SAP ABAP 动态內表实现 ALV横向按月份动态显示数据

*&---------------------------------------------------------------------*
*& Report  ZMM_PRODUCT_ORDER_CHECK
*&
*&---------------------------------------------------------------------*
*& add by leon 20200525 MA 历史修改记录查询
*&
*&
*&---------------------------------------------------------------------*
 

*&---------------------------------------------------------------------*
*& Report  ZMM_MA_HISTORY
*&
*&---------------------------------------------------------------------*
*& add by leon 20200525 MA 历史修改记录查询
*&
*&
*&---------------------------------------------------------------------*
REPORT ZMM_MA_HISTORY MESSAGE-ID ZMM .
TYPE-POOLS:SLIS, ABAP .
**********************************************************************
TABLES : MARA,MARC,CDHDR,CDPOS,ZMATAPPEND.
DATA: GR_TABLE     TYPE REF TO CL_SALV_TABLE.

*变量定义
TYPES : BEGIN OF TYP_ITAB ,
          MATNR    TYPE MATNR,
          WERKS    TYPE WERKS_D,
          DISMM	   TYPE DISMM,
          MMSTA    TYPE MMSTA,
          MATGR	   TYPE MATNRGROUP,
          VERSION  TYPE CHAR3,
          MA       TYPE MATNRGROUP,
          SPMON    TYPE SPMON,
          UDATE    TYPE  CDDATUM,
          ZEIAR    TYPE DZEIAR,
          MAKTX    TYPE MAKTX,
          EKGRP    TYPE EKGRP,
          ZZSCMPN  TYPE ZZSCMPN,
          USERNAME TYPE  CDUSERNAME,
*          UTIME    type  CDUZEIT,
*          TCODE    type  CDTCODE,
        END OF TYP_ITAB .

TYPES TY_ITAB TYPE TYP_ITAB  OCCURS 0 .
DATA:LT_TAB TYPE TY_ITAB .
DATA:LT_TAB1 TYPE TY_ITAB .
DATA WA_TAB TYPE LINE OF TY_ITAB .
DATA : I_MONTHS   TYPE INT4,
       D_DATE_BEG TYPE DATUM,
       D_DATE_END TYPE DATUM,
       V_SPMON    TYPE SPMON,
       V_DATE1    TYPE DATUM,
       V_DATE2    TYPE DATUM.

DATA L_OBJECTID LIKE CDPOS-OBJECTID .
DATA L_TABLEKEY LIKE  CDPOS-TABKEY .
DATA V_TABLEKEY LIKE  CDPOS-TABKEY .
DATA LT_EDITPOS	LIKE TABLE OF	CDRED WITH HEADER LINE   .
DATA WA_EDITPOS LIKE CDRED .

TYPES : BEGIN OF TYP_MON ,
          SPMON TYPE SPMON,
        END OF TYP_MON .
DATA : WA_MON TYPE TYP_MON,
       LT_MON TYPE TYP_MON OCCURS 0.
DATA V_INDEX TYPE SY-INDEX .
DATA COLUMNNAME TYPE LVC_FNAME .
DATA : SHORT_TEXT TYPE SCRTEXT_S,
       MED_TEXT   TYPE SCRTEXT_M,
       LONG_TEXT  TYPE SCRTEXT_L.
**********************************************************************
DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR.
DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR.

DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
DATA LR_DATA  TYPE REF TO CL_ABAP_DATADESCR.

DATA LT_COMP TYPE  ABAP_COMPONENT_TAB.
DATA LS_COMP LIKE LINE OF  LT_COMP.

DATA DYN_WA TYPE REF TO DATA.
DATA DYN_TABLE TYPE REF TO DATA.

DATA L_STRING TYPE STRING.

FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
               <DYN_WA>    TYPE ANY,
               <DYN_LINE>  TYPE ANY,
               <DYN_FIELD> ,
               <WA_FIELD1> ,
               <WA_FIELD2> ,
               <WA_FIELD3> .
DATA :CFIELD(30) .

DATA: DREF_STR    TYPE REF TO DATA,
      DREF_TAB    TYPE REF TO DATA,
      DREF_I      TYPE REF TO DATA,
      ITAB_TYPE   TYPE REF TO CL_ABAP_TABLEDESCR,
      STRUCT_TYPE TYPE REF TO CL_ABAP_STRUCTDESCR,
      ELEM_TYPE   TYPE REF TO CL_ABAP_ELEMDESCR,
      TABLE_TYPE  TYPE REF TO CL_ABAP_TABLEDESCR,
      COMP_TAB    TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE WITH HEADER LINE,
      COMP_TAB1   TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE WITH HEADER LINE.
