2017년 1월 30일 월요일

ZUPLOAD_DOWNLOAD_PROGRAM

*&---------------------------------------------------------------------*
*& Report  ZUPLOAD_DOWNLOAD_PROGRAM
*&
*&---------------------------------------------------------------------*
************************************************************************
*  Program Name     : ZUPDOWNLOAD_PROGRAM                              *
*  Description      : Direct upload & download program (SAP ver4.6C)
*                       With GUI Status
*  Screen           :                                                  *
*  Transaction code :                                                  *
*  Updated Tables   :                                                  *
*  Input Parameters :                                                  *
*  Return Codes     :                                                  *
*  Special Logic    :                                                  *
*  Includes         :                                                  *
************************************************************************
*  MODIFICATION LOG                                                    *
************************************************************************
*  Date         Rev #       Programmer      Description                *
* ---------    --------   ------------- -------------------------      *
************************************************************************
REPORT ZUPLOAD_DOWNLOAD_PROGRAM
  NO STANDARD PAGE HEADING
  LINE-SIZE 132.

************************************************************************
* INCLUDE PROGRAM                                                      *
************************************************************************
INCLUDE: <ICON>.

************************************************************************
* TABLES                                                               *
************************************************************************
TABLES: TRDIR, RLGRAP, D020S, SSCRFIELDS.

************************************************************************
* DATA                                                                 *
************************************************************************
DATA: G_MSGTXT(100),
      G_ANSWER,                        "Answer of Popup Window
      G_FLAG_ERR(10).

*..... Text element
DATA: GT_TEXTPOOL LIKE TEXTPOOL OCCURS 0 WITH HEADER LINE.

*..... Message classes
DATA: G_ARBGB LIKE T100-ARBGB.        "Message class

DATA: BEGIN OF GT_MESSAGE OCCURS 0,
        ARBGB LIKE T100-ARBGB,
        MSGNR LIKE T100-MSGNR,
        TEXT  LIKE T100-TEXT,
      END OF GT_MESSAGE.

*..... Program & Menu
DATA: BEGIN OF GT_PROGTEXT OCCURS 0,
*         PROG LIKE TRDIR-NAME,
         TEXT(255),
      END OF GT_PROGTEXT.

*..... Include program
DATA: BEGIN OF GT_INCLUDE OCCURS 10,
        NAME LIKE TRDIR-NAME,
      END OF GT_INCLUDE.

*..... Process log
DATA: BEGIN OF GT_LOG OCCURS 0,
        STAT(5),
        TYPE(10),
        TEXT(80),
      END OF GT_LOG.

************************************************************************
* CONSTANTS                                                            *
************************************************************************
CONSTANTS: C_STARS(64)     VALUE '********************************'
                               & '********************************',
           C_COMMENT1(64)  VALUE '*   THIS FILE IS GENERATED BY THE'
                               & ' SCREEN PAINTER.              *',
           C_COMMENT2(64)  VALUE '*   NEVER CHANGE IT MANUALLY, '
                               & 'PLEASE !                         *',
           C_DYNPRO(8)     VALUE '%_DYNPRO',
           C_HEADER(8)     VALUE '%_HEADER',
           C_PARAMS(8)     VALUE '%_PARAMS',
           C_DESCRIPT(13)  VALUE '%_DESCRIPTION',
           C_FIELDS(8)     VALUE '%_FIELDS',
           C_KREUZ(1)      VALUE 'x',
           C_FLOWLOGIC(11) VALUE '%_FLOWLOGIC',
           C_HYPHEN(64)    VALUE '--------------------------------'
                               & '--------------------------------',
           C_TEXTCOM0(50)  VALUE '*%%$$          T E X T    '
                               & 'E L E M E N T S ',
           C_TEXTCOM1(30)  VALUE '*%%$$  R - Program titles',
           C_TEXTCOM2(30)  VALUE '*%%$$  T - List headers',
           C_TEXTCOM3(30)  VALUE '*%%$$  H - Column headers',
           C_TEXTCOM4(30)  VALUE '*%%$$  S - Selection texts',
           C_TEXTCOM5(30)  VALUE '*%%$$  I - Text symbols'.

************************************************************************
* MACRO                                                                *
************************************************************************
DEFINE GET_MENU.
  LOOP AT &2.
    CLEAR GT_PROGTEXT.
    CONCATENATE &1 &2 INTO GT_PROGTEXT-TEXT.
    APPEND GT_PROGTEXT.
  ENDLOOP.
END-OF-DEFINITION.

DEFINE SET_MENU.
  CLEAR &1.
  WRITE GT_PROGTEXT+7 TO &1.
  APPEND &1.
END-OF-DEFINITION.

************************************************************************
* SELECTION SCREEN ( SELECT-OPTIONS & PARAMETERS )
************************************************************************
*..... Upload
SELECTION-SCREEN BEGIN OF SCREEN 1001 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK BL3 WITH FRAME TITLE TT_OPT3.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 5.
PARAMETERS: P_RPROG  RADIOBUTTON GROUP R01
                      USER-COMMAND REXE    DEFAULT 'X'.
SELECTION-SCREEN COMMENT (10) TP_RPROG FOR FIELD P_RPROG.

SELECTION-SCREEN POSITION 30.
PARAMETERS: P_RSCR   RADIOBUTTON GROUP R01.
SELECTION-SCREEN COMMENT (10) TP_RSCR  FOR FIELD P_RSCR.

SELECTION-SCREEN POSITION 55.
PARAMETERS: P_RMENU  RADIOBUTTON GROUP R01.
SELECTION-SCREEN COMMENT (10) TP_RMENU FOR FIELD P_RMENU.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BL3.

SELECTION-SCREEN BEGIN OF BLOCK BL4 WITH FRAME TITLE TT_OPT4.
SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(20) TP_UPATH FOR FIELD P_UPATH.
PARAMETERS P_UPATH LIKE RLGRAP-FILENAME.    "OBLIGATORY
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(20) TP_UPROG FOR FIELD P_UPROG.
PARAMETERS: P_UPROG LIKE TRDIR-NAME,       "OBLIGATORY.
            P_UINCL AS CHECKBOX MODIF ID G01.
SELECTION-SCREEN COMMENT 70(10) TP_UINCL FOR FIELD P_UINCL.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(20) TP_USCR FOR FIELD P_UDNUM.
PARAMETERS: P_UDNUM LIKE D020S-DNUM MODIF ID G02.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN END OF BLOCK BL4.
SELECTION-SCREEN END OF SCREEN 1001.

*..... Download
SELECTION-SCREEN BEGIN OF SCREEN 1002 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TT_OPT1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(20) TP_DPROG FOR FIELD P_DPROG.
PARAMETERS: P_DPROG LIKE TRDIR-NAME.        "OBLIGATORY.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(20) TP_DPATH FOR FIELD P_DPATH.
PARAMETERS P_DPATH LIKE RLGRAP-FILENAME     "OBLIGATORY
                   DEFAULT 'C:\TEMP'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BL1.

SELECTION-SCREEN BEGIN OF BLOCK BL2 WITH FRAME TITLE TT_OPT2.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(19) TP_DMPRG FOR FIELD P_DMPRG.
PARAMETERS: P_DMPRG AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(19) TP_DMSG FOR FIELD P_DMSG.
PARAMETERS: P_DMSG AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(19) TP_DINCL FOR FIELD P_DINCL.
PARAMETERS: P_DINCL AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(19) TP_DSCR FOR FIELD P_DSCR.
PARAMETERS: P_DSCR AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(19) TP_DMENU FOR FIELD P_DMENU.
PARAMETERS: P_DMENU AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BL2.
SELECTION-SCREEN END OF SCREEN 1002.

*..... Selection screen - include tabstrip contorl
SELECTION-SCREEN: BEGIN OF TABBED BLOCK TABB1 FOR 11 LINES,
                  TAB (20) TABS1 USER-COMMAND EXUP,
                  TAB (20) TABS2 USER-COMMAND EXDN,
                  END OF BLOCK TABB1.

************************************************************************
* INITIALIZATION
************************************************************************
INITIALIZATION.
  PERFORM INITIALIZATION.

************************************************************************
* AT SELECTION-SCREEN ( ALL VARIATIONS )                               *
************************************************************************
AT SELECTION-SCREEN OUTPUT.
  PERFORM MODIFY_SCREEN.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DPROG.
  PERFORM F4_PROGRAM.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DPATH.
  PERFORM F4_HELP_FOR_FOLDER
            USING
              'P_DPATH'
            CHANGING
              P_DPATH.
*  PERFORM F4_FILEPATH USING '%DOWN' P_DPATH.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPATH.
  PERFORM F4_FILEPATH USING '%UP' P_UPATH.

AT SELECTION-SCREEN.
  PERFORM AT_SELECTION_SCREEN.

************************************************************************
* START-OF-SELECTION                                                   *
************************************************************************
START-OF-SELECTION.
  PERFORM START_OF_SELECTION.

************************************************************************
* END-OF-SELECTION                                                     *
************************************************************************
END-OF-SELECTION.
  PERFORM WRITE_LOG.

************************************************************************
* TOP-OF-PAGE                                                          *
************************************************************************
TOP-OF-PAGE.
  PERFORM WRITE_HEADER.

************************************************************************
* TOP-OF-PAGE DURING LINE-SELECTION                                    *
************************************************************************
*  SY-LSIND = SY-LSIND - 1.
************************************************************************
* END-OF-PAGE                                                          *
************************************************************************

************************************************************************
*                       S U B R O U T I N E S                          *
*                       S U B R O U T I N E S                          *
*                       S U B R O U T I N E S                          *
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  INITIALIZATION
*&---------------------------------------------------------------------*
FORM INITIALIZATION.
*..... Set text for selection screen
  TT_OPT1  = 'General parameters'.
  TT_OPT2  = 'Additional option'.
  TT_OPT3  = 'Job choice'.
  TT_OPT4  = 'General parameters'.
  TP_DPROG = 'Original program'.
  TP_DPATH = 'Download path'.
  TP_DMPRG = 'Main program'.
  TP_DMSG  = 'Message class'.
  TP_DINCL = 'Include progrm'.
  TP_DSCR  = 'Screen'.
  TP_DMENU = 'Menu'.
  TP_UPATH = 'Upload path & name'.
  TP_UPROG = 'Target program'.
  TP_USCR  = 'Screen number'.
  TP_UINCL = 'Include'.
  TP_RPROG = 'Program'.
  TP_RSCR  = 'Screen'.
  TP_RMENU = 'Menu'.

*..... Tabstrip
  IF TABB1 IS INITIAL.
    TABS1           = 'Upload'.
    TABS2           = 'Download'.
    TABB1-PROG      = SY-REPID.
    TABB1-DYNNR     = 1001.
    TABB1-ACTIVETAB = 'TABS1'.
  ENDIF.
*.... Initialize variant
  CLEAR: G_FLAG_ERR.
ENDFORM.                    "INITIALIZATION
*&---------------------------------------------------------------------*
*&      Form  F4_FILEPATH
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F4_FILEPATH USING FP_TYPE FP_PATH.
  CALL FUNCTION 'WS_FILENAME_GET'
       EXPORTING
*           DEF_FILENAME     = ' '
*           DEF_PATH         = ' '
            MASK             = ' ,*,*,*,*.'
            MODE             = '0'
*           TITLE            = ' '
       IMPORTING
            FILENAME         = FP_PATH
*           RC               = '
       EXCEPTIONS
            INV_WINSYS       = 1
            NO_BATCH         = 2
            SELECTION_CANCEL = 3
            SELECTION_ERROR  = 4
            OTHERS           = 5.

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

  CHECK FP_TYPE EQ '%DOWN'.
  CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
    EXPORTING
      FULL_NAME     = FP_PATH
    IMPORTING
*     STRIPPED_NAME =
      FILE_PATH     = FP_PATH
    EXCEPTIONS
      X_ERROR       = 1
      OTHERS        = 2.

ENDFORM.                    " F4_FILEPATH
*&---------------------------------------------------------------------*
*&      Form  F4_HELP_FOR_FOLDER
*&---------------------------------------------------------------------*
FORM F4_HELP_FOR_FOLDER
        USING
          P_FIELDNAME
        CHANGING
          P_FOLDER.
  DATA:
    L_FOLDER TYPE STRING,  " LIKE RLGRAP-FILENAME,
*    OBJFILE TYPE REF TO CL_GUI_FRONTEND_SERVICES,
    L_SELECTED_FOLDER TYPE STRING,
    L_INITIAL_FOLDER TYPE STRING,
    LT_DYNPFIELDS LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.

  LT_DYNPFIELDS-FIELDNAME = P_FIELDNAME.
  APPEND LT_DYNPFIELDS.
  CLEAR LT_DYNPFIELDS.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME     = SY-CPROG
      DYNUMB     = SY-DYNNR
    TABLES
      DYNPFIELDS = LT_DYNPFIELDS.

  READ TABLE LT_DYNPFIELDS
    WITH KEY
      FIELDNAME = P_FIELDNAME.
  IF SY-SUBRC EQ 0.
    L_FOLDER = LT_DYNPFIELDS-FIELDVALUE.
  ENDIF.

*  CREATE OBJECT OBJFILE.

  IF NOT L_FOLDER IS INITIAL.
    L_INITIAL_FOLDER = L_FOLDER.
  ELSE.
*    CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
*      CHANGING
*        DESKTOP_DIRECTORY    = L_INITIAL_FOLDER
**      EXCEPTIONS
**        CNTL_ERROR           = 1
**        ERROR_NO_GUI         = 2
**        NOT_SUPPORTED_BY_GUI = 3
**        OTHERS               = 4
*            .
*    IF SY-SUBRC <> 0.
**     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    ENDIF.

  ENDIF.

  CALL METHOD CL_GUI_CFW=>FLUSH.
  CALL METHOD CL_GUI_CFW=>UPDATE_VIEW.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
    EXPORTING
*     WINDOW_TITLE         =
      INITIAL_FOLDER       = L_INITIAL_FOLDER
    CHANGING
      SELECTED_FOLDER      = L_SELECTED_FOLDER
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

*  OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = L_INITIAL_FOLDER
*                             CHANGING SELECTED_FOLDER = L_SELECTED_FOLDER
*                             EXCEPTIONS CNTL_ERROR = 1
*                                        ERROR_NO_GUI = 2
*                                        NOT_SUPPORTED_BY_GUI = 3 ).

  IF SY-SUBRC = 0.
    P_FOLDER = L_SELECTED_FOLDER.
  ELSE.
    WRITE: / 'An error has occured picking a folder'.
  ENDIF.

ENDFORM.                    "F4_HELP_FOR_FOLDER
*&---------------------------------------------------------------------*
*&      Form  EXEC_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EXEC_DOWNLOAD.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  PERFORM CHECK_REQUIRED_FIELD USING '%DOWN'.

  CHECK G_FLAG_ERR IS INITIAL.
  L_DEFAULT = 'N'.
  L_TEXT1   = 'Do you want to download the program?'.
  L_TITLE   = 'Notification'.

  PERFORM POPUP_TO_CONFIRM USING L_DEFAULT L_TEXT1 L_TEXT2 L_TITLE
                                 G_ANSWER.

  CHECK G_ANSWER EQ 'J'.
  IF P_DMPRG EQ 'X'.
    PERFORM DOWN_MAIN_PROG.
  ENDIF.

  IF P_DINCL EQ 'X'.
    PERFORM DOWN_INCLUDE_PROG.
  ENDIF.

  IF P_DSCR EQ 'X'.
    PERFORM DOWN_SCREEN.
  ENDIF.

  IF P_DMENU EQ 'X'.
    PERFORM DOWN_MENU.
  ENDIF.

  IF P_DMSG EQ 'X'.
    PERFORM DOWN_MESSAGE.
  ENDIF.

ENDFORM.                    " EXEC_DOWNLOAD

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_STATUS
*&---------------------------------------------------------------------*
*       ???? ??? ??
*----------------------------------------------------------------------*
*  -->  FP_MSGTXT  : ???
*  -->  FP_SECONDS : Delay time
*----------------------------------------------------------------------*
FORM DISPLAY_STATUS USING FP_MSGTXT FP_SECONDS.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = 0
      TEXT       = FP_MSGTXT
    EXCEPTIONS
      OTHERS     = 1.

  CHECK FP_SECONDS GT 0.
  CALL FUNCTION 'RZL_SLEEP'
    EXPORTING
      SECONDS        = FP_SECONDS
    EXCEPTIONS
      ARGUMENT_ERROR = 1
      OTHERS         = 2.

ENDFORM.                    " DISPLAY_STATUS

*&---------------------------------------------------------------------*
*&      Form  DOWN_MAIN_PROG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWN_MAIN_PROG.
  DATA: L_PATH LIKE RLGRAP-FILENAME.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  CLEAR: GT_PROGTEXT, GT_PROGTEXT[].

  G_MSGTXT = 'Processing please wait...Main program'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  SELECT SINGLE NAME INTO TRDIR-NAME
           FROM TRDIR
          WHERE NAME EQ P_DPROG
            AND SUBC IN ('1', 'M', 'F').

  IF SY-SUBRC NE 0.
    CONCATENATE 'Program' P_DPROG 'does not exist.'
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%ERR' '%MPRG' G_MSGTXT.
    STOP.
  ENDIF.

*..... Read the program contents into memory
  READ REPORT P_DPROG INTO GT_PROGTEXT.

  IF SY-SUBRC NE 0.
    CONCATENATE 'Import error of' P_DPROG 'program!!'
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%ERR' '%MPRG' G_MSGTXT.
    STOP.
  ENDIF.

*..... Get text element
  PERFORM ADD_TEXT_ELEMENT USING P_DPROG.

*..... Download & append log
  CONCATENATE P_DPATH '\' P_DPROG '.TXT'
         INTO L_PATH.
  PERFORM WS_DOWNLOAD TABLES GT_PROGTEXT USING L_PATH G_FLAG_ERR.

  IF G_FLAG_ERR IS INITIAL.
    CONCATENATE P_DPROG '.TXT' INTO G_MSGTXT.
    PERFORM APPEND_LOG USING '%OK'  '%MPRG' G_MSGTXT.
  ELSE.
    PERFORM APPEND_LOG USING '%ERR' '%MPRG' G_MSGTXT.
  ENDIF.

ENDFORM.                    " DOWN_MAIN_PROG

*&---------------------------------------------------------------------*
*&      Form  DOWN_INCLUDE_PROG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWN_INCLUDE_PROG.
  DATA: L_PATH LIKE RLGRAP-FILENAME.

  G_MSGTXT = 'Processing please wait...Include program'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  PERFORM GET_INCLUDE_PROGRAM TABLES GT_INCLUDE
                              USING  P_DPROG.

  DESCRIBE TABLE GT_INCLUDE LINES SY-TFILL.

  IF SY-TFILL EQ 0.
    G_MSGTXT = 'Include program does not exist'.
    PERFORM APPEND_LOG USING '%ERR' '%IPRG' G_MSGTXT.
    EXIT.
  ENDIF.

  LOOP AT GT_INCLUDE.
    CLEAR: GT_PROGTEXT, GT_PROGTEXT[].

*..... Read the program contents into memory
    READ REPORT GT_INCLUDE-NAME INTO GT_PROGTEXT.

    IF SY-SUBRC NE 0.
      CONCATENATE 'Import error of' GT_INCLUDE-NAME 'program!!'
             INTO G_MSGTXT SEPARATED BY SPACE.
      PERFORM APPEND_LOG USING '%ERR' '%IPRG' G_MSGTXT.
      CONTINUE.
    ENDIF.

*..... Get text element
    PERFORM ADD_TEXT_ELEMENT USING GT_INCLUDE-NAME.

