【ABAP SAP】开辟-BUG修补纪录_采购申请打印时品名规格品牌为空

[复制链接]
发表于 2025-12-7 16:15:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
项目场景:

TCODE:自开辟步调ZMMF004
采购申请打印


标题形貌

ZMMF004打印的时间,有的采购申请的品名、规格、品牌为空


缘故起因分析:

1、起首我通过写SQL语句查底表来看这几条采购申请本身有无品名、规格、品牌
SQL语句如下,只需修改where条件即可测试各条数据
eban底表:采购申请
测试1:采购申请号:2500000122
  1. SELECT ZPM,ZGGXH,ZPP
  2. FROM EBAN
  3. WHERE BANFN = '2500000122';
复制代码
实行效果:

可看出该条采购申请是本身就没有品名、规格、品牌的值的
测试2:采购申请号:2500000134
  1. SELECT ZPM,ZGGXH,ZPP
  2. FROM EBAN
  3. WHERE BANFN = '2500000134';
复制代码
实行效果:

可看出该条采购申请是本身就有品名的值,但没有规格、品牌的值
测试3:采购申请号:2500000136
  1. SELECT ZPM,ZGGXH,ZPP
  2. FROM EBAN
  3. WHERE BANFN = '2500000136';
复制代码
实行效果:

可看出该条采购申请对应两个物料号,此中一个物料有品名值,无规格、品牌的值;另一个物料这三个字段都没有值
从上面的测试效果我可以得出,并不是由于步调取数逻辑错误而导致带不出品名、规格、品牌等字段值,而是由于一些采购申请本身就没有填相应的字段值
2、我的起首的思绪是,loop循环ALV终极要显现出来的取到数据的内表,一条一条查哪些采购申请的品名、规格、品牌为空,若为空,则再从物料主数据中取然后放到内表中,但如许loop会非常泯灭时间,代码实现也要相对注意,以是这个思绪out
3、与其loop已取出来数的内表,不如直接从源头select改变取值方式,直接去物料主数据里取

办理方案:

通过上面的缘故起因分析,可采取如下办理方案:也就是缘故起因分析中的第三条
直接取物料对应的物料主数据上的须要的字段信息,并使其表现出来,若采购申请有这三个字段的值也不要紧,从物料主数据中取出来的三字段的值会直接覆盖(由于采购申请中的三字段值和物料主数据中的应该是划一的)
以是办理办法也很简单,直接在原先select语句根本上,连一个表mara物料主数据,让直接从mara表中取品名,规格,品牌(条件是mara表中得有这些字段)
mara表:

修改的语句如下:
  1. SELECT a~banfn,
  2.          a~bnfpo,
  3.          a~badat,
  4.          a~bsart,
  5.          a~matkl,
  6.          a~ernam,
  7.          a~knttp,
  8.          a~werks,
  9.          d~name1,
  10.          a~ekgrp,
  11.          b~eknam,
  12.          a~matnr,
  13.          a~txz01,
  14.          i~zpm,
  15.          i~zggxh,
  16.          i~zpp,
  17.          a~menge,
  18.          a~meins,
  19.          a~lfdat,
  20.          a~lgort,
  21.          c~lgobe,
  22.          a~afnam,
  23.          a~zjjcd,
  24.          a~zjhjh,
  25.          f~maktx,
  26.          g~wgbez,
  27.          h~knttx
  28.    INTO CORRESPONDING FIELDS OF TABLE @gt_alv
  29.     FROM eban AS a
  30.     LEFT  OUTER JOIN t024    AS b ON a~ekgrp = b~ekgrp
  31.     LEFT  OUTER JOIN t023T   AS g ON a~matkl = g~matkl
  32.     LEFT  OUTER JOIN t001L   AS c ON a~werks = c~werks AND a~lgort = c~lgort
  33.     LEFT  OUTER JOIN t001w   AS d ON a~werks = d~werks
  34.     LEFT  OUTER JOIN makt    AS f ON a~matnr = f~matnr
  35.     LEFT  OUTER JOIN zmmt021 AS e ON a~banfn = e~banfn
  36.     LEFT  OUTER JOIN t163i   AS h ON a~knttp = h~knttp AND h~spras = @sy-langu
  37.     LEFT  OUTER JOIN MARA    AS i on i~matnr = a~matnr
  38.    WHERE a~bsart IN @s_bsart
  39.      AND a~werks IN @s_werks
  40.      AND a~banfn IN @s_banfn
  41.      AND a~badat IN @s_badat
  42.      AND a~ernam IN @s_ernam
  43.      AND a~loekz NE 'X'
  44.      AND (lv_str)
  45.      AND (lv_str2).
复制代码
红框中为修改并添加的语句

再实行 ZMMF004,效果如下:


