SAP ALV Report

*&---------------------------------------------------------------------*
*&  Include           ZALV001
*&---------------------------------------------------------------------*
*& ALV 共用function
*&---------------------------------------------------------------------*
*  ALV 宣告
*  General Data
TYPE-POOLS: SLIS.
DATA : G_REPID LIKE SY-REPID,                       "sy-repid 指當前的主程序
       POS  TYPE SLIS_SORTINFO_ALV  ,               "欄位計數器
       I_FIELDCAT    TYPE SLIS_FIELDCAT_ALV,        "表單列名資料緩存器
       PGT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV ,     "WITH HEADER LINE,
       W_FIELDCAT_ALV     LIKE LINE OF PGT_FIELDCAT,
*用來存放我們將要在表單顯示區域顯示出來的表單的列名,每個列名對應的
*字段名以及列表頭其他相關屬性信息的數據類型 .
       PIS_LAYOUT    TYPE SLIS_LAYOUT_ALV,          "LAYOUT alv格式
       I_LIST_COMMENTS TYPE SLIS_T_LISTHEADER,      "用來填充表單標題區域的數据類型
       W_LIST_COMMENTS LIKE LINE OF I_LIST_COMMENTS,"表單標題區域的數据類型緩存器
       I_SORT        TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE, "排序
       I_VARIANT     TYPE DISVARIANT,               "配置(外部使用)
       PIS_VARIANT   TYPE DISVARIANT,
       GS_VARIANT_SAVE(1)  TYPE C,                  "變式類型
       IS_PRINT      TYPE SLIS_PRINT_ALV ,          "類型組
       I_EVENT_EXIT  TYPE SLIS_T_EVENT_EXIT,        "EXIT事件記錄器
       W_EVENT_EXIT  LIKE LINE OF I_EVENT_EXIT,     "EXIT事件記錄器緩存器
       W_HTML_TOP_OF_PAGE TYPE  SLIS_FORMNAME,  "字符型
       G_EXIT_CAUSED_BY_CALLER,
       GS_EXIT_CAUSED_BY_USER TYPE SLIS_EXIT_BY_USER,
       I_EXCLUDING   TYPE SLIS_T_EXTAB,
       G_TABNAME_HEADER TYPE SLIS_TABNAME,
       G_TABNAME_ITEM   TYPE SLIS_TABNAME,
*使用兩個表格進行輸出時,G_TABNAME_HEADER用于輸出表頭,G_TABNAME_ITEM用于輸出明細
       P_ALV_HANDLE(4).

DATA : I_KEYINFO   TYPE  SLIS_KEYINFO_ALV,
       IS_KEYINFO    TYPE SLIS_KEYINFO_ALV,
       GS_KEYINFO  TYPE SLIS_KEYINFO_ALV.

DATA: BEGIN OF SLIS_ALV_CATG.
INCLUDE TYPE SLIS_FIELDCAT_MAIN0.
INCLUDE TYPE SLIS_FIELDCAT_MAIN1.
DATA: END OF SLIS_ALV_CATG.

*  Callback
DATA:I_EVENT        TYPE SLIS_T_EVENT WITH HEADER LINE,       "事件記錄器
     I_EVENTS       TYPE SLIS_T_EVENT ,                       "事件記錄器
     W_EVENTS       LIKE LINE OF I_EVENTS,                    "事件記錄器緩存器
     GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER,              "ALV報表標頭類型
     LS_LINE        TYPE SLIS_LISTHEADER,                     "標頭資料儲存器
     G_STATUS_SET   TYPE SLIS_FORMNAME VALUE 'PF_STATUS_SET',
     G_USER_COMMAND TYPE SLIS_FORMNAME ,"VALUE 'USER_COMMAND',"使用者變量
     G_TOP_OF_PAGE  TYPE SLIS_FORMNAME ,"VALUE 'TOP_OF_PAGE', "頁首變量類型
     G_TOP_OF_LIST  TYPE SLIS_FORMNAME ,"VALUE 'TOP_OF_LIST', "報表區域變量
     G_END_OF_LIST  TYPE SLIS_FORMNAME ."VALUE 'END_OF_LIST'. "頁尾區域變量
*&--------------------------------------------------------------------*
*&      Form  SET_alv_field_info
*&--------------------------------------------------------------------*
*基本型的ALV
*&KEY & FIX_COLUMN 搭配可固定列
*&POS:欄位計輸器,在傳輸參數時可以為空
*&FIELD_NAME:表格欄位
*&SELTEXT_L:欄位說明
*&KEY:是否為KEY值
*&EMPHASIZE:欄位顏色設定
*&FIX_COLUMN:固定列
*&NO_ZERO:輸出不顯示0
**---------------------------------------------------------------------*
FORM SET_ALV_FIELD_INFO USING POS
                              FIELD_NAME
                              SELTEXT_L
                              KEY
                              EMPHASIZE
                              FIX_COLUMN
                              NO_ZERO .
  CLEAR I_FIELDCAT.
  I_FIELDCAT-COL_POS       =  POS.
  I_FIELDCAT-FIELDNAME     =  FIELD_NAME.
  I_FIELDCAT-SELTEXT_L     =  SELTEXT_L.
  I_FIELDCAT-KEY           =  KEY.
  I_FIELDCAT-EMPHASIZE     =  EMPHASIZE.
  I_FIELDCAT-FIX_COLUMN    =  FIX_COLUMN.
  I_FIELDCAT-NO_ZERO       =  NO_ZERO .
  APPEND I_FIELDCAT  TO PGT_FIELDCAT.

  LOOP AT PGT_FIELDCAT INTO W_FIELDCAT_ALV.
    CASE W_FIELDCAT_ALV-FIELDNAME.
      WHEN 'NAME'.
        W_FIELDCAT_ALV-HOTSPOT   = 'X'.
      WHEN 'MYFIELD'.
        W_FIELDCAT_ALV-CHECKBOX  = 'X'.
        W_FIELDCAT_ALV-SELTEXT_S = 'MyChkBox'.
      WHEN OTHERS.
    ENDCASE.
    MODIFY PGT_FIELDCAT FROM W_FIELDCAT_ALV.
  ENDLOOP.


ENDFORM.                    "SET_alv_field_info
*&--------------------------------------------------------------------*
*&      Form  SET_alv_field_info1
*&--------------------------------------------------------------------*
*基本型的ALV
*&KEY & FIX_COLUMN 搭配可固定列
*&POS:欄位計輸器,在傳輸參數時可以為空
*&FIELD_NAME:表格欄位
*&SELTEXT_L:欄位說明
*&KEY:是否為KEY值
*&EMPHASIZE:欄位顏色設定
*&FIX_COLUMN:固定列
*&NO_ZERO:輸出不顯示0
*&REF_TABNAME:參考表格
*&REF_FIELDNAME:參考字段名
**---------------------------------------------------------------------*
FORM SET_ALV_FIELD_INFO1 USING POS
                              FIELD_NAME
                              SELTEXT_L
                              REF_TABNAME
                              REF_FIELDNAME
                              KEY
                              EMPHASIZE
                              FIX_COLUMN
                              NO_ZERO .
  CLEAR I_FIELDCAT.
  I_FIELDCAT-COL_POS       =  POS.
  I_FIELDCAT-FIELDNAME     =  FIELD_NAME.
  I_FIELDCAT-SELTEXT_L     =  SELTEXT_L.
  I_FIELDCAT-REF_TABNAME   =  REF_TABNAME.
  I_FIELDCAT-REF_FIELDNAME =  REF_FIELDNAME.
  I_FIELDCAT-KEY           =  KEY.
  I_FIELDCAT-EMPHASIZE     =  EMPHASIZE.
  I_FIELDCAT-FIX_COLUMN    =  FIX_COLUMN.
  I_FIELDCAT-NO_ZERO       =  NO_ZERO .
  APPEND I_FIELDCAT  TO PGT_FIELDCAT.

  LOOP AT PGT_FIELDCAT INTO W_FIELDCAT_ALV.
    CASE W_FIELDCAT_ALV-FIELDNAME.
      WHEN 'NAME'.
        W_FIELDCAT_ALV-HOTSPOT   = 'X'.
      WHEN 'MYFIELD'.
        W_FIELDCAT_ALV-CHECKBOX  = 'X'.
        W_FIELDCAT_ALV-SELTEXT_S = 'MyChkBox'.
      WHEN OTHERS.
    ENDCASE.
    MODIFY PGT_FIELDCAT FROM W_FIELDCAT_ALV.
    IF W_FIELDCAT_ALV-SELTEXT_L  IS INITIAL .
      DELETE PGT_FIELDCAT .
    ENDIF .
  ENDLOOP.