*..... Download & append log
    CONCATENATE P_DPATH '\' GT_INCLUDE-NAME '.TXT'
           INTO L_PATH.
    PERFORM WS_DOWNLOAD TABLES GT_PROGTEXT USING L_PATH G_FLAG_ERR.

    IF G_FLAG_ERR IS INITIAL.
      CONCATENATE GT_INCLUDE-NAME '.TXT' INTO G_MSGTXT.
      PERFORM APPEND_LOG USING '%OK'  '%IPRG' G_MSGTXT.
    ELSE.
      PERFORM APPEND_LOG USING '%ERR' '%IPRG' G_MSGTXT.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " DOWN_INCLUDE_PROG

*&---------------------------------------------------------------------*
*&      Form  DOWN_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWN_SCREEN.
  DATA: L_PATH LIKE RLGRAP-FILENAME,
        LT_D020S LIKE D020S OCCURS 0 WITH HEADER LINE.

  DATA: L_DTXT   LIKE D020T-DTXT,
        L_H      LIKE D020S,
        LT_F     LIKE D021S OCCURS 10,
        LT_E     LIKE D022S OCCURS 10,
        LT_M     LIKE D023S OCCURS 10.

  G_MSGTXT = 'Processing please wait...Screen'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  SELECT * INTO TABLE LT_D020S
           FROM D020S
          WHERE PROG EQ P_DPROG
            AND TYPE NOT IN ('S', 'W', 'J').       "Selection screen

  IF SY-SUBRC NE 0.
    G_MSGTXT = 'Screen does not exist'.
    PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
    EXIT.
  ENDIF.

  LOOP AT LT_D020S.
    CLEAR: L_DTXT, L_H, LT_F, LT_E, LT_M, LT_F[], LT_E[], LT_M[].

*..... Import the screen contents
    CALL FUNCTION 'RS_SCREEN_IMPORT'
      EXPORTING
        DYNNR               = LT_D020S-DNUM
        PROGNAME            = LT_D020S-PROG
      IMPORTING
        DYNPRO_TEXT         = L_DTXT
        H_IMPORT            = L_H
        NEW_MASTER_LANGUAGE = SY-LANGU
      TABLES
        E_G                 = LT_E
        F_G                 = LT_F
        M_G                 = LT_M
      EXCEPTIONS
        NOT_EXECUTED        = 1
        NOT_FOUND           = 2
        OTHERS              = 3.

    IF SY-SUBRC NE 0.
      CONCATENATE 'Import error of' LT_D020S-PROG LT_D020S-DNUM
             INTO G_MSGTXT SEPARATED BY SPACE.
      PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
      CONTINUE.
    ENDIF.

*..... Download & append log
    CONCATENATE P_DPATH '\' LT_D020S-PROG '_' LT_D020S-DNUM '.TXT'
           INTO L_PATH.

    PERFORM RS_DYNPRO_DOWNLOAD TABLES LT_F LT_E LT_M
                               USING  L_H L_DTXT L_PATH.

    IF G_FLAG_ERR IS INITIAL.
      CONCATENATE LT_D020S-PROG '_' LT_D020S-DNUM '.TXT'
             INTO G_MSGTXT.
      PERFORM APPEND_LOG USING '%OK'  '%SCR' G_MSGTXT.
    ELSE.
      PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
    ENDIF.

*    CALL FUNCTION 'RS_DYNPRO_DOWNLOAD'
*         EXPORTING
*              HEADER              = L_H
*              DESCRIPT            = L_DTXT
*              FILE                = L_PATH
*         TABLES
*              FIELDS              = LT_F
*              FLOWLOGIC           = LT_E
*              PARAMS              = LT_M
*         EXCEPTIONS
*              INVALID_FILESIZE    = 1
*              INVALID_TABLE_WIDTH = 2
*              INVALID_TYPE        = 3
*              NO_BATCH            = 4
*              UNKNOWN_ERROR       = 5
*              NOT_EXECUTED        = 6
*              OTHERS              = 7.
*
*    IF SY-SUBRC <> 0.
*      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    ENDIF.
  ENDLOOP.

ENDFORM.                    " DOWN_SCREEN

*&---------------------------------------------------------------------*
*&      Form  EXEC_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EXEC_UPLOAD.
  DATA: L_PATH LIKE RLGRAP-FILENAME.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  PERFORM CHECK_REQUIRED_FIELD USING '%UP'.

  CHECK G_FLAG_ERR IS INITIAL.
  L_DEFAULT = 'N'.
  L_TEXT1   = 'Do you want to upload the program?'.
  L_TITLE   = 'Notification'.

  PERFORM POPUP_TO_CONFIRM USING L_DEFAULT L_TEXT1 L_TEXT2 L_TITLE
                                 G_ANSWER.

  CHECK G_ANSWER EQ 'J'.
  CASE 'X'.
    WHEN P_RPROG.
      IF P_UINCL EQ 'X'.
        PERFORM UP_INCLUDE_PROG.
      ELSE.
        PERFORM UP_MAIN_PROG.
      ENDIF.

    WHEN P_RSCR.
      PERFORM UP_SCREEN.

    WHEN P_RMENU.
      PERFORM UP_MENU.
  ENDCASE.

ENDFORM.                    " EXEC_UPLOAD

*&---------------------------------------------------------------------*
*&      Form  ADD_TEXT_ELEMENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ADD_TEXT_ELEMENT USING FP_PROG.
  CLEAR: GT_TEXTPOOL, GT_TEXTPOOL[].

  READ TEXTPOOL FP_PROG INTO GT_TEXTPOOL LANGUAGE SY-LANGU.

  CHECK SY-SUBRC EQ 0.
  SORT GT_TEXTPOOL BY ID KEY.

  LOOP AT GT_TEXTPOOL.
    AT FIRST.
      APPEND INITIAL LINE TO GT_PROGTEXT.
      CONCATENATE '*%%$$' C_STARS  INTO GT_PROGTEXT.
      APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM0.    APPEND GT_PROGTEXT.
      CONCATENATE '*%%$$' C_HYPHEN INTO GT_PROGTEXT.
      APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM1.    APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM2.    APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM3.    APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM4.    APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_TEXTCOM5.    APPEND GT_PROGTEXT.
      CONCATENATE '*%%$$' C_STARS  INTO GT_PROGTEXT.
      APPEND GT_PROGTEXT.
    ENDAT.

    CLEAR: GT_PROGTEXT.
*    SHIFT GT_textpool BY 05 PLACES RIGHT.
*    GT_textpool(05) = '*%%$$'.
*    GT_PROGTEXT = GT_textpool.
    WRITE: '*%%$$' TO GT_PROGTEXT-TEXT,
           GT_TEXTPOOL+0 TO GT_PROGTEXT-TEXT+5.
    APPEND GT_PROGTEXT.

*    AT LAST.
*      CONCATENATE '*%%$$' C_STARS INTO GT_PROGTEXT.
*      APPEND GT_PROGTEXT.
*    ENDAT.
  ENDLOOP.

ENDFORM.                    " ADD_TEXT_ELEMENT

*&---------------------------------------------------------------------*
*&      Form  FIND_MESSAGE_CLASS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FIND_MESSAGE_CLASS.
  DATA: L_HEAD(100),
        L_TAIL(100).

  DATA: LT_MSG(100) OCCURS 0 WITH HEADER LINE.

  DATA: LT_KW(30)          OCCURS 0 WITH HEADER LINE,
        LT_TK  LIKE STOKEX OCCURS 0 WITH HEADER LINE,
        LT_STM LIKE SSTMNT OCCURS 0 WITH HEADER LINE.

  LOOP AT GT_INCLUDE.
    CLEAR: GT_PROGTEXT, GT_PROGTEXT[].

*..... Read the program contents into memory
    READ REPORT GT_INCLUDE-NAME INTO GT_PROGTEXT.

    IF SY-SUBRC NE 0.
      CONCATENATE 'Import error of' GT_INCLUDE-NAME 'program!!'
             INTO G_MSGTXT SEPARATED BY SPACE.
      PERFORM APPEND_LOG USING '%ERR' '%MSG' G_MSGTXT.
      CONTINUE.
    ENDIF.

*..... Find the main message class
    IF G_ARBGB IS INITIAL.
      LOOP AT GT_PROGTEXT
           WHERE NOT ( TEXT IS INITIAL OR TEXT(1) EQ '*' ).
        TRANSLATE GT_PROGTEXT TO UPPER CASE.

        IF GT_PROGTEXT CS 'MESSAGE-ID'.
          SPLIT GT_PROGTEXT AT 'MESSAGE-ID' INTO L_HEAD L_TAIL.
          TRANSLATE L_TAIL USING '. '.
          SHIFT L_TAIL LEFT DELETING LEADING SPACE.
          SPLIT L_TAIL AT SPACE INTO L_HEAD L_TAIL.
          CONDENSE L_HEAD.
          G_ARBGB = L_HEAD.
          EXIT.
        ENDIF.
      ENDLOOP.
    ENDIF.

*..... Find the messages
    CLEAR: LT_KW, LT_KW[].
    LT_KW = 'MESSAGE'.    APPEND LT_KW.
    LT_KW = 'message'.    APPEND LT_KW.

    CLEAR: LT_TK, LT_STM, LT_TK[], LT_STM[].
    SCAN ABAP-SOURCE GT_PROGTEXT
              TOKENS INTO LT_TK
          STATEMENTS INTO LT_STM
            KEYWORDS FROM LT_KW WITH ANALYSIS.

    LOOP AT LT_STM.
      ADD 1 TO LT_STM-FROM.
      READ TABLE LT_TK INDEX LT_STM-FROM.
      LT_MSG = LT_TK-STR.
      COLLECT LT_MSG.
    ENDLOOP.

    LOOP AT LT_MSG.
      CHECK LT_MSG NE 'ID'.
      CLEAR: GT_MESSAGE.

      TRANSLATE LT_MSG TO UPPER CASE.
      SHIFT LT_MSG LEFT.
      TRANSLATE LT_MSG USING '( ) '.
      CONDENSE LT_MSG.
      SPLIT LT_MSG AT SPACE INTO GT_MESSAGE-MSGNR GT_MESSAGE-ARBGB.

      IF GT_MESSAGE-ARBGB IS INITIAL.
        GT_MESSAGE-ARBGB = G_ARBGB.
      ENDIF.

      COLLECT GT_MESSAGE.
    ENDLOOP.
  ENDLOOP.

*..... Set message class
  LOOP AT GT_MESSAGE WHERE ARBGB IS INITIAL.
    GT_MESSAGE-ARBGB = G_ARBGB.
    MODIFY GT_MESSAGE.
  ENDLOOP.

  DELETE GT_MESSAGE WHERE ARBGB(1) NA 'YZ'.
  DELETE ADJACENT DUPLICATES FROM GT_MESSAGE COMPARING ARBGB MSGNR.

ENDFORM.                    " FIND_MESSAGE_CLASS

*&---------------------------------------------------------------------*
*&      Form  POPUP_TO_CONFIRM
*&---------------------------------------------------------------------*
*       Display popup window & choose button
*----------------------------------------------------------------------*
*  <--  FP_ANSWER : Return of answer
*----------------------------------------------------------------------*
FORM POPUP_TO_CONFIRM USING FP_DEFAULT FP_TEXT1 FP_TEXT2 FP_TITEL
                            FP_ANSWER.
  CLEAR FP_ANSWER.

  CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
    EXPORTING
      DEFAULTOPTION  = FP_DEFAULT
      TEXTLINE1      = FP_TEXT1
      TEXTLINE2      = FP_TEXT2
      TITEL          = FP_TITEL
      CANCEL_DISPLAY = ''
    IMPORTING
      ANSWER         = FP_ANSWER.

ENDFORM.                    " POPUP_TO_CONFIRM

*&---------------------------------------------------------------------*
*&      Form  WS_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_PROGTEXT  text
*      -->P_L_PATH  text
*----------------------------------------------------------------------*
FORM WS_DOWNLOAD TABLES FT_TEXT STRUCTURE GT_PROGTEXT
                 USING  FP_PATH FP_FLAG.
  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      FILENAME                = FP_PATH
      FILETYPE                = 'ASC'
    TABLES
      DATA_TAB                = FT_TEXT
    EXCEPTIONS
      INVALID_FILESIZE        = 1
      INVALID_TABLE_WIDTH     = 2
      INVALID_TYPE            = 3
      NO_BATCH                = 4
      UNKNOWN_ERROR           = 5
      GUI_REFUSE_FILETRANSFER = 6
      CUSTOMER_ERROR          = 7
      OTHERS                  = 8.

  IF SY-SUBRC EQ 0.
    CLEAR: FP_FLAG.
  ELSE.
    FP_FLAG = '%ERR'.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
  ENDIF.

ENDFORM.                    " WS_DOWNLOAD

*&---------------------------------------------------------------------*
*&      Form  F4_PROGRAM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F4_PROGRAM.
  DATA: LT_DYNPREAD LIKE DYNPREAD OCCURS 0  WITH HEADER LINE.

  LT_DYNPREAD-FIELDNAME  = 'P_DPROG'.
  APPEND LT_DYNPREAD.
  PERFORM DYNP_VALUES_READ TABLES LT_DYNPREAD USING P_DPROG.

  CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
    EXPORTING
      OBJECT_TYPE          = 'PROG'
      OBJECT_NAME          = P_DPROG
      SUPPRESS_SELECTION   = ' '
    IMPORTING
      OBJECT_NAME_SELECTED = P_DPROG
    EXCEPTIONS
      CANCEL               = 01.

  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.                    " F4_PROGRAM

*&---------------------------------------------------------------------*
*&      Form  DYNP_VALUES_READ
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_DPROG  text
*----------------------------------------------------------------------*
FORM DYNP_VALUES_READ TABLES FT_DYNPREAD STRUCTURE DYNPREAD
                      USING  FP_VALUE.
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME     = SY-CPROG
      DYNUMB     = SY-DYNNR
    TABLES
      DYNPFIELDS = FT_DYNPREAD
    EXCEPTIONS
      OTHERS.

  CHECK SY-SUBRC EQ 0.
  READ TABLE FT_DYNPREAD INDEX 1.
  FP_VALUE = FT_DYNPREAD-FIELDVALUE.

ENDFORM.                    " DYNP_VALUES_READ

*&---------------------------------------------------------------------*
*&      Form  DOWN_MENU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWN_MENU.
  DATA: L_PATH LIKE RLGRAP-FILENAME.

  DATA: L_ADM  LIKE  RSMPE_ADM,
        LT_STA LIKE  RSMPE_STAT OCCURS 10 WITH HEADER LINE,
        LT_FUN LIKE  RSMPE_FUNT OCCURS 10 WITH HEADER LINE,
        LT_MEN LIKE  RSMPE_MEN  OCCURS 10 WITH HEADER LINE,
        LT_MTX LIKE  RSMPE_MNLT OCCURS 10 WITH HEADER LINE,
        LT_ACT LIKE  RSMPE_ACT  OCCURS 10 WITH HEADER LINE,
        LT_BUT LIKE  RSMPE_BUT  OCCURS 10 WITH HEADER LINE,
        LT_PFK LIKE  RSMPE_PFK  OCCURS 10 WITH HEADER LINE,
        LT_SET LIKE  RSMPE_STAF OCCURS 10 WITH HEADER LINE,
        LT_DOC LIKE  RSMPE_ATRT OCCURS 10 WITH HEADER LINE,
        LT_TIT LIKE  RSMPE_TITT OCCURS 10 WITH HEADER LINE,
        LT_BIV LIKE  RSMPE_BUTS OCCURS 10 WITH HEADER LINE.

  G_MSGTXT = 'Processing please wait...Menu'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist & Import
  CALL FUNCTION 'RS_CUA_INTERNAL_FETCH'
    EXPORTING
      PROGRAM   = P_DPROG
      LANGUAGE  = SY-LANGU
    IMPORTING
      ADM       = L_ADM
    TABLES
      STA       = LT_STA
      FUN       = LT_FUN
      MEN       = LT_MEN
      MTX       = LT_MTX
      ACT       = LT_ACT
      BUT       = LT_BUT
      PFK       = LT_PFK
      SET       = LT_SET
      DOC       = LT_DOC
      TIT       = LT_TIT
      BIV       = LT_BIV
    EXCEPTIONS
      NOT_FOUND = 1
      OTHERS    = 2.

  IF SY-SUBRC NE 0 OR
     L_ADM IS INITIAL.
    G_MSGTXT = 'Menu does not exist'.
    PERFORM APPEND_LOG USING '%ERR' '%MENU' G_MSGTXT.
    EXIT.
  ENDIF.

*..... Download & append log
  CLEAR: GT_PROGTEXT, GT_PROGTEXT[].

  CONCATENATE '%%ADM%%' L_ADM INTO GT_PROGTEXT-TEXT.
  APPEND GT_PROGTEXT.

  GET_MENU: '%%STA%%' LT_STA,
            '%%FUN%%' LT_FUN,
            '%%MEN%%' LT_MEN,
            '%%MTX%%' LT_MTX,
            '%%ACT%%' LT_ACT,
            '%%BUT%%' LT_BUT,
            '%%PFK%%' LT_PFK,
            '%%SET%%' LT_SET,
            '%%DOC%%' LT_DOC,
            '%%TIT%%' LT_TIT,
            '%%BIV%%' LT_BIV.

  CONCATENATE P_DPATH '\' P_DPROG '_MENU.TXT'
         INTO L_PATH.
  PERFORM WS_DOWNLOAD TABLES GT_PROGTEXT USING L_PATH G_FLAG_ERR.

  IF G_FLAG_ERR IS INITIAL.
    CONCATENATE P_DPROG '_MENU.TXT' INTO G_MSGTXT.
    PERFORM APPEND_LOG USING '%OK'  '%MENU' G_MSGTXT.
  ELSE.
    PERFORM APPEND_LOG USING '%ERR' '%MENU' G_MSGTXT.
  ENDIF.

ENDFORM.                    " DOWN_MENU

*&---------------------------------------------------------------------*
*&      Form  GET_INCLUDE_PROGRAM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_INCLUDE  text
*----------------------------------------------------------------------*
FORM GET_INCLUDE_PROGRAM TABLES FT_INCLUDE STRUCTURE GT_INCLUDE
                         USING  FP_PROG.
  CALL FUNCTION 'GET_INCLUDETAB'
    EXPORTING
      PROGNAME = FP_PROG
    TABLES
      INCLTAB  = FT_INCLUDE
    EXCEPTIONS
      OTHERS   = 1.

  CHECK SY-SUBRC EQ 0.
  DELETE FT_INCLUDE WHERE NOT ( NAME(1) EQ 'Z'  OR
                                NAME(1) EQ 'Y'  OR
                                NAME(2) EQ 'MZ' OR
                                NAME(2) EQ 'MY' OR
                                NAME(2) EQ 'LZ' OR
                                NAME(2) EQ 'LY' )
                          OR  ( NAME(1) EQ '<' ).

ENDFORM.                    " GET_INCLUDE_PROGRAM

*&---------------------------------------------------------------------*
*&      Form  UP_MAIN_PROG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UP_MAIN_PROG.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  G_MSGTXT = 'Processing please wait...Main program'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  SELECT SINGLE NAME INTO TRDIR-NAME
           FROM TRDIR
          WHERE NAME EQ P_UPROG.

  IF SY-SUBRC EQ 0.
    L_DEFAULT = 'N'.
    L_TEXT2   = 'Do you want to overwrite?'.
    L_TITLE   = 'Notification'.
    CONCATENATE 'Program' P_UPROG 'already exist.'
           INTO L_TEXT1 SEPARATED BY SPACE.

    PERFORM POPUP_TO_CONFIRM USING L_DEFAULT L_TEXT1 L_TEXT2 L_TITLE
                                   G_ANSWER.

    IF G_ANSWER NE 'J'.
      STOP.
    ENDIF.
  ENDIF.

*..... Upload from local file
  PERFORM WS_UPLOAD TABLES GT_PROGTEXT USING P_UPATH G_FLAG_ERR.

  IF NOT ( G_FLAG_ERR IS INITIAL ).
    PERFORM APPEND_LOG USING '%ERR' '%MPRG' G_MSGTXT.
    STOP.
  ENDIF.

*..... Delete text element in main program
  PERFORM DEL_TEXT_ELEMENT TABLES GT_PROGTEXT.

*..... Create program
  INSERT REPORT P_UPROG FROM GT_PROGTEXT.

  IF SY-SUBRC EQ 0.
    INSERT TEXTPOOL P_UPROG FROM GT_TEXTPOOL LANGUAGE SY-LANGU.

    IF SY-SUBRC EQ 0.
      PERFORM APPEND_LOG USING '%OK'  '%MPRG' P_UPROG.
    ELSE.
      CONCATENATE P_UPROG 'Insert error of text element'
             INTO G_MSGTXT SEPARATED BY SPACE.
      PERFORM APPEND_LOG USING '%WAR'  '%MPRG' G_MSGTXT.
    ENDIF.
  ELSE.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%MPRG' G_MSGTXT.
  ENDIF.

ENDFORM.                    " UP_MAIN_PROG

*&---------------------------------------------------------------------*
*&      Form  DEL_TEXT_ELEMENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_PROGTEXT  text
*----------------------------------------------------------------------*
FORM DEL_TEXT_ELEMENT TABLES FT_PROGTEXT STRUCTURE GT_PROGTEXT.
  CLEAR: GT_TEXTPOOL, GT_TEXTPOOL[].

  LOOP AT FT_PROGTEXT WHERE TEXT(5) EQ '*%%$$'.
    IF '*-' NS FT_PROGTEXT-TEXT+5(1).
      CLEAR: GT_TEXTPOOL.
      GT_TEXTPOOL = FT_PROGTEXT-TEXT+5.
      APPEND GT_TEXTPOOL.
    ENDIF.

    DELETE FT_PROGTEXT.
  ENDLOOP.

ENDFORM.                    " DEL_TEXT_ELEMENT

*&---------------------------------------------------------------------*
*&      Form  UP_INCLUDE_PROG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UP_INCLUDE_PROG.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  G_MSGTXT = 'Processing please wait...Include program'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  SELECT SINGLE NAME INTO TRDIR-NAME
           FROM TRDIR
          WHERE NAME EQ P_UPROG.

  IF SY-SUBRC EQ 0.
    L_DEFAULT = 'N'.
    L_TEXT2   = 'Do you want to overwrite?'.
    L_TITLE   = 'Notification'.
    CONCATENATE 'Program' P_UPROG 'already exist.'
           INTO L_TEXT1 SEPARATED BY SPACE.

    PERFORM POPUP_TO_CONFIRM USING L_DEFAULT L_TEXT1 L_TEXT2 L_TITLE
                                   G_ANSWER.

    IF G_ANSWER NE 'J'.
      STOP.
    ENDIF.
  ENDIF.

*..... Upload from local file
  PERFORM WS_UPLOAD TABLES GT_PROGTEXT USING P_UPATH G_FLAG_ERR.

  IF NOT ( G_FLAG_ERR IS INITIAL ).
    PERFORM APPEND_LOG USING '%ERR' '%IPRG' G_MSGTXT.
    STOP.
  ENDIF.

*..... Delete text element in main program
  PERFORM DEL_TEXT_ELEMENT TABLES GT_PROGTEXT.

*..... Create program & Change program type
  INSERT REPORT P_UPROG FROM GT_PROGTEXT.

  IF SY-SUBRC EQ 0.
    EXEC SQL.
      UPDATE reposrc SET subc = 'I'
                 WHERE progname = p_uprog
                   AND r3state  = 'A'.
    ENDEXEC.

    IF SY-SUBRC EQ 0.
      INSERT TEXTPOOL P_UPROG FROM GT_TEXTPOOL LANGUAGE SY-LANGU.

      IF SY-SUBRC EQ 0.
        PERFORM APPEND_LOG USING '%OK'  '%IPRG' P_UPROG.
      ELSE.
        CONCATENATE P_UPROG 'Insert error of text element'
               INTO G_MSGTXT SEPARATED BY SPACE.
        PERFORM APPEND_LOG USING '%WAR'  '%IPRG' G_MSGTXT.
      ENDIF.
    ELSE.
      CONCATENATE P_UPROG 'Update error of program type'
             INTO G_MSGTXT SEPARATED BY SPACE.
      PERFORM APPEND_LOG USING '%WAR'  '%IPRG' G_MSGTXT.
    ENDIF.
  ELSE.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%IPRG' G_MSGTXT.
  ENDIF.

ENDFORM.                    " UP_INCLUDE_PROG

*&---------------------------------------------------------------------*
*&      Form  UP_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UP_SCREEN.
  DATA: L_DEFAULT, L_TEXT1(70),  L_TEXT2(70), L_TITLE(70).

  DATA: L_DTXT   LIKE D020T-DTXT,
        L_H      LIKE D020S,
        LT_F     LIKE D021S OCCURS 10,
        LT_E     LIKE D022S OCCURS 10,
        LT_M     LIKE D023S OCCURS 10.

  G_MSGTXT = 'Processing please wait...Screen'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  UNPACK P_UDNUM TO P_UDNUM.

  SELECT SINGLE NAME INTO TRDIR-NAME
           FROM TRDIR
          WHERE NAME EQ P_UPROG
            AND SUBC IN ('1', 'M').

  IF SY-SUBRC NE 0.
    CONCATENATE 'Program' P_UPROG 'does not exist.'
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%ERR'  '%SCR' G_MSGTXT.
    STOP.
  ENDIF.

  SELECT SINGLE PROG DNUM
           INTO (D020S-PROG, D020S-DNUM)
           FROM D020S
          WHERE PROG EQ P_UPROG
            AND DNUM EQ P_UDNUM.

  IF SY-SUBRC EQ 0.
    L_DEFAULT = 'N'.
    L_TEXT2   = 'Do you want to overwrite?'.
    L_TITLE   = 'Notification'.
    CONCATENATE 'Screen' P_UPROG P_UDNUM 'already exist.'
           INTO L_TEXT1 SEPARATED BY SPACE.

    PERFORM POPUP_TO_CONFIRM USING L_DEFAULT L_TEXT1 L_TEXT2 L_TITLE
                                   G_ANSWER.

    IF G_ANSWER NE 'J'.
      STOP.
    ENDIF.
  ENDIF.

*..... Upload from local file
  PERFORM RS_DYNPRO_UPLOAD TABLES LT_F LT_E LT_M
                            USING  L_H L_DTXT P_UPATH P_UPROG P_UDNUM.

*  CALL FUNCTION 'RS_DYNPRO_UPLOAD'
*       EXPORTING
*            FILE              = P_UPATH
*       IMPORTING
*            HEADER            = L_H
*            DESCRIPT          = L_DTXT
*       TABLES
*            FIELDS            = LT_F
*            FLOWLOGIC         = LT_E
*            PARAMS            = LT_M
*       CHANGING
*            PROGRAM           = P_USPROG
*            DYNNR             = P_USDNUM
*       EXCEPTIONS
*            INVALID_FILE      = 1
*            NOT_EXECUTED      = 2
*            WRONG_DYNPRO_NAME = 3
*            INVALID_RELEASE   = 4
*            DAMAGED           = 5
*            OTHERS            = 6.
*
*  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.

*..... Create screen
  CALL FUNCTION 'RS_SCREEN_EXPORT'
    EXPORTING
      DYNNR            = P_UDNUM
      DYNPRO_TEXT      = L_DTXT
      H_EXPORT         = L_H
      PROGNAME         = P_UPROG
      DYNPRO_LANGUAGE  = SY-LANGU
    TABLES
      E_G              = LT_E
      F_G              = LT_F
      M_G              = LT_M
    EXCEPTIONS
      CANCELED_BY_USER = 1
      OTHERS           = 2.

  IF G_FLAG_ERR IS INITIAL.
    CONCATENATE P_UPROG P_UDNUM
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%OK'  '%SCR' G_MSGTXT.
  ELSE.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
  ENDIF.

ENDFORM.                    " UP_SCREEN

*&---------------------------------------------------------------------*
*&      Form  UP_MENU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UP_MENU.
  DATA: L_TRKEY LIKE TRKEY,
        L_ADM   LIKE  RSMPE_ADM,
        LT_STA  LIKE  RSMPE_STAT OCCURS 10 WITH HEADER LINE,
        LT_FUN  LIKE  RSMPE_FUNT OCCURS 10 WITH HEADER LINE,
        LT_MEN  LIKE  RSMPE_MEN  OCCURS 10 WITH HEADER LINE,
        LT_MTX  LIKE  RSMPE_MNLT OCCURS 10 WITH HEADER LINE,
        LT_ACT  LIKE  RSMPE_ACT  OCCURS 10 WITH HEADER LINE,
        LT_BUT  LIKE  RSMPE_BUT  OCCURS 10 WITH HEADER LINE,
        LT_PFK  LIKE  RSMPE_PFK  OCCURS 10 WITH HEADER LINE,
        LT_SET  LIKE  RSMPE_STAF OCCURS 10 WITH HEADER LINE,
        LT_DOC  LIKE  RSMPE_ATRT OCCURS 10 WITH HEADER LINE,
        LT_TIT  LIKE  RSMPE_TITT OCCURS 10 WITH HEADER LINE,
        LT_BIV  LIKE  RSMPE_BUTS OCCURS 10 WITH HEADER LINE.

  G_MSGTXT = 'Processing please wait...Menu'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Check exist
  SELECT SINGLE NAME INTO TRDIR-NAME
           FROM TRDIR
          WHERE NAME EQ P_UPROG
            AND SUBC IN ('1', 'M').

  IF SY-SUBRC NE 0.
    CONCATENATE 'Program' P_UPROG 'does not exist.'
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%ERR' '%MENU' G_MSGTXT.
    STOP.
  ENDIF.

*..... Upload from local file
  PERFORM WS_UPLOAD TABLES GT_PROGTEXT USING P_UPATH G_FLAG_ERR.

  IF NOT ( G_FLAG_ERR IS INITIAL ).
    PERFORM APPEND_LOG USING '%ERR' '%MENU' G_MSGTXT.
    STOP.
  ENDIF.

  LOOP AT GT_PROGTEXT.
    CASE GT_PROGTEXT(7).
      WHEN '%%ADM%%'.  WRITE GT_PROGTEXT+7 TO L_ADM.
      WHEN '%%STA%%'.  SET_MENU LT_STA.
      WHEN '%%FUN%%'.  SET_MENU LT_FUN.
      WHEN '%%MEN%%'.  SET_MENU LT_MEN.
      WHEN '%%MTX%%'.  SET_MENU LT_MTX.
      WHEN '%%ACT%%'.  SET_MENU LT_ACT.
      WHEN '%%BUT%%'.  SET_MENU LT_BUT.
      WHEN '%%PFK%%'.  SET_MENU LT_PFK.
      WHEN '%%SET%%'.  SET_MENU LT_SET.
      WHEN '%%DOC%%'.  SET_MENU LT_DOC.
      WHEN '%%TIT%%'.  SET_MENU LT_TIT.
      WHEN '%%BIV%%'.  SET_MENU LT_BIV.
    ENDCASE.
  ENDLOOP.

*..... Create menu
  CALL FUNCTION 'RS_CUA_INTERNAL_WRITE'
    EXPORTING
      PROGRAM   = P_UPROG
      LANGUAGE  = SY-LANGU
      TR_KEY    = L_TRKEY
      ADM       = L_ADM
*     STATE     = 'A'
    TABLES
      STA       = LT_STA
      FUN       = LT_FUN
      MEN       = LT_MEN
      MTX       = LT_MTX
      ACT       = LT_ACT
      BUT       = LT_BUT
      PFK       = LT_PFK
      SET       = LT_SET
      DOC       = LT_DOC
      TIT       = LT_TIT
      BIV       = LT_BIV
    EXCEPTIONS
      NOT_FOUND = 1
      OTHERS    = 2.

  IF SY-SUBRC EQ 0.
    CONCATENATE 'Create menu to' P_UPROG
           INTO G_MSGTXT SEPARATED BY SPACE.
    PERFORM APPEND_LOG USING '%OK'   '%MENU' G_MSGTXT.
  ELSE.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%MENU' G_MSGTXT.
  ENDIF.

ENDFORM.                    " UP_MENU

*&---------------------------------------------------------------------*
*&      Form  WS_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_PROGTEXT  text
*      -->P_P_PATH  text
*----------------------------------------------------------------------*
FORM WS_UPLOAD TABLES FT_TEXT STRUCTURE GT_PROGTEXT
               USING  FP_PATH FP_FLAG.
  CLEAR: FT_TEXT, FT_TEXT[].

  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      FILENAME            = FP_PATH
      FILETYPE            = 'ASC'
    TABLES
      DATA_TAB            = FT_TEXT
    EXCEPTIONS
      CONVERSION_ERROR    = 01
      FILE_OPEN_ERROR     = 02
      FILE_READ_ERROR     = 03
      INVALID_TABLE_WIDTH = 04
      INVALID_TYPE        = 05
      NO_BATCH            = 06
      UNKNOWN_ERROR       = 07.

  IF SY-SUBRC EQ 0.
    CLEAR: FP_FLAG.
  ELSE.
    FP_FLAG = '%ERR'.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
  ENDIF.

ENDFORM.                    " WS_UPLOAD

*&---------------------------------------------------------------------*
*&      Form  RS_DYNPRO_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PATH  text
*----------------------------------------------------------------------*
FORM RS_DYNPRO_DOWNLOAD TABLES FT_F STRUCTURE D021S
                               FT_E STRUCTURE D022S
                               FT_M STRUCTURE D023S
                         USING FP_H FP_DTXT FP_PATH.

  DATA: HEADER_CHAR LIKE SCR_CHHEAD,
        DYNP_CHAR   LIKE SCR_CHFLD OCCURS 0 WITH HEADER LINE,
        FIELDS_CHAR LIKE SCR_CHFLD OCCURS 0 WITH HEADER LINE,
        PROG_LEN    TYPE P.

  CALL FUNCTION 'RS_SCRP_HEADER_RAW_TO_CHAR'
    EXPORTING
      HEADER_INT  = FP_H
    IMPORTING
      HEADER_CHAR = HEADER_CHAR
    EXCEPTIONS
      OTHERS      = 1.

  REFRESH DYNP_CHAR.

* Comment
  DYNP_CHAR = C_STARS.    APPEND DYNP_CHAR.
  DYNP_CHAR = C_COMMENT1. APPEND DYNP_CHAR.
  DYNP_CHAR = C_COMMENT2. APPEND DYNP_CHAR.
  DYNP_CHAR = C_STARS.    APPEND DYNP_CHAR.

* Identification
  DYNP_CHAR = C_DYNPRO.         APPEND DYNP_CHAR.          "  '%_DYNPRO'
  DYNP_CHAR = HEADER_CHAR-PROG. APPEND DYNP_CHAR.
  DYNP_CHAR = HEADER_CHAR-DNUM. APPEND DYNP_CHAR.
  DYNP_CHAR = SY-SAPRL.         APPEND DYNP_CHAR.
  DESCRIBE FIELD D020S-PROG LENGTH PROG_LEN IN BYTE MODE.
  DYNP_CHAR(16) = PROG_LEN.     APPEND DYNP_CHAR.

* Header
  DYNP_CHAR = C_HEADER.         APPEND DYNP_CHAR.     "  '%_HEADER'
  APPEND HEADER_CHAR TO DYNP_CHAR.

* Description
  DYNP_CHAR = C_DESCRIPT.       APPEND DYNP_CHAR.     "  '%_DESCRIPTION'
  APPEND FP_DTXT TO DYNP_CHAR.

* Fieldlist
  DYNP_CHAR = C_FIELDS.         APPEND DYNP_CHAR.     "  '%_FIELDS'
  CALL FUNCTION 'RS_SCRP_FIELDS_RAW_TO_CHAR'
    TABLES
      FIELDS_INT  = FT_F
      FIELDS_CHAR = FIELDS_CHAR
    EXCEPTIONS
      OTHERS      = 1.

  LOOP AT FIELDS_CHAR.
    APPEND FIELDS_CHAR TO DYNP_CHAR.
  ENDLOOP.

* Flowlogic
  DYNP_CHAR = C_FLOWLOGIC.      APPEND DYNP_CHAR.     "  '%_FLOWLOGIC'

  LOOP AT FT_E.
    APPEND FT_E TO DYNP_CHAR.
  ENDLOOP.
**  refresh flowlogic.                   "vjb 25.06.98


* Dynpro Parameters                      "vjb ab 4.6A (01.07.98)
  IF FT_M IS REQUESTED.
    DYNP_CHAR = C_PARAMS.       APPEND DYNP_CHAR.     "  '%_PARAMS'

    LOOP AT FT_M.
      APPEND FT_M TO DYNP_CHAR.
    ENDLOOP.
  ENDIF.

* Download
  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      FILENAME                = FP_PATH
      FILETYPE                = 'ASC'
    TABLES
      DATA_TAB                = DYNP_CHAR
    EXCEPTIONS
      INVALID_FILESIZE        = 1
      INVALID_TABLE_WIDTH     = 2
      INVALID_TYPE            = 3
      NO_BATCH                = 4
      UNKNOWN_ERROR           = 5
      GUI_REFUSE_FILETRANSFER = 6
      CUSTOMER_ERROR          = 7
      OTHERS                  = 8.

  IF SY-SUBRC EQ 0.
    CLEAR: G_FLAG_ERR.
  ELSE.
    G_FLAG_ERR = '%ERR'.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
  ENDIF.

ENDFORM.                    " RS_DYNPRO_DOWNLOAD

*&---------------------------------------------------------------------*
*&      Form  RS_DYNPRO_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_F  text
*      -->P_LT_E  text
*      -->P_LT_M  text
*      -->P_L_H  text
*      -->P_L_DTXT  text
*      -->P_P_UPATH  text
*----------------------------------------------------------------------*
FORM RS_DYNPRO_UPLOAD TABLES FT_F STRUCTURE D021S
                             FT_E STRUCTURE D022S
                             FT_M STRUCTURE D023S
                       USING FP_H FP_DTXT FP_PATH FP_PROG FP_DNUM.
  TYPES: BEGIN OF DYNP_REL_TYPE,               "Dynpro-Releases
          REL(1),
          DOT(1),

          VERSION(2),
        END OF DYNP_REL_TYPE.

  DATA: SCRP_REL  TYPE DYNP_REL_TYPE VALUE '4.60',  "Rel. Scrp. 4.6A
        DYNP_REL  TYPE DYNP_REL_TYPE.               "akt. Rel. Dynpro

  DATA: DYNPRO_REL(4).

  DATA: DYNP_CHAR   LIKE SCR_CHFLD OCCURS 0 WITH HEADER LINE,
        FIELDS_CHAR LIKE SCR_CHFLD OCCURS 0 WITH HEADER LINE,
        HEADER_CHAR LIKE SCR_CHHEAD.

  DATA: BEGIN OF DYNP,
             PROG LIKE D020S-PROG,
             DNUM LIKE D020S-DNUM,
        END OF DYNP.

  DATA: STATUS,
        RELEASE,
        PROG_LEN     TYPE P.

  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      FILENAME            = FP_PATH
      FILETYPE            = 'ASC'
    TABLES
      DATA_TAB            = DYNP_CHAR
    EXCEPTIONS
      CONVERSION_ERROR    = 01
      FILE_OPEN_ERROR     = 02
      FILE_READ_ERROR     = 03
      INVALID_TABLE_WIDTH = 04
      INVALID_TYPE        = 05
      NO_BATCH            = 06
      UNKNOWN_ERROR       = 07.

  IF SY-SUBRC NE 0.
    PERFORM MESSAGE_TEXT_BUILD
      USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
    STOP.
  ENDIF.

* is it really a dynpro file ?
  READ TABLE DYNP_CHAR INDEX 5.
  IF DYNP_CHAR <> C_DYNPRO.   " '%_DYNPRO'
    PERFORM MESSAGE_TEXT_BUILD
      USING 37 250 SPACE SPACE SPACE SPACE G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%SCR' G_MSGTXT.
    STOP.
  ENDIF.

* release test ( < rel. 3)
  READ TABLE DYNP_CHAR INDEX 8.

  IF DYNP_CHAR(1) < 3.                                    "#EC PORTABLE
    PERFORM MESSAGE_TEXT_BUILD
      USING 37 251 SPACE SPACE SPACE SPACE G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%SCR' G_MSGTXT.
    STOP.
  ENDIF.

* test dynpro name
  READ TABLE DYNP_CHAR INDEX 6.
  DYNP-PROG = DYNP_CHAR.

  READ TABLE DYNP_CHAR INDEX 7.
  DYNP-DNUM = DYNP_CHAR.

* fill header_char, fields_char, flowlogic, and dynpro parameters
  REFRESH FIELDS_CHAR.
  REFRESH FT_E.
  REFRESH FT_M.
  STATUS = ' '.
  LOOP AT DYNP_CHAR.
    CASE DYNP_CHAR.
      WHEN C_DYNPRO.    STATUS = '1'.    " '%_DYNPRO'
      WHEN C_HEADER.    STATUS = 'H'.    " '%_HEADER'
      WHEN C_DESCRIPT.  STATUS = 'D'.    " '%_DESCRIPT'
      WHEN C_FIELDS.    STATUS = 'F'.    " '%_FIELDS'
      WHEN C_FLOWLOGIC. STATUS = 'E'.    " '%_FLOWLOGIC'
      WHEN C_PARAMS.    STATUS = 'P'.    " '%_PARAMS'
      WHEN OTHERS.
        CASE STATUS.
          WHEN '1'.
            STATUS = '2'.
          WHEN '2'.
            STATUS = '3'.
          WHEN '3'.
            RELEASE = DYNP_CHAR(1).
            STATUS = '4'.
          WHEN '4'.
            PROG_LEN = DYNP_CHAR.
            STATUS = 'H'.
          WHEN 'H'.
            IF DYNP-PROG EQ FP_PROG.
              MOVE DYNP_CHAR(PROG_LEN) TO HEADER_CHAR(PROG_LEN).
              MOVE DYNP_CHAR+PROG_LEN  TO HEADER_CHAR+PROG_LEN.
            ELSE.
              MOVE FP_PROG(PROG_LEN)   TO HEADER_CHAR(PROG_LEN).
              MOVE DYNP_CHAR+PROG_LEN  TO HEADER_CHAR+PROG_LEN.
            ENDIF.
            IF DYNP-DNUM NE FP_DNUM.
              MOVE FP_DNUM(4)          TO HEADER_CHAR+PROG_LEN(4).
            ENDIF.
            STATUS = ' '.
          WHEN 'D'.
            FP_DTXT = DYNP_CHAR.
          WHEN 'F'.
            FIELDS_CHAR = DYNP_CHAR.
            APPEND FIELDS_CHAR.
          WHEN 'E'.
            FT_E = DYNP_CHAR.
            APPEND FT_E.
          WHEN 'P'.
            FT_M    = DYNP_CHAR.
            APPEND FT_M.
        ENDCASE.
    ENDCASE.
  ENDLOOP.

* translate header
  CALL FUNCTION 'RS_SCRP_HEADER_CHAR_TO_RAW'
    EXPORTING
      HEADER_CHAR = HEADER_CHAR
    IMPORTING
      HEADER_INT  = FP_H
    EXCEPTIONS
      OTHERS      = 1.

* translate fieldlist
  CALL FUNCTION 'RS_SCRP_FIELDS_CHAR_TO_RAW'
    TABLES
      FIELDS_INT  = FT_F
      FIELDS_CHAR = FIELDS_CHAR
    EXCEPTIONS
      OTHERS      = 1.

* release check
  CALL FUNCTION 'RS_DYNPRO_RELEASE_GET'
    EXPORTING
      DYNPRO_HEADER  = FP_H
    IMPORTING
      DYNPRO_RELEASE = DYNPRO_REL.

  DYNP_REL = DYNPRO_REL.
  IF SCRP_REL < DYNP_REL.                                 "#EC PORTABLE
    PERFORM MESSAGE_TEXT_BUILD
      USING 37 251 SPACE SPACE SPACE SPACE G_MSGTXT.
    PERFORM APPEND_LOG USING '%ERR'  '%SCR' G_MSGTXT.
    STOP.
  ENDIF.

  CALL FUNCTION 'RS_SCRP_DYNPRO_CHECK'
    TABLES
      FIELDLIST            = FT_F
      FLOWLOGIC            = FT_E
      PARAMS               = FT_M
    CHANGING
      HEADER               = FP_H
    EXCEPTIONS
      DAMAGED_BUT_REPAIRED = 1
      DAMAGED              = 2
      OTHERS               = 3.

  CHECK ( SY-SUBRC EQ 2 ) OR ( SY-SUBRC EQ 3 ).
  PERFORM MESSAGE_TEXT_BUILD
    USING SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
          G_MSGTXT.
  PERFORM APPEND_LOG USING '%ERR' '%SCR' G_MSGTXT.
  STOP.

ENDFORM.                    " RS_DYNPRO_UPLOAD

*&---------------------------------------------------------------------*
*&      Form  CHECK_REQUIRED_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1145   text
*----------------------------------------------------------------------*
FORM CHECK_REQUIRED_FIELD USING FP_STATUS.
  CLEAR: G_FLAG_ERR.

  CASE FP_STATUS.
    WHEN '%DOWN'.
      IF ( P_DPROG IS INITIAL ) OR ( P_DPATH IS INITIAL ).
        G_MSGTXT = 'Specify download program name & path!!'.
        PERFORM WS_MSG USING 'E' G_MSGTXT.
        G_FLAG_ERR = 'X'.  EXIT.
      ENDIF.

      IF ( P_DMPRG IS INITIAL ) AND ( P_DMSG IS INITIAL ) AND
         ( P_DINCL IS INITIAL ) AND ( P_DSCR IS INITIAL ) AND
         ( P_DMSG  IS INITIAL ).
        G_MSGTXT = 'Check additional option!!'.
        PERFORM WS_MSG USING 'E' G_MSGTXT.
        G_FLAG_ERR = 'X'.  EXIT.
      ENDIF.

    WHEN '%UP'.
      IF P_UPATH IS INITIAL.
        G_MSGTXT = 'Specify upload file path & name!!'.
        PERFORM WS_MSG USING 'E' G_MSGTXT.
        G_FLAG_ERR = 'X'.  EXIT.
      ENDIF.

      IF P_UPROG IS INITIAL.
        G_MSGTXT = 'Specify target program name!!'.
        PERFORM WS_MSG USING 'E' G_MSGTXT.
        G_FLAG_ERR = 'X'.  EXIT.
      ELSE.
        IF P_UPROG(1) NA 'YZ'.
          IF P_UINCL EQ 'X'.
            IF ( P_UPROG(2) NE 'MZ' ) AND
               ( P_UPROG(2) NE 'MY' ).
              G_MSGTXT = 'Error in program name!!'.
              PERFORM WS_MSG USING 'E' G_MSGTXT.
              G_FLAG_ERR = 'X'.  EXIT.
            ENDIF.
          ELSE.
            IF ( P_UPROG(5) NE 'SAPMZ' ) AND
               ( P_UPROG(5) NE 'SAPMY' ).
              G_MSGTXT = 'Error in program name!!'.
              PERFORM WS_MSG USING 'E' G_MSGTXT.
              G_FLAG_ERR = 'X'.  EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.

      IF ( P_RSCR EQ 'X' ) AND ( P_UDNUM IS INITIAL ).
        G_MSGTXT = 'Specify screen number!!'.
        PERFORM WS_MSG USING 'E' G_MSGTXT.
        G_FLAG_ERR = 'X'.  EXIT.
      ENDIF.
  ENDCASE.

ENDFORM.                    " CHECK_REQUIRED_FIELD

*&---------------------------------------------------------------------*
*&      Form  DOWN_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWN_MESSAGE.
  DATA: L_PATH LIKE RLGRAP-FILENAME.

  CLEAR: GT_INCLUDE, GT_INCLUDE[], GT_MESSAGE, GT_MESSAGE[], G_ARBGB.

  G_MSGTXT = 'Processing please wait...Message class'.
  PERFORM DISPLAY_STATUS USING G_MSGTXT 0.

*..... Find messages
  PERFORM GET_INCLUDE_PROGRAM TABLES GT_INCLUDE
                              USING  P_DPROG.

  CLEAR: GT_INCLUDE.
  GT_INCLUDE-NAME = P_DPROG.
  INSERT GT_INCLUDE INDEX 1.

  PERFORM FIND_MESSAGE_CLASS.

*..... Check exist
  DESCRIBE TABLE GT_MESSAGE LINES SY-TFILL.

  IF SY-TFILL EQ 0.
    G_MSGTXT = 'Message class does not exist'.
    PERFORM APPEND_LOG USING '%ERR' '%MSG' G_MSGTXT.
    EXIT.
  ENDIF.

