都是项目中实际总结出来的,原创不易,如果对你有用请点赞,谢谢。
需要修改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:用来刷排序,过滤等