ENDFORM.                    "SET_alv_field_info1
*&--------------------------------------------------------------------*
*&      Form  SET_alv_field_info2
*&--------------------------------------------------------------------*
*基本型的ALV
*&KEY & FIX_COLUMN 搭配可固定列
*&POS:欄位計輸器,在傳輸參數時可以為空
*&FIELD_NAME:表格欄位
*&SELTEXT_L:欄位說明
*&KEY:是否為KEY值
*&EMPHASIZE:欄位顏色設定
*&FIX_COLUMN:固定列
*&NO_ZERO:輸出不顯示0
*&SELTEXT_M:欄位說明
*&OUTPUTLEN:輸出長度
*&TABNAME:結構名
**---------------------------------------------------------------------*
FORM SET_ALV_FIELD_INFO2 USING POS
                              FIELD_NAME
                              SELTEXT_L
                              SELTEXT_M
                              KEY
                              EMPHASIZE
                              FIX_COLUMN
                              NO_ZERO
                              OUTPUTLEN
                              TABNAME.
  CLEAR I_FIELDCAT.
  I_FIELDCAT-COL_POS       =  POS.
  I_FIELDCAT-FIELDNAME     =  FIELD_NAME.
  I_FIELDCAT-SELTEXT_L     =  SELTEXT_L.
  I_FIELDCAT-SELTEXT_M     =  SELTEXT_M.
  I_FIELDCAT-KEY           =  KEY.
  I_FIELDCAT-EMPHASIZE     =  EMPHASIZE.
  I_FIELDCAT-FIX_COLUMN    =  FIX_COLUMN.
  I_FIELDCAT-NO_ZERO       =  NO_ZERO .
  I_FIELDCAT-OUTPUTLEN     =  OUTPUTLEN .
  I_FIELDCAT-TABNAME       =  TABNAME .
  APPEND I_FIELDCAT  TO PGT_FIELDCAT.
ENDFORM.                    "SET_alv_field_info
*&--------------------------------------------------------------------*
*&      Form F_CALL_ALV
*&--------------------------------------------------------------------*
*雙層的ALV
*&TABNAME_HEADER: 第一層欄位名
*&TABNAME_ITEM:第二層欄位名
*&OUTTAB_HEADER:第一層字段內容
*&OUTTAB_ITEM:第二層字段內容
**---------------------------------------------------------------------*
FORM F_CALL_ALV TABLES OUTTAB_HEADER OUTTAB_ITEM
                USING  VALUE(TABNAME_HEADER)
                       VALUE(TABNAME_ITEM).

  CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
     EXPORTING
       I_CALLBACK_PROGRAM             = G_REPID
*      I_CALLBACK_PF_STATUS_SET       = 'F_SET_STATUS'
*      I_CALLBACK_USER_COMMAND        =
       IS_LAYOUT                      = PIS_LAYOUT
       IT_FIELDCAT                    = PGT_FIELDCAT[]
       I_DEFAULT                      = 'X'
       I_SAVE                         = 'A'
       IS_VARIANT                     = I_VARIANT
       I_TABNAME_HEADER               = TABNAME_HEADER  "第一
       I_TABNAME_ITEM                 = TABNAME_ITEM  "第二
       IS_KEYINFO                     = I_KEYINFO
       IS_PRINT                       = IS_PRINT
      I_BYPASSING_BUFFER             = 'X'
      I_BUFFER_ACTIVE                = ' '
     TABLES
       T_OUTTAB_HEADER                = OUTTAB_HEADER[]  "第一
       T_OUTTAB_ITEM                  = OUTTAB_ITEM[]  "第二
     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.                    " F_CALL_ALV

*---------------------------------------------------------------------*
*       FORM get_alv_event                                            *
*---------------------------------------------------------------------*
*&取得現有可用的Alv Event .
*---------------------------------------------------------------------*
FORM GET_ALV_EVENT.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE = 0
    IMPORTING
      ET_EVENTS   = I_EVENTS[].

ENDFORM.                    "get_alv_event

*&--------------------------------------------------------------------*
*&      Form  FILL_ALV_EVENT
*&--------------------------------------------------------------------*
*&P_EVENTID:  EVENT ID
*&TOP-OF-PAGE
*&END-OF-PAGE
*&END-OF-LIST
*&P_FUNCNAME: FUNCTION NAME
*---------------------------------------------------------------------*
FORM FILL_ALV_EVENT USING VALUE(P_EVENTID)
      VALUE(P_FUNCNAME).

  IF I_EVENTS[] IS INITIAL .
    PERFORM  GET_ALV_EVENT.
  ENDIF.


  READ TABLE I_EVENTS WITH KEY NAME =  P_EVENTID
       INTO W_EVENTS.
  IF SY-SUBRC = 0.
    MOVE P_FUNCNAME TO W_EVENTS-FORM.
    MODIFY I_EVENTS FROM W_EVENTS INDEX SY-TABIX."將標題區數据賦值給W_EVENTS
  ENDIF.
ENDFORM.                    "FILL_ALV_EVENT
*---------------------------------------------------------------------*
*       FORM alv_end_of_list                                          *
*---------------------------------------------------------------------*
*& FOR  GRID
*---------------------------------------------------------------------*
*FORM ALV_END_OF_LIST.
*
*  CLEAR: I_LIST_COMMENTS[].
*  W_LIST_COMMENTS-TYP = 'A'. "H = Header, S = Selection, A = Action
*  W_LIST_COMMENTS-KEY = ''.
*  W_LIST_COMMENTS-INFO = '報表結束'.
*  APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
*
*  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*    EXPORTING
*      IT_LIST_COMMENTARY = I_LIST_COMMENTS
*      I_LOGO             = 'HOTEL_5_STAR'
*      I_END_OF_LIST_GRID = 'X'.
*
*ENDFORM.                    "alv_end_of_list
*&---------------------------------------------------------------------*
*       FORM alv_end_of_page                                          *
*---------------------------------------------------------------------*
*& FOR  GRID
*---------------------------------------------------------------------*
FORM ALV_END_OF_PAGE.

ENDFORM.                    "ALV_END_OF_PAGE
*&---------------------------------------------------------------------*
*&      Form  LAYOUT_INIT
*&---------------------------------------------------------------------*
FORM LAYOUT_INIT USING RS_LAYOUT TYPE SLIS_LAYOUT_ALV.
  RS_LAYOUT-DETAIL_POPUP      = 'X'.
ENDFORM.                    " layout_init

*&---------------------------------------------------------------------*
*&      Form  EVENT_EXIT_BUILD
*&---------------------------------------------------------------------*
*&I_EVENT_EXIT:
*&EXIT-UCOMM:設置触發彈出詳細信息窗口的功能碼,這里是雙擊
*&EXIT-BEFORE:触發前參數
*&EXIT-AFTER:触發後參數
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EVENT_EXIT_BUILD .
  CLEAR: I_EVENT_EXIT[].
* Pick
  W_EVENT_EXIT-UCOMM  = '&ETA'. "設置触發彈出詳細信息窗口的功能碼,這里是雙擊
  W_EVENT_EXIT-BEFORE = ' '.
  W_EVENT_EXIT-AFTER  = 'X'.
  APPEND W_EVENT_EXIT TO I_EVENT_EXIT.

ENDFORM.                    " EVENT_EXIT_BUILD

*&---------------------------------------------------------------------*
*&      Form  PRINT_BUILD
*&---------------------------------------------------------------------*
*&NO_PRINT_LISTINFOS:Display no listinfos
*----------------------------------------------------------------------*
FORM PRINT_BUILD .
  IS_PRINT-NO_PRINT_LISTINFOS = 'X'.
ENDFORM.                    " PRINT_BUILD

*&---------------------------------------------------------------------*
*&      Form  LAYOUT_BUILD
*&---------------------------------------------------------------------*
*&ZEBRA:可選行顏色設置
*&DETAIL_POPUP:鼠標右鍵功能
*&F2CODE:雙擊鼠表功能
*&NO_VLINE:豎直線條設置
*&COLWIDTH_OPTIMIZE:輸出寬度調節
*&DETAIL_INITIAL_LINES:橫線設置
*&DETAIL_TITLEBAR:輸出alv的toolbar
*----------------------------------------------------------------------*
*& FOR  GRID
*----------------------------------------------------------------------*
FORM LAYOUT_BUILD .
  "用于定義ALV表單的相關格式、屬性
  PIS_LAYOUT-ZEBRA = 'X'.
  PIS_LAYOUT-DETAIL_POPUP = 'X'.
  G_REPID = SY-REPID.
  PIS_LAYOUT-F2CODE = '&ETA'.
  PIS_LAYOUT-NO_VLINE             = ' '.
  PIS_LAYOUT-COLWIDTH_OPTIMIZE    = 'X'.
  PIS_LAYOUT-DETAIL_INITIAL_LINES = 'X'.
  PIS_LAYOUT-DETAIL_TITLEBAR      = 'Detail Title Bar'.

ENDFORM.                    " LAYOUT_BUILD