2024/12/12    13:57
承接上文,须要做个改正,由于采购申请中的那三个字段的值大概和物料主数据中的不一样,以是实在并不能简单的让直接取物料主数据里的值,而忽略过采购申请,以是,照旧须要判定:若采购申请中的三个字段的值不为空,则就取采购申请里的,若采购申请里的为空或为初始值,则取物料主数据里的
代码如下:
  1.   SELECT a~banfn,
  2.          a~bnfpo,
  3.          a~badat,
  4.          a~bsart,
  5.          a~matkl,
  6.          a~ernam,
  7.          a~knttp,
  8.          a~werks,
  9.          d~name1,
  10.          a~ekgrp,
  11.          b~eknam,
  12.          a~matnr,
  13.          a~txz01,
  14. *         a~zpm,
  15. *         a~zggxh,
  16. *         a~zpp,
  17.     CASE
  18.     WHEN a~zpm is not null and a~zpm is not initial then a~zpm
  19.     else i~zpm
  20.     end as zpm,
  21.     CASE
  22.     WHEN a~zggxh is not null and a~zggxh is not initial then a~zggxh
  23.     else i~zggxh
  24.     end as zggxh,
  25.       CASE
  26.     WHEN a~zpp is not null and a~zpp is not initial then a~zpp
  27.     else i~zpp
  28.     end as zpp,
  29.          a~menge,
  30.          a~meins,
  31.          a~lfdat,
  32.          a~lgort,
  33.          c~lgobe,
  34.          a~afnam,
  35.          a~zjjcd,
  36.          a~zjhjh,
  37.          f~maktx,
  38.          g~wgbez,
  39.          h~knttx
  40.     FROM eban AS a
  41.     LEFT  OUTER JOIN t024    AS b ON a~ekgrp = b~ekgrp
  42.     LEFT  OUTER JOIN t023T   AS g ON a~matkl = g~matkl
  43.     LEFT  OUTER JOIN t001L   AS c ON a~werks = c~werks AND a~lgort = c~lgort
  44.     LEFT  OUTER JOIN t001w   AS d ON a~werks = d~werks
  45.     LEFT  OUTER JOIN makt    AS f ON a~matnr = f~matnr
  46.     LEFT  OUTER JOIN zmmt021 AS e ON a~banfn = e~banfn
  47.     LEFT  OUTER JOIN t163i   AS h ON a~knttp = h~knttp AND h~spras = @sy-langu
  48.     LEFT  OUTER JOIN MARA    AS i on i~matnr = a~matnr
  49.    WHERE a~bsart IN @s_bsart
  50.      AND a~werks IN @s_werks
  51.      AND a~banfn IN @s_banfn
  52.      AND a~badat IN @s_badat
  53.      AND a~ernam IN @s_ernam
  54.      AND a~loekz NE 'X'
  55.      AND (lv_str)
  56.      AND (lv_str2)
  57.   INTO CORRESPONDING FIELDS OF TABLE @gt_alv.
复制代码
别的:对null 和initial做个区分
a~zpm is not null查抄字段是否有值;a~zpm is not initial查抄字段的值是否不是其“初始”状态;
这里的初始状态应该是说数据库表字段在界说时有无指定默认值,如果数据库表字段在界说时指定了默认值,那么在插入数据时如果没有为该字段赋值,数据库会白动利用指定的默认值;如果数据库表字段没有指定默认值,且在插入数据时没有为其赋值,那么该字段的值将取决于数据库体系的默认活动:字符范例字段会被赋值为空字符(”)
那只有在从采购申请中得来的字段不为空且不是初始值的情况下,就用采购申请里的;如果空或是初始值,就用物料主数据里的
null在数据库中表现一个未知或缺失的值。如果一个字段的值为null,这意味着这个字段没有值,大概说它的值是不确定的。
initial用于表现一个字段或变量的初始状态或默认值
注:
在 ABAP 中,往数据库插入数据时,如果字段未被显式赋值,则插入活动取决于以下几个方面:
1、字段的初始值:
对于 ABAP 内部表大概工作区(Work Area)中的字段,如果未赋值,这些字段会有默认的
初始值,详细如下:
字符型(CHAR, STRING):空字符串 ··
数值型(INT, FLOAT, DEC):e。
日期型(DATE):‘00000000’。
时间型(TIME):‘000000’
布尔型 (X, FLAG):8。
插入数据库时,ABAP 会利用这些默认初始值。
2、数据库字段的默认值
如果数据库表字段在界说时指定了默认值(通过字段的 Defaut 属性设置),纵然 ABAP 步调
没有赋值,该默认值也会被插入。
3、数据库字段是否答应空值:
如果字段在数据库中被界说为答应 NULL值,那么 ABAP 中利用 CLEAR 或未赋值的字段可
能会被视为 NULL,详细取决于数据库接口的设置。
如果字段不答应 NULL值,未赋值字段会利用其默认的初始值插入到数据库中,
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表