错误的abap 7.5循环

2020-08-18 20:12发布

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

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


大家好,

我没有在alv输出中获取这些字段数据...

VBELN,AUDAT,POSNR,MATNR,MEINS,MAKTX。 请检查代码。

报告zmanoj4。
 表格:kna1,vbak,vbap,makt。

 类型:ty开始,
           kunnr TYPE kunnr,
           name1 TYPE name1,
           vbeln TYPE vbeln,
           TYPE Audat,
           posnr TYPE posnr,
           matnr TYPE matnr,
           kwmeng TYPE kwmeng,
           类型,
           netwr TYPE netwr,
           maktx TYPE maktx,
         ty of ty。


 数据:它的类型表,
        wa TYPE TY。
 数据:it_fieldcat类型slis_t_fieldcat_alv,
       wa_fieldcat类型slis_fieldcat_alv。

 带有标题标题文本001的b1块的选择屏幕开始。
 参数p_num类型kna1-kunnr。
 块b的选择屏幕结束。

 选择开始。
   性能得到。
   执行广告
   执行。

 形式得到。
   选择kunnr,
          从kna1到表@DATA(it_knal)的name1
          在kunnr EQ @p_num处。

   如果sy-subrc EQ 0。
   SELECT vbeln,
            奥德
            kunnr从vbak到表@DATA(it_vbak)
            对于@it_knal中的所有条目
            在kunnr EQ @ it_knal-kunnr。
   万一。

   SELECT vbeln,
          posnr,
          matnr,
          w
          我的意思
          从vbap到表@DATA(it_vbap)中的netwr
          对于@it_vbak中的所有条目
          在哪里vbeln EQ @ it_vbak-vbeln。

   如果sy-subrc EQ 0。
     SELECT matnr,
            maktx从makt到表@DATA(it_makt)
            对于@it_vbap中的所有条目
            matnr EQ @ it_vbap-matnr在哪里。
   万一。


   循环到it_vbak INTO DATA(wa_vbak)。
     使用键vbeln = wa_vbak-vbeln将表it_vbap读入数据(wa_vbap)。
     使用键kunnr = wa_vbak-kunnr读取表it_​​knal到DATA(wa_knal)中。
     使用键matnr = wa_vbap-matnr读取表it_​​makt到DATA(wa_makt)中。
     附加wa_vbak。
   结局。
 ENDFORM。



 形式alv。
   wa_fieldcat-fieldname ='KUNNR'。
   wa_fieldcat-ref_tabname ='KNA1'。
   wa_fieldcat-seltext_m ='会计凭证编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='NAME1'。
   wa_fieldcat-ref_tabname ='KNA1'。
   wa_fieldcat-seltext_m ='AccountDocument号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='VBELN'。
   wa_fieldcat-ref_tabname ='VBAK'。
   wa_fieldcat-seltext_m ='会计凭证编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='AUDAT'。
   wa_fieldcat-ref_tabname ='VBAK'。
   wa_fieldcat-seltext_m ='AccounDocument号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='POSNR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MATNR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ="地点编号"。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='KWMENG'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MEINS'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='NETWR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='AcingD'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MAKTX'。
   wa_fieldcat-ref_tabname ='MAKT'。
   wa_fieldcat-seltext_m ='Acing r'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。
 ENDFORM。

 形成。
   通话功能'REUSE_ALV_GRID_DISPLAY'
     出口
       i_grid_title ='会计凭证详细信息'
       it_fieldcat = it_fieldcat
     桌子
       t_outtab =它。
 ENDFORM。

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

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


大家好,

我没有在alv输出中获取这些字段数据...

VBELN,AUDAT,POSNR,MATNR,MEINS,MAKTX。 请检查代码。

