调用BADI时程序输出无显示

2020-08-19 02:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,我是abap的新手,目前正在学习巴迪语。

我在Method的Z Badi接口中插入了简单的逻辑

 IV_MATNR导入类型MARA-MATNR
 LS_MARA更改类型MARA
 GT_MARA更改类型MARA



 选择matnr mtart INTO gt_mara FROM mara
       matnr eq iv_matnr在哪里。

       如果sy-subrc <> 0。
         清除gt_mara。
         其他。
           写入:/,/ls_mara-matnr,ls_mara-mtart。
         万一。
        ENDSELECT。

我正在尝试在程序中调用经典badi。 在参数中选择材料并执行后,输出为空。

如果有任何错误,请纠正我,谢谢

程序代码:

数据o_badi类型参考到ZIF_EX_ABAP_BADI。  ""经典BADi接口名称

 数据:带有标题行的gt_mara类型zmara_ttyp。
 数据:gs_mara与gt_mara类似。


 参数:p_matnr类似于gs_mara-matnr。



 选择开始。

 调用方法CL_EXITHANDLER => GET_INSTANCE""调用此方法为Classic BADI定义创建实例
   出口
     EXIT_NAME ='ZABAP_BADI'""经典BADi定义
 * NULL_INSTANCE_ACCEPTED = SEEX_FALSE
 *重要
 * ACT_IMP_EXISTING =
   改变
     实例= o_badi
 *例外情况
 * NO_REFERENCE = 1
 * NO_INTERFACE_REFERENCE = 2
 * NO_EXIT_INTERFACE = 3
 * CLASS_NOT_IMPLEMENT_INTERFACE = 4
 * SINGLE_EXIT_MULTIPLY_ACTIVE = 5
 * CAST_ERROR = 6
 * EXIT_NOT_EXISTING = 7
 * DATA_INCONS_IN_EXIT_MANAGEM = 8
 *其他= 9
         。
 *如果SY-SUBRC <> 0。
 **在此处实施适当的错误处理
 *万一。


 呼叫方法O_BADI-> MAT_DETAILS
   出口
     IV_MATNR = p_matnr
   改变
     LS_MARA = gs_mara
     GT_MARA = gt_mara。




 将gt_mara循环到gs_mara。

   写:gs_mara-matnr,
           gs_mara-mtart。

   ENDLOOP。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,我是abap的新手,目前正在学习巴迪语。

我在Method的Z Badi接口中插入了简单的逻辑

 IV_MATNR导入类型MARA-MATNR
 LS_MARA更改类型MARA
 GT_MARA更改类型MARA



 选择matnr mtart INTO gt_mara FROM mara
       matnr eq iv_matnr在哪里。

       如果sy-subrc <> 0。
         清除gt_mara。
         其他。
           写入:/,/ls_mara-matnr,ls_mara-mtart。
         万一。
        ENDSELECT。

我正在尝试在程序中调用经典badi。 在参数中选择材料并执行后,输出为空。

如果有任何错误,请纠正我,谢谢

程序代码:

数据o_badi类型参考到ZIF_EX_ABAP_BADI。  ""经典BADi接口名称

 数据:带有标题行的gt_mara类型zmara_ttyp。
 数据:gs_mara与gt_mara类似。


 参数:p_matnr类似于gs_mara-matnr。



 选择开始。

 调用方法CL_EXITHANDLER => GET_INSTANCE""调用此方法为Classic BADI定义创建实例
   出口
     EXIT_NAME ='ZABAP_BADI'""经典BADi定义
 * NULL_INSTANCE_ACCEPTED = SEEX_FALSE
 *重要
 * ACT_IMP_EXISTING =
   改变
     实例= o_badi
 *例外情况
 * NO_REFERENCE = 1
 * NO_INTERFACE_REFERENCE = 2
 * NO_EXIT_INTERFACE = 3
 * CLASS_NOT_IMPLEMENT_INTERFACE = 4
 * SINGLE_EXIT_MULTIPLY_ACTIVE = 5
 * CAST_ERROR = 6
 * EXIT_NOT_EXISTING = 7
 * DATA_INCONS_IN_EXIT_MANAGEM = 8
 *其他= 9
         。
 *如果SY-SUBRC <> 0。
 **在此处实施适当的错误处理
 *万一。


 呼叫方法O_BADI-> MAT_DETAILS
   出口
     IV_MATNR = p_matnr
   改变
     LS_MARA = gs_mara
     GT_MARA = gt_mara。




 将gt_mara循环到gs_mara。

   写:gs_mara-matnr,
           gs_mara-mtart。

   ENDLOOP。
付费偷看设置
发送
5条回答
SAP砖家
1楼-- · 2020-08-19 03:07

我看到了几种"改善"编码的方法,但是主要问题是badi实现的内容以及如何处理带有标题行的表。 有关更好的解决方案,请参见答案的结尾。 首先,这里是"出错"的地方

1。 您使用SELECT ... ENDSELECT,一次只能提取一条记录并将该记录写入结构(而不​​是表中,请参见有关ENDSELECT的ABAP文档):

 SELECT matnr mtart从mara WHERE matnr EQ iv_matnr中插入gt_mara。
    ...
 ENDSELECT。

这样,变量GT_MARA []的表永远不会被填充,但是变量GT_MARA的结构却被填充。 在大多数情况下,ABAP将根据上下文选择带有标题行的表的正确"部分"(表或结构)。 在某些情况下,这可能是"错误的"或不可能的。 有关更多信息,请参见内部表带有标题行的ABAP文档