FIELD-SYMBOLS :<FS_ITAB> TYPE ANY TABLE.

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*       事件处理类(定义)
*----------------------------------------------------------------------*
CLASS LCL_HANDLE_EVENTS DEFINITION.
  PUBLIC SECTION.
*    CLASS-METHODS :
    METHODS:
      ON_USER_COMMAND FOR EVENT ADDED_FUNCTION OF CL_SALV_EVENTS
        IMPORTING E_SALV_FUNCTION,

      ON_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE
        IMPORTING ROW COLUMN,

      ON_LINK_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
        IMPORTING ROW COLUMN.
ENDCLASS  .              "lcl_handle_eventsDEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*       ALV操作类(定义)
*----------------------------------------------------------------------*
CLASS LCL_ALV DEFINITION.
  PUBLIC SECTION .
    METHODS: GETDATA         "取得要显示的数据
      RETURNING VALUE(LT_TAB) TYPE TY_ITAB,
      ALV_FULL        "全屏Grid列表处理方法
        IMPORTING VALUE(LT_TAB) TYPE TY_ITAB,
      MAIN .           "主方法
ENDCLASS .                    "lcl_alv DEFINITION

**********************************************************************
DATA: GR_EVENTS TYPE REF TO LCL_HANDLE_EVENTS.

SELECTION-SCREEN : BEGIN OF BLOCK BLK-01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS : S_WERKS FOR MARC-WERKS  ,
                 S_MATNR FOR MARC-MATNR ,
                 S_ZEIAR FOR MARA-ZEIAR ,
                 S_EKGRP FOR MARC-EKGRP ,
                 S_SPMON FOR SY-DATUM+0(6),
                 S_DATE FOR SY-DATUM NO-DISPLAY
                 .
SELECTION-SCREEN : END OF BLOCK BLK-01 .
SELECTION-SCREEN : BEGIN OF BLOCK BLK-02 WITH FRAME TITLE TEXT-002.
PARAMETERS : P_VERTI TYPE C RADIOBUTTON GROUP RG1 USER-COMMAND UC1 DEFAULT 'X',
             P_HORIZ TYPE C RADIOBUTTON GROUP RG1
             .

SELECTION-SCREEN : END OF BLOCK BLK-02 .

INITIALIZATION .
  S_WERKS-LOW = '2000'.
  S_WERKS-HIGH = '2200'.
  S_WERKS-SIGN = 'I' .
  S_WERKS-OPTION = 'BT' .
  APPEND S_WERKS .
*  S_EKGRP-LOW = '201'.
*  S_EKGRP-SIGN = 'I'.
*  S_EKGRP-OPTION = 'EQ' .
*  append S_EKGRP .
  IF SY-DATUM+4(2) EQ '12'.
    S_SPMON-LOW+0(4) = SY-DATUM+0(4) .
    S_SPMON-LOW+4(2) = '01' .
  ELSE .
    S_SPMON-LOW+0(4) = SY-DATUM+0(4) - 1  .
    S_SPMON-LOW+4(2) = SY-DATUM+4(2) + 1  .
  ENDIF .
  S_SPMON-HIGH+0(6) = SY-DATUM+0(6) .
  S_SPMON-SIGN = 'I' .
  S_SPMON-OPTION = 'BT' .
  APPEND S_SPMON .

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*       事件处理类(实现)
*----------------------------------------------------------------------*
CLASS LCL_HANDLE_EVENTS IMPLEMENTATION.
*  method ON_USER_COMMAND .
*    data L_STRING type STRING.
*    concatenate 'Function is ' E_SALV_FUNCTION
*           into L_STRING
*           separated by SPACE .
*    message I000(0K) with L_STRING .
*  endmethod  .                   "on_user_command
  METHOD ON_USER_COMMAND .
    PERFORM HANDLE_USER_COMMAND USING E_SALV_FUNCTION .
  ENDMETHOD .                    "on_user_command
  METHOD ON_DOUBLE_CLICK .
    PERFORM SHOW_DOCUMENT USING ROW COLUMN .
  ENDMETHOD .

  METHOD ON_LINK_CLICK .
*perform SHOW_DOCUMENT using ROW COLUMN .
  ENDMETHOD .                      "on_user_command
ENDCLASS  .             "lcl_handle_eventsIMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*       ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS LCL_ALV IMPLEMENTATION.
*取得要显示的数据
  METHOD GETDATA .
    DATA WA_DATE LIKE LINE OF S_DATE .
    WA_DATE-LOW+0(6) = S_SPMON-LOW+0(6).
    WA_DATE-LOW+6(2) = '01'.
    CALL FUNCTION 'DATE_GET_MONTH_LASTDAY'
      EXPORTING
        I_DATE = WA_DATE-LOW
      IMPORTING
        E_DATE = WA_DATE-HIGH.
    WA_DATE-SIGN = 'I'.
    WA_DATE-OPTION = 'BT' .
    APPEND WA_DATE TO S_DATE .
    CLEAR : LT_TAB1 . REFRESH LT_TAB1.
**********************************************************************
*& 取物料主数据
    SELECT DISTINCT MARA~MATNR
                    MARC~WERKS
                    MARC~DISMM
                    MARC~MMSTA
                    MARC~MATGR
                    MARA~ZEIAR
                    MARC~EKGRP
      FROM MARA
      INNER JOIN MARC ON MARC~MATNR = MARA~MATNR
      INTO CORRESPONDING FIELDS OF TABLE LT_TAB1
     WHERE MARA~MATNR IN S_MATNR
       AND MARC~WERKS IN S_WERKS
       AND MARC~EKGRP IN S_EKGRP
       AND MARA~ZEIAR IN S_ZEIAR
       AND MARA~MATNR IN ( SELECT DISTINCT MATNR
                             FROM ZMATAPPEND
                            WHERE MATNR = MARA~MATNR
                          )
    .
    "" 取月份
    CLEAR :D_DATE_BEG,D_DATE_END .
    D_DATE_BEG+0(6) = S_SPMON-LOW+0(6) .
    D_DATE_BEG+6(2) = '01' .
    D_DATE_END+0(6) = S_SPMON-HIGH+0(6) .
    D_DATE_END+6(2) = '01' .
    CLEAR I_MONTHS .
    CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
      EXPORTING
        BEGDA    = D_DATE_BEG
        ENDDA    = D_DATE_END
*       TAB_MODE = ' '
      IMPORTING
*       DAYS     =
*       C_WEEKS  =
        C_MONTHS = I_MONTHS
*       C_YEARS  =
*       WEEKS    =
*       MONTHS   =
*       YEARS    =
*       D_MONTHS =
*       MONTH_TAB       =
      .
    I_MONTHS = I_MONTHS + 1 .
    CLEAR :LT_TAB . REFRESH :LT_TAB .
    CLEAR: WA_MON,LT_MON,LT_MON .
    LOOP AT LT_TAB1 INTO WA_TAB .
      SELECT SINGLE MAKTX
              FROM MAKT
              INTO WA_TAB-MAKTX
             WHERE MATNR = WA_TAB-MATNR
               AND SPRAS = SY-LANGU
            .

      CLEAR : L_OBJECTID,LT_EDITPOS,L_TABLEKEY .
      REFRESH :LT_EDITPOS .
      WRITE WA_TAB-MATNR TO L_OBJECTID .
      CONCATENATE SY-MANDT
            WA_TAB-MATNR
       INTO L_TABLEKEY.
      WRITE WA_TAB-WERKS TO L_TABLEKEY+21(4).
*      concatenate SY-MANDT WA_TAB-MATNR WA_TAB-WERKS into L_TABLEKEY .
      CALL FUNCTION 'CHANGEDOCUMENT_READ'
        EXPORTING
*         ARCHIVE_HANDLE             = 0
*         CHANGENUMBER               = ' '
*         DATE_OF_CHANGE             = '00000000'
          OBJECTCLASS                = 'MATERIAL'
          OBJECTID                   = L_OBJECTID
          TABLEKEY                   = L_TABLEKEY
          TABLENAME                  = 'MARC'
*         TIME_OF_CHANGE             = '000000'
*         USERNAME                   = ' '
*         LOCAL_TIME                 = ' '
*         TIME_ZONE                  = 'UTC'
*         TABLEKEY254                = ' '
*         KEYGUID                    = ' '
*         DATE_UNTIL                 = '99991231'
*         TIME_UNTIL                 = '235959'
*         KEYGUID_STR                = ' '
*         READ_CHANGEDOCU            = ' '
*         I_PREP_UNIT                = 'X'
*         NOPLUS_ASWILDCARD_INOBJID  = ' '
*     IMPORTING
*         ET_CDRED_STR               =
        TABLES
          EDITPOS                    = LT_EDITPOS[]
        EXCEPTIONS
          NO_POSITION_FOUND          = 1
          WRONG_ACCESS_TO_ARCHIVE    = 2
          TIME_ZONE_CONVERSION_ERROR = 3
          OTHERS                     = 4.
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.
      DELETE LT_EDITPOS WHERE FNAME NE 'MATGR' .
      IF LT_EDITPOS[] IS INITIAL .
        APPEND WA_TAB TO LT_TAB .
      ELSE .
        CLEAR V_SPMON .
        V_SPMON = D_DATE_BEG+0(6) .
        CLEAR : WA_TAB-MA,WA_TAB-VERSION,
          WA_TAB-UDATE,
          WA_TAB-USERNAME  .
*          WA_TAB-UTIME ,
*          WA_TAB-TCODE .
        DO I_MONTHS TIMES.
          IF V_SPMON+4(2) GT 12 .
            V_SPMON+4(2) = '01' .
            V_SPMON+0(4) = V_SPMON+0(4) + 1 .
          ENDIF .
          WA_TAB-SPMON = V_SPMON .

          WA_MON-SPMON = V_SPMON .
          APPEND WA_MON TO LT_MON .

          CLEAR : V_DATE1 ,V_DATE2 .
          V_DATE1+0(6) = V_SPMON .
          V_DATE1+6(2) = '01' .
          CALL FUNCTION 'DATE_GET_MONTH_LASTDAY'
            EXPORTING
              I_DATE = V_DATE1
            IMPORTING
              E_DATE = V_DATE2.
          CLEAR WA_EDITPOS .
          LOOP AT LT_EDITPOS INTO WA_EDITPOS WHERE UDATE BETWEEN V_DATE1 AND V_DATE2 .
            WA_TAB-MA = WA_EDITPOS-F_NEW .
            WA_TAB-VERSION = WA_TAB-VERSION + 1 .
            WA_TAB-UDATE = WA_EDITPOS-UDATE .
            WA_TAB-USERNAME = WA_EDITPOS-USERNAME .
*            WA_TAB-UTIME = WA_EDITPOS-UTIME .
*            WA_TAB-TCODE = WA_EDITPOS-TCODE .
            APPEND WA_TAB TO LT_TAB .
          ENDLOOP .
          IF WA_EDITPOS IS INITIAL .
            CLEAR WA_TAB-MA .
            LOOP AT LT_EDITPOS INTO WA_EDITPOS WHERE UDATE LT V_DATE1 .  "把最后一次修改的记录读出来并显示在
              WA_TAB-MA = WA_EDITPOS-F_NEW .
              WA_TAB-VERSION = WA_TAB-VERSION + 1 .
              WA_TAB-UDATE = WA_EDITPOS-UDATE .
              WA_TAB-USERNAME = WA_EDITPOS-USERNAME .
*            WA_TAB-UTIME = WA_EDITPOS-UTIME .
*            WA_TAB-TCODE = WA_EDITPOS-TCODE .
            ENDLOOP .
            IF NOT WA_TAB-MA IS INITIAL. " 当前期间内没有修改记录 则把上个月的记录复制到当前月份
              APPEND WA_TAB TO LT_TAB .
            ENDIF .
          ENDIF .
          V_SPMON = V_SPMON + 1 .
        ENDDO .
      ENDIF .
      CLEAR WA_TAB .
    ENDLOOP.
    SORT LT_TAB BY
          MATNR
          WERKS
          SPMON DESCENDING
          UDATE
          MATGR
          MA
          VERSION DESCENDING .
    DELETE ADJACENT DUPLICATES FROM LT_TAB COMPARING MATNR WERKS SPMON UDATE MATGR MA .
    SORT LT_MON BY SPMON DESCENDING .
    DELETE ADJACENT DUPLICATES FROM LT_MON COMPARING SPMON .

    IF P_HORIZ = 'X'.
      PERFORM GEN_DYN_TABLE TABLES LT_TAB .
    ENDIF .

  ENDMETHOD .                   "getdata

*输出全屏网格列表的方法
  METHOD ALV_FULL.
    DATA LR_DISPLAY TYPE REF TO CL_SALV_DISPLAY_SETTINGS .
    DATA:LR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS.
*         LR_EVENTS    type ref to CL_SALV_EVENTS.
    DATA: LV_REPID TYPE SYREPID.
    DATA: LR_LAYOUT TYPE REF TO CL_SALV_LAYOUT,
          LS_KEY    TYPE SALV_S_LAYOUT_KEY.
    DATA: LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE.

    DATA: LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS,
          LR_COLUMN  TYPE REF TO CL_SALV_COLUMN_TABLE.
    DATA: LR_SELECTIONS TYPE REF TO CL_SALV_SELECTIONS.

    "创建实例
    IF P_HORIZ = 'X' .
      TRY .
          CL_SALV_TABLE=>FACTORY(
            EXPORTING
              LIST_DISPLAY = ABAP_FALSE
            IMPORTING
              R_SALV_TABLE = GR_TABLE
            CHANGING
              T_TABLE      = <DYN_TABLE>
          ) .
        CATCH CX_SALV_MSG .
      ENDTRY .
    ELSEIF P_VERTI = 'X'.
      TRY .
          CL_SALV_TABLE=>FACTORY(
            EXPORTING
              LIST_DISPLAY = ABAP_FALSE
            IMPORTING
              R_SALV_TABLE = GR_TABLE
            CHANGING
              T_TABLE      = LT_TAB
          ) .
        CATCH CX_SALV_MSG .
      ENDTRY .
    ENDIF .
    "设置ALV功能
    GR_TABLE->SET_SCREEN_STATUS(
    PFSTATUS      =  'SALV_STANDARD'
    REPORT        =  SY-REPID
    SET_FUNCTIONS = GR_TABLE->C_FUNCTIONS_ALL
    ).
    LR_COLUMNS = GR_TABLE->GET_COLUMNS( ).
    LR_COLUMNS->SET_OPTIMIZE( 'X' ).

    PERFORM SET_COLUMNS_TECHNICAL USING LR_COLUMNS.

*    try.
*        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ).
*        LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).
*
*      catch CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
*    endtry.
*
*    try.
*        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'MATGR' ).
*        LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).
*
*      catch CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
*    endtry.

    LR_SELECTIONS = GR_TABLE->GET_SELECTIONS( ).
    LR_SELECTIONS->SET_SELECTION_MODE( IF_SALV_C_SELECTION_MODE=>MULTIPLE ).
    LR_LAYOUT = GR_TABLE->GET_LAYOUT( ).
    LS_KEY-REPORT = SY-REPID.
    LR_LAYOUT->SET_KEY( LS_KEY ).
    LR_LAYOUT->SET_DEFAULT( 'X' ).
    LR_EVENTS = GR_TABLE->GET_EVENT( ).

    CREATE OBJECT GR_EVENTS. "动态方法
    SET HANDLER GR_EVENTS->ON_USER_COMMAND FOR LR_EVENTS .
    SET HANDLER GR_EVENTS->ON_LINK_CLICK FOR LR_EVENTS .
    SET HANDLER GR_EVENTS->ON_DOUBLE_CLICK FOR LR_EVENTS .

    "  ALV的显示样式
    LR_DISPLAY = GR_TABLE->GET_DISPLAY_SETTINGS( ) .
    LR_DISPLAY->SET_STRIPED_PATTERN( 'X' ) . "设置颜色间隔显示
    IF SY-LANGU = 'E'.
      LR_DISPLAY->SET_LIST_HEADER( 'Products MA Change Report' ) . "设置ALV的抬头
    ELSE.
      LR_DISPLAY->SET_LIST_HEADER( 'WAC MA变化报表' ) . "设置ALV的抬头
    ENDIF.

    LR_DISPLAY->SET_HORIZONTAL_LINES( 'X' ) .  "设置水平线是否显示
    LR_DISPLAY->SET_VERTICAL_LINES( 'X' ) .    "设置垂直线是否显示
*    "注册事件  " 静态方法
*    set handler LCL_HANDLE_EVENTS=>ON_USER_COMMAND for LR_EVENTS.
    "显示列表
    GR_TABLE->DISPLAY( ) .

  ENDMETHOD.                   "alv_full

*主方法,整合数据
  METHOD MAIN .
    "取得要显示的数据
    LT_TAB = ME->GETDATA( ).
    ME->ALV_FULL( LT_TAB ).
  ENDMETHOD.                    "main

ENDCLASS .                    "lcl_alvIMPLEMENTATION

*报表执行
START-OF-SELECTION .
  DATA  LR_ALV   TYPE REF TO LCL_ALV .
  CREATE OBJECT LR_ALV .
  LR_ALV->MAIN( ) .

FORM SET_COLUMNS_TECHNICAL USING IR_COLUMNS TYPE REF TO CL_SALV_COLUMNS.
  DATA: LR_COLUMN TYPE REF TO CL_SALV_COLUMN.
  DATA : LR_COLUMNS TYPE SALV_T_COLUMN_REF .
  DATA WA_COLUMN TYPE SALV_S_COLUMN_REF .
*  try .
*      LR_COLUMNS = IR_COLUMNS->GET( ) .
*    catch CX_SALV_NOT_FOUND.                            "#EC NO_HANDLER
*  endtry.
  LOOP AT LT_MON INTO WA_MON .
    CLEAR COLUMNNAME .
    CONCATENATE 'MONTH_' WA_MON-SPMON INTO COLUMNNAME .
    WRITE : WA_MON-SPMON TO SHORT_TEXT ,
            WA_MON-SPMON TO MED_TEXT,
            WA_MON-SPMON TO LONG_TEXT .
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( COLUMNNAME ).
        LR_COLUMN->SET_SHORT_TEXT( SHORT_TEXT ).
        LR_COLUMN->SET_MEDIUM_TEXT( MED_TEXT ).
        LR_COLUMN->SET_LONG_TEXT( LONG_TEXT ).
      CATCH CX_SALV_NOT_FOUND .                         "#EC NO_HANDLER
    ENDTRY .
  ENDLOOP .


  IF SY-LANGU EQ 'E'.

    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'SPMON' ).
        LR_COLUMN->SET_SHORT_TEXT( 'Period' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'Period' ).
        LR_COLUMN->SET_LONG_TEXT( 'Period' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'UDATE' ).
        LR_COLUMN->SET_SHORT_TEXT( 'UpdateDate' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'Update Date' ).
        LR_COLUMN->SET_LONG_TEXT( 'Update Date' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'VERSION' ).
        LR_COLUMN->SET_SHORT_TEXT( 'Revision' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'Revision Number' ).
        LR_COLUMN->SET_LONG_TEXT( 'Revision Number' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.

    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'ZEIAR' ).
        LR_COLUMN->SET_SHORT_TEXT( 'Business' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'Business Unit' ).
        LR_COLUMN->SET_LONG_TEXT( 'Business Unit' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'MA' ).
        LR_COLUMN->SET_SHORT_TEXT( 'Revised MA' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'Revised MA' ).
        LR_COLUMN->SET_LONG_TEXT( 'Revised MA' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'MATGR' ).
        LR_COLUMN->SET_SHORT_TEXT( 'MA' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'MA' ).
        LR_COLUMN->SET_LONG_TEXT( 'MA' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.

  ELSE.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'USERNAME' ).
        LR_COLUMN->SET_SHORT_TEXT( '修改账号' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '修改账号' ).
        LR_COLUMN->SET_LONG_TEXT( '修改账号' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.

    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'SPMON' ).
        LR_COLUMN->SET_SHORT_TEXT( '月份' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '月份' ).
        LR_COLUMN->SET_LONG_TEXT( '月份' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'UDATE' ).
        LR_COLUMN->SET_SHORT_TEXT( '更新日期' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '更新日期' ).
        LR_COLUMN->SET_LONG_TEXT( '更新日期' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'VERSION' ).
        LR_COLUMN->SET_SHORT_TEXT( '修改次数' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '修改次数' ).
        LR_COLUMN->SET_LONG_TEXT( '修改次数' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'MA' ).
        LR_COLUMN->SET_SHORT_TEXT( '修改后MA' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '修改后MA' ).
        LR_COLUMN->SET_LONG_TEXT( '修改后MA' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'ZEIAR' ).
        LR_COLUMN->SET_SHORT_TEXT( '产品家族' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '产品家族' ).
        LR_COLUMN->SET_LONG_TEXT( '产品家族' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
    TRY.
        LR_COLUMN = IR_COLUMNS->GET_COLUMN( 'MATGR' ).
        LR_COLUMN->SET_SHORT_TEXT( 'MA' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'MA' ).
        LR_COLUMN->SET_LONG_TEXT( 'MA' ).
      CATCH CX_SALV_NOT_FOUND.                          "#EC NO_HANDLER
    ENDTRY.
  ENDIF.

ENDFORM.

FORM GEN_DYN_TABLE TABLES GT_TAB LIKE LT_TAB.
  TYPES : BEGIN OF TYP_TAB_PART1 ,
            MATNR TYPE MATNR,
            WERKS TYPE WERKS_D,
            DISMM	TYPE DISMM,
            MMSTA TYPE MMSTA,
            MATGR	TYPE MATNRGROUP,

          END OF TYP_TAB_PART1 .
  TYPES :  BEGIN OF TYP_TAB_PART3 ,
             ZEIAR    TYPE DZEIAR,
             MAKTX    TYPE MAKTX,
             EKGRP    TYPE EKGRP,
             USERNAME TYPE  CDUSERNAME,
           END OF TYP_TAB_PART3 .
  DATA LT_TAB_PART1 TYPE SORTED TABLE OF TYP_TAB_PART1 WITH UNIQUE KEY MATNR WERKS .
  DATA LT_TAB_PART3 TYPE TYP_TAB_PART3 OCCURS 0 .
  DATA :V_MATNR TYPE MATNR,
        V_WERKS TYPE WERKS_D.
  "排序表动态排序
  DATA:LT_SORTED_TABLE TYPE ABAP_SORTORDER_TAB.
  LT_SORTED_TABLE = VALUE #( ( NAME = 'MATNR' ASTEXT = ABAP_FALSE DESCENDING = ABAP_FALSE )
                             ( NAME = 'WERKS') ).
