动态移动类型列显示物料移动

REPORT Z_BARRY_TEST_FIELDSYMOLS.
TYPE-POOLSSLIS.

TABLESMSEG,
        MKPF.

DATAGD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATASLA         TYPE SLIS_LAYOUT_ALV,
      IVARIANT    LIKE DISVARIANT,
      I_REPID     LIKE SY-REPID,
      I_EXCLUDING TYPE SLIS_T_EXTAB.

TYPESBEGIN 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.

DATA ITAB TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
DATA HS_SUM TYPE HASHED TABLE OF TY_SUM WITH UNIQUE KEY WERKS MATNR LGORT BWART WITH HEADER LINE .
DATA ITAB_SUM TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .

TYPESBEGIN OF TY_BWART ,
         BWART LIKE MSEG-BWART,
       END OF TY_BWART.

DATA HS_BWART TYPE HASHED TABLE OF TY_BWART WITH UNIQUE KEY BWART WITH HEADER LINE .
DATA ITAB_BWART TYPE STANDARD TABLE OF TY_BWART WITH HEADER LINE .

FIELD-SYMBOLS<F_FS1> ,
               <F_OUT>    TYPE STANDARD TABLE,
               <F_OUT_WA> .

DATAMAX_COUNT TYPE I,
      DY_OUT    TYPE REF TO DATA,
      DY_OUT_WA TYPE REF TO DATA,
      XFC       TYPE LVC_S_FCAT,
      IFC       TYPE LVC_T_FCAT.
