Material Document 中相同的工廠物料庫存地點下顯示不同的movement type對應的quantity及SUM

因爲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:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章