**********************************************************************
*& 动态创建内表 内表由三部分组成  第1和第3部份 为上面的结构  中间的第二部分由分份动态生成
  "**========给现有的内表动态的加一列
  FREE :TABLE_TYPE, STRUCT_TYPE,COMP_TAB[] .
  TABLE_TYPE ?= CL_ABAP_TABLEDESCR=>DESCRIBE_BY_DATA( LT_TAB_PART1 ).
  STRUCT_TYPE ?= TABLE_TYPE->GET_TABLE_LINE_TYPE( ).
  COMP_TAB[] = STRUCT_TYPE->GET_COMPONENTS( ).
  CLEAR V_INDEX.
  DESCRIBE TABLE COMP_TAB LINES V_INDEX .
  LOOP AT LT_MON INTO WA_MON .
*    COMP_TAB-NAME = WA_MON-SPMON .
    CONCATENATE 'MONTH_' WA_MON-SPMON  INTO COMP_TAB-NAME .
    COMP_TAB-TYPE = CL_ABAP_ELEMDESCR=>GET_C( 20 ) .
    V_INDEX = V_INDEX + 1 .
    INSERT COMP_TAB INTO COMP_TAB INDEX V_INDEX .
  ENDLOOP .

  FREE :TABLE_TYPE, STRUCT_TYPE,COMP_TAB1[] .
  TABLE_TYPE ?= CL_ABAP_TABLEDESCR=>DESCRIBE_BY_DATA( LT_TAB_PART3 ) .
  STRUCT_TYPE ?= TABLE_TYPE->GET_TABLE_LINE_TYPE( ) .
  COMP_TAB1[] = STRUCT_TYPE->GET_COMPONENTS( ) .
  V_INDEX = V_INDEX + 1 .
  INSERT LINES OF COMP_TAB1 INTO COMP_TAB  INDEX V_INDEX  .

  STRUCT_TYPE = CL_ABAP_STRUCTDESCR=>CREATE( COMP_TAB[] ) .
  ITAB_TYPE   = CL_ABAP_TABLEDESCR=>CREATE( STRUCT_TYPE ) .
  CREATE DATA DREF_TAB TYPE HANDLE ITAB_TYPE  .
  ASSIGN DREF_TAB->* TO <DYN_TABLE>  ."将字段符号指向新创建出来的内表对象
  CREATE DATA DREF_STR TYPE HANDLE STRUCT_TYPE  .
  ASSIGN DREF_STR->* TO <DYN_WA> .

  IF NOT GT_TAB[] IS INITIAL .
    LOOP AT GT_TAB INTO WA_TAB .
      MOVE-CORRESPONDING WA_TAB TO <DYN_WA> .
      APPEND <DYN_WA> TO <DYN_TABLE> .
    ENDLOOP .
    SORT <DYN_TABLE> BY (LT_SORTED_TABLE) .
    DELETE ADJACENT DUPLICATES FROM <DYN_TABLE> COMPARING ALL FIELDS .
    LOOP AT <DYN_TABLE> INTO <DYN_WA> .
      V_INDEX = SY-TABIX.
      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <WA_FIELD1> .
      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <DYN_WA> TO <WA_FIELD2> .
      ASSIGN COMPONENT 'MATGR' OF STRUCTURE <DYN_WA> TO <WA_FIELD3> .
      IF V_MATNR EQ <WA_FIELD1> AND V_WERKS EQ <WA_FIELD2>.  "如果同一物料同一工厂出现多次 删除重复行
        DELETE <DYN_TABLE> INDEX V_INDEX  .
        CONTINUE .
      ENDIF.
      V_MATNR = <WA_FIELD1> .
      V_WERKS = <WA_FIELD2> .
      LOOP AT GT_TAB INTO WA_TAB WHERE MATNR EQ  <WA_FIELD1>
                                   AND WERKS  EQ  <WA_FIELD2>
                                   AND MATGR  EQ  <WA_FIELD3>
                                   AND SPMON  NE  '000000'.
        CLEAR CFIELD .
        CONCATENATE 'MONTH_' WA_TAB-SPMON INTO CFIELD .
        ASSIGN COMPONENT CFIELD OF STRUCTURE <DYN_WA> TO <DYN_FIELD> .
        <DYN_FIELD> = WA_TAB-MA+0(20) .
      ENDLOOP .
      MODIFY <DYN_TABLE> FROM <DYN_WA> INDEX V_INDEX.
    ENDLOOP .
  ENDIF .