报告zmanoj4。
 表格:kna1,vbak,vbap,makt。

 类型:ty开始,
           kunnr TYPE kunnr,
           name1 TYPE name1,
           vbeln TYPE vbeln,
           TYPE Audat,
           posnr TYPE posnr,
           matnr TYPE matnr,
           kwmeng TYPE kwmeng,
           类型,
           netwr TYPE netwr,
           maktx TYPE maktx,
         ty of ty。


 数据:它的类型表,
        wa TYPE TY。
 数据:it_fieldcat类型slis_t_fieldcat_alv,
       wa_fieldcat类型slis_fieldcat_alv。

 带有标题标题文本001的b1块的选择屏幕开始。
 参数p_num类型kna1-kunnr。
 块b的选择屏幕结束。

 选择开始。
   性能得到。
   执行广告
   执行。

 形式得到。
   选择kunnr,
          从kna1到表@DATA(it_knal)的name1
          在kunnr EQ @p_num处。

   如果sy-subrc EQ 0。
   SELECT vbeln,
            奥德
            kunnr从vbak到表@DATA(it_vbak)
            对于@it_knal中的所有条目
            在kunnr EQ @ it_knal-kunnr。
   万一。

   SELECT vbeln,
          posnr,
          matnr,
          w
          我的意思
          从vbap到表@DATA(it_vbap)中的netwr
          对于@it_vbak中的所有条目
          在哪里vbeln EQ @ it_vbak-vbeln。

   如果sy-subrc EQ 0。
     SELECT matnr,
            maktx从makt到表@DATA(it_makt)
            对于@it_vbap中的所有条目
            matnr EQ @ it_vbap-matnr在哪里。
   万一。


   循环到it_vbak INTO DATA(wa_vbak)。
     使用键vbeln = wa_vbak-vbeln将表it_vbap读入数据(wa_vbap)。
     使用键kunnr = wa_vbak-kunnr读取表it_​​knal到DATA(wa_knal)中。
     使用键matnr = wa_vbap-matnr读取表it_​​makt到DATA(wa_makt)中。
     附加wa_vbak。
   结局。
 ENDFORM。



 形式alv。
   wa_fieldcat-fieldname ='KUNNR'。
   wa_fieldcat-ref_tabname ='KNA1'。
   wa_fieldcat-seltext_m ='会计凭证编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='NAME1'。
   wa_fieldcat-ref_tabname ='KNA1'。
   wa_fieldcat-seltext_m ='AccountDocument号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='VBELN'。
   wa_fieldcat-ref_tabname ='VBAK'。
   wa_fieldcat-seltext_m ='会计凭证编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。

   wa_fieldcat-fieldname ='AUDAT'。
   wa_fieldcat-ref_tabname ='VBAK'。
   wa_fieldcat-seltext_m ='AccounDocument号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='POSNR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MATNR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ="地点编号"。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='KWMENG'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MEINS'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='Acing文档编号'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='NETWR'。
   wa_fieldcat-ref_tabname ='VBAP'。
   wa_fieldcat-seltext_m ='AcingD'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。


   wa_fieldcat-fieldname ='MAKTX'。
   wa_fieldcat-ref_tabname ='MAKT'。
   wa_fieldcat-seltext_m ='Acing r'。
   将wa_fieldcat附加到it_fieldcat。
   清除wa_fieldcat。
 ENDFORM。

 形成。
   通话功能'REUSE_ALV_GRID_DISPLAY'
     出口
       i_grid_title ='会计凭证详细信息'
       it_fieldcat = it_fieldcat
     桌子
       t_outtab =它。
 ENDFORM。
付费偷看设置
发送
5条回答
槿木_熙
1楼-- · 2020-08-18 21:14

您的主要问题是这种逻辑。 您想在这里发生什么?

循环到it_vbak INTO DATA(wa_vbak)。
     使用键vbeln = wa_vbak-vbeln将表it_vbap读入数据(wa_vbap)。
     使用键kunnr = wa_vbak-kunnr读取表it_​​knal到DATA(wa_knal)中。
     使用键matnr = wa_vbap-matnr读取表it_​​makt到DATA(wa_makt)中。
     附加wa_vbak。
   ENDLOOP。
  • 您从表中读取了结构,但对这些内容不做任何操作
    ,例如
    清除wa。
    移动wa_vbak到wa。
    移动wa_vbap到wa。
    移动wa_knal到wa。
    移动wa_makt到wa。
    附录
  • 您不必遍历订单头寸以获取订单的所有可能项目。
    使用键vbeln = wa_vbak-vbeln在it_vbap中将其放入DATA(wa_vbap)。
    。 ..
    ENDLOOP。
  • 您想从市场上读什么语言
    例如 您选择语句中的SPRAS ='D'

但是还有其他问题:

  • 除了进行多带带的选择,您还可以对联接进行一次选择
  • ,否则,您应该考虑对表类型使用KEY,以便在具有读取和嵌套循环的循环中获得更好的性能, 但这取决于选择的数据量
  • 您不必分别构建字段目录,它将由给定的表类型自动生成。 如果要使用其他DDIC功能(例如描述和f4值),或者正在使用不具有DDIC功能的ABAP内部类型,只需更改它即可。
hengyuye
2楼-- · 2020-08-18 21:15

列是否在ALV中,但所有值都为空?

Baoming ROSE
3楼-- · 2020-08-18 21:01

您好 Manoj Kumar

您不会将信息从源内部表移动到结果内部表。 这就是为什么您没有在ALV中获得价值的原因。

您可以使用移动对应或逐字段。 视情况而定。

 FORM获取。
   "这里的数据库选择

   循环到it_vbak INTO DATA(wa_vbak)。
     在它的开头添加一行引用到DATA(ld_it)中。
     将wa_vbak移动到ld_it-> *。

     使用键vbeln = wa_vbak-vbeln将表it_vbap读入数据(wa_vbap)。
     如果sy-subrc = 0。
       将wa_vbap移动到ld_it-> *。

       使用键matnr = wa_vbap-matnr读取表it_​​makt到DATA(wa_makt)中。
       如果sy-subrc = 0。
         将wa_makt对应移动到ld_it-> *
       万一
     万一。

     使用键kunnr = wa_vbak-kunnr读取表it_​​knal到DATA(wa_knal)中。
     如果sy-subrc = 0。
       将wa_kna1移动到ld_it-> *。
     万一。
   结局。
 ENDFORM。

