项目场景:
TCODE:自开发程序ZMMF004
采购申请打印
问题描述
ZMMF004打印的时候,有的采购申请的品名、规格、品牌为空
原因分析:
1、首先我通过写SQL语句查底表来看这几条采购申请本身有无品名、规格、品牌
SQL语句如下,只需修改where条件即可测试各条数据
eban底表:采购申请
测试1:采购申请号:2500000122
SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000122';
执行结果:
可看出该条采购申请是本身就没有品名、规格、品牌的值的
测试2:采购申请号:2500000134
SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000134';
执行结果:
可看出该条采购申请是本身就有品名的值,但没有规格、品牌的值
测试3:采购申请号:2500000136
SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000136';
执行结果:
可看出该条采购申请对应两个物料号,其中一个物料有品名值,无规格、品牌的值;另一个物料这三个字段都没有值
从上面的测试结果我可以得出,并不是由于程序取数逻辑错误而导致带不出品名、规格、品牌等字段值,而是因为一些采购申请本身就没有填相应的字段值
2、我的首先的思路是,loop循环ALV最终要显现出来的取到数据的内表,一条一条查哪些采购申请的品名、规格、品牌为空,若为空,则再从物料主数据中取然后放到内表中,但这样loop会非常耗费时间,代码实现也要相对注意,所以这个思路out
3、与其loop已取出来数的内表,不如直接从源头select改变取值方式,直接去物料主数据里取
解决方案:
通过上面的原因分析,可采用如下解决方案:也就是原因分析中的第三条
直接取物料对应的物料主数据上的需要的字段信息,并使其显示出来,若采购申请有这三个字段的值也没关系,从物料主数据中取出来的三字段的值会直接覆盖(因为采购申请中的三字段值和物料主数据中的应该是一致的)
所以解决办法也很简单,直接在原先select语句基础上,连一个表mara物料主数据,让直接从mara表中取品名,规格,品牌(前提是mara表中得有这些字段)
mara表:
修改的语句如下:
SELECT a~banfn,
a~bnfpo,
a~badat,
a~bsart,
a~matkl,
a~ernam,
a~knttp,
a~werks,
d~name1,
a~ekgrp,
b~eknam,
a~matnr,
a~txz01,
i~zpm,
i~zggxh,
i~zpp,
a~menge,
a~meins,
a~lfdat,
a~lgort,
c~lgobe,
a~afnam,
a~zjjcd,
a~zjhjh,
f~maktx,
g~wgbez,
h~knttx
INTO CORRESPONDING FIELDS OF TABLE @gt_alv
FROM eban AS a
LEFT OUTER JOIN t024 AS b ON a~ekgrp = b~ekgrp
LEFT OUTER JOIN t023T AS g ON a~matkl = g~matkl
LEFT OUTER JOIN t001L AS c ON a~werks = c~werks AND a~lgort = c~lgort
LEFT OUTER JOIN t001w AS d ON a~werks = d~werks
LEFT OUTER JOIN makt AS f ON a~matnr = f~matnr
LEFT OUTER JOIN zmmt021 AS e ON a~banfn = e~banfn
LEFT OUTER JOIN t163i AS h ON a~knttp = h~knttp AND h~spras = @sy-langu
LEFT OUTER JOIN MARA AS i on i~matnr = a~matnr
WHERE a~bsart IN @s_bsart
AND a~werks IN @s_werks
AND a~banfn IN @s_banfn
AND a~badat IN @s_badat
AND a~ernam IN @s_ernam
AND a~loekz NE 'X'
AND (lv_str)
AND (lv_str2).
红框中为修改并添加的语句
再执行 ZMMF004,效果如下: