动态ALV表实例-移动类型汇总

TABLES:MSEG,MAKT.
"定义结构
TYPES:BEGIN OF TY_DATA,
        MJAHR      LIKE MSEG-MJAHR, "物料凭证的年份
        MBLNR      LIKE MSEG-MBLNR, "物料凭证
        BWART      LIKE MSEG-BWART, "移动类型
        XAUTO      LIKE MSEG-XAUTO, "是否自动创建
        MATNR      LIKE MSEG-MATNR, "物料编码
        MAKTX      LIKE MAKT-MAKTX, "物料描述
        WERKS      LIKE MSEG-WERKS, "工厂
        LGORT      LIKE MSEG-LGORT, "库位
        CHARG      LIKE MSEG-CHARG, "批次
        MENGE      LIKE MSEG-MENGE, "基本单位数量
        MEINS      LIKE MSEG-MEINS, "基本单位
        ERFMG      LIKE MSEG-ERFMG, "录入数量
        ERFME      LIKE MSEG-ERFME, "录入单位
        BUDAT_MKPF LIKE MSEG-BUDAT_MKPF, "过账日期
        CPUDT_MKPF LIKE MSEG-CPUDT_MKPF, "输入日期
        CPUTM_MKPF LIKE MSEG-CPUTM_MKPF, "输入时间
        USNAM_MKPF LIKE MSEG-USNAM_MKPF, "用户名
      END OF TY_DATA.
TYPES:BEGIN OF TY_DATA1,
*        MJAHR      LIKE MSEG-MJAHR, "物料凭证的年份
*        MBLNR      LIKE MSEG-MBLNR, "物料凭证
        WERKS LIKE MSEG-WERKS, "工厂
        LGORT LIKE MSEG-LGORT, "库位
        MATNR LIKE MSEG-MATNR, "物料编码
        MAKTX LIKE MAKT-MAKTX, "物料描述
        BWART LIKE MSEG-BWART, "移动类型
*        XAUTO      LIKE MSEG-XAUTO, "是否自动创建
*        CHARG      LIKE MSEG-CHARG, "批次
        MENGE LIKE MSEG-MENGE, "基本单位数量
        MEINS LIKE MSEG-MEINS, "基本单位
*        ERFMG      LIKE MSEG-ERFMG, "录入数量
*        ERFME      LIKE MSEG-ERFME, "录入单位
*        BUDAT_MKPF LIKE MSEG-BUDAT_MKPF, "过账日期
*        CPUDT_MKPF LIKE MSEG-CPUDT_MKPF, "输入日期
*        CPUTM_MKPF LIKE MSEG-CPUTM_MKPF, "输入时间
*        USNAM_MKPF LIKE MSEG-USNAM_MKPF, "用户名
      END OF TY_DATA1.
TYPES:BEGIN OF TY_DATA2,
*        MJAHR      LIKE MSEG-MJAHR, "物料凭证的年份
*        MBLNR      LIKE MSEG-MBLNR, "物料凭证
*        WERKS      LIKE MSEG-WERKS, "工厂
*        LGORT      LIKE MSEG-LGORT, "库位
*        MATNR      LIKE MSEG-MATNR, "物料编码
*        MAKTX      LIKE MAKT-MAKTX, "物料描述
        BWART LIKE MSEG-BWART, "移动类型
*        XAUTO      LIKE MSEG-XAUTO, "是否自动创建
*        CHARG      LIKE MSEG-CHARG, "批次
*        MENGE      LIKE MSEG-MENGE, "基本单位数量
*        MEINS      LIKE MSEG-MEINS, "基本单位
*        ERFMG      LIKE MSEG-ERFMG, "录入数量
*        ERFME      LIKE MSEG-ERFME, "录入单位
*        BUDAT_MKPF LIKE MSEG-BUDAT_MKPF, "过账日期
*        CPUDT_MKPF LIKE MSEG-CPUDT_MKPF, "输入日期
*        CPUTM_MKPF LIKE MSEG-CPUTM_MKPF, "输入时间
*        USNAM_MKPF LIKE MSEG-USNAM_MKPF, "用户名
      END OF TY_DATA2.