*&---------------------------------------------------------------------*
*&      Form  ALV_REPORT_DISPLAY
*&---------------------------------------------------------------------*
*& 基本型GRID ALV FOR HANNSTAR.
*&---------------------------------------------------------------------*
*& Grid 格式為網格格式:
*& 鼠標右鍵:可用
*& TOP-OF-PAGE:只可固定于左對齊位置
*& 輸出長度不受系統限制(1023)
*& 列寬可隨意變更
*&---------------------------------------------------------------------*
FORM ALV_REPORT_DISPLAY TABLES ITAB.
  W_HTML_TOP_OF_PAGE = 'HTML_TOP_OF_PAGE'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM      = G_REPID   "前程序
      I_BACKGROUND_ID         = '  '
*      I_BACKGROUND_ID         = 'ALV_BACKGROUND'
*      I_BACKGROUND_ID         = 'SIWB_WALLPAPER'
      I_DEFAULT               = 'X'
      I_SAVE                  = 'A'
      IS_LAYOUT               = PIS_LAYOUT  "子函LAYOUT_BUILD填充的格式定?
      IT_FIELDCAT             = PGT_FIELDCAT[] "子函FIELDS填充的各列
      I_CALLBACK_USER_COMMAND = G_USER_COMMAND
*      I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
      I_CALLBACK_HTML_TOP_OF_PAGE = W_HTML_TOP_OF_PAGE
      IT_EVENTS               = I_EVENTS
      IT_EVENT_EXIT           = I_EVENT_EXIT
*    IS_LAYOUT                   = SLA
      IS_PRINT                = IS_PRINT
    TABLES
      T_OUTTAB                = ITAB
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.
*定義相關快捷按鈕,以免出現退回等按鈕丟矢的情況
  IF SY-SUBRC = 0.
    IF G_EXIT_CAUSED_BY_CALLER = 'X'.
    ELSE.
      IF GS_EXIT_CAUSED_BY_USER-BACK = 'X'.       "F3
      ELSE.
        IF GS_EXIT_CAUSED_BY_USER-EXIT = 'X'.     "F15
        ELSE.
          IF GS_EXIT_CAUSED_BY_USER-CANCEL = 'X'. "F12
          ELSE.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ELSE.
  ENDIF.

ENDFORM.                    "ALV_REPORT_DISPLAY
*---------------------------------------------------------------------*
*       FORM ALV_report                                               *
*---------------------------------------------------------------------*
*  基本型的ALV                                                        *
*---------------------------------------------------------------------*
FORM ALV_REPORT TABLES ITAB
USING PROGRAM_NAME
      STRUCTURE_NAME
      PROGRAM_USCOMM
      PROGRAM_STATUS
      CHKBOX
      COLOR.
* ALV 宣告
  DATA :PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
        PIS_VARIANT TYPE DISVARIANT.

  IF PGT_FIELDCAT[] IS INITIAL .
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.
  ENDIF.
  IF P_ALV_HANDLE IS INITIAL .
  ELSE.
    PIS_VARIANT-HANDLE = P_ALV_HANDLE.
  ENDIF.

  PIS_LAYOUT-F2CODE  = 'PICK'.
  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-USERNAME = SY-UNAME.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

  IF COLOR = ' ' .
    PIS_LAYOUT-ZEBRA = 'X' .
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = PROGRAM_NAME
      I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
      I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS
      I_STRUCTURE_NAME         = STRUCTURE_NAME
      IS_LAYOUT                = PIS_LAYOUT
      IS_VARIANT               = PIS_VARIANT
      IT_FIELDCAT              = PGT_FIELDCAT[]
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = ITAB
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

ENDFORM.                    "alv_report
*---------------------------------------------------------------------*
*       FORM popup_alv_log                                            *
*---------------------------------------------------------------------*
*  popup 型態的ALV
*****************
FORM POPUP_ALV_LOG TABLES ITAB
USING PROGRAM_NAME STRUCTURE_NAME .
*
**** >>> ALV 宣告
  DATA : PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
         PIS_VARIANT TYPE DISVARIANT.
  DATA:  PLS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

**** <<< ALV 宣告
  IF PGT_FIELDCAT[] IS INITIAL .
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
  EXPORTING
    I_CALLBACK_PROGRAM = PROGRAM_NAME
*      i_structure_name   = structure_name
    IT_FIELDCAT        = PGT_FIELDCAT[]
    I_TITLE            = 'Message Log'
    I_SELECTION        = ''
    I_TABNAME          = 'ITAB'
    I_ZEBRA            = 'X'
  TABLES
    T_OUTTAB           = ITAB
  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.                    "popup_alv_log


*&---------------------------------------------------------------------*
*&      Form  popup_alv_log_full2
*&---------------------------------------------------------------------*
****  浮動式的ALV report
*----------------------------------------------------------------------*
FORM POPUP_ALV_LOG2 TABLES ITAB
USING PROGRAM_NAME STRUCTURE_NAME
      PROGRAM_USCOMM PROGRAM_STATUS
      CHKBOX
      COLOR
      ZEBRA
      ..

  .

**** >>> ALV 宣告
  DATA :  "pgt_fieldcat TYPE slis_t_fieldcat_alv,
        PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
*          is_exit TYPE slis_exit_by_user,
        PIS_VARIANT TYPE DISVARIANT.
*          is_variant2 TYPE disvariant.
**** <<< ALV 宣告
  IF PGT_FIELDCAT[] IS INITIAL .
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.
  ENDIF.
  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  PIS_LAYOUT-F2CODE  = 'PICK'.
*  is_layout-info_fieldname = 'COLOR'.
*  pis_variant-report = program_name.
*  is_variant-handle = '0001'.
*  pis_variant-username = sy-uname.
*  is_variant-log_group = '000A'.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  IF ZEBRA = 'X'.
    PIS_LAYOUT-ZEBRA = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-ZEBRA .
  ENDIF.

  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-HANDLE = '0001'.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = PROGRAM_NAME
      I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
      I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS
      I_STRUCTURE_NAME         = STRUCTURE_NAME
      IS_LAYOUT                = PIS_LAYOUT
      IS_VARIANT               = PIS_VARIANT
      IT_FIELDCAT              = PGT_FIELDCAT[]
      IT_SORT                  = I_SORT[]
      IS_PRINT                 = IS_PRINT
      IT_EVENTS                = I_EVENT[]
      I_SAVE                   = 'A'                        "HP_311471
      I_SCREEN_START_COLUMN    = 5
      I_SCREEN_START_LINE      = 5
      I_SCREEN_END_COLUMN      = 90
      I_SCREEN_END_LINE        = 20
    TABLES
      T_OUTTAB                 = ITAB
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

*FORM user_command USING r_ucomm LIKE sy-ucomm
*rs_selfield TYPE slis_selfield.
*
*FORM status USING rt_extab TYPE slis_t_extab.

ENDFORM.                    " popup_alv_log_full2

*&--------------------------------------------------------------------*
*&      Form  popup_alv_log3
*&--------------------------------------------------------------------*
FORM POPUP_ALV_LOG3   TABLES ITAB
USING PROGRAM_NAME STRUCTURE_NAME
      PROGRAM_USCOMM PROGRAM_STATUS
      CHKBOX
      COLOR
      ZEBRA
      P_TYPE.
*                                   1:正常ALV , 2: Err Log
*DATA : BEGIN OF pgt_msg OCCURS 0 .
*DATA : type LIKE bapiret1-type,
*       message LIKE bapiret1-message,
*       color LIKE wb2_alv_head_dyn-linecolor .
*DATA : END OF pgt_msg.

**** >>> ALV 宣告
  DATA :  L_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
        PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
*          is_exit TYPE slis_exit_by_user,
        PIS_VARIANT TYPE DISVARIANT.
*          is_variant2 TYPE disvariant.

  CLEAR: PGT_FIELDCAT, PGT_FIELDCAT[].

**** <<< ALV 宣告
  CASE P_TYPE.
    WHEN '1' OR ' '.
      IF PGT_FIELDCAT[] IS INITIAL .
        CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
          EXPORTING
            I_PROGRAM_NAME         = PROGRAM_NAME
            I_STRUCTURE_NAME       = STRUCTURE_NAME
            I_CLIENT_NEVER_DISPLAY = 'X'
          CHANGING
            CT_FIELDCAT            = PGT_FIELDCAT[]
          EXCEPTIONS
            INCONSISTENT_INTERFACE = 1
            PROGRAM_ERROR          = 2
            OTHERS                 = 3.
      ENDIF.

    WHEN '2'.

      L_FIELDCAT-FIELDNAME     = 'TYPE'.
      L_FIELDCAT-REF_FIELDNAME = 'BAPIRET1'.
      L_FIELDCAT-REF_TABNAME   = 'BAPIRET1'.
      APPEND L_FIELDCAT TO PGT_FIELDCAT .
      CLEAR L_FIELDCAT.

      L_FIELDCAT-FIELDNAME     = 'MESSAGE'.
      L_FIELDCAT-REF_FIELDNAME = 'MESSAGE'.
      L_FIELDCAT-REF_TABNAME   = 'BAPIRET1'.
      APPEND L_FIELDCAT TO PGT_FIELDCAT .
      CLEAR L_FIELDCAT.

      L_FIELDCAT-FIELDNAME     = 'LINECOLOR'.
      L_FIELDCAT-REF_FIELDNAME = 'LINECOLOR'.
      L_FIELDCAT-REF_TABNAME   = 'WB2_ALV_HEAD_DYN'.
      APPEND L_FIELDCAT TO PGT_FIELDCAT .
      CLEAR L_FIELDCAT.