2。 找到记录后,您可以在一个空变量上使用WRITE(以显示输出)语句:

 WRITE:/,/ls_mara-matnr,ls_mara-mtart。
 

从未通过您的报告或badi方法设置变量LS_MARA。 但是您仍在尝试阅读。 甚至更糟糕的是,您试图写入屏幕输出,除非您只是尝试测试编码,否则在大多数情况下使用Badi都是不合适的。

3。

 SELECT ...。您正在尝试在SELECT ... ENDSELECT语句中而不是之后处理不成功的调用。

 SELECT ...。
   如果sy-subrc <> 0。
     清除:gt_mara。
   万一。
 ENDSELECT。

永远不会达到IF子句的这种编码,因为SELECT ... ENDSELECT的内部仅对找到的每个记录(sy-subrc = 0)进行处理,如果存在 找不到记录,sy-subrc将为<> 0,并且编码将在ENDSELECT之后继续进行(请参见有关SELECT的ABAP文档

更新:4。您在报告中将GT_MARA定义为带有HEADER LINE的TABLE,但BADI仅使用标题行

调用方法O_BADI-> MAT_DETAILS,则不会更改GT_MARA的结构。
   出口
     IV_MATNR = p_matnr
   改变
     LS_MARA = gs_mara
     GT_MARA = gt_mara。  "->这显然只是一种使用结构
 附加gt_mara。  "->这就是您如何进行以下编码的方式


使用SELECT ... INTO ... ENDSELECT的解决方案[A]:

UPDATE:由于GT_MARA是一个CHANGING参数,并且类型定义为结构,因此,您要更改的参数ls_mara和gt_mara是同一类型,并且您没有通过将二者都添加到编码中来添加任何功能。 不过,已更新为适用于您的编码:

清除:gt_mara,ls_mara。
 从mara WHERE matnr EQ iv_matnr中选择matnr mtart INTO gt_mara。
   ls_mara = gt_mara。
 ENDSELECT。
 如果sy-subrc <> 0。
   " ...
 ENDIF。

具有SELECT ... INTO TABLE

的解决方案[B]:

更新:仅当接口参数GT_MARA是TABLES参数而不是CHANGING时才可以使用 参数。 作为TABLES参数,它是带有HEADER LINE的TABLE TYPE。 作为CHANGING参数,它可以是一个或一个,但不能两者兼有,并且取决于给定的TYPE。 显然,给定的TYPE是结构而不是表。

 SELECT matnr mtart插入表gt_mara []从mara WHERE matnr EQ iv_matnr中。
 如果sy-subrc <> 0。
   " ...
 ENDIF。

更新:使用SELECT SINGLE ... INTO 的解决方案[C]:

 SELECT SINGLE matnr mtart INTO(ls_mara-matnr,ls_mara-mtart)来自mara WHERE  matnr EQ iv_matnr。
 如果sy-subrc = 0。
   gt_mara = ls_mara。
 其他
   清除:gt_mara,ls_mara。
 ENDIF。

更新:我将对您的BADI和报告编码进行以下更改:

  • 在您的BADI中,摆脱GT_MARA,它误导性不是分配类型的表。
    由于您是通过MARA的主键进行选择的,因此您始终只会获取no或正好获取1条记录 ,因此,当您实际上不更改现有值,而是返回"新"值时,返回的TABLE也将产生误导作用。 在这种情况下,您应该使用EXPORTING参数。 不要给您的EXPORTING/CHANGING参数加上ls_或gt_之类的前缀,如果要使用匈牙利表示法,请在这种情况下使用es_和cs_代替
  • 给该参数一个比MARA更合适的名称,这也会引起误解 ,因为您目前在该结构中仅具有matnr和mtart
  • 选择解决方案[C]来填充您的结构
  • 在您的报告中,摆脱GT_MARA的定义,它不会添加 任何其他功能,从BADI寻找的输出只是一个导出参数(定义为从报告角度导入)
Cikesha
2楼-- · 2020-08-19 03:07

正在学习:内核BAdI是新的更快)的方式将BAdI包含在代码中,将其放在您的列表中。

" HEADER LINE"是 过时的说明,因为它会引起与您传递的错误完全相同的麻烦,并且 Michael Piesche 详细(带有HEADER LINE的表既是结构又是内部 表)。 您应该从研究中删除它。

宇峰Kouji
3楼-- · 2020-08-19 02:55

当我删除"标题行"时,它显示错误–内部表/结构不兼容(方法和程序之间),即使我更改了

宇峰Kouji
4楼-- · 2020-08-19 02:55

AS 多次,请继续处理您的未解决问题

  • 评论答案或您的问题是否还有未解决的问题。
  • 否则将答案标记为接受,如果它可以帮助您解决问题
  • 或发布您自己的答案并接受 如果您自己找到了另一个有用的解决方案
  • ,或者将您的问题重定向到另一个相关且对解决您的问题有用的问题
  • 最后,请关闭您的问题
空代码
5楼-- · 2020-08-19 02:43

AS ,我已经回答了您的问题,您 说它可行,因此请标记为已回答,投票,喜欢或关闭该问题,尤其不要在该主题中回答与原始问题无关的其他问题,尤其是当您已经有一个处理相同问题的开放问题时 (我现在也已经通过已答复了)。

PS:为什么要使用两个帐户来发布相同帐户和类似帐户 是否同时在 A S

一周热门 更多>

向帮助了您的网友说句感谢的话吧!