SAP notes: 185530
症状:
自开发程序和程序增强运行很慢。当访问SAP SD表:VBAK,VBAP,VMVA,LIPS,VBRK,VBRP,VBFA时,性能很差。
理由和需求:
R/3系统发布的时候,大部分SD事物数据表没有第二索引。取而代之的是R/3系统有专有的
高效访问索引表(销售文档索引,例如表VAKPA,VAPMA匹配的表是M_VMVAB,M_VMVAC
或者配置的视图是M_VMVAA, M_VMVAE)
注意下面的警告:
- 在高效使用列出的备选方案之前,必须仔细检查程序的功能准确性。
- 销售文档的索引必须在系统中正确的维护。
考虑下面的标记:
下面的例子中,经常访问几个表,例如:
SELECT FROM vakpa WHERE kunde = ... SELECT FROM vbak WHERE vbeln = vakpa-vbeln.
这样能提升性能,通过在相应的表上定义一个选择视图,把对两个表的读取合并为一次。
解决方案:
1.读取销售订单(VBAK,VBAP)
a) 为客户编码搜索订单(字段 VBAK-KUNNR)
错误: SELECT FROM vbak WHERE kunnr = ...
正确: SELECT FROM vakpa WHERE kunde = ...
b) 为物料编码搜索订单条目(字段 VBAP-MATNR)
错误: SELECT FROM vbap WHERE matnr = ...
正确: SELECT FROM vapma WHERE matnr = ... SELECT FROM vbap WHERE vbeln = vapma-vbeln
c)针对销售订单的其他搜索帮助提供匹配代码表和视图M_VMVAx,x.= A,B,C,...M;例如对用户,描述等等的采购订单的搜索。
2.访问发货(LIKP,LIPS)
a) 为客户编码搜索发货(字段 LIKP-KUNNR)
错误: SELECT FROM likp WHERE kunnr = ...
正确: SELECT FROM vlkpa WHERE kunde = ... SELECT FROM likp WHERE vbeln = vlkpa-vbeln.
b) 用物料编码搜索发货条目(字段 LIKP-MATNR)
错误:SELECT FROM lips WHERE matnr = ...
正确: SELECT FROM vlpma WHERE matnr = ... SELECT FROM lips WHERE vbeln = vlpma-vbeln AND posnr = vlpma-posnn.
c) 用销售订单号查找发货(前序文档 ,字段 LIPS-VGBEL)
错误:SELECT FROM lips WHERE vgbel = ...
正确:SELECT FROM vbfa WHERE VBELV = ... and VBTYP_N = 'J' SELECT FROM lips WHERE vbeln = vbfa-vbeln and posnr = vbfa-posnn.
d) 针对发货的其他搜索帮助提供匹配代码表和视图 M_VMVLx,x.= A,B,C,...M;例如对货物过账日期,捡配日期,运输计划日期等等的搜索。
3.访问发票(VBRK,VBRP)
a) 用客户编码(“付账方”)搜索发票(字段 VBRK-KUNRG)
错误: SELECT FROM vbrk WHERE kunrg = ....
正确: SELECT FROM vrkpa WHERE kunde = ... SELECT FROM vbrk WHERE vbeln = vrkpa-vbeln
b)用物料编码搜索发票(字段 VBRP-MATNR)
错误: SELECT FROM VBRP WHERE MATNR = ...
正确: SELECT FROM VRPMA WHERE MATNR = ... SELECT FROM VBRK WHERE VBELN = VRPMA-VBELN AND POSNR = VRPMA-POSNR
c) 用发货号搜索发票(前序文档 ,字段 VBRP-VGBEL)
错误: SELECT FROM vbrp WHERE vgbel = ...
正确: SELECT FROM vbfa WHERE vbtyp_n = 'M' AND vbelv = ... SELECT FROM vbrp WHERE vbeln = vbfa-vbeln AND posnr = vbfa-posnn
d) 用订单号搜索发票(前序文档 ,字段 VBRP-VGBEL)
错误: SELECT FROM vbrp WHERE aubel = ...
正确: SELECT FROM vbfa WHERE vbtyp_n = 'M' AND vbelv = ... SELECT FROM vbrp WHERE vbeln = vbfa-vbeln AND posnr = vbfa-posnn
4. SD中的其他访问
a)文档流程
错误:SELECT vbelv FROM vbfa WHERE vbeln ...
在vbfa表中前序文档用来查找后续文档(例如订单发货)。在这个表中搜索其他的方式是没有一样,
因为前序文档直接存储在这个文档表中。在vbfa表中只有一种查询方式。
正确: SELECT vgbel FROM lips WHERE vbeln = ...;
or SELECT vgbel FROM vbrp WHERE vbeln = ...;
or SELECT aubel FROM vbrp WHERE vbeln = ...
b) 用发货查找运输单元条目
错误: SELECT FROM vepo WHERE vbtyp = 'J' AND vbeln = i_lips-vbeln
正确: SELECT FROM vbfa WHERE vbtyp_n = 'X' AND vbelv = i_lips-vbeln
SELECT FROM vepo WHERE venum = vbfa-vbeln