此外,仅当VBAK SELECT返回任何结果时,才应在VBAP表上执行SELECT。

 SELECT kunnr,
          从kna1到表@DATA(it_knal)的name1
          在kunnr EQ @p_num处。
   如果sy-subrc EQ 0。
     SELECT vbeln,
            奥德
            kunnr从vbak到表@DATA(it_vbak)
            对于@it_knal中的所有条目
            在kunnr EQ @ it_knal-kunnr。
     如果sy-subrc = 0。
       SELECT vbeln,
             posnr,
             matnr,
             w
             我的意思
             从vbap到表@DATA(it_vbap)中的netwr
             对于@it_vbak中的所有条目
             在哪里vbeln EQ @ it_vbak-vbeln。
       如果sy-subrc EQ 0。
         SELECT matnr,
                maktx从makt到表@DATA(it_makt)
                对于@it_vbap中的所有条目
                matnr EQ @ it_vbap-matnr在哪里。
       万一。
     万一。
   ENDIF。

您可以这样做,也可以简单地退出GET过程,因为其中一个KNA1/VBAK SELECT语句都不返回结果,因为所有其他语句都依赖于这些结果。/p>

 SELECT kunnr,
          从kna1到表@DATA(it_knal)的name1
          在kunnr EQ @p_num处。
   如果sy-subrc <> 0。
     返回。
   万一。

   SELECT vbeln,
          奥德
          kunnr从vbak到表@DATA(it_vbak)
          对于@it_knal中的所有条目
          在kunnr EQ @ it_knal-kunnr。
   如果sy-subrc <> 0。
     返回
   万一。

   SELECT vbeln,
          posnr,
          matnr,
          w
          我的意思
          从vbap到表@DATA(it_vbap)中的netwr
          对于@it_vbak中的所有条目
          在哪里vbeln EQ @ it_vbak-vbeln。
   如果sy-subrc = 0。
     SELECT matnr,
            maktx从makt到表@DATA(it_makt)
            对于@it_vbap中的所有条目
            matnr EQ @ it_vbap-matnr在哪里。
   ENDIF。

这样,代码更易于阅读和理解。

此外,最好将IT_VBAP,IT_MAKT和IT_KNA1定义为排序的内部表,因为 在LOOP中从这些表中读取数据。 将它们定义为排序类型(TYPE SORTED TABLE OF),并使用用于读取的键,可以使报表的性能更好。

此致

Mateusz

打个大熊猫
4楼-- · 2020-08-18 21:09
< p> Manoj Kumar ,很高兴您现在又走了一步,但是仍有一些问题需要通过编码解决 我以及马特乌斯都提到过:

1。 如果从表VBAP中选择选项FOR ALL ENTRIES,请确保该表不是初始表,否则,将选择所有值:

如果it_vbak []不是INITIAL。  ",确保在使用FOR ALL ENTRIES时it_vbak不是初始的
       选择vbeln,posnr,matnr,kwmeng,meins,netwr
             从vbap到表@DATA(it_vbap)
             对于@it_vbak中的所有条目
             在哪里vbeln EQ @ it_vbak-vbeln。
 ENDIF。

2。 如果使用READ TABLE,请确保处理sy-subrc = 0或初始化字段,否则,如果缺少匹配项,则可能会以其他记录中的值结尾:

 APPEND wa  
CLEAR:wa,wa_vbak,wa_vbap,wa_makt。

3。 当前,您正在为客户选择所有可能的VBAK订单,以及为VBAK订单选择所有VBAP头寸,但是您没有将这些订单转移到ALV,这是故意的吗? 截至目前,您只需要从VBAK以及从VBAP到ALV的一个订单中选择一个"随机"匹配。 要解决此问题,您将不得不在it_vbak上做一个LOOP而不是在READ TABLE it_vbak上做同样的处理: 使用密钥kunnr = wa_knal-kunnr在it_vbak上输入数据(wa_vbak)。 用键vbeln = wa_vbak-vbeln循环到it_vbap INTO数据(wa_vbap)。 使用键matnr = wa_vbap-matnr读取表it_​​makt INTO数据(wa_makt)。 wa-kunnr = wa_vbak-kunnr。 wa-name1 = wa_knal-name1。 wa-vbeln = wa_vbap-vbeln。 wa-audat = wa_vbak-audat。 wa-posnr = wa_vbap-posnr。 wa-matnr = wa_makt-matnr。 wa-kwmeng = wa_vbap-kwmeng。 wa-meins = wa_vbap-meins。 wa-netwr = wa_vbap-netwr。 wa-maktx = wa_makt-maktx。 附加到它。 清除:wa,wa_makt。 结局。 结局。 ENDLOOP。

4。 当前,您从语言相关的描述表MAKT中选择没有首选语言的材料描述(例如SPRAS = sy-langu),因此将选择所有语言描述。 而且当您循环播放时,您也无法解决此问题,而且您也无法解决,因为您没有选择语言。

clasier
5楼-- · 2020-08-18 21:15

感谢您 Mateusz Adamus ..!

一周热门 更多>