*..... Get message text
  CLEAR: GT_PROGTEXT, GT_PROGTEXT[].

  SORT GT_MESSAGE BY ARBGB DESCENDING MSGNR.
  LOOP AT GT_MESSAGE.
    AT NEW ARBGB.
      GT_PROGTEXT = C_STARS.  APPEND GT_PROGTEXT.
      PERFORM SELECT_T100T USING GT_MESSAGE-ARBGB GT_MESSAGE-TEXT.
      CONCATENATE '* Message class :' GT_MESSAGE-ARBGB GT_MESSAGE-TEXT
             INTO GT_PROGTEXT-TEXT SEPARATED BY SPACE.
      APPEND GT_PROGTEXT.
      GT_PROGTEXT = C_STARS.  APPEND GT_PROGTEXT.
    ENDAT.

    PERFORM SELECT_T100
      USING GT_MESSAGE-ARBGB GT_MESSAGE-MSGNR GT_MESSAGE-TEXT.

    CLEAR GT_PROGTEXT.
    GT_PROGTEXT = GT_MESSAGE-TEXT.
    APPEND GT_PROGTEXT.

    AT END OF ARBGB.
      APPEND INITIAL LINE TO GT_PROGTEXT.
    ENDAT.

    AT LAST.
      GT_PROGTEXT = C_STARS.  APPEND GT_PROGTEXT.
    ENDAT.
  ENDLOOP.

*..... Download & append log
  CONCATENATE P_DPATH '\' P_DPROG '_MSG.TXT'
         INTO L_PATH.
  PERFORM WS_DOWNLOAD TABLES GT_PROGTEXT USING L_PATH G_FLAG_ERR.

  IF G_FLAG_ERR IS INITIAL.
    CONCATENATE P_DPROG '_MSG.TXT' INTO G_MSGTXT.
    PERFORM APPEND_LOG USING '%OK'  '%MSG' G_MSGTXT.
  ELSE.
    PERFORM APPEND_LOG USING '%ERR' '%MSG' G_MSGTXT.
  ENDIF.

ENDFORM.                    " DOWN_MESSAGE

*&---------------------------------------------------------------------*
*&      Form  WRITE_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM WRITE_HEADER.
  CASE TABB1-ACTIVETAB.
    WHEN 'TABS2' OR 'EXDN'.     "Download
      FORMAT: INTENSIFIED OFF, COLOR COL_HEADING.
      WRITE: /(80) 'Download Log'.
      FORMAT: INTENSIFIED OFF, COLOR COL_NORMAL.
      WRITE: / C_HYPHEN,
             /03 'Download path    :', P_DPATH(59).

    WHEN 'TABS1' OR 'EXUP'.     "Upload
      FORMAT: INTENSIFIED OFF, COLOR COL_HEADING.
      WRITE: /(80) 'Upload Log'.
      FORMAT: INTENSIFIED OFF, COLOR COL_NORMAL.
      WRITE: / C_HYPHEN,
             /03 'Upload path      :', P_UPATH(59).
  ENDCASE.

ENDFORM.                    " WRITE_HEADER

*&---------------------------------------------------------------------*
*&      Form  WS_MSG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_3464   text
*      -->P_G_MSGTXT  text
*----------------------------------------------------------------------*
FORM WS_MSG USING FP_TYPE FP_TEXT.
  CALL FUNCTION 'WS_MSG'
    EXPORTING
      MSG_TYPE = FP_TYPE
      TEXT     = FP_TEXT
      TITL     = 'Notification'.

ENDFORM.                    " WS_MSG

*&---------------------------------------------------------------------*
*&      Form  WRITE_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0960   text
*      -->P_G_MSGTXT  text
*----------------------------------------------------------------------*
FORM WRITE_LOG.
  LOOP AT GT_LOG.
    CASE GT_LOG-STAT.
      WHEN '%OK'.
        WRITE: /03 ICON_GREEN_LIGHT AS ICON.
      WHEN '%WAR'.
        WRITE: /03 ICON_YELLOW_LIGHT AS ICON.
      WHEN '%ERR'.
        WRITE: /03 ICON_RED_LIGHT AS ICON.
    ENDCASE.

    CASE GT_LOG-TYPE.
      WHEN '%MPRG'.
        WRITE: 'Main prg.   :', GT_LOG-TEXT.
      WHEN '%IPRG'.
        WRITE: 'Include prg.:', GT_LOG-TEXT.
      WHEN '%SCR'.
        WRITE: 'Screen      :', GT_LOG-TEXT.
      WHEN '%MENU'.
        WRITE: 'Menu        :', GT_LOG-TEXT.
      WHEN '%MSG'.
        WRITE: 'Message     :', GT_LOG-TEXT.
    ENDCASE.
  ENDLOOP.

ENDFORM.                    " WRITE_LOG

*&---------------------------------------------------------------------*
*&      Form  APPEND_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0960   text
*      -->P_0961   text
*      -->P_G_MSGTXT  text
*----------------------------------------------------------------------*
FORM APPEND_LOG USING FP_STAT FP_TYPE FP_TEXT.
  CLEAR: GT_LOG.
  GT_LOG-STAT = FP_STAT.
  GT_LOG-TYPE = FP_TYPE.
  GT_LOG-TEXT = FP_TEXT.
  APPEND GT_LOG.

ENDFORM.                    " APPEND_LOG

*&---------------------------------------------------------------------*
*&      Form  MESSAGE_TEXT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SY_MSGID  text
*      -->P_SY_MSGNO  text
*      -->P_MSGV1  text
*      -->P_MSGV2  text
*      -->P_MSGV3  text
*      -->P_MSGV4  text
*      -->P_G_MSGTXT  text
*----------------------------------------------------------------------*
FORM MESSAGE_TEXT_BUILD USING FP_MSGID FP_MSGNO FP_MSGV1 FP_MSGV2
                              FP_MSGV3 FP_MSGV4 FP_TEXT.
  CLEAR: FP_TEXT.

  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      MSGID               = FP_MSGID
      MSGNR               = FP_MSGNO
      MSGV1               = FP_MSGV1
      MSGV2               = FP_MSGV2
      MSGV3               = FP_MSGV3
      MSGV4               = FP_MSGV4
    IMPORTING
      MESSAGE_TEXT_OUTPUT = FP_TEXT.

ENDFORM.                    " MESSAGE_TEXT_BUILD

*&---------------------------------------------------------------------*
*&      Form  MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_SCREEN.
  LOOP AT SCREEN.
    CASE SCREEN-GROUP1.
      WHEN 'G01'.
        IF P_RPROG EQ 'X'.
          SCREEN-INPUT = '1'.
        ELSE.
          SCREEN-INPUT = '0'.
        ENDIF.
      WHEN 'G02'.
        IF P_RSCR EQ 'X'.
          SCREEN-INPUT = '1'.
        ELSE.
          SCREEN-INPUT = '0'.
        ENDIF.
      WHEN OTHERS.
        CONTINUE.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

  CASE 'X'.
    WHEN P_RPROG.
      CLEAR: P_UDNUM.
    WHEN P_RSCR.
      CLEAR: P_UINCL.
    WHEN P_RMENU.
      CLEAR: P_UDNUM, P_UINCL.
  ENDCASE.

ENDFORM.                    " MODIFY_SCREEN
*&---------------------------------------------------------------------*
*&      Form  AT_SELECTION_SCREEN
*&---------------------------------------------------------------------*
FORM AT_SELECTION_SCREEN.

  CASE SSCRFIELDS-UCOMM.
    WHEN 'EXUP'.
      TABB1-DYNNR     = 1001.
      TABB1-ACTIVETAB = 'TABS1'.

    WHEN 'EXDN'.
      TABB1-DYNNR     = 1002.
      TABB1-ACTIVETAB = 'TABS2'.
  ENDCASE.

ENDFORM.                    "AT_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*&      Form  START_OF_SELECTION
*&---------------------------------------------------------------------*
FORM START_OF_SELECTION.

  CASE TABB1-ACTIVETAB.
    WHEN 'TABS1' OR 'EXUP'.
      PERFORM EXEC_UPLOAD.

    WHEN 'TABS2' OR 'EXDN'.
      PERFORM EXEC_DOWNLOAD.
  ENDCASE.

ENDFORM.                    "START_OF_SELECTION
*&---------------------------------------------------------------------*
*&      Form  SELECT_T100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_MESSAGE_ARBGB  text
*      -->P_GT_MESSAGE_MSGNR  text
*      -->P_GT_MESSAGE_TEXT  text
*----------------------------------------------------------------------*
FORM SELECT_T100 USING FP_ARBGB FP_MSGNR FP_TEXT.
  CLEAR FP_TEXT.

  SELECT SINGLE TEXT INTO FP_TEXT
           FROM T100
          WHERE SPRSL = SY-LANGU
            AND ARBGB = FP_ARBGB
            AND MSGNR = FP_MSGNR.

  IF SY-SUBRC EQ 0.
    CONCATENATE GT_MESSAGE-MSGNR FP_TEXT
           INTO FP_TEXT SEPARATED BY SPACE.
  ELSE.
    FP_TEXT = FP_MSGNR.
  ENDIF.

ENDFORM.                    " SELECT_T100

*&---------------------------------------------------------------------*
*&      Form  SELECT_T100T
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_MESSAGE_ARBGB  text
*      -->P_GT_MESSAGE_TEXT  text
*----------------------------------------------------------------------*
FORM SELECT_T100T USING FP_ARBGB FP_TEXT.
  CLEAR: FP_TEXT.

  SELECT SINGLE STEXT INTO FP_TEXT
           FROM T100T
          WHERE SPRSL EQ SY-LANGU
            AND ARBGB EQ FP_ARBGB.

ENDFORM.                    " SELECT_T100T

*%%$$****************************************************************
*%%$$          T E X T    E L E M E N T S
*%%$$----------------------------------------------------------------
*%%$$  R - Program titles
*%%$$  T - List headers
*%%$$  H - Column headers
*%%$$  S - Selection texts
*%%$$  I - Text symbols
*%%$$****************************************************************
*%%$$R        Program download and upload

댓글 없음:

댓글 쓰기