Material Document 中相同的工厂物料库存地点下显示不同的movement type对应的quantity及SUM

博客介绍了如何在ALV报表中动态展示不同movement type的库存数量,解决在Material Document中同一库存地点下,多个movement type对应quantity的展示问题。通过使用Dynamic Columns Display技术,实现了库存数据的灵活展示和汇总。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为movement type到底有多少种是不确定的,所以这个时候就用到了Dynamic Columns Display in ALV

Source code:

 

REPORT  yiris_dynamic_alv4.
TYPE-POOLS: slis.
TABLES: mseg, mkpf.
TYPES: BEGIN OF ty_sum,
      werks LIKE mseg-werks,
      matnr LIKE mseg-matnr,
      lgort LIKE mseg-lgort,
      bwart LIKE mseg-bwart,
      menge LIKE mseg-menge,
      END OF ty_sum.

TYPES: BEGIN OF ty_bwart,
      bwart LIKE mseg-bwart,
       END OF ty_bwart.

DATA: it_tab TYPE TABLE OF ty_sum,
      wa_tab TYPE  ty_sum,
      hash_it_sum TYPE HASHED TABLE OF ty_sum
      WITH UNIQUE KEY werks matnr lgort bwart,
      wa_sum TYPE ty_sum,
       itab_sum TYPE TABLE OF ty_sum.

DATA: hash_it_bwart TYPE HASHED TABLE OF ty_bwart
                WITH UNIQUE KEY bwart ,
      wa_hs_bwart TYPE ty_bwart,
       itab_bwart TYPE TABLE OF ty_bwart.

DATA: gv_no(2) TYPE n,
      txt(20)  TYPE c ,
      wa_fcat  TYPE lvc_s_fcat,
      it_fcat  TYPE lvc_t_fcat.

DATA: dy_table TYPE REF TO data,
      dy_line  TYPE REF TO data.

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>,
               <dyn_field>.
DATA: gd_fieldcat TYPE slis_t_fieldcat_alv.
SELECT-OPTIONS: s_mblnr FOR mseg-mblnr,"Material Document No.
                s_budat FOR mkpf-budat."Posting Date

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM fix_data.
  PERFORM fieldcat_init."整 理 下 fieldcat 进 行 显 示

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat        = gd_fieldcat[]
    TABLES
      t_outtab           = <dyn_table>
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.

FORM get_data .
  SELECT werks matnr lgort bwart "Movement Type
         menge "Quantity
         INTO TABLE it_tab
   FROM mkpf INNER JOIN mseg ON
        mkpf~mblnr = mseg~mblnr "Material Document No.
      AND mkpf~mjahr = mseg~mjahr "Material Document Year
    WHERE mkpf~mblnr IN s_mblnr
     AND  mkpf~budat IN s_budat.
ENDFORM.                    " get_data
FORM fix_data .
  DATA: index TYPE sy-tabix.
  LOOP AT it_tab INTO wa_tab.
*计 算 同 一 个 工 厂、 物 料、storage loaction,不 同 的movement type 的 quantity 的 SUM
    wa_sum = wa_tab.
    COLLECT wa_sum INTO hash_it_sum.
*无 重 复 的 获 得 movement type都 有 哪 些
    wa_hs_bwart = wa_tab-bwart.
    COLLECT wa_hs_bwart INTO hash_it_bwart.
  ENDLOOP.

  SORT hash_it_bwart.
  itab_bwart[] = hash_it_bwart[].
  itab_sum[] = hash_it_sum[].

  PERFORM create_itab_out.

  LOOP AT itab_sum INTO wa_sum..
    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = wa_sum-werks.
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = wa_sum-matnr.
    ASSIGN COMPONENT 'LGORT' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = wa_sum-lgort.

*在 不 确 定 列 名 的 时 候 ,可 以 用 index 来 访 问 该 列
    READ TABLE itab_bwart TRANSPORTING NO FIELDS  WITH KEY bwart =
wa_sum-bwart.
    index = sy-tabix + 3.
    ASSIGN COMPONENT index OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = wa_sum-menge.

    ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = wa_sum-menge.

    COLLECT <dyn_wa> INTO <dyn_table>.
    CLEAR: <dyn_wa>.
  ENDLOOP.
ENDFORM.                    " fix_data
FORM create_itab_out .
  CLEAR: gv_no .
  PERFORM build_itab_stru USING: 'WERKS' 'MSEG' 'WERKS' ,
                                    'MATNR' 'MSEG' 'MATNR' ,
                                    'LGORT' 'MSEG' 'LGORT' .

  LOOP AT  hash_it_bwart INTO wa_hs_bwart.
    gv_no = gv_no + 1.
    CONCATENATE 'MENGE' gv_no INTO txt.
    PERFORM build_itab_stru USING txt 'MSEG' 'MENGE'.
  ENDLOOP.

  PERFORM build_itab_stru USING 'LINE_SUM' 'MSEG' 'MENGE'.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = it_fcat
    IMPORTING
      ep_table        = dy_table.
*如 果 定 义 时 没 有 指 定 类 型 或 者 结 构 ,那 么 REF 必 须 ASSIGN
*到 另 外 一 个 FS 里 间 接 使 用
  ASSIGN dy_table->* TO <dyn_table>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

ENDFORM.                    " create_itab_out

FORM build_itab_stru USING fdname ref_t ref_f.
  wa_fcat-fieldname = fdname .
  wa_fcat-ref_table = ref_t.
  wa_fcat-ref_field = ref_f.
  APPEND wa_fcat TO it_fcat.
ENDFORM.                    "build_itab_stru
FORM fieldcat_init .
  CLEAR gv_no .
  PERFORM frm_catlg_set USING: 'WERKS'   'Plant' 'X' ,
                                 'MATNR'   'Material No.' 'X' ,
                                 'LGORT'   'Storage Location' 'X' .
  LOOP AT itab_bwart INTO wa_hs_bwart  .
    gv_no = gv_no + 1.
    CONCATENATE 'MENGE' gv_no INTO txt.
    PERFORM frm_catlg_set USING: txt wa_hs_bwart-bwart '' .
  ENDLOOP.
  PERFORM frm_catlg_set USING: 'LINE_SUM' 'SUM' '' .

ENDFORM.                    " fieldcat_init

FORM frm_catlg_set USING p_field
                         p_text
                         p_key.
  DATA: ls_fieldcat TYPE slis_fieldcat_alv.

  ls_fieldcat-fieldname     = p_field.
  ls_fieldcat-seltext_l   = p_text.
  ls_fieldcat-key           = p_key.

  IF p_field = 'LINE_SUM'.
    ls_fieldcat-emphasize = 'C700'.
  ENDIF.
  APPEND ls_fieldcat TO  gd_fieldcat.
  CLEAR ls_fieldcat .
ENDFORM.                    "frm_catlg_set


Output:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值