機能名:プログラムステップ数カウント

Asking / 2023-09-03 / 原文

*&---------------------------------------------------------------------*
*&  プログラムID  :ZAXYT_TOOL_01
*&  プログラム名称:プログラムのステップ数カウント
*&  処  理  概  要:PGMのSTEP数をカウントしALVに出力する
*&  作   成   者  :SAPDMOT
*&  作   成   日  :2023/08/08
*&---------------------------------------------------------------------*
*&  変  更  番  号:
*&  変   更   者  :
*&  変   更   日  :
*&  変  更  内  容:
*&---------------------------------------------------------------------*
REPORT Z1OTR0050 NO STANDARD PAGE HEADING
                  MESSAGE-ID YMSG
                  LINE-SIZE 255
                  LINE-COUNT 65.

************************************************************************
*   TABLES
************************************************************************

************************************************************************
*   INCLUDE
************************************************************************

************************************************************************
*   TYPES(内部テーブル構造)
************************************************************************
*--- ALV
TYPE-POOLS: SLIS.

*--- ソース格納
TYPES: BEGIN OF TYP_PGM,
         SORCE TYPE C LENGTH 300,
       END OF TYP_PGM.

*--- プログラム名
TYPES: BEGIN OF TYP_NAME,
         FUNCNAME TYPE TFDIR-FUNCNAME,
         NAME     TYPE PROGNAME,
         DEVCLASS TYPE TADIR-DEVCLASS,
       END OF TYP_NAME.

*--- レポート表題
TYPES: BEGIN OF TYP_REP1,
         NAME TYPE PROGNAME,
         TEXT TYPE C LENGTH 100,
       END OF TYP_REP1.

*--- ALV OUTPUT
TYPES: BEGIN OF TYP_ALV,
         DEVCLASS TYPE TADIR-DEVCLASS,    "パッケージ
         NAME     TYPE PROGDIR-NAME,      "PGM名/汎用モジュール
         INCLUDE  TYPE D010INC-INCLUDE,   "INCLUDE
         TEXT     TYPE TRDIRT-TEXT,       "テキスト
         COUNT    TYPE P LENGTH 16,       "件数
         FLG_ERR  TYPE C LENGTH 1,        "エラーフラグ
         ERR_MSG  TYPE C LENGTH 100,      "エラーメッセージ
       END OF TYP_ALV.

*&---------------------------------------------------------------------*
*  DATA (内部テーブル定義)
*&---------------------------------------------------------------------*
DATA:
  TADIR     TYPE TADIR,         "リポジトリオブジェクトのディレクトリ
  PROGDIR   TYPE PROGDIR,       "REPOSRCのビュー
  APPL_PROG TYPE APPL_PROG,     "D010SINF TADIRによる結合
  TRDIRT    TYPE TRDIRT,        "プログラムの表題テキスト
  TDEVCT    TYPE TDEVCT.        "パッケージのテキスト

*--- ソース格納
DATA: TAB_PGM TYPE TABLE OF TYP_PGM,
      REC_PGM TYPE TYP_PGM.

*--- プログラム名
DATA: TAB_NAME TYPE TABLE OF TYP_NAME,
      REC_NAME TYPE TYP_NAME.

*--- 「TADIR」取得用
DATA: TAB_TADIR TYPE STANDARD TABLE OF TADIR,
      REC_TADIR TYPE TADIR.

*--- 「D010INC」取得用
DATA: TAB_INCL      TYPE STANDARD TABLE OF D010INC,
      REC_INCL      TYPE D010INC,
      TAB_INCL_SAVE TYPE STANDARD TABLE OF D010INC.

*--- レポート表題
DATA: TAB_REP1 TYPE TABLE OF TYP_REP1,
      REC_REP1 TYPE TYP_REP1.

*--- 処理対象INCLUDEレンジテーブル
DATA: RG_INCL TYPE RANGE OF D010INC-INCLUDE.

*[ALV出力用]
*--- ALVデータ
DATA: TAB_ALV  TYPE STANDARD TABLE OF TYP_ALV,
      REC_ALV  TYPE TYP_ALV,

*--- ALVデータ編集用
      TAB_EDIT TYPE STANDARD TABLE OF TYP_ALV,
      REC_EDIT TYPE TYP_ALV.

*--- 項目カタログ設定用
DATA: TAB_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      REC_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

*--- 初期ソート設定用
DATA: TAB_SORT TYPE SLIS_T_SORTINFO_ALV,
      REC_SORT TYPE SLIS_SORTINFO_ALV.

* レイアウト
DATA: REC_LAYOUT TYPE SLIS_LAYOUT_ALV.

************************************************************************
*   CONSTANTS
************************************************************************
CONSTANTS: C_FLG_ON TYPE C LENGTH 1 VALUE 'X'.

************************************************************************
*   PARAMETERS & SELECTION-SCREEN
************************************************************************
*--- オブジェクト属性
SELECTION-SCREEN: BEGIN OF BLOCK A WITH FRAME TITLE C_TEXT01,

*--- 汎用モジュール
BEGIN OF LINE,
COMMENT 01(12) C_TEXT02 FOR FIELD P_FM,
POSITION 15.
PARAMETERS: P_FM TYPE C RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN: END OF LINE,

*--- その他
BEGIN OF LINE,
COMMENT 01(06) C_TEXT03 FOR FIELD P_PGM,
POSITION 15.
PARAMETERS P_PGM TYPE C RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN: END OF LINE,
END OF BLOCK A,

*--- パッケージ
BEGIN OF LINE,
COMMENT 01(10) C_TEXT04 FOR FIELD S_DEVCL,
POSITION 20.
SELECT-OPTIONS S_DEVCL FOR TADIR-DEVCLASS.
SELECTION-SCREEN: END OF LINE,

*--- プログラムID
BEGIN OF LINE,
COMMENT 01(16) C_TEXT05 FOR FIELD s_PGM,
POSITION 23.
SELECT-OPTIONS S_PGM FOR TADIR-OBJ_NAME.
SELECTION-SCREEN: END OF LINE,
SKIP 1,

*--- コメント行カウント(X:コメント含む,SPACE:コメントなし)
BEGIN OF LINE,
COMMENT 01(16) C_TEXT06 FOR FIELD P_COMM,
POSITION 23.
PARAMETERS P_COMM AS CHECKBOX DEFAULT SPACE.
SELECTION-SCREEN: END OF LINE,

*--- 詳細レコード出力
BEGIN OF LINE,
COMMENT 01(16) C_TEXT07 FOR FIELD P_DETAIL,
POSITION 23.
PARAMETERS P_DETAIL AS CHECKBOX DEFAULT SPACE.
SELECTION-SCREEN END OF LINE.

************************************************************************
INITIALIZATION.
************************************************************************
*--- 選択テキストセット
  PERFORM F_SELECTION_TEXT_SET.

************************************************************************
AT SELECTION-SCREEN.
************************************************************************
  IF S_PGM[] IS INITIAL
    AND S_DEVCL[] IS INITIAL.

    SET CURSOR FIELD 'S_DEVCL-LOW'.
    MESSAGE E000(YMSG) WITH 'プログラム名 または パッケージ' 'を入力してください' .

  ENDIF.


************************************************************************
START-OF-SELECTION.
************************************************************************
  PERFORM F_MAIN.

************************************************************************
TOP-OF-PAGE.
************************************************************************

*&---------------------------------------------------------------------*
*& Form F_SELECTION_TEXT_SET
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_SELECTION_TEXT_SET .

  MOVE:
    'オブジェクト'       TO C_TEXT01,
    '汎用モジュール'     TO C_TEXT02,
    'その他'             TO C_TEXT03,
    'パッケージ'         TO C_TEXT04,
    'プログラムID'       TO C_TEXT05,
    'コメント行カウント' TO C_TEXT06,
    '詳細レコード出力'   TO C_TEXT07.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_MAIN