DATAC(2)    TYPE N,
      TXT(20TYPE C.

SELECT-OPTIONS:
S_MATNR FOR MSEG-MATNR,
S_MBLNR FOR MSEG-MBLNR,
S_BUDAT FOR MKPF-BUDAT.
PARAMETERS:     P_SUM AS CHECKBOX .

START-OF-SELECTION.
  PERFORM GETDATA.
  PERFORM FIXDATA.
  IF P_SUM 'X'.
    PERFORM OUTDATA.
  ELSE.
    PERFORM OUTDATA2.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form GETDATA
*&---------------------------------------------------------------------*
FORM GETDATA.
  SELECT
    WERKS
    MATNR
    LGORT
    BWART
    MENGE
    INTO TABLE ITAB
  FROM MKPF
    INNER JOIN MSEG ON MKPF~MBLNR MSEG~MBLNR
                   AND MKPF~MJAHR MSEG~MJAHR
  WHERE MKPF~MBLNR IN S_MBLNR
    AND MKPF~BUDAT IN S_BUDAT
    AND MSEG~MATNR IN S_MATNR.
ENDFORM.                    " GETDATA
*&---------------------------------------------------------------------*
*&      Form FIXDATA
*&---------------------------------------------------------------------*
FORM FIXDATA.

  DATAINDEX LIKE SY-TABIX .

  LOOP AT ITAB.
    HS_SUM ITAB."汇总成唯一值
    COLLECT HS_SUM.

    HS_BWART ITAB-BWART ."所有的唯一移动类型
    COLLECT HS_BWART.
  ENDLOOP.

  SORT HS_BWART.

  ITAB_BWART[] HS_BWART[]."赋值给标准表

  ITAB_SUM[] HS_SUM[]."赋值给标准表

  PERFORM CREAT_ITAB_OUT."动态列的构造

  LOOP AT ITAB_SUM.
    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> ITAB_SUM-WERKS.

    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> ITAB_SUM-MATNR.

    ASSIGN COMPONENT 'LGORT' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> ITAB_SUM-LGORT.

    READ TABLE ITAB_BWART WITH KEY BWART ITAB_SUM-BWART .
    INDEX SY-TABIX + 3."查找到的位置加3就是当前写入的位置

    ASSIGN COMPONENT INDEX OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> ITAB_SUM-MENGE.

    ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> ITAB_SUM-MENGE.

    COLLECT <F_OUT_WA> INTO <F_OUT> .
    CLEAR <F_OUT_WA>.
  ENDLOOP.

ENDFORM.                    " FIXDATA
*&---------------------------------------------------------------------*
*&      Form outdata
*&---------------------------------------------------------------------*
FORM OUTDATA.
  PERFORM FIELDCAT_INIT .
  SLA-COLWIDTH_OPTIMIZE 'X'.
  SLA-ZEBRA             'X'.
  I_REPID SY-REPID.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM I_REPID
      IT_FIELDCAT        GD_FIELDCAT[]
      I_SAVE             'A'
      IS_VARIANT         IVARIANT
      IS_LAYOUT          SLA
      IT_EXCLUDING       I_EXCLUDING
*     i_callback_user_command = 'USER_COMMAND'
    TABLES
      T_OUTTAB           ITAB_SUM
    EXCEPTIONS
      PROGRAM_ERROR      1
      OTHERS             2.
ENDFORM.                    " outdata
*---------------------------------------------------------------------*
*       FORM fieldcat_init                                            *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT .
  PERFORM FRM_CATLG_SET USING:
        'WERKS'     'WERKS' 'X' ,
        'MATNR'     'MATNR' 'X' ,
        'LGORT'     'LGORT' 'X' ,
        'BWART'     'BWART' '' ,
        'MENGE'     'MENGE' '' .
ENDFORM.                    "fieldcat_init
*---------------------------------------------------------------------*
*       FORM frm_catlg_set                                            *
*---------------------------------------------------------------------*
FORM FRM_CATLG_SET USING
                          P_FIELD
                          P_TEXT
                          P_KEY.
  DATALS_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
*&--------------------------------------------------------------------*
*&      Form user_command
*&--------------------------------------------------------------------*
*FORM user_command USING r_ucomm LIKE sy-ucomm
*                    rs_selfield TYPE slis_selfield.
* READ TABLE itab INDEX rs_selfield-tabindex.
* CASE r_ucomm.
*    WHEN '&IC1'. "双击
*
*    WHEN 'EXIT'.
*      LEAVE PROGRAM.
* ENDCASE.
** rs_selfield-refresh = 'X'. "自动刷新
*ENDFORM. "user_com
*---------------------------------------------------------------------*
*       FORM outdata2                                                 *
*---------------------------------------------------------------------*
FORM OUTDATA2.
  PERFORM FIELDCAT_INIT2 .
  SLA-COLWIDTH_OPTIMIZE 'X'.
  SLA-ZEBRA             'X'.
  I_REPID SY-REPID.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM I_REPID
      IT_FIELDCAT        GD_FIELDCAT[]
      I_SAVE             'A'
      IS_VARIANT         IVARIANT
      IS_LAYOUT          SLA
      IT_EXCLUDING       I_EXCLUDING
    TABLES
      T_OUTTAB           <F_OUT>
    EXCEPTIONS
      PROGRAM_ERROR      1
      OTHERS             2.
ENDFORM.                    " outdata
*---------------------------------------------------------------------*
*       FORM fieldcat_init2                                           *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT2 .
  CLEAR .
  PERFORM FRM_CATLG_SET USING:
        'WERKS'   'WERKS' 'X' ,
        'MATNR'   'MATNR' 'X' ,
        'LGORT'   'LGORT' 'X' .
  LOOP AT HS_BWART .
    1.
    CONCATENATE 'MENGE' INTO TXT.
    PERFORM FRM_CATLG_SET USINGTXT HS_BWART-BWART '' .
  ENDLOOP.
  PERFORM FRM_CATLG_SET USING'LINE_SUM' 'SUM' '' .
ENDFORM.                    "fieldcat_init
*---------------------------------------------------------------------*
*       FORM creat_itab_out                                           *
*---------------------------------------------------------------------*
FORM CREAT_ITAB_OUT.
  CLEAR C."C是字符数字型累加的

  "前面三列是固定的
  PERFORM BUILD_ITAB_STRU USING:
        'WERKS' 'MSEG' 'WERKS' ,
        'MATNR' 'MSEG' 'MATNR' ,
        'LGORT' 'MSEG' 'LGORT' .

  "动态列
  LOOP AT HS_BWART.
    1.
    CONCATENATE 'MENGE' INTO TXT.
    PERFORM BUILD_ITAB_STRU USINGTXT 'MSEG' 'MENGE' .
  ENDLOOP.

  "汇总数
  PERFORM BUILD_ITAB_STRU USING'LINE_SUM' 'MSEG' 'MENGE' .

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG IFC
    IMPORTING
      EP_TABLE        DY_OUT.
  ASSIGN DY_OUT->TO <F_OUT>.
  CREATE DATA DY_OUT_WA LIKE LINE OF <F_OUT>.
  ASSIGN DY_OUT_WA->TO <F_OUT_WA>.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM build_itab_stru                                          *
*---------------------------------------------------------------------*
FORM BUILD_ITAB_STRU USING FDNAME REF_T REF_F.
  XFC-FIELDNAME FDNAME .
  XFC-REF_TABLE REF_T.
  XFC-REF_FIELD REF_F.
  APPEND XFC TO IFC.

ENDFORM.

动态移动类型列显示物料移动