DATA:IT_DATA TYPE STANDARD TABLE OF TY_DATA,
     WA_DATA TYPE TY_DATA.
DATA:IT_DATA1 TYPE STANDARD TABLE OF TY_DATA1,
     WA_DATA1 TYPE TY_DATA1.
DATA:IT_DATA2 TYPE STANDARD TABLE OF TY_DATA2,
     WA_DATA2 TYPE TY_DATA2.
DATA:N TYPE I.
DATA: IT_TABLE     TYPE REF TO DATA,
      IT_STRUCTURE TYPE LVC_T_FCAT,
      WA_STRUCTURE TYPE LVC_S_FCAT.
DATA: WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
      IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      WA_LAYOUT   TYPE LVC_S_LAYO.
DATA: G_TITLE    TYPE LVC_TITLE.
"FIELD SYMBOLS
FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
               <DYN_WA>,
               <DYN_FIELD>.
"定义屏幕
SELECTION-SCREEN BEGIN OF BLOCK BLK01.
SELECT-OPTIONS:S_WERKS FOR MSEG-WERKS,"工厂
               S_LGORT FOR MSEG-LGORT,"库位
               S_MATNR FOR MSEG-MATNR,"物料
               S_BUDAT FOR MSEG-BUDAT_MKPF,"过账日期
               S_CPUDT FOR MSEG-CPUDT_MKPF,"输入日期
               S_BWART FOR MSEG-BWART,"移动类型
               S_USNAM FOR MSEG-USNAM_MKPF."username
SELECTION-SCREEN END OF BLOCK BLK01.
"主程序

START-OF-SELECTION.
  PERFORM GET_DATA."取数
  PERFORM CREAT_STRUCTURE."创建内表结构
  PERFORM CREAT_TABLE."按照结构定义内表
  PERFORM DATA_TO_TABLE."写数据进内表
  PERFORM FRM_INIT_LAYOUT.
  PERFORM FRM_SHOW_ALV."内表数据展示
FORM GET_DATA.
  SELECT
  MSEG~MJAHR,
  MSEG~MBLNR,
  MSEG~BWART,
  MSEG~XAUTO,
  MSEG~MATNR,
  MAKT~MAKTX,
  MSEG~WERKS,
  MSEG~LGORT,
  MSEG~CHARG,
  CASE  MSEG~SHKZG
   WHEN 'H' THEN ( 0 - MSEG~MENGE )
  ELSE MSEG~MENGE
    END AS MENGE,
  MSEG~MEINS,
  CASE  MSEG~SHKZG
   WHEN 'H' THEN ( 0 - MSEG~ERFMG )
  ELSE MSEG~ERFMG
    END AS ERFMG,
  MSEG~ERFME,
  MSEG~BUDAT_MKPF,
  MSEG~CPUDT_MKPF,
  MSEG~CPUTM_MKPF,
  MSEG~USNAM_MKPF
  FROM MSEG
  LEFT JOIN MAKT ON MAKT~MATNR = MSEG~MATNR
  INTO CORRESPONDING FIELDS OF TABLE @IT_DATA
  WHERE MSEG~WERKS IN @S_WERKS
        AND MSEG~LGORT IN @S_LGORT
        AND MSEG~MATNR IN @S_MATNR
        AND MSEG~BUDAT_MKPF IN @S_BUDAT
        AND MSEG~BWART IN @S_BWART
        AND MSEG~USNAM_MKPF IN @S_USNAM
        AND MSEG~CPUDT_MKPF IN @S_CPUDT.
  LOOP AT IT_DATA INTO WA_DATA.
    MOVE-CORRESPONDING WA_DATA TO WA_DATA1.
    COLLECT WA_DATA1 INTO IT_DATA1.
    CLEAR:WA_DATA,WA_DATA1.
  ENDLOOP.