*&---------------------------------------------------------------------*
*& 処理
*&---------------------------------------------------------------------*
FORM F_MAIN .

*--- 変数の初期化
  PERFORM F_INITIALIZE.

*--- 対象データ取得
  PERFORM F_GET_DATA.

*--- 対象データチェック/出力データ格納
  PERFORM F_PGM_CHECK.

*--- データ件数サマリ
  PERFORM F_SUM_COUNT.

*--- ALV出力処理
  PERFORM F_OUTPUT_ALV.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_INITIALIZE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_INITIALIZE .

*--- ローカル変数定義
  DATA L_REC_INCL LIKE LINE OF RG_INCL.

  CLEAR: TAB_TADIR, TAB_NAME, RG_INCL, TAB_EDIT, TAB_ALV,
          TAB_FIELDCAT, TAB_SORT, REC_LAYOUT.

*--- 処理対象INCLUDE設定
  MOVE:
    'I'  TO L_REC_INCL-SIGN,
    'CP' TO L_REC_INCL-OPTION.

*--- 汎用モジュール用
  IF P_FM = C_FLG_ON.

    MOVE 'L*' TO L_REC_INCL-LOW.

  ELSE.

    MOVE: 'M*' TO  L_REC_INCL-LOW.

  ENDIF.

  APPEND L_REC_INCL TO RG_INCL.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_DATA
*&---------------------------------------------------------------------*
*& 対象データ取得
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_GET_DATA .

*--- 「TADIR」所得
  PERFORM F_GET_TADIR.

  LOOP AT TAB_TADIR INTO REC_TADIR.

    CLEAR: REC_NAME.

*--- 属性:汎用モジュール
    IF P_FM = C_FLG_ON.

      PERFORM F_GET_TFDIR.

*--- 属性:その他
    ELSE.
      PERFORM F_PROGDIR_SELECT.
      ENDIF.

  ENDLOOP.

  IF TAB_NAME[] IS INITIAL.

    MESSAGE S000(YMSG) WITH '対象データが存在しません' DISPLAY LIKE 'E'.

    LEAVE LIST-PROCESSING.

  ENDIF.

  SORT TAB_NAME ASCENDING BY FUNCNAME NAME.
*--- 重複データ削除
  DELETE ADJACENT DUPLICATES FROM TAB_NAME
    COMPARING FUNCNAME NAME.