*
  ENDCASE.

  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  PIS_LAYOUT-F2CODE  = 'PICK'.
*  is_layout-info_fieldname = 'COLOR'.
*  pis_variant-report = program_name.
*  is_variant-handle = '0001'.
*  pis_variant-username = sy-uname.
*  is_variant-log_group = '000A'.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  IF ZEBRA = 'X'.
    PIS_LAYOUT-ZEBRA = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-ZEBRA .
  ENDIF.

  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-HANDLE = '0001'.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = PROGRAM_NAME
      I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
      I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS
      I_STRUCTURE_NAME         = STRUCTURE_NAME
      IS_LAYOUT                = PIS_LAYOUT
      IS_VARIANT               = PIS_VARIANT
      IT_FIELDCAT              = PGT_FIELDCAT[]
      IT_SORT                  = I_SORT[]
      IS_PRINT                 = IS_PRINT
      IT_EVENTS                = I_EVENT[]
      I_SAVE                   = 'A'                        "HP_311471
      I_SCREEN_START_COLUMN    = 5
      I_SCREEN_START_LINE      = 5
      I_SCREEN_END_COLUMN      = 90
      I_SCREEN_END_LINE        = 20
    TABLES
      T_OUTTAB                 = ITAB
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

*FORM user_command USING r_ucomm LIKE sy-ucomm
*rs_selfield TYPE slis_selfield.
*
*FORM status USING rt_extab TYPE slis_t_extab.

 

ENDFORM.                    " popup_alv_log_3
*---------------------------------------------------------------------*
*       FORM popup_alv_log4                                            *
*---------------------------------------------------------------------*
*  popup 型態的ALV
*****************
FORM POPUP_ALV_LOG4 TABLES ITAB
USING PROGRAM_NAME STRUCTURE_NAME P_TITLE.
*
**** >>> ALV 宣告
  DATA :
        PIS_LAYOUT   TYPE SLIS_LAYOUT_ALV,
        PIS_VARIANT  TYPE DISVARIANT,
        PLS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

  DATA: IEX TYPE SLIS_T_EXTAB.
  DATA: XEX LIKE LINE OF IEX.
  DATA: I_TITLE(50).

**** <<< ALV 宣告
  IF PGT_FIELDCAT[] IS INITIAL .
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.
  ENDIF.

  XEX-FCODE = '&NT1'. APPEND XEX TO IEX.
  XEX-FCODE = '&OUP'. APPEND XEX TO IEX.
  XEX-FCODE = '&ODN'. APPEND XEX TO IEX.
  XEX-FCODE = '&ILT'. APPEND XEX TO IEX.
  XEX-FCODE = '&OL0'. APPEND XEX TO IEX.
  XEX-FCODE = '%SC' . APPEND XEX TO IEX.
  XEX-FCODE = '%SC+'. APPEND XEX TO IEX.

  IF P_TITLE = SPACE.
    I_TITLE = 'Message Log'.
  ELSE.
    I_TITLE =  P_TITLE.
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
    EXPORTING
      I_CALLBACK_PROGRAM    = PROGRAM_NAME
      IT_FIELDCAT           = PGT_FIELDCAT[]
      I_TITLE               = I_TITLE
      I_SCREEN_START_COLUMN = 5
      I_SCREEN_START_LINE   = 5
      I_SCREEN_END_COLUMN   = 110
      I_SCREEN_END_LINE     = 20
      I_SELECTION           = 'X'
      I_TABNAME             = 'ITAB'
      I_ZEBRA               = 'X'
      IT_EXCLUDING          = IEX
    TABLES
      T_OUTTAB              = ITAB
    EXCEPTIONS
      PROGRAM_ERROR         = 1
      OTHERS                = 2.

ENDFORM.                    "popup_alv_log4

*&--------------------------------------------------------------------*
*&      Form  alv_report
*&--------------------------------------------------------------------*
* 支援 ALV Event Report 的 ALV
FORM ALV_REPORT_EVENT TABLES ITAB
USING PROGRAM_NAME
      STRUCTURE_NAME
      PROGRAM_USCOMM
      PROGRAM_STATUS
      CHKBOX
      COLOR
      ZEBRA
      NO_TOTALLINE.

  IF PGT_FIELDCAT[] IS INITIAL .

    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.

  ENDIF.

  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  PIS_LAYOUT-F2CODE            = 'PICK'.
  PIS_LAYOUT-TOTALS_TEXT       = 'Totals'.
  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-HANDLE = I_VARIANT-HANDLE.
  PIS_VARIANT-USERNAME = SY-UNAME.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF NO_TOTALLINE = 'X'.
    PIS_LAYOUT-NO_TOTALLINE = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-NO_TOTALLINE.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  IF ZEBRA = 'X'.
    PIS_LAYOUT-ZEBRA = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-ZEBRA .
  ENDIF.

  IS_PRINT-NO_CHANGE_PRINT_PARAMS = 'X'.
  IS_PRINT-NO_PRINT_LISTINFOS = 'X'.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = PROGRAM_NAME
      I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
      I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS
      I_STRUCTURE_NAME         = STRUCTURE_NAME
      IS_LAYOUT                = PIS_LAYOUT
      IS_VARIANT               = PIS_VARIANT
      IT_FIELDCAT              = PGT_FIELDCAT[]
      IT_SORT                  = I_SORT[]
      IS_PRINT                 = IS_PRINT
      IT_EVENTS                = I_EVENT[]
      I_SAVE                   = 'A'                        "HP_311471
    TABLES
      T_OUTTAB                 = ITAB
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

ENDFORM.                    "alv_report_enevt

*&--------------------------------------------------------------------*
*&      Form  alv_report
*&--------------------------------------------------------------------*
*  多個ALV Report 在一個報表的 型態
FORM BLOCK_ALV_REPORT TABLES ITAB                           "Type = 2 用
  EVENTS                                                    "Type = 2 用
USING VALUE(TYPE)
      PROGRAM_NAME
      PROGRAM_USCOMM
      PROGRAM_STATUS
      STRUCTURE_NAME                                        "Type = 2 用
      ITAB_NAME                                             "Type = 2 用
      BLOCK_ALV_TITLE                                       "Type = 2 用
      CHKBOX                                                "Type = 2 用
      COLOR                                                 "Type = 2 用
      ZEBRA                                                 "Type = 2 用
      .

**** >>> ALV 宣告
  DATA :  PGT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
          PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
          PIS_VARIANT TYPE DISVARIANT.
**** <<< ALV 宣告
  IF TYPE = 1 .
    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
      EXPORTING
        I_CALLBACK_PROGRAM       = PROGRAM_NAME
        I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
        I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS.
    EXIT.
  ENDIF.
  IF TYPE = 2.
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        I_PROGRAM_NAME         = PROGRAM_NAME
        I_STRUCTURE_NAME       = STRUCTURE_NAME
        I_CLIENT_NEVER_DISPLAY = 'X'
      CHANGING
        CT_FIELDCAT            = PGT_FIELDCAT[]
      EXCEPTIONS
        INCONSISTENT_INTERFACE = 1
        PROGRAM_ERROR          = 2
        OTHERS                 = 3.

    PIS_LAYOUT-F2CODE  = 'PICK'.
    PIS_VARIANT-REPORT = PROGRAM_NAME.
    PIS_VARIANT-USERNAME = SY-UNAME.
    IF CHKBOX = 'X'.
      PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
    ELSE.
      CLEAR PIS_LAYOUT-BOX_FIELDNAME.
    ENDIF.
    IF COLOR = 'X'.
      PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
    ELSE.
      CLEAR PIS_LAYOUT-INFO_FIELDNAME .
    ENDIF.

    IF ZEBRA = 'X'.
      PIS_LAYOUT-ZEBRA = 'X'.
    ELSE.
      CLEAR PIS_LAYOUT-ZEBRA .
    ENDIF.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        IT_FIELDCAT = PGT_FIELDCAT[]
        IS_LAYOUT   = PIS_LAYOUT
        I_TABNAME   = ITAB_NAME
        IT_EVENTS   = EVENTS[]
        I_TEXT      = BLOCK_ALV_TITLE
      TABLES
        T_OUTTAB    = ITAB.
    EXIT.
  ENDIF.

  IF TYPE = 3.
    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'.
    EXIT.
  ENDIF.