ENDFORM.
FORM CREAT_STRUCTURE.
  DATA: L_LINES TYPE I.
  LOOP AT IT_DATA1 INTO WA_DATA1.
    MOVE-CORRESPONDING WA_DATA1 TO WA_DATA2.
    APPEND WA_DATA2 TO IT_DATA2.
  ENDLOOP.

  SORT IT_DATA2 BY BWART.
  DELETE ADJACENT DUPLICATES FROM IT_DATA2 COMPARING BWART.
  DESCRIBE TABLE IT_DATA2 LINES N.
  L_LINES = 5.


* 创建静态结构部分
  PERFORM FRM_ALV_FCAT_SET USING:
    1   'WERKS' TEXT-007 'WERKS'  'MSEG'  SPACE   SPACE,
    2   'LGORT' TEXT-008 'LGORT'  'MSEG'  SPACE   SPACE,
    3   'MATNR' TEXT-008 'MATNR'  'MAKT'  SPACE   SPACE,
    4   'MAKTX' TEXT-008 'MAKTX'  'MAKT'  SPACE   SPACE.
*    5   'BUDAT_MKPF' TEXT-008 'BUDAT_MKPF'  'MSEG'  SPACE   SPACE,
*    6   'CPUDT_MKPF' TEXT-008 'CPUDT_MKPF'  'MSEG'  SPACE   SPACE.

  LOOP AT IT_DATA2 INTO WA_DATA2.
*    DO N TIMES.
    CLEAR WA_STRUCTURE.
*字段名称
    WA_STRUCTURE-FIELDNAME = WA_DATA2-BWART.
*列名称
*    CONCATENATE '移动类型' WA_DATA2-BWART INTO WA_STRUCTURE-SCRTEXT_L.
    WA_STRUCTURE-SCRTEXT_L = WA_DATA2-BWART.
    WA_STRUCTURE-SCRTEXT_M = WA_STRUCTURE-SCRTEXT_L.
    WA_STRUCTURE-SCRTEXT_S = WA_STRUCTURE-SCRTEXT_L.
    WA_STRUCTURE-COLTEXT   = WA_STRUCTURE-SCRTEXT_L.
    WA_STRUCTURE-NO_ZERO   = 'X'.
    WA_STRUCTURE-DO_SUM    = 'X'.

    WA_STRUCTURE-REF_FIELD = 'MENGE'.
    WA_STRUCTURE-REF_TABLE = 'EKPO'.

    WA_STRUCTURE-COL_POS    = L_LINES.
    APPEND WA_STRUCTURE TO IT_STRUCTURE.

    L_LINES = L_LINES + 1.
  ENDLOOP.
  WA_STRUCTURE-FIELDNAME = 'SUM'.
  WA_STRUCTURE-SCRTEXT_L = '行总计'.
  WA_STRUCTURE-SCRTEXT_M = WA_STRUCTURE-SCRTEXT_L.
  WA_STRUCTURE-SCRTEXT_S = WA_STRUCTURE-SCRTEXT_L.
  WA_STRUCTURE-COLTEXT   = WA_STRUCTURE-SCRTEXT_L.
  WA_STRUCTURE-NO_ZERO   = 'X'.
  WA_STRUCTURE-DO_SUM    = 'X'.
*  WA_STRUCTURE-REF_FIELD = 'MENGE'.
*  WA_STRUCTURE-REF_TABLE = 'EKPO'.
  WA_STRUCTURE-COL_POS   = L_LINES.
  APPEND WA_STRUCTURE TO IT_STRUCTURE.

ENDFORM.
FORM CREAT_TABLE.
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = IT_STRUCTURE
    IMPORTING
      EP_TABLE        = IT_TABLE.

  ASSIGN IT_TABLE->* TO <DYN_TABLE>.
