LOOP GROUP用法

1

分组

136f4e83d26d13ef7d37c7b4693fbc2a.png

根据维度分组,处理内表中不同维度值的数据

TYPES:BEGIN OF ty_alv,        matnr    TYPE marc-matnr, "物料        werks    TYPE marc-werks, "工厂        bdmng    TYPE resb-bdmng, "数量        zj       TYPE  resb-bdmng, "汇总        checkbox TYPE char1, "选择框      END OF ty_alv.DATA: gt_alv TYPE TABLE OF ty_alv, "      gs_alv TYPE ty_alv.gt_alv = VALUE #( ( matnr = 'AAA' werks = '1000' bdmng = '10.1' checkbox = 'X')                  ( matnr = 'BBB' werks = '2000' bdmng = '10.2' checkbox = 'X')                  ( matnr = 'AAA' werks = '1000' bdmng = '10.3' )                  ( matnr = 'BBB' werks = '2000' bdmng = '10.4' )                  ( matnr = 'AAA' werks = '2000' bdmng = '10.5' )                  ( matnr = 'BBB' werks = '2000' bdmng = '10.6' )                 )."根据物料和工厂维度分组LOOP AT gt_alv INTO gs_alv GROUP BY ( matnr = gs_alv-matnr                                       werks = gs_alv-werks ).  WRITE: / '组           ',gs_alv-matnr,gs_alv-werks.  CLEAR:lv_item.  LOOP AT GROUP gs_alv ASSIGNING FIELD-SYMBOL().    lv_item = lv_item + 1.    WRITE: / ' ',lv_item,-matnr,-werks,-bdmng.  ENDLOOP.  CLEAR:gs_alv.ENDLOOP.

维度分组结果

11a516192558229cf9ba365488332741.png

2

同维度处理

1c40332695b3fb87e87f4e9a71896ba6.png

比如在ALV中经常会将选中行的相同维度的行项目都选中,也可以通过该方法实现

比如勾选了两行数据

898608a36a8be92a9fd80694adedb408.png

 按照维度分组,直接更新选择框

"将选中行的相同维度的行都选中LOOP AT gt_alv INTO gs_alv WHERE checkbox = 'X' GROUP BY ( matnr = gs_alv-matnr                                                             werks = gs_alv-werks ).  MODIFY gt_alv FROM gs_alv TRANSPORTING checkbox WHERE matnr = gs_alv-matnr                                                     AND werks = gs_alv-werks.  CLEAR:gs_alv.ENDLOOP.

结果如下

2743b2effc52c50ec714cdda267c98e6.png

3

分组行数

8144f8472c1156f31366449dd03b5dd2.png

比如想知道每组的行数,用来在最后一行显示同维度数量总计,可以使用GROUP SIZE

DATA:lv_count TYPE i, "行计数器     lv_bdmng TYPE resb-bdmng. "数量LOOP AT gt_alv INTO gs_alv GROUP BY ( matnr = gs_alv-matnr                                       werks = gs_alv-werks                                      size = GROUP SIZE )                                      INTO DATA(ls_key).  CLEAR:lv_bdmng,lv_count.  LOOP AT GROUP ls_key ASSIGNING FIELD-SYMBOL().    lv_count = lv_count + 1."计数器    lv_bdmng = lv_bdmng + -bdmng."数量累加    IF ls_key-size = lv_count."最后一行      -zj = lv_bdmng."总计    ENDIF.  ENDLOOP.  CLEAR:gs_alv.ENDLOOP.

结果如下

f3955475c294e022c872ad11b378928d.png

再比如,进行数量分摊。将分摊数量,按照各行数量在本维度中的占比,根据比例进行分摊。分摊到最后一行,将最终剩余的分摊数量全部分摊到这一行中,避免因为比例计算而产生尾差

TYPES:BEGIN OF ty_alv,        matnr TYPE marc-matnr, "物料        werks TYPE marc-werks, "工厂        bdmng TYPE resb-bdmng, "数量        zftsl TYPE resb-bdmng, "分摊数量      END OF ty_alv.DATA: gt_alv TYPE TABLE OF ty_alv, "      gs_alv TYPE ty_alv.DATA:lv_count  TYPE i, "行计数器     lv_ftzs   TYPE resb-bdmng, "分摊总数     lv_syftsl TYPE resb-bdmng, "剩余分摊数量     lv_bdmng  TYPE resb-bdmng. "数量"只用同一维度的数据来简单举例gt_alv = VALUE #( ( matnr = 'AAA' werks = '1000' bdmng = '1' )                  ( matnr = 'AAA' werks = '1000' bdmng = '2' )                  ( matnr = 'AAA' werks = '1000' bdmng = '3' )                  ( matnr = 'AAA' werks = '1000' bdmng = '4' )                 )."按照物料工厂分组LOOP AT gt_alv INTO gs_alv GROUP BY ( matnr = gs_alv-matnr                                       werks = gs_alv-werks                                      size = GROUP SIZE )                                      INTO DATA(ls_key).  lv_syftsl = lv_ftzs = 100."需要分摊的总数  "先计算同维度数量之和。这个也可以放在其他地方计算,写在此处是为了展示在LOOP中可以多次进行LOOP AT GROUP循环  CLEAR:lv_bdmng.  LOOP AT GROUP ls_key ASSIGNING FIELD-SYMBOL().    lv_bdmng = lv_bdmng + -bdmng."数量累加  ENDLOOP.  "再次循环进行分摊  LOOP AT GROUP ls_key ASSIGNING .    lv_count = lv_count + 1."计数器    IF ls_key-size = lv_count."最后一行      -zftsl = lv_syftsl."分摊数量    ELSE."不是最后一行      "分摊数量 = 分摊总数 * 分配比例(分配比例 = 本行数量 / 该维度总数量)      <fs_alv>-zftsl = lv_ftzs * <fs_alv>-bdmng / lv_bdmng.      lv_syftsl = lv_syftsl - <fs_alv>-zftsl."剩余分摊数量 = 剩余分摊数量 - 分摊数量    ENDIF.  ENDLOOP.  CLEAR:gs_alv.ENDLOOP.

最终结果

1737c4ccc6d8657bc4ac5142c0924cb1.png

—— 希望本篇文章对您有所帮助 ——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值