案例:ALV SUBTOTAL 中修改计算公式和文本

都是项目中实际总结出来的,原创不易,如果对你有用请点赞,谢谢。

需要修改subtotal行的计算公式或者是显示文本内容时,可以参考以下实现方式。

subtotal_text事件,在我的案例中不能触发。因而我使用了其它方式实现,更加好用。

我的需求是要根据bom成品物料号排序后,在subtotal行上,增加显示某个组件物料号及其

描述。当然参考下面方式,还可以按需将subtotal行的汇总值修改为其它计算公式,如求平均等。

ALV事件:after_refresh

ALV method:get_subtotals

话不多说,代码实现方式如下:

FORM handle_after_refresh .
  DATA: total TYPE REF TO data,
        subtotal1 TYPE REF TO data,
        subtotal2 TYPE REF TO data,
        subtotal3 TYPE REF TO data.
  DATA:
         ls_stbl    TYPE lvc_s_stbl.

  DATA: lv_exit  .


  FIELD-SYMBOLS <total> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <wa_total> TYPE ty_output.
  DATA ls_output TYPE ty_output.
  FIELD-SYMBOLS <subtotal1> TYPE ty_output.
  FIELD-SYMBOLS <subtotal2> TYPE ty_output.
  FIELD-SYMBOLS <subtotal3> TYPE ty_output.

  CALL METHOD g_grid->get_subtotals
    IMPORTING
      ep_collect00 = total
      ep_collect01 = subtotal1
      ep_collect02 = subtotal2
      ep_collect03 = subtotal3.

  ASSIGN subtotal3->* TO <total>.
*  ASSIGN subtotal1->* TO <subtotal1>.
*  ASSIGN subtotal2->* TO <subtotal2>.
*  ASSIGN subtotal3->* TO <subtotal3>.




  LOOP AT <total> ASSIGNING <wa_total> .

    IF  <wa_total>-idnrk IS NOT INITIAL .

      lv_exit = 'X' .
    ELSE.

      LOOP AT gt_output INTO ls_output WHERE werks = <wa_total>-werks
                                          AND  matnr = <wa_total>-matnr AND ( mtart_zj = 'ZHAL' OR  mtart_zj = 'ZROH' ).

        <wa_total>-idnrk = ls_output-idnrk.
        <wa_total>-maktx1 = ls_output-maktx1.

      ENDLOOP.
      IF sy-subrc <>  0 .

        lv_exit = 'X' .

      ENDIF.




    ENDIF.




  ENDLOOP.
  IF lv_exit  IS INITIAL  .

*    ls_stbl-row = 'X'.
*    ls_stbl-col = 'X'.
*
*   CALL METHOD g_grid->refresh_table_display."死循环

    CALL METHOD g_grid->refresh_table_display
      EXPORTING
        i_soft_refresh = 'X'."不刷新数据只是刷新图标,排序,过滤之类
*    CALL METHOD cl_gui_control=>set_focus
*      EXPORTING
*        control = g_grid.
*    CALL METHOD cl_gui_cfw=>flush.
  ENDIF.
ENDFORM.     

注意:

修改get_subtotals 的内表后,使用refresh_table_display更新,会继续进入到after_refresh,

需要将i_soft_refresh = 'X'.才能更新。否则进入死循环。

IS_STABLE :用来刷数据

I_SOFT_REFRESH:用来刷排序,过滤等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值