新的 ABAP 语法而不是 COLLECT

Posted

技术标签:

【中文标题】新的 ABAP 语法而不是 COLLECT【英文标题】:New ABAP syntax instead of COLLECT 【发布时间】:2020-01-15 03:25:44 【问题描述】:

目前,我有这个编码,它工作得非常好:

      TYPES: BEGIN OF tty_ekpo,
               ebeln TYPE ebeln,
               ebelp TYPE ebelp,
             END OF tty_ekpo.
      DATA: lt_ekpo TYPE TABLE OF tty_ekpo,
            ls_ekpo LIKE LINE OF lt_ekpo.
      LOOP AT gt_lopdata ASSIGNING FIELD-SYMBOL(<fs_collect>).
        ls_ekpo-ebeln = <fs_collect>-ebeln.
        ls_ekpo-ebelp = <fs_collect>-ebelp.
        COLLECT ls_ekpo INTO lt_ekpo.
      ENDLOOP.

我想对新语法做同样的事情,可以吗? 如果是,怎么做?

【问题讨论】:

【参考方案1】:

要回答我自己的问题,结果将是这样的:

TYPES: BEGIN OF ty_ekpo,
         ebeln TYPE ebeln,
         ebelp TYPE ebelp,
         netwr TYPE ekpo-netwr,
         matnr type ekpo-matnr,
       END OF ty_ekpo,
       tty_ekpo TYPE STANDARD TABLE OF ty_ekpo WITH EMPTY KEY.


DATA: it_ekpo TYPE SORTED TABLE OF ty_ekpo WITH UNIQUE KEY ebeln ebelp.
DATA(lt1_ekpo) = VALUE tty_ekpo(
             FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
             LET coll_line = REDUCE #( INIT line TYPE ty_ekpo FOR <m> IN GROUP <group_key>
                                       NEXT line-ebeln = <m>-ebeln 
                                            line-ebelp = <m>-ebelp 
                                            line-netwr = line-netwr + <m>-netwr
                                            line-matnr = <m>-matnr )
                             IN ( coll_line ) ) .

【讨论】:

【参考方案2】:

好吧,我不同意 Joszsef 变体,因为加法 WITHOUT MEMBERS 会生成所有组键值,它会自动将数字字段与 COLLECT 相加。为此,您需要采取其他措施。

这是适合您的需求并收集 NETWR 字段的增强型 Joszef 变体:

  TYPES: BEGIN OF ty_ekpo,
             ebeln TYPE ebeln,
             ebelp TYPE ebelp,
             netwr TYPE ekpo-netwr,
           END OF ty_ekpo,
           tty_ekpo TYPE STANDARD TABLE OF ty_ekpo WITH EMPTY KEY.
  DATA: it_ekpo TYPE SORTED TABLE OF ty_ekpo WITH UNIQUE KEY ebeln ebelp.

DATA(lt1_ekpo) = VALUE tty_ekpo(
                 FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
                 LET coll_line = REDUCE #( INIT line TYPE ty_ekpo FOR <m> IN GROUP <group_key>
                                           NEXT line-ebeln = <m>-ebeln line-ebelp = <m>-ebelp line-netwr = line-netwr + <m>-netwr )
                                 IN ( coll_line ) ) .

基于两个 REDUCE 的另一种风味:

DATA(lt2_ekpo) = REDUCE tty_ekpo( INIT cline = VALUE tty_ekpo( )
                 FOR GROUPS <group_key> OF <g> IN it_ekpo GROUP BY ( ebeln = <g>-ebeln ebelp = <g>-ebelp )
                 NEXT cline = VALUE #( BASE cline ( ebeln = <group_key>-ebeln ebelp = <group_key>-ebelp
                                                    netwr = REDUCE netwr( INIT val TYPE netwr
                                                                          FOR wa IN
                                                                          FILTER #( it_ekpo WHERE ebeln = <group_key>-ebeln AND ebelp = <group_key>-ebelp )
                                                                          NEXT val = val + wa-netwr ) ) ) ).

我看到您在原始帖子中也没有进行总结,您只是将关键字段收集到表格中。如果这是你需要的,Joszef sn-p 就可以了。只是注意到COLLECT 的作用不止于此。

【讨论】:

我只需要ebelnebelp 用于所有条目。 好吧,那么 Joszef 的变种就可以了 如果我们在这个表中有一个 MATNR 字段 - 并且所有由 ebeln 和 ebelp 组合在一起的行都是相同的 - 我们如何在结果表中传输它?目前该字段为空。 @kdobrev 对于第一个变体,您应该扩展 ty_ekpo 类型并在 NEXT 语句中从 itab 传输它,如下所示 NEXT line-matnr = &lt;m&gt;-matnr line-ebeln = &lt;m&gt;-ebeln line-ebelp = .. 【参考方案3】:

我用这个:

lt_ekpo = VALUE #( FOR GROUPS ebelnebelp OF <ls_collect> IN gt_lopdata
                   GROUP BY ( ebeln = <ls_collect>-ebeln
                              ebelp = <ls_collect>-ebelp )
                   ASCENDING WITHOUT MEMBERS ( ebelnebelp ) ).

【讨论】:

ABAP 文档:FOR GROUPS ... GROUP BY.

以上是关于新的 ABAP 语法而不是 COLLECT的主要内容,如果未能解决你的问题,请参考以下文章

abap中,怎么样用read获得内表中某一特定的字段值,而不是整条数据。

关于SAP ABAP程序中出现的奇奇怪怪的错误

Abap新语法里替代loop at啥语法[破涕为笑]

ABAP基础-动态数据对象

SAP ABAP语法 Select single 和 FOR ALL ENTRIES IN 到底哪个性能更好

ABAP系列SAP ABAP7.40新语法简介第一篇