*--- テキスト取得
  PERFORM F_GET_TEXT.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_TEXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_GET_TEXT .

  CLEAR TAB_REP1.

  IF P_FM = C_FLG_ON.
    SELECT FUNCNAME
           STEXT
      INTO TABLE TAB_REP1
      FROM TFTIT
      WHERE SPRAS    = SY-LANGU   "言語キー
       AND  FUNCNAME IN S_PGM.    "汎用モジュール
  ELSE.

    SELECT
            NAME
            TEXT
      FROM TRDIRT
      INTO TABLE TAB_REP1
      WHERE NAME IN S_PGM
      AND SPRSL  =  SY-LANGU.

  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_PGM_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_PGM_CHECK .

  LOOP AT TAB_NAME INTO REC_NAME.

    PERFORM F_GET_D010INC.

    PERFORM F_GET_PGM_INFO USING REC_NAME-NAME
                                 C_FLG_ON.


    LOOP AT TAB_INCL INTO REC_INCL.
      PERFORM F_GET_PGM_INFO USING REC_INCL-INCLUDE
                                   SPACE.


      IF P_FM IS INITIAL.

        CLEAR REC_INCL-MASTER.
        APPEND REC_INCL TO TAB_INCL_SAVE.

      ENDIF.

    ENDLOOP.

  ENDLOOP.

  IF TAB_EDIT[] IS INITIAL.
    MESSAGE S000(YMSG) DISPLAY LIKE 'E'.

    LEAVE LIST-PROCESSING.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SUM_COUNNT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_SUM_COUNT .

  DATA: L_FLG_NEW TYPE C LENGTH 1,
        L_FLG_END TYPE C LENGTH 1,
        L_TOT_CNT TYPE P LENGTH 16.

  SORT TAB_EDIT BY DEVCLASS NAME INCLUDE ASCENDING.

  SORT TAB_INCL_SAVE BY INCLUDE ASCENDING.
  DELETE ADJACENT DUPLICATES FROM TAB_INCL_SAVE COMPARING INCLUDE.
  LOOP AT TAB_INCL_SAVE INTO REC_INCL.

    DELETE TAB_EDIT WHERE NAME = REC_INCL-INCLUDE.

  ENDLOOP.

  IF P_DETAIL = C_FLG_ON.

    APPEND LINES OF TAB_EDIT TO TAB_ALV.

  ENDIF.

  LOOP AT TAB_EDIT INTO REC_EDIT.

    AT NEW NAME.
      MOVE C_FLG_ON TO L_FLG_NEW.

    ENDAT.

    IF L_FLG_NEW = C_FLG_ON.

      CLEAR: L_TOT_CNT, REC_ALV, L_FLG_NEW.
      MOVE REC_EDIT TO REC_ALV.

    ENDIF.

    L_TOT_CNT =  L_TOT_CNT + REC_EDIT-COUNT.

    IF REC_EDIT-FLG_ERR IS NOT INITIAL.
      MOVE REC_EDIT-FLG_ERR TO REC_ALV-FLG_ERR.

    ENDIF.

    IF REC_EDIT-ERR_MSG IS NOT INITIAL.
      MOVE REC_EDIT-ERR_MSG TO REC_ALV-ERR_MSG.

    ENDIF.

    AT END OF NAME.

      MOVE C_FLG_ON TO L_FLG_END.
    ENDAT.
    IF L_FLG_END = C_FLG_ON.
      MOVE L_TOT_CNT TO REC_ALV-COUNT.
      APPEND REC_ALV TO TAB_ALV.
      CLEAR: L_FLG_END, L_TOT_CNT, REC_ALV.

    ENDIF.


  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_PROGDIR_SELECT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_PROGDIR_SELECT .

  SELECT SINGLE NAME
    FROM PROGDIR
    INTO REC_NAME-NAME
    WHERE NAME = REC_TADIR-OBJ_NAME       "プログラム名
    AND STATE = 'A'.                      "ステータス有効

  IF SY-SUBRC = 0.

    MOVE REC_TADIR-DEVCLASS TO REC_NAME-DEVCLASS.
    APPEND REC_NAME TO TAB_NAME.

  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_D010INC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_GET_D010INC .

  CLEAR: TAB_INCL.

  SELECT *
    INTO TABLE TAB_INCL
    FROM D010INC
    WHERE MASTER = REC_NAME-NAME
    AND INCLUDE IN RG_INCL.

ENDFORM.

FORM F_EDIT.

  DATA L_OFFSET TYPE I.

  DELETE TAB_PGM WHERE SORCE IS INITIAL.

  DELETE TAB_PGM
  WHERE SORCE+0(1) = '*'.

  DELETE TAB_PGM
  WHERE SORCE+0(1) = '"'.

  LOOP AT TAB_PGM INTO REC_PGM.
    FIND '"' IN REC_PGM-SORCE MATCH OFFSET L_OFFSET.

    IF SY-SUBRC = 0.
      IF L_OFFSET > 1.
        L_OFFSET = L_OFFSET - 1.


      ENDIF.

      IF REC_PGM-SORCE+0(L_OFFSET) IS INITIAL.
        DELETE TAB_PGM.

      ENDIF.

    ENDIF.

  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_TFDIR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_GET_TFDIR .

  DATA L_PNAME TYPE TFDIR-PNAME.

  IF REC_TADIR-OBJ_NAME IS INITIAL.

    EXIT.

  ENDIF.

  CONCATENATE 'SAPL' REC_TADIR-OBJ_NAME INTO L_PNAME.

  SELECT
          FUNCNAME
          PNAME
    UP TO 1 ROWS
    FROM TFDIR
    INTO (REC_NAME-FUNCNAME, REC_NAME-NAME)
    WHERE FUNCNAME IN S_PGM
    AND PNAME LIKE L_PNAME.
    EXIT.

  ENDSELECT.

  IF SY-SUBRC = 0.
    MOVE REC_TADIR-DEVCLASS TO REC_NAME-DEVCLASS.
    APPEND REC_NAME TO TAB_NAME.

  ENDIF.

ENDFORM.


FORM F_GET_TADIR.

  DATA: L_PGMID  TYPE TADIR-PGMID VALUE 'R3TR',
        L_OBJECT TYPE TADIR-OBJECT,
        L_FG     TYPE TADIR-OBJECT VALUE 'FUGR',
        L_PGM    TYPE TADIR-OBJECT VALUE 'PROG'.


  IF P_FM = C_FLG_ON.
    MOVE L_FG TO L_OBJECT.

    SELECT *
      INTO  TABLE TAB_TADIR
      FROM TADIR
      WHERE PGMID   = L_PGMID
      AND  OBJECT   = L_OBJECT
      AND DEVCLASS IN S_DEVCL.

  ELSE.
    MOVE L_PGM TO L_OBJECT.
    SELECT *
      INTO TABLE TAB_TADIR
      FROM TADIR
      WHERE PGMID  = L_PGMID
      AND   OBJECT = L_OBJECT
      AND OBJ_NAME IN S_PGM
      AND  DEVCLASS IN S_DEVCL.


  ENDIF.




ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_PGM_INFO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> REC_NAME_NAME
*&      --> C_FLG_ON
*&---------------------------------------------------------------------*
FORM F_GET_PGM_INFO  USING    VALUE(L_P_NAME)
                              VALUE(L_P_FLG).

  CLEAR REC_EDIT.

  IF P_FM = C_FLG_ON.
    MOVE REC_NAME-FUNCNAME TO REC_EDIT-NAME.

  ELSE.
    MOVE REC_NAME-NAME TO REC_EDIT-NAME.

  ENDIF.

  IF L_P_NAME = C_FLG_ON.

    CLEAR REC_REP1.
    READ TABLE TAB_REP1 INTO REC_REP1
    WITH KEY NAME = REC_EDIT-NAME.

  ELSE.
    MOVE L_P_NAME TO REC_EDIT-INCLUDE.

  ENDIF.

  MOVE: REC_REP1-TEXT     TO REC_EDIT-TEXT,
        REC_NAME-DEVCLASS TO REC_EDIT-DEVCLASS.

  TRY .
      READ REPORT L_P_NAME INTO TAB_PGM.

    CATCH CX_SY_READ_SRC_LINE_TOO_LONG.

      MOVE C_FLG_ON TO REC_EDIT-FLG_ERR.
      MESSAGE S000(YMSG) WITH 'SOURCE IS OVER 3000BITE..'
      INTO REC_EDIT-ERR_MSG.
      APPEND REC_EDIT TO TAB_EDIT.

  ENDTRY.

  IF SY-SUBRC = 0.

    IF P_COMM IS INITIAL.

      PERFORM F_EDIT.

    ENDIF.