ENDFORM.                    "alv_report

*&--------------------------------------------------------------------*
*&      Form  alv_report_hierseq
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->ITAB_H     text
*      -->ITAB_D     text
*      -->VALUE(PROGRtextAME)
*      -->VALUE(STRUCtext_NAME_H)
*      -->VALUE(STRUCtext_NAME_D)
*      -->VALUE(ITAB_text_H)
*      -->VALUE(ITAB_text_D)
*      -->VALUE(ITAB_textH)
*      -->VALUE(ITAB_textD)
*      -->VALUE(PROGRtextSCOMM)
*      -->VALUE(PROGRtextTATUS)
*      -->VALUE(CHKBOtext
*      -->VALUE(COLORtext
*      -->VALUE(ZEBRAtext
*      -->VALUE(STARTtextUMN)
*      -->VALUE(STARTtextE)
*---------------------------------------------------------------------*
FORM  ALV_REPORT_HIERSEQ TABLES  ITAB_H " STRUCTURE i_bkpf
  ITAB_D " STRUCTURE i_bseg
USING VALUE(PROGRAM_NAME)
      VALUE(STRUCTURE_NAME_H)
      VALUE(STRUCTURE_NAME_D)
      VALUE(ITAB_NAME_H)
      VALUE(ITAB_NAME_D)
      VALUE(ITAB_TXT_H)
      VALUE(ITAB_TXT_D)
      VALUE(PROGRAM_USCOMM)
      VALUE(PROGRAM_STATUS)
      VALUE(CHKBOX)
      VALUE(COLOR)
      VALUE(ZEBRA)
      VALUE(START_COLUMN)
      VALUE(START_LINE)
      VALUE(KEYINFO).

*** >>> ALV 宣告
  DATA :  PGT_FIELDCAT_A TYPE SLIS_T_FIELDCAT_ALV,
          PGT_FIELDCAT_B TYPE SLIS_T_FIELDCAT_ALV,
          PGT_FIELDCAT   TYPE SLIS_T_FIELDCAT_ALV,
          P_FIELD TYPE SLIS_FIELDCAT_ALV,
          PIS_LAYOUT TYPE SLIS_LAYOUT_ALV,
          PIS_VARIANT TYPE DISVARIANT,
          P_CNT LIKE SY-INDEX.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         = PROGRAM_NAME
      I_STRUCTURE_NAME       = STRUCTURE_NAME_H
      I_INTERNAL_TABNAME     = ITAB_NAME_H
      I_CLIENT_NEVER_DISPLAY = ''
    CHANGING
      CT_FIELDCAT            = PGT_FIELDCAT[]
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         = PROGRAM_NAME
      I_STRUCTURE_NAME       = STRUCTURE_NAME_D
      I_INTERNAL_TABNAME     = ITAB_NAME_D
      I_CLIENT_NEVER_DISPLAY = ''
    CHANGING
      CT_FIELDCAT            = PGT_FIELDCAT[]
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.

*  LOOP AT pgt_fieldcat_a INTO  p_field .
*    ADD 1 TO p_cnt .
*    p_field-col_pos = p_cnt.
*    APPEND p_field TO pgt_fieldcat  .
*  ENDLOOP.
*  LOOP AT pgt_fieldcat_b INTO  p_field .
*    ADD 1 TO p_cnt .
*    p_field-col_pos = p_cnt.
*    APPEND  p_field TO pgt_fieldcat  .
*  ENDLOOP.

  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  PIS_LAYOUT-F2CODE  = 'PICK'.
  PIS_LAYOUT-ITEM_TEXT =  ITAB_TXT_D.
  PIS_LAYOUT-HEADER_TEXT =  ITAB_TXT_H.
  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-USERNAME = SY-UNAME.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  IF ZEBRA = 'X'.
    PIS_LAYOUT-ZEBRA = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-ZEBRA .
  ENDIF.


  DATA : P_TAB_H TYPE SLIS_TABNAME ,
         P_TAB_D TYPE SLIS_TABNAME .

  P_TAB_H = ITAB_NAME_H.
  P_TAB_D = ITAB_NAME_D.

  PIS_VARIANT-REPORT = SY-CPROG.

  CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
  EXPORTING
    I_CALLBACK_PROGRAM             = PROGRAM_NAME
    I_CALLBACK_PF_STATUS_SET       = PROGRAM_STATUS
    I_CALLBACK_USER_COMMAND        = PROGRAM_USCOMM
    IS_LAYOUT                      = PIS_LAYOUT
    IT_FIELDCAT                    = PGT_FIELDCAT[]
*   IT_SPECIAL_GROUPS              =
*   IT_SORT                        =
*   IT_FILTER                      =
*   IS_SEL_HIDE                    =
*   i_screen_start_column          = 5
*   i_screen_start_line            = 5
*   i_screen_end_column            = 90
*   i_screen_end_line              = 20
*   I_DEFAULT                      = 'X'
    I_SAVE                         = 'X'
*   is_variant                     =  pis_variant
*   it_events                      =  i_event[]
*   IT_EVENT_EXIT                  =
    I_TABNAME_HEADER               = P_TAB_H
    I_TABNAME_ITEM                 = P_TAB_D
*   I_STRUCTURE_NAME_HEADER        = 'BKPF'
*   I_STRUCTURE_NAME_ITEM          = 'BSEG'
    IS_KEYINFO                     = KEYINFO
*   IS_PRINT                       =
*   IS_REPREP_ID                   =
*   I_BYPASSING_BUFFER             =
*   I_BUFFER_ACTIVE                =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER        =
*   ES_EXIT_CAUSED_BY_USER         =
  TABLES
    T_OUTTAB_HEADER                =  ITAB_H[]
    T_OUTTAB_ITEM                  =  ITAB_D[]
  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.                    "alv_report_HIERSEQ
*&--------------------------------------------------------------------*
*&      Form  alv_report_hierseq_1
*&--------------------------------------------------------------------*
FORM  ALV_REPORT_HIERSEQ_1 TABLES ITAB_H
                                  ITAB_D
                            USING VALUE(PROGRAM_NAME)
                                  VALUE(ITAB_NAME_H)
                                  VALUE(ITAB_NAME_D)
                                  VALUE(ITAB_TXT_H)
                                  VALUE(ITAB_TXT_D)
                                  VALUE(PROGRAM_USCOMM)
                                  VALUE(PROGRAM_STATUS)
                                  VALUE(CHKBOX)
                                  VALUE(COLOR)
                                  VALUE(ZEBRA)
                                  VALUE(START_COLUMN)
                                  VALUE(START_LINE)
                                  VALUE(KEYINFO).

  DATA : P_TAB_H TYPE SLIS_TABNAME ,
         P_TAB_D TYPE SLIS_TABNAME .

  CLEAR PIS_VARIANT.
  PIS_VARIANT-REPORT = SY-CPROG.
  PIS_VARIANT-REPORT = PROGRAM_NAME.
  PIS_VARIANT-USERNAME = SY-UNAME.

  PIS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  PIS_LAYOUT-F2CODE      = 'PICK'.
  PIS_LAYOUT-ITEM_TEXT   =  ITAB_TXT_D.
  PIS_LAYOUT-HEADER_TEXT =  ITAB_TXT_H.

  IF CHKBOX = 'X'.
    PIS_LAYOUT-BOX_FIELDNAME = 'CHKBOX'.
  ELSE.
    CLEAR PIS_LAYOUT-BOX_FIELDNAME.
  ENDIF.

  IF COLOR = 'X'.
    PIS_LAYOUT-INFO_FIELDNAME = 'COLOR'.
  ELSE.
    CLEAR PIS_LAYOUT-INFO_FIELDNAME .
  ENDIF.

  IF ZEBRA = 'X'.
    PIS_LAYOUT-ZEBRA = 'X'.
  ELSE.
    CLEAR PIS_LAYOUT-ZEBRA .
  ENDIF.

  P_TAB_H = ITAB_NAME_H.
  P_TAB_D = ITAB_NAME_D.

  CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = PROGRAM_NAME
      I_CALLBACK_PF_STATUS_SET = PROGRAM_STATUS
      I_CALLBACK_USER_COMMAND  = PROGRAM_USCOMM
      IS_LAYOUT                = PIS_LAYOUT
      IT_FIELDCAT              = PGT_FIELDCAT[]
      I_SAVE                   = 'X'
      I_TABNAME_HEADER         = P_TAB_H
      I_TABNAME_ITEM           = P_TAB_D
      IS_KEYINFO               = KEYINFO
    TABLES
      T_OUTTAB_HEADER          = ITAB_H[]
      T_OUTTAB_ITEM            = ITAB_D[]
    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.                    "alv_report_HIERSEQ_1
*&---------------------------------------------------------------------*
*&      Form  UPADTE_ALV_FIELD_INFO
*&---------------------------------------------------------------------*
* Select ststus  H .Hide
*                K .Key
*                D .小數點顯示位數
*                M .SUM SET
*                L .OUTPUT LEN        <- COLWIDTH_OPTIMIZE 要取消
*                N .Hide all
*                J .(R)ight (L)eft (C)ent
*                Z .leading zero
*                NS.write no-sign
*                NZ.write no-zero
*                NC.no convext
*                CFL/CFM/CFS.Change field desc.
*                S1.sort ASCENDING    <-  要和 M 共用
*                S2.sort DESCENDING   <-  要和 M 共用
*                S3.sort ASCENDING    <-  要和 M 共用(分頁)
*                S4.sort DESCENDING   <-  要和 M 共用(分頁)
* Ex : PERFORM UPADTE_ALV_FIELD_INFO USING 'LIFNR'  'X' 'K'.
*----------------------------------------------------------------------*
FORM UPADTE_ALV_FIELD_INFO USING FIELD_NAME
      SET_VALUE
      STSTUS.

*  DATA: T_TMP  TYPE SLIS_FIELDCAT_ALV,
*        T_TMP2 TYPE SLIS_SORTINFO_ALV,
*        L_TEXT(1),
*        P_TABIX like sy-tabix.
*
** field info.
*  DEFINE UP_FIELD.
*    CLEAR: T_TMP, T_TMP2.
*    READ TABLE &1 INTO T_TMP WITH KEY FIELDNAME = &2.
*    P_TABIX = sy-tabix.
**    DELETE &1 INDEX SY-TABIX.
*
*    IF &4 = 'H'.
*      T_TMP-NO_OUT = &3.     " 隱藏欄位, 但是可以讓使用者手動加入
*      MODIFY &1  FROM T_TMP.
*    ELSEIF &4 = 'K'.
*      T_TMP-KEY = &3.        " KEY SET
*      MODIFY  &1 FROM T_TMP .
*    ELSEIF &4 = 'M'.
*      T_TMP-DO_SUM = &3.     " SUM SET
*      MODIFY  &1  FROM T_TMP .
*    ELSEIF &4 = 'L'.
*      T_TMP-OUTPUTLEN = &3.  " OUTPUT LEN
*      MODIFY  &1 FROM T_TMP.
*    ELSEIF &4 = 'N'.
*      T_TMP-TECH    = &3.    " 完整隱藏
*      MODIFY  &1 FROM T_TMP.
*    ELSEIF &4 = 'CFL' OR &4 = 'CFM' OR &4 = 'CFS'.
*    " 改變說明L/M/S
*      T_TMP-SELTEXT_S = T_TMP-SELTEXT_M = T_TMP-SELTEXT_L
*                      = T_TMP-REPTEXT_DDIC = &3.
*      T_TMP-DDICTXT = &4+2(1).
*      MODIFY  &1 FROM T_TMP.
*    ELSEIF &4 = 'J'.         " (R)ight (L)eft (C)ent
*      T_TMP-JUST = 'C'. "&3.
*      MODIFY &1 FROM T_TMP.
*    ELSEIF &4 = 'Z'.         " leading zero
*      T_TMP-LZERO = &3.
*      MODIFY &1 FROM T_TMP.
*    ELSEIF &4 = 'NS'.        " write no-sign
*      T_TMP-NO_SIGN = &3.
*      MODIFY &1 FROM T_TMP.
*    ELSEIF &4 = 'NZ'.        " write no-zero
*      T_TMP-NO_ZERO = &3.
*      MODIFY &1 FROM T_TMP.
*    ELSEIF &4 = 'NC'.        " no convext
*      T_TMP-NO_CONVEXT = &3.
*      MODIFY &1 FROM T_TMP.
*
*    ELSEIF &4 = 'S1' OR &4 = 'S2' OR
*           &4 = 'S3' OR &4 = 'S4'.
*     MODIFY &1 FROM T_TMP.
*
*      T_TMP2-FIELDNAME = &2.
*
*      T_TMP2-SUBTOT = &3.
*
*      IF &4 = 'S1' OR &4 = 'S3'.
*        T_TMP2-UP = &3.
*      ENDIF.
*
*      IF &4 = 'S3' OR &4 = 'S4'.
*        T_TMP2-GROUP = '* '.
*      ENDIF.
*
*      APPEND T_TMP2 TO I_SORT.
*    ENDIF.
*  END-OF-DEFINITION.
*
*  UP_FIELD PGT_FIELDCAT FIELD_NAME SET_VALUE STSTUS.

  DATA: T_TMP  TYPE SLIS_FIELDCAT_ALV,
        T_TMP2 TYPE SLIS_SORTINFO_ALV,
        L_TEXT(1).

* field info.
  DEFINE UP_FIELD.
    CLEAR: T_TMP, T_TMP2.
    READ TABLE &1 INTO T_TMP WITH KEY FIELDNAME = &2.
    DELETE &1 INDEX SY-TABIX.

    IF &4 = 'H'.
      T_TMP-NO_OUT = &3.     " 隱藏欄位, 但是可以讓使用者手動加入
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'D'.
      T_TMP-DECIMALS_OUT = &3.     " 小數點顯示位數
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'K'.
      T_TMP-KEY = &3.        " KEY SET
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'M'.
      T_TMP-DO_SUM = &3.     " SUM SET
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'L'.
      T_TMP-OUTPUTLEN = &3.  " OUTPUT LEN
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'N'.
      T_TMP-TECH    = &3.    " 完整隱藏
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'CFL' OR &4 = 'CFM' OR &4 = 'CFS'.       " 改變說明L/M/S
      T_TMP-SELTEXT_S = T_TMP-SELTEXT_M = T_TMP-SELTEXT_L
      = T_TMP-REPTEXT_DDIC = &3.
      T_TMP-DDICTXT = &4+2(1).
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'J'.         " (R)ight (L)eft (C)ent
      T_TMP-JUST = 'C'. "&3.
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'Z'.         " leading zero
      T_TMP-LZERO = &3.
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'NS'.        " write no-sign
      T_TMP-NO_SIGN = &3.
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'NZ'.        " write no-zero
      T_TMP-NO_ZERO = &3.
      APPEND T_TMP TO &1.
    ELSEIF &4 = 'NC'.        " no convext
      T_TMP-NO_CONVEXT = &3.
      APPEND T_TMP TO &1.

    ELSEIF &4 = 'S1' OR &4 = 'S2' OR
      &4 = 'S3' OR &4 = 'S4'.
      APPEND T_TMP TO &1.

      T_TMP2-FIELDNAME = &2.

      T_TMP2-SUBTOT = &3.

      IF &4 = 'S1' OR &4 = 'S3'.
        T_TMP2-UP = &3.
      ENDIF.

      IF &4 = 'S3' OR &4 = 'S4'.
        T_TMP2-GROUP = '* '.
      ENDIF.

      APPEND T_TMP2 TO I_SORT.
    ENDIF.
  END-OF-DEFINITION.

  UP_FIELD PGT_FIELDCAT FIELD_NAME SET_VALUE STSTUS.
ENDFORM.                    " UPADTE_ALV_FIELD_INFO

*&---------------------------------------------------------------------*
*&      Form  UPADTE_ALV_FIELD_INFO_2
*&---------------------------------------------------------------------*
* Select ststus  H .Hide
*                K .Key
*                M .SUM SET
*                D .小數點顯示位數
*                L .OUTPUT LEN        <- COLWIDTH_OPTIMIZE 要取消
*                N .Hide all
*                J .(R)ight (L)eft (C)ent
*                Z .leading zero
*                NS.write no-sign
*                NZ.write no-zero
*                NC.no convext
*                CFL/CFM/CFS.Change field desc.
*                TEXT 欄位文字用L/M/S哪一種
*                COLOR : Column 顏色
*                S1.sort ASCENDING    <-  要和 M 共用
*                S2.sort DESCENDING   <-  要和 M 共用
*                S3.sort ASCENDING    <-  要和 M 共用(分頁)
*                S4.sort DESCENDING   <-  要和 M 共用(分頁)
* Ex : PERFORM UPADTE_ALV_FIELD_INFO USING 'LIFNR'  'X' 'K'.
*----------------------------------------------------------------------*
FORM UPADTE_ALV_FIELD_INFO_2
TABLES P_FIELDCAT
  STRUCTURE SLIS_ALV_CATG
USING FIELD_NAME
      SET_VALUE
      STATUS.

  DATA: T_TMP  TYPE SLIS_FIELDCAT_ALV,
        T_TMP2 TYPE SLIS_SORTINFO_ALV,
        L_TEXT(1),
        P_TABIX LIKE SY-TABIX.

** field info.
  CLEAR: T_TMP, T_TMP2.
  READ TABLE P_FIELDCAT INTO T_TMP WITH KEY FIELDNAME = FIELD_NAME.
  CHECK SY-SUBRC EQ 0.
  P_TABIX = SY-TABIX.
*    DELETE &1 INDEX SY-TABIX.
*  UP_FIELD 1:PGT_FIELDCAT 2:FIELD_NAME 3:SET_VALUE 4:STSTUS.

  IF STATUS = 'H'.
    T_TMP-NO_OUT = SET_VALUE.     " 隱藏欄位, 但是可以讓使用者手動加入
    MODIFY P_FIELDCAT  FROM T_TMP.
  ELSEIF STATUS = 'D'.
    T_TMP-DECIMALS_OUT = SET_VALUE.        " 小數點顯示位數
    MODIFY   P_FIELDCAT   FROM T_TMP .
  ELSEIF STATUS = 'K'.
    T_TMP-KEY = SET_VALUE.        " KEY SET
    MODIFY   P_FIELDCAT   FROM T_TMP .
  ELSEIF STATUS = 'TEXT'.
    T_TMP-DDICTXT = SET_VALUE.        " KEY SET
    MODIFY   P_FIELDCAT   FROM T_TMP .
  ELSEIF STATUS = 'COLOR'.
    T_TMP-EMPHASIZE = SET_VALUE.        " KEY SET
    MODIFY   P_FIELDCAT   FROM T_TMP .
  ELSEIF STATUS = 'M'.
    T_TMP-DO_SUM = SET_VALUE.     " SUM SET
    MODIFY   P_FIELDCAT    FROM T_TMP .
  ELSEIF STATUS = 'L'.
    T_TMP-OUTPUTLEN = SET_VALUE.  " OUTPUT LEN
    MODIFY   P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'N'.
    T_TMP-TECH    = SET_VALUE.    " 完整隱藏
    MODIFY   P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'CFL' OR STATUS = 'CFM' OR STATUS = 'CFS'.
    " 改變說明L/M/S
    T_TMP-SELTEXT_S = T_TMP-SELTEXT_M = T_TMP-SELTEXT_L
    = T_TMP-REPTEXT_DDIC = SET_VALUE.
    T_TMP-DDICTXT = STATUS+2(1).
    MODIFY  P_FIELDCAT FROM T_TMP.
  ELSEIF STATUS = 'J'.         " (R)ight (L)eft (C)ent
    T_TMP-JUST = SET_VALUE. "set_value.
    MODIFY  P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'Z'.         " leading zero
    T_TMP-LZERO = SET_VALUE.
    MODIFY  P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'NS'.        " write no-sign
    T_TMP-NO_SIGN = SET_VALUE.
    MODIFY  P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'NZ'.        " write no-zero
    T_TMP-NO_ZERO = SET_VALUE.
    MODIFY  P_FIELDCAT   FROM T_TMP.
  ELSEIF STATUS = 'NC'.        " no convext
    T_TMP-NO_CONVEXT = SET_VALUE.
    MODIFY  P_FIELDCAT   FROM T_TMP.

  ELSEIF STATUS = 'S1' OR STATUS = 'S2' OR
    STATUS = 'S3' OR STATUS = 'S4'.
    MODIFY P_FIELDCAT FROM T_TMP.

    T_TMP2-FIELDNAME = FIELD_NAME.

    T_TMP2-SUBTOT = SET_VALUE.

    IF STATUS = 'S1' OR STATUS = 'S3'.
      T_TMP2-UP = SET_VALUE.
    ENDIF.

    IF STATUS = 'S3' OR STATUS = 'S4'.
      T_TMP2-GROUP = '* '.
    ENDIF.

    APPEND T_TMP2 TO I_SORT.
  ENDIF.
**
**  UP_FIELD PGT_FIELDCAT FIELD_NAME SET_VALUE STSTUS.
**

ENDFORM.                    " UPADTE_ALV_FIELD_INFO
*&---------------------------------------------------------------------*
*&      Form  UPADTE_ALV_FIELD_INFO
*&---------------------------------------------------------------------*
* Select ststus  H .Hide
*                K .Key
*                D .小數點顯示位數
*                M .SUM SET
*                L .OUTPUT LEN        <- COLWIDTH_OPTIMIZE 要取消
*                N .Hide all
*                J .(R)ight (L)eft (C)ent
*                Z .leading zero
*                NS.write no-sign
*                NZ.write no-zero
*                NC.no convext
*                CFL/CFM/CFS.Change field desc.
*                S1.sort ASCENDING    <-  要和 M 共用
*                S2.sort DESCENDING   <-  要和 M 共用
*                S3.sort ASCENDING    <-  要和 M 共用(分頁)
*                S4.sort DESCENDING   <-  要和 M 共用(分頁)
* Ex : PERFORM UPADTE_ALV_FIELD_INFO USING 'LIFNR'  'X' 'K'.
*----------------------------------------------------------------------*
FORM UPADTE_ALV_FIELD_INFO_3 USING FIELD_NAME
                                   SET_VALUE
                                   STSTUS
                                   TAB_NAME.

  DATA: T_TMP   TYPE SLIS_FIELDCAT_ALV,
        T_TMP2  TYPE SLIS_SORTINFO_ALV,
        P_TABIX LIKE SY-TABIX,
        L_TEXT(1).

  CLEAR: T_TMP, T_TMP2.


  IF TAB_NAME <> SPACE.
    READ TABLE PGT_FIELDCAT INTO T_TMP
          WITH KEY FIELDNAME = FIELD_NAME
                   TABNAME   = TAB_NAME.
  ELSE.
    READ TABLE PGT_FIELDCAT INTO T_TMP
          WITH KEY FIELDNAME = FIELD_NAME.
  ENDIF.
  P_TABIX = SY-TABIX.

* field info.
  CASE STSTUS.
    WHEN 'H'.
      T_TMP-NO_OUT = SET_VALUE.     " 隱藏欄位, 但是可以讓使用者手動加入
    WHEN 'D'.
      T_TMP-DECIMALS_OUT = SET_VALUE.     " 小數點顯示位數
    WHEN 'K'.
      T_TMP-KEY = SET_VALUE.        " KEY SET
    WHEN 'M'.
      T_TMP-DO_SUM = SET_VALUE.     " SUM SET
    WHEN 'L'.
      T_TMP-OUTPUTLEN = SET_VALUE.  " OUTPUT LEN
    WHEN 'N'.
      T_TMP-TECH    = SET_VALUE.    " 完整隱藏
    WHEN 'Z'.
      T_TMP-NO_ZERO = SET_VALUE.                            " 不顯示 0

    WHEN 'J'.         " (R)ight (L)eft (C)ent
      T_TMP-JUST = 'C'. "SET_VALUE.
    WHEN 'Z'.         " leading zero
      T_TMP-LZERO = SET_VALUE.
    WHEN 'NS'.        " write no-sign
      T_TMP-NO_SIGN = SET_VALUE.
    WHEN 'NZ'.        " write no-zero
      T_TMP-NO_ZERO = SET_VALUE.
    WHEN 'NC'.        " no convext
      T_TMP-NO_CONVEXT = SET_VALUE.

    WHEN 'CFL' OR 'CFM' OR 'CFS'.       " 改變說明L/M/S
      T_TMP-SELTEXT_S = T_TMP-SELTEXT_M = T_TMP-SELTEXT_L
                      = T_TMP-REPTEXT_DDIC = SET_VALUE.
      T_TMP-DDICTXT = STSTUS+2(1).

    WHEN 'S1' OR 'S2' OR 'S3' OR 'S4'.

      T_TMP2-FIELDNAME = FIELD_NAME.

      T_TMP2-SUBTOT = SET_VALUE.

      IF STSTUS = 'S1' OR STSTUS = 'S3'.
        T_TMP2-UP = SET_VALUE.
      ENDIF.

      IF STSTUS = 'S3' OR STSTUS = 'S4'.
        T_TMP2-GROUP = '* '.
      ENDIF.
      APPEND T_TMP2 TO I_SORT.
  ENDCASE.

  MODIFY PGT_FIELDCAT INDEX P_TABIX FROM T_TMP.
ENDFORM.                    " UPADTE_ALV_FIELD_INFO_3

*&---------------------------------------------------------------------*
*&      Form  get_alv_field
*&---------------------------------------------------------------------*
FORM GET_ALV_FIELD USING PROGRAM_NAME
                         STRUCTURE_NAME.

  SUBMIT BALVBUFDEL AND RETURN.  " reset alv data
  MESSAGE S888(SABAPDOCU) WITH ' '.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         = PROGRAM_NAME
      I_STRUCTURE_NAME       = STRUCTURE_NAME
      I_CLIENT_NEVER_DISPLAY = 'X'
    CHANGING
      CT_FIELDCAT            = PGT_FIELDCAT[]
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.
ENDFORM.                    " get_alv_field
*&---------------------------------------------------------------------*
*&      Form  UPADTE_ALV_FIELD_INFO_sort
*&---------------------------------------------------------------------*
* SPOS       : 排列順序
* FIELD_NAME : 欄位名稱
* SUB_FLAG   : 小計資料
* UP_FLAG    : ASCENDING/DESCENDING
* GROUP      : 分頁符號 (UL/*)
*----------------------------------------------------------------------*
FORM UPADTE_ALV_FIELD_INFO_SORT USING SPOS
      FIELD_NAME
      SUB_FLAG
      UP_FLAG
      GROUP.

  DATA: T_TMP2 TYPE SLIS_SORTINFO_ALV.

* field info.
  CLEAR T_TMP2.
  SPOS  = SPOS + 1 .
  T_TMP2-SPOS      = SPOS.
  T_TMP2-FIELDNAME = FIELD_NAME.
  T_TMP2-SUBTOT    = SUB_FLAG.
  T_TMP2-UP        = UP_FLAG.
  T_TMP2-GROUP     = GROUP.
  APPEND T_TMP2 TO I_SORT.
ENDFORM.                    " UPADTE_ALV_FIELD_INFO_sort
*&---------------------------------------------------------------------*
*&      Form  MD_CONVERT_MATERIAL_UNIT
*&---------------------------------------------------------------------*
FORM MD_CONVERT_MATERIAL_UNIT  USING MATNR
      BASE_UNIT
      COV_UNIT
      QTY
      COV_QTY.
  CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
    EXPORTING
      I_MATNR              = MATNR
      I_IN_ME              = BASE_UNIT
      I_OUT_ME             = COV_UNIT
      I_MENGE              = QTY
    IMPORTING
      E_MENGE              = COV_QTY
    EXCEPTIONS
      ERROR_IN_APPLICATION = 1
      ERROR                = 2
      OTHERS               = 3.
ENDFORM.                    " MD_CONVERT_MATERIAL_UNIT
*&---------------------------------------------------------------------*
*&      Form  get_alv_field_hierseq
*&---------------------------------------------------------------------*
FORM GET_ALV_FIELD_HIERSEQ  USING PROGRAM_NAME
                            STRUCTURE_NAME
                            ITAB_NAME.

  SUBMIT BALVBUFDEL AND RETURN.  " reset alv data
  MESSAGE S888(SABAPDOCU) WITH ' '.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         = PROGRAM_NAME
      I_STRUCTURE_NAME       = STRUCTURE_NAME
      I_INTERNAL_TABNAME     = ITAB_NAME
      I_CLIENT_NEVER_DISPLAY = 'X'
    CHANGING
      CT_FIELDCAT            = PGT_FIELDCAT[]
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.
ENDFORM.                    " get_alv_field_hierseq


*&---------------------------------------------------------------------*
*&      Form  f4_for_variant
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_REPORT   text
*      -->P_VARI     text
*----------------------------------------------------------------------*
FORM F4_FOR_VARIANT USING P_REPORT P_VARI.
*

  DATA: LT_VARIANT LIKE DISVARIANT,
        LT_CANCEL(1).

  LT_VARIANT-REPORT = P_REPORT.

*  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
*  EXPORTING
*    is_variant          = lt_variant
*    i_save              = 'A'
*  IMPORTING
*    e_exit              = lt_cancel
*    es_variant          = lt_variant
*   EXCEPTIONS
*     NOT_FOUND                 = 1
*     PROGRAM_ERROR             = 2
*     OTHERS                    = 3

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
  EXPORTING
    IS_VARIANT                = LT_VARIANT
*     I_TABNAME_HEADER          =
*     I_TABNAME_ITEM            =
*     IT_DEFAULT_FIELDCAT       =
*     I_SAVE                    = ' '
*     I_DISPLAY_VIA_GRID        = ' '
  IMPORTING
    E_EXIT                    = LT_CANCEL
    ES_VARIANT                = LT_VARIANT
  EXCEPTIONS
    NOT_FOUND                 = 1
    PROGRAM_ERROR             = 2
    OTHERS                    = 3     .

  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

 

  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  P_VARI = LT_VARIANT-VARIANT.

ENDFORM.                    "f4_for_variant


*&---------------------------------------------------------------------*
*&      Form  REPORT_TITLE_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM REPORT_TITLE_DISPLAY USING
       U_REPID   "report id
       U_BUTXT   TYPE T001-BUTXT  "company name
       U_TITLE   TYPE SY-TITLE    "report title
       U_TCODE   TYPE SY-TCODE    "Tcode
       U_SUBTEXT TYPE STRING      "sub description
       U_PAGNO   TYPE SY-PAGNO         "page number or ("小計/總計")
       U_LINSZ   TYPE SY-LINSZ.   "line size

  DATA: LV_REPID TYPE SY-REPID,
        LV_LINSZ TYPE SY-LINSZ.

  DATA: BEGIN OF LV_POS,
    COMP_NAME  TYPE  I,      " Compony Name
    TITLE      TYPE  I,      " Report Title
    SUBTXT     TYPE  I,      " Sub text
    R_SIDE     TYPE  I,      " Right Side
    CENTER     TYPE  I,      " Center
  END OF LV_POS.

  DATA: BEGIN OF LV_LABEL,"description
    TCODE(10)       TYPE  C,
    USERNAME(10)    TYPE  C,
    COMP_NAME       TYPE  STRING ,
    PROGRAM(10)     TYPE  C,
    DATE(10)        TYPE  C,
    TIME(10)        TYPE  C,
    PAGENO(10)      TYPE  C,
  END OF LV_LABEL.

 

  DATA: BEGIN OF LV_LEN,
    COMP_NAME  TYPE  I,      " Compony Name
    TITLE      TYPE  I,      " Report Title
    SUBTXT     TYPE  I,      " Sub text
  END OF LV_LEN.

  CLEAR: LV_POS, LV_LEN, LV_LABEL.

  MOVE  U_REPID  TO  LV_REPID .
  MOVE  U_LINSZ  TO  LV_LINSZ .


  LV_POS-CENTER = LV_LINSZ / 2 .
  LV_POS-R_SIDE = LV_LINSZ - 23.
  CLEAR LV_LABEL.
  LV_LABEL-PROGRAM   = '程式代碼 :'(T01).
  LV_LABEL-COMP_NAME =  U_BUTXT.
  LV_LABEL-DATE      = '執行日期 :'(T02).
  LV_LABEL-TIME      = '執行時間 :'(T03).
  LV_LABEL-PAGENO    = '頁    次 :'(T04).
  LV_LABEL-USERNAME  = '使 用 者 :'(T05).
  LV_LABEL-TCODE     = '交易代碼 :'(T06).

* Compony Name Position and Length
  CONDENSE LV_LABEL-COMP_NAME.
*  lv_len-comp_name = STRLEN( lv_label-comp_name ) * 2.

  LV_LEN-COMP_NAME =
  CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( LV_LABEL-COMP_NAME ).
  LV_POS-COMP_NAME = LV_POS-CENTER - ( LV_LEN-COMP_NAME / 2 ).

* Title Position and Length
*  lv_len-title = STRLEN( u_title ) * 2.

  LV_LEN-TITLE =
  CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( U_TITLE  ).
  LV_POS-TITLE = LV_POS-CENTER - ( LV_LEN-TITLE / 2 ) .

* Sub Text Position and Length
*  lv_len-subtxt = STRLEN( u_subtext ) * 2.

  LV_LEN-SUBTXT =
  CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( U_SUBTEXT ).
  LV_POS-SUBTXT = LV_POS-CENTER - ( LV_LEN-SUBTXT / 2 ) .

* First Line
  WRITE:  / LV_LABEL-PROGRAM, LV_REPID,"程式代碼
         AT LV_POS-COMP_NAME(LV_LEN-COMP_NAME)
            LV_LABEL-COMP_NAME CENTERED,
         AT LV_POS-R_SIDE LV_LABEL-DATE,
            SY-DATUM. "列印日期

* Second Line
  WRITE: / LV_LABEL-USERNAME, (12) SY-UNAME,"使用者
*        AT LV_POS-TITLE(LV_LEN-TITLE) SY_TITLE CENTERED,"程式說明
        AT LV_POS-TITLE(LV_LEN-TITLE) U_TITLE CENTERED,"程式說明
        AT LV_POS-R_SIDE LV_LABEL-TIME, SY-UZEIT."列印時間

* Third Line
  IF NOT U_TCODE IS INITIAL.
    WRITE: /   LV_LABEL-TCODE, (12) U_TCODE."交易代碼
    WRITE: AT  LV_POS-SUBTXT(LV_LEN-SUBTXT) U_SUBTEXT CENTERED.
  ELSE.
    WRITE: AT /LV_POS-SUBTXT(LV_LEN-SUBTXT) U_SUBTEXT CENTERED.
  ENDIF.
  WRITE:  AT LV_POS-R_SIDE LV_LABEL-PAGENO NO-GAP,
              U_PAGNO RIGHT-JUSTIFIED NO-SIGN. "頁次

*  ULINE AT /(LV_LINSZ).

ENDFORM.                    " REPORT_TITLE_DISPLAY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值