**********************************************************************

ENDFORM .

FORM HANDLE_USER_COMMAND USING I_UCOMM TYPE SALV_DE_FUNCTION.
  DATA: LR_SELECTIONS TYPE REF TO CL_SALV_SELECTIONS,
        LT_ROWS       TYPE SALV_T_ROW,
        LV_ROWS       TYPE LINE OF SALV_T_ROW,
        LV_LINES      TYPE INT4.

  CASE I_UCOMM .
    WHEN 'DISP_INV'.
      LR_SELECTIONS = GR_TABLE->GET_SELECTIONS( ) .
      LT_ROWS = LR_SELECTIONS->GET_SELECTED_ROWS( ) .
      LV_LINES = LINES( LT_ROWS ) .
      IF LV_LINES = 0 .
        MESSAGE 'Please select at least one record '(M01) TYPE 'I'.
      ELSEIF LV_LINES > 1 .
        MESSAGE 'Please select only one record'(M02) TYPE 'I'.
      ELSE .
*        read table  LT_ROWS into LV_ROWS index 1..
*        read table GT_OUT_INVOICE_DETAIL into GS_OUT_INVOICE_DETAIL index LV_ROWS.
*        if SY-SUBRC = 0 and GS_OUT_INVOICE_DETAIL-VBELN is not initial.
*          set parameter id 'VF' field GS_OUT_INVOICE_DETAIL-VBELN.
*          call transaction 'VF03' and skip first screen.
*        endif.
      ENDIF .
    WHEN 'REFRESH'.

    WHEN OTHERS .
  ENDCASE .

ENDFORM.                    " handle_user_command

FORM SHOW_DOCUMENT USING PV_ROW    TYPE I
                      PV_COLUMN TYPE LVC_FNAME  .
  IF P_VERTI = 'X'.



    READ TABLE LT_TAB INTO WA_TAB INDEX PV_ROW  .


    IF SY-SUBRC = 0 AND WA_TAB-MATNR IS NOT INITIAL  .
      CASE PV_COLUMN  .
        WHEN 'MATGR' .
          SET PARAMETER ID 'MAT' FIELD WA_TAB-MATNR .
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
        WHEN 'MATNR' .
          SET PARAMETER ID 'MAT' FIELD WA_TAB-MATNR .
          SET PARAMETER ID 'BERID' FIELD WA_TAB-WERKS .
          SET PARAMETER ID 'WRK' FIELD WA_TAB-WERKS .
          CALL TRANSACTION 'MD04' AND SKIP FIRST SCREEN.
      ENDCASE .
    ENDIF .

  ELSEIF P_HORIZ = 'X' .



    READ TABLE <DYN_TABLE> INTO <DYN_WA> INDEX PV_ROW  .


*    CLEAR: <WA_FIELD1> , <WA_FIELD2> ,<WA_FIELD3> .
*
*      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <WA_FIELD1> .
*      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <DYN_WA> TO <WA_FIELD2> .
*      ASSIGN COMPONENT 'MATGR' OF STRUCTURE <DYN_WA> TO <WA_FIELD3> .

    IF SY-SUBRC = 0 AND <WA_FIELD1> IS NOT INITIAL  .
      CASE PV_COLUMN  .
        WHEN 'MATGR' .
          SET PARAMETER ID 'MAT' FIELD <WA_FIELD1> .
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
        WHEN 'MATNR' .
          SET PARAMETER ID 'MAT' FIELD <WA_FIELD1> .
          SET PARAMETER ID 'BERID' FIELD <WA_FIELD2> .
          SET PARAMETER ID 'WRK' FIELD <WA_FIELD2> .
          CALL TRANSACTION 'MD04' AND SKIP FIRST SCREEN.
      ENDCASE .
    ENDIF .


  ENDIF.


ENDFORM.

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页