*--- GET SOURCE LINE
    DESCRIBE TABLE TAB_PGM LINES REC_EDIT-COUNT.
  ELSE.
    MOVE C_FLG_ON TO REC_EDIT-FLG_ERR.
    MESSAGE S000(YMSG) WITH 'PGM' L_P_NAME 'は存在しません'
    INTO REC_EDIT-ERR_MSG.

  ENDIF.

  APPEND REC_EDIT TO TAB_EDIT.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_OUTPUT_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_OUTPUT_ALV .

  PERFORM F_SET_FIELDCAT.

  PERFORM F_SET_SORT.

  PERFORM F_CALL_ALV_GRID_DISPLAY.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_SET_FIELDCAT .

  PERFORM F_SET_FIELDCAT_ITEMS USING '1'
                                      'DEVCLASS'
                                      'パッケージ'.

  PERFORM F_SET_FIELDCAT_ITEMS USING '2'
                                      'NAME'
                                      'PROGRAM ID'.

  PERFORM F_SET_FIELDCAT_ITEMS USING '3'
                                      'DEVCLASS'
                                      'PGM NAME'.

  PERFORM F_SET_FIELDCAT_ITEMS USING '4'
                                      'INCLUDE'
                                      'INCLUDE'.

  PERFORM F_SET_FIELDCAT_ITEMS USING '5'
                                      'COUNT'
                                      'プログラムステップ数'.


  PERFORM F_SET_FIELDCAT_ITEMS USING '6'
                                      'FLG_ERR'
                                      'FLG_ERR'.


  PERFORM F_SET_FIELDCAT_ITEMS USING '7'
                                      'ERR_MSG'
                                      'ERR_MSG'.




ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SET_FIELDCAT_ITEMS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> P_
*&---------------------------------------------------------------------*
FORM F_SET_FIELDCAT_ITEMS  USING    VALUE(L_P_COL)
                                    VALUE(L_P_ITEM)
                                    VALUE(L_P_TEXT).

  CLEAR REC_FIELDCAT.
  MOVE:
  L_P_COL TO REC_FIELDCAT-COL_POS,
  L_P_ITEM TO REC_FIELDCAT-FIELDNAME.

  MOVE L_P_TEXT TO : REC_FIELDCAT-DDICTXT,
                     REC_FIELDCAT-SELTEXT_L,
                     REC_FIELDCAT-SELTEXT_M,
                     REC_FIELDCAT-SELTEXT_S.

  IF L_P_COL = '5'.
    MOVE C_FLG_ON TO REC_FIELDCAT-DO_SUM.
  ENDIF.

  APPEND REC_FIELDCAT TO TAB_FIELDCAT.



ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SET_SORT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_SET_SORT .

  CLEAR REC_SORT.

  MOVE: '1'        TO REC_SORT-SPOS,
        'DEVCLASS' TO REC_SORT-FIELDNAME,
        C_FLG_ON   TO REC_SORT-UP,
        P_DETAIL   TO REC_SORT-SUBTOT.

  APPEND REC_SORT TO TAB_SORT.


  MOVE: '2'        TO REC_SORT-SPOS,
        'NAME' TO REC_SORT-FIELDNAME,
        C_FLG_ON   TO REC_SORT-UP,
        P_DETAIL   TO REC_SORT-SUBTOT.

  APPEND REC_SORT TO TAB_SORT.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_CALL_ALV_GRID_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_CALL_ALV_GRID_DISPLAY .

  MOVE: C_FLG_ON TO REC_LAYOUT-COLWIDTH_OPTIMIZE,
        C_FLG_ON TO REC_LAYOUT-ZEBRA.

  SET PF-STATUS 'STANDARD'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
*     I_CALLBACK_PROGRAM                = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE  =
*     I_GRID_SETTINGS                   =
      IS_LAYOUT     = REC_LAYOUT
      IT_FIELDCAT   = TAB_FIELDCAT
*     IT_EXCLUDING  =
*     IT_SPECIAL_GROUPS                 =
      IT_SORT       = TAB_SORT
*     IT_FILTER     =
*     IS_SEL_HIDE   =
*     I_DEFAULT     = 'X'
      I_SAVE        = 'A'
*     IS_VARIANT    =
*     IT_EVENTS     =
*     IT_EVENT_EXIT =
*     IS_PRINT      =
*     IS_REPREP_ID  =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK  =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*     O_PREVIOUS_SRAL_HANDLER           =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      T_OUTTAB      = TAB_ALV
    EXCEPTIONS
      PROGRAM_ERROR = 1
      OTHERS        = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE S000(YMSG) WITH 'REUSE_ALV_GRID_DISPLAY'.

    LEAVE  LIST-PROCESSING.
  ENDIF.


ENDFORM.