ENDFORM.
FORM DATA_TO_TABLE.
  DATA:WA_NEW_LINE TYPE REF TO DATA.
  CREATE DATA WA_NEW_LINE LIKE LINE OF <DYN_TABLE>.
  ASSIGN WA_NEW_LINE->* TO <DYN_WA>.

  DATA: L_SUM(7) TYPE P DECIMALS 3.

  DATA:L_FIELDNAME TYPE LVC_S_FCAT-FIELDNAME.
  DATA:LW_ERFMG TYPE TY_DATA1.
  SORT IT_DATA1 BY WERKS LGORT MATNR.
  LOOP AT IT_DATA1 INTO WA_DATA1.
    CLEAR:L_FIELDNAME.
    L_FIELDNAME = WA_DATA1-BWART.
    ASSIGN COMPONENT L_FIELDNAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
    IF WA_DATA1-MENGE IS NOT INITIAL.
      <DYN_FIELD> = WA_DATA1-MENGE.
      L_SUM = L_SUM + WA_DATA1-MENGE.
    ENDIF.
    LW_ERFMG = WA_DATA1.
    AT END OF MATNR.
      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
      <DYN_FIELD> = LW_ERFMG-WERKS.
      ASSIGN COMPONENT 'LGORT' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
      <DYN_FIELD> = LW_ERFMG-LGORT.
      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
      <DYN_FIELD> = LW_ERFMG-MATNR.
      ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
      <DYN_FIELD> = LW_ERFMG-MAKTX.
*      ASSIGN COMPONENT 'BUDAT_MKPF' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
*      <DYN_FIELD> = LW_ERFMG-BUDAT_MKPF.
*      ASSIGN COMPONENT 'CPUDT_MKPF' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
*      <DYN_FIELD> = LW_ERFMG-CPUDT_MKPF.
      ASSIGN COMPONENT 'SUM' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
      <DYN_FIELD> = L_SUM.
      APPEND <DYN_WA> TO <DYN_TABLE>.
      CLEAR: L_SUM, <DYN_WA>.
    ENDAT.

    CLEAR: LW_ERFMG, WA_DATA1.



  ENDLOOP.


*  DELETE <DYN_TABLE> WHERE MATNR IS INITIAL.


ENDFORM.
*设置layout属性
FORM FRM_INIT_LAYOUT .
  G_TITLE = TEXT-006.

  CLEAR WA_LAYOUT.
  WA_LAYOUT-CWIDTH_OPT = 'X'.
ENDFORM.                    " FRM_INIT_LAYOUT
FORM FRM_SHOW_ALV.
*  * ALV显示函数
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IS_LAYOUT_LVC      = WA_LAYOUT
      IT_FIELDCAT_LVC    = IT_STRUCTURE
      I_GRID_TITLE       = G_TITLE
*     i_callback_pf_status_set = 'PF_STATUS_SET'
*     IT_EXCLUDING       =       "系统自带STATUS图标控制内表
      I_SAVE             = 'A'
*     i_callback_pf_status_set = 'PF_STATUS_SET'
*     i_callback_user_command  = 'FRM_USER_COMMAND'
    TABLES
      T_OUTTAB           = <DYN_TABLE>
    EXCEPTIONS
      PROGRAM_ERROR      = 1
      OTHERS             = 2.
  IF SY-SUBRC <> 0.
*    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.




ENDFORM.
FORM FRM_ALV_FCAT_SET USING PU_POS    TYPE I
                            PU_FNAME  TYPE C
                            PU_FTEXT  TYPE C
                            PU_RFIELD TYPE C
                            PU_RTABLE TYPE C
                            PU_QNAME  TYPE C
                            PU_EDIT   TYPE C.
  CLEAR WA_STRUCTURE.
  WA_STRUCTURE-COL_POS    = PU_POS.
  WA_STRUCTURE-FIELDNAME  = PU_FNAME.
  WA_STRUCTURE-SCRTEXT_L  = PU_FTEXT.
  WA_STRUCTURE-SCRTEXT_M  = PU_FTEXT.
  WA_STRUCTURE-SCRTEXT_S  = PU_FTEXT.
  WA_STRUCTURE-REF_FIELD  = PU_RFIELD.
  WA_STRUCTURE-REF_TABLE  = PU_RTABLE.
  WA_STRUCTURE-QFIELDNAME = PU_QNAME.
  WA_STRUCTURE-EDIT       = PU_EDIT.
  WA_STRUCTURE-KEY = 'X'.
  APPEND WA_STRUCTURE TO IT_STRUCTURE.
ENDFORM.                    " FRM_ALV_FCAT_S
原文地址:https://www.cnblogs.com/BruceKing/p/11171201.html