ABAP 导出程序


*======================================================================================================================
*  Direct Download Enterprise version 1.3.
*
*  THIS SOFTWARE IS FOR PERSONAL USE ONLY.
*  THIS PROGRAM IS FREEWARE AND IS PROVIDED ON AN AS-IS BASIS WITHOUT WARRANTY OF ANY KIND.
*  THE PROVIDER SPECIFICALLY DISCLAIMS ANY OTHER WARRANTY, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY
*  OR FITNESS FOR A PARTICULAR PURPOSE.
*
*  IN NO EVENT SHALL THE PROVIDER BE LIABLE FOR ANY CONSEQUENTIAL, INDIRECT, SPECIAL OR INCIDENTAL DAMAGES, EVEN IF PROVIDER
*  HAS BEEN ADVISED BY CLIENT OF THE POSSIBILITY OF SUCH POTENTIAL LOSS OR DAMAGE.
*  CLIENT AGREES TO HOLD PROVIDER HARMLESS FROM AND AGAINST ANY AND ALL CLAIMS, LOSSES, LIABILITIES AND EXPENSES.  BY
*  INSTALLING OR RUNNING THIS PROGRAM YOU ARE AGREEING TO THE TERMS AND CONDITONS STATED ABOVE.
*
*----------------------------------------------------------------------------------------------------------------------
*  PROGRAM DESCRIPTION & USE
*  Allows a user to download programs, Functions, DD definitions, etc to the presentation server.  This version searches
*  recursively for nested includes and function modules, and allows you to download the resulting code as standard text
*  or HTML web pages within a suitable directory structure.
*
*  You can either search by object name, using wildcards if you wish, or a combination of Author and object name.  If
*  you want all objects returned for a particular author then select the author name and choose the most suitable
*  radiobutton.  All objects will be returned if the fields to the right hand side of the radiobutton are left completely
*  blank.
*
*  Compatible with R/3 Enterprise only, for older versions of SAP you will need Direct Download version 5.xx.
*  This version removes the programming limitations imposed by developing across SAP releases 3 to 4.6.
*
*  In order to be able to download files to the SAP server you must first set up a logical filepath within transaction
*  'FILE', or use an existing one.  You must also create a external operating system command in SM69 called ZMKDIR. This
*  will then be used to create any directories needed on the SAP server

*  This program is intended to allow a person to keep a visual representation of a program for backup purposes only as
*  has not been designed to allow programs to be uploaded to SAP systems.
*----------------------------------------------------------------------------------------------------------------------
*
* author          : E.G.Mellodew
*
*
* program contact : direct@dalestech.com
*                   www.dalestech.com
*
*----------------------------------------------------------------------------------------------------------------------
REPORT YTEST001.
*----------------------------------------------------------------------------------------------------------------------
*  SAP Tables
*----------------------------------------------------------------------------------------------------------------------
TABLES: TRDIR, SEOCLASS, TFDIR, ENLFDIR, DD02L.

*----------------------------------------------------------------------------------------------------------------------
*  Types
*----------------------------------------------------------------------------------------------------------------------
* text element structure
TYPES: TTEXTTABLE LIKE TEXTPOOL.
* GUI titles
TYPES: TGUITITLE LIKE D347T.

* Message classes
TYPESBEGIN OF TMESSAGE,
         ARBGB LIKE T100-ARBGB,
         STEXT LIKE T100A-STEXT,
         MSGNR LIKE T100-MSGNR,
         TEXT  LIKE T100-TEXT,
       END OF TMESSAGE.

* Screen flow.
TYPESBEGIN OF TSCREENFLOW,
         SCREEN LIKE D020S-DNUM,
         CODE   LIKE D022S-LINE,
       END OF TSCREENFLOW.

* Holds a table\structure definition
TYPESBEGIN OF TDICTTABLESTRUCTURE,
         FIELDNAME LIKE DD03L-FIELDNAME,
         POSITION  LIKE DD03L-POSITION,
         KEYFLAG   LIKE DD03L-KEYFLAG,
         ROLLNAME  LIKE DD03L-ROLLNAME,
         DOMNAME   LIKE DD03L-DOMNAME,
         DATATYPE  LIKE DD03L-DATATYPE,
         LENG      LIKE DD03L-LENG,
         DDTEXT    LIKE DD04T-DDTEXT,
       END OF TDICTTABLESTRUCTURE.

* Holds a tables attributes + its definition
TYPESBEGIN OF TDICTTABLE,
         TABLENAME  LIKE DD03L-TABNAME,
         TABLETITLE LIKE DD02T-DDTEXT,
         ISTRUCTURE TYPE TDICTTABLESTRUCTURE OCCURS 0,
       END OF TDICTTABLE.

* Include program names
TYPESBEGIN OF TINCLUDE,
         INCLUDENAME  LIKE TRDIR-NAME,
         INCLUDETITLE LIKE TFTIT-STEXT,
       END OF TINCLUDE.

* Exception class texts
TYPESBEGIN OF TCONCEPT,
         CONSTNAME TYPE STRING,
         CONCEPT   TYPE SOTR_CONC,
       END OF TCONCEPT.

* Method
TYPESBEGIN OF TMETHOD,
         CMPNAME   LIKE VSEOMETHOD-CMPNAME,
         DESCRIPT  LIKE VSEOMETHOD-DESCRIPT,
         EXPOSURE  LIKE VSEOMETHOD-EXPOSURE,
         METHODKEY TYPE STRING,
       END OF TMETHOD.

* Class
TYPESBEGIN OF TCLASS,
         SCANNED(1),
         CLSNAME           LIKE VSEOCLASS-CLSNAME,
         DESCRIPT          LIKE VSEOCLASS-DESCRIPT,
         MSG_ID            LIKE VSEOCLASS-MSG_ID,
         EXPOSURE          LIKE VSEOCLASS-EXPOSURE,
         STATE             LIKE VSEOCLASS-STATE,
         CLSFINAL          LIKE VSEOCLASS-CLSFINAL,
         R3RELEASE         LIKE VSEOCLASS-R3RELEASE,
         IMETHODS          TYPE TMETHOD OCCURS 0,
         IDICTSTRUCT       TYPE TDICTTABLE OCCURS 0,
         ITEXTELEMENTS     TYPE TTEXTTABLE OCCURS 0,
         IMESSAGES         TYPE TMESSAGE OCCURS 0,
         ICONCEPTS         TYPE TCONCEPT OCCURS 0,
         TEXTELEMENTKEY    TYPE STRING,
         PUBLICCLASSKEY    TYPE STRING,
         PRIVATECLASSKEY   TYPE STRING,
         PROTECTEDCLASSKEY TYPE STRING,
         TYPESCLASSKEY     TYPE STRING,
         EXCEPTIONCLASS    TYPE I,
       END OF TCLASS.

* function modules
TYPESBEGIN OF TFUNCTION,
         FUNCTIONNAME        LIKE TFDIR-FUNCNAME,
         FUNCTIONGROUP       LIKE ENLFDIR-AREA,
         INCLUDENUMBER       LIKE TFDIR-INCLUDE,
         FUNCTIONMAININCLUDE LIKE TFDIR-FUNCNAME,
         FUNCTIONTITLE       LIKE TFTIT-STEXT,
         TOPINCLUDENAME      LIKE TFDIR-FUNCNAME,
         PROGNAME            LIKE TFDIR-PNAME,
         PROGRAMLINKNAME     LIKE TFDIR-PNAME,
         MESSAGECLASS        LIKE T100-ARBGB,
         ITEXTELEMENTS       TYPE TTEXTTABLE OCCURS 0,
         ISELECTIONTEXTS     TYPE TTEXTTABLE OCCURS 0,
         IMESSAGES           TYPE TMESSAGE OCCURS 0,
         IINCLUDES           TYPE TINCLUDE OCCURS 0,
         IDICTSTRUCT         TYPE TDICTTABLE OCCURS 0,
         IGUITITLE           TYPE TGUITITLE OCCURS 0,
         ISCREENFLOW         TYPE TSCREENFLOW OCCURS 0,
       END OF TFUNCTION.

TYPESBEGIN OF TPROGRAM,
         PROGNAME        LIKE TRDIR-NAME,
         PROGRAMTITLE    LIKE TFTIT-STEXT,
         SUBC            LIKE TRDIR-SUBC,
         MESSAGECLASS    LIKE T100-ARBGB,
         IMESSAGES       TYPE TMESSAGE OCCURS 0,
         ITEXTELEMENTS   TYPE TTEXTTABLE OCCURS 0,
         ISELECTIONTEXTS TYPE TTEXTTABLE OCCURS 0,
         IGUITITLE       TYPE TGUITITLE OCCURS 0,
         ISCREENFLOW     TYPE TSCREENFLOW OCCURS 0,
         IINCLUDES       TYPE TINCLUDE OCCURS 0,
         IDICTSTRUCT     TYPE TDICTTABLE OCCURS 0,
       END OF TPROGRAM.

*----------------------------------------------------------------------------------------------------------------------
*  Internal tables
*----------------------------------------------------------------------------------------------------------------------
*  Dictionary object
DATA: IDICTIONARY TYPE STANDARD TABLE OF TDICTTABLE WITH HEADER LINE.
* Function modules.
DATA: IFUNCTIONS TYPE STANDARD TABLE OF TFUNCTION WITH HEADER LINE.
* Tree display structure.
DATA: ITREEDISPLAY TYPE STANDARD TABLE OF SNODETEXT WITH HEADER LINE.
* Message class data
DATA: IMESSAGES TYPE STANDARD TABLE OF TMESSAGE WITH HEADER LINE.
* Holds a single message class an all of its messages
DATA: ISINGLEMESSAGECLASS TYPE STANDARD TABLE OF TMESSAGE WITH HEADER LINE.
* Holds program related data
DATA: IPROGRAMS TYPE STANDARD TABLE OF TPROGRAM WITH HEADER LINE.
* Classes
DATA: ICLASSES TYPE STANDARD TABLE OF TCLASS WITH HEADER LINE.
* Table of paths created on the SAP server
DATA: ISERVERPATHS TYPE STANDARD TABLE OF STRING WITH HEADER LINE.

*----------------------------------------------------------------------------------------------------------------------
*  Table prototypes
*----------------------------------------------------------------------------------------------------------------------
DATA: DUMIDICTSTRUCTURE TYPE STANDARD TABLE OF TDICTTABLESTRUCTURE.
DATA: DUMITEXTTAB TYPE STANDARD TABLE OF TTEXTTABLE.
DATA: DUMIINCLUDES TYPE STANDARD TABLE OF TINCLUDE.
DATA: DUMIHTML TYPE STANDARD TABLE OF STRING.
DATA: DUMIHEADER TYPE STANDARD TABLE OF STRING .
DATA: DUMISCREEN TYPE STANDARD TABLE OF TSCREENFLOW .
DATA: DUMIGUITITLE TYPE STANDARD TABLE OF TGUITITLE.
DATA: DUMIMETHODS TYPE STANDARD TABLE OF TMETHOD.
DATA: DUMICONCEPTS TYPE STANDARD TABLE OF TCONCEPT.

*----------------------------------------------------------------------------------------------------------------------
*   Global objects
*----------------------------------------------------------------------------------------------------------------------
DATA: OBJFILE TYPE REF TO CL_GUI_FRONTEND_SERVICES.
DATA: OBJRUNTIMEERROR TYPE REF TO CX_ROOT.

*----------------------------------------------------------------------------------------------------------------------
*  Constants
*----------------------------------------------------------------------------------------------------------------------
CONSTANTS: VERSIONNO TYPE STRING VALUE '1.3'.
CONSTANTSTABLES TYPE STRING VALUE 'TABLES'.
CONSTANTSTABLE TYPE STRING VALUE 'TABLE'.
CONSTANTSLIKE TYPE STRING VALUE 'LIKE'.
CONSTANTSTYPE TYPE STRING VALUE 'TYPE'.
CONSTANTS: TYPEREFTO TYPE STRING VALUE 'TYPE REF TO'.
CONSTANTSSTRUCTURE TYPE STRING VALUE 'STRUCTURE'.
CONSTANTS: LOWSTRUCTURE TYPE STRING VALUE 'structure'.
CONSTANTSOCCURS TYPE STRING VALUE 'OCCURS'.
CONSTANTSFUNCTION TYPE STRING VALUE 'FUNCTION'.
CONSTANTS: CALLFUNCTION TYPE STRING VALUE ' CALL FUNCTION'.
CONSTANTSMESSAGE TYPE STRING  VALUE 'MESSAGE'.
CONSTANTSINCLUDE TYPE STRING VALUE 'INCLUDE'.
CONSTANTS: LOWINCLUDE TYPE STRING VALUE 'include'.
CONSTANTS: DESTINATION TYPE STRING VALUE 'DESTINATION'.
CONSTANTS: IS_TABLE TYPE STRING VALUE 'T'.
CONSTANTS: IS_PROGRAM TYPE STRING VALUE 'P'.
CONSTANTS: IS_SCREEN TYPE STRING VALUE 'S'.
CONSTANTS: IS_GUITITLE TYPE STRING VALUE 'G'.
CONSTANTS: IS_DOCUMENTATION TYPE STRING VALUE 'D'.
CONSTANTS: IS_MESSAGECLASS TYPE STRING VALUE 'MC'.
CONSTANTS: IS_FUNCTION TYPE STRING VALUE 'F'.
CONSTANTS: IS_CLASS TYPE STRING VALUE 'C'.
CONSTANTS: IS_METHOD TYPE STRING VALUE 'M'.
CONSTANTS: ASTERIX TYPE STRING VALUE '*'.
CONSTANTS: COMMA TYPE STRING VALUE ','.
CONSTANTS: PERIOD TYPE STRING VALUE '.'.
CONSTANTS: DASH TYPE STRING VALUE '-'.
CONSTANTS: TRUE TYPE VALUE 1.
CONSTANTS: FALSE TYPE VALUE 0.
CONSTANTSLT TYPE STRING VALUE '<'.
CONSTANTSGT TYPE STRING VALUE '>'.
CONSTANTS: UNIX TYPE STRING VALUE 'UNIX'.
CONSTANTS: NON_UNIX TYPE STRING VALUE 'not UNIX'.
CONSTANTS: BACKGROUND_COLOUR TYPE STRING VALUE '#FFFFE0'.
CONSTANTS: COLOUR_WHITE TYPE STRING VALUE '#FFFFFF'.
CONSTANTS: COLOUR_BLACK TYPE STRING VALUE '#000000'.
CONSTANTS: COLOUR_YELLOW TYPE STRING VALUE '#FFFF00'.
CONSTANTS: COMMENT_COLOUR TYPE STRING VALUE '#0000FF'.
CONSTANTS: HTMLEXTENSION TYPE STRING VALUE 'html'.
CONSTANTS: TEXTEXTENSION TYPE STRING VALUE 'txt'.

*----------------------------------------------------------------------------------------------------------------------
*  Global variables
*----------------------------------------------------------------------------------------------------------------------
DATA: STATUSBARMESSAGE(100).
DATA: FORCEDEXIT TYPE VALUE 0.
DATA: STARTTIME LIKE SY-UZEIT.
DATA: RUNTIME LIKE SY-UZEIT.
DATA: DOWNLOADFILEEXTENSION TYPE STRING.
DATA: DOWNLOADFOLDER TYPE STRING.
DATA: SERVERSLASHSEPARATOR TYPE STRING.
DATA: FRONTENDSLASHSEPARATOR TYPE STRING.
DATA: SLASHSEPARATORTOUSE TYPE STRING.
DATA: SERVERFILESYSTEM TYPE FILESYS_D.
DATA: SERVERFOLDER TYPE STRING.
DATA: FRONTENDOPSYSTEM TYPE STRING.
DATA: SERVEROPSYSTEM TYPE STRING.
DATA: CUSTOMERNAMESPACE TYPE STRING.
RANGES: SOPROGRAMNAME FOR TRDIR-NAME.
RANGES: SOAUTHOR FOR USR02-BNAME.
RANGES: SOTABLENAMES FOR DD02L-TABNAME.
RANGES: SOFUNCTIONNAME  FOR TFDIR-FUNCNAME.
RANGES: SOCLASSNAME FOR VSEOCLASS-CLSNAME.
RANGES: SOFUNCTIONGROUP FOR ENLFDIR-AREA.
FIELD-SYMBOLS: <WADICTSTRUCT> TYPE TDICTTABLE.

*----------------------------------------------------------------------------------------------------------------------
*  Selection screen declaration
*----------------------------------------------------------------------------------------------------------------------
* Author
SELECTION-SCREENBEGIN OF BLOCK B1 WITH FRAME TITLE TBLOCK1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(23) TAUTH.
PARAMETERS: PAUTH LIKE USR02-BNAME MEMORY ID MAUTH.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(36) TPMOD.
PARAMETERS: PMOD AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

* Local objects
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(36) T$TMP.
PARAMETERS: P$TMP AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREENEND OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TBLOCK2.
* Tables
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: RTABLE RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(15) TRTABLE.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(15) TPTABLE.
SELECT-OPTIONS: SOTABLE FOR DD02L-TABNAME.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(79) TTNOTE.
SELECTION-SCREEN END OF LINE.

* Message classes
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: RMESS RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(18) TPMES.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(18) TMNAME.
PARAMETERS: PMNAME LIKE T100-ARBGB MEMORY ID MMNAME.
SELECTION-SCREEN END OF LINE.

* Function modules
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: RFUNC RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(30) TRFUNC.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(15) TPFNAME.
SELECT-OPTIONS: SOFNAME FOR TFDIR-FUNCNAME.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(15) TFGROUP.
SELECT-OPTIONS: SOFGROUP FOR ENLFDIR-AREA.
SELECTION-SCREEN END OF LINE.

* Classes
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: RCLASS RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(30) TRCLASS.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(15) TPCNAME.
SELECT-OPTIONS: SOCLASS FOR SEOCLASS-CLSNAME.
SELECTION-SCREEN END OF LINE.

* Programs / includes
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: RPROG RADIOBUTTON GROUP R1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 5(18) TPROG.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(15) TRPNAME.
SELECT-OPTIONS: SOPROG FOR TRDIR-NAME.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.
* Language
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(18) TMLANG.
PARAMETERS: PMLANG LIKE T100-SPRSL DEFAULT 'EN'.
SELECTION-SCREEN END OF LINE.

* Package
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(18) TPACK.
PARAMETERS: PPACK LIKE TADIV-DEVCLASS MEMORY ID MPACK.
SELECTION-SCREEN END OF LINE.

* Customer objects
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(27) TCUST.
PARAMETERS: PCUST AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 32(25) TNRANGE.
PARAMETERS: PCNAME TYPE NAMESPACE MEMORY ID MNAMESPACE.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREENEND OF BLOCK B2.

* Additional things to download.
SELECTION-SCREENBEGIN OF BLOCK B3 WITH FRAME TITLE TBLOCK3.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPTEXT.
PARAMETERS: PTEXT AS CHECKBOX DEFAULT 'X' MEMORY ID MTEXT.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TMESS.
PARAMETERS: PMESS AS CHECKBOX DEFAULT 'X' MEMORY ID MMESS.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPINC.
PARAMETERS: PINC AS CHECKBOX DEFAULT 'X' MEMORY ID MINC.
SELECTION-SCREEN COMMENT 40(20) TRECC.
PARAMETERS: PRECI AS CHECKBOX DEFAULT 'X' MEMORY ID MRECI.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPFUNC.
PARAMETERS: PFUNC AS CHECKBOX DEFAULT 'X' MEMORY ID MFUNC.
SELECTION-SCREEN COMMENT 40(20) TRECF.
PARAMETERS: PRECF AS CHECKBOX DEFAULT 'X' MEMORY ID MRECF.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TDOC.
PARAMETERS: PDOC AS CHECKBOX DEFAULT 'X' MEMORY ID MDOC.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPSCR.
PARAMETERS: PSCR AS CHECKBOX DEFAULT 'X' MEMORY ID MSCR.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPDICT.
PARAMETERS: PDICT AS CHECKBOX DEFAULT 'X' MEMORY ID MDICT.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TSORTT.
PARAMETERS: PSORTT AS CHECKBOX DEFAULT ' ' MEMORY ID MSORTT.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREENEND OF BLOCK B3.

* File details
SELECTION-SCREENBEGIN OF BLOCK B4 WITH FRAME TITLE TBLOCK4.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) TPHTML.
PARAMETERS: PHTML RADIOBUTTON GROUP G1 DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(29) TCOMM.
PARAMETERS: PCOMM AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(29) TBACK.
PARAMETERS: PBACK AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) TPTXT.
PARAMETERS: PTXT RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.

* Download to SAP server
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(25) TSERV.
PARAMETERS: PSERV RADIOBUTTON GROUP G2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 8(20) TSPATH.
PARAMETERS: PLOGICAL LIKE FILENAME-FILEINTERN MEMORY ID MLOGICAL.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN COMMENT /28(60) TSDPATH.

* Download to PC
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(25) TPC.
PARAMETERS: PPC RADIOBUTTON GROUP G2 DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 8(20) TPPATH.
PARAMETERS: PFOLDER LIKE RLGRAP-FILENAME MEMORY ID MFOLDER.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREENEND OF BLOCK B4.

* Display options
SELECTION-SCREENBEGIN OF BLOCK B5 WITH FRAME TITLE TBLOCK5.
* Display final report
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TREP.
PARAMETERS: PREP AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
* Display progress messages
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(33) TPROMESS.
PARAMETERS: PPROMESS AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREENEND OF BLOCK B5.

*----------------------------------------------------------------------------------------------------------------------
* Display a directory picker window
*----------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR PFOLDER.  

DATA: OBJFILE TYPE REF TO CL_GUI_FRONTEND_SERVICES.  
DATA: PICKEDFOLDER TYPE STRING.  
DATA: INITIALFOLDER TYPE STRING.  

IF SY-BATCH IS INITIAL.    
CREATE OBJECT OBJFILE.    

IF NOT PFOLDER IS INITIAL.      INITIALFOLDER 
= PFOLDER.    
ELSE.      OBJFILE
->GET_TEMP_DIRECTORYCHANGING TEMP_DIR = INITIALFOLDER                                   
EXCEPTIONS CNTL_ERROR 1                                             ERROR_NO_GUI 
2                                             NOT_SUPPORTED_BY_GUI 
).    
ENDIF.    OBJFILE

->DIRECTORY_BROWSEEXPORTING INITIAL_FOLDER = INITIALFOLDER                               
CHANGING SELECTED_FOLDER = PICKEDFOLDER                               
EXCEPTIONS CNTL_ERROR 1                                          ERROR_NO_GUI 
2                                          NOT_SUPPORTED_BY_GUI 
).    

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

*----------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN.
*----------------------------------------------------------------------------------------------------------------------  
CASE 'X'.    
WHEN PPC.      
IF PFOLDER IS INITIAL.
*       User must enter a path to save to        
MESSAGE E000(OOWITH 'You must enter a file path'.      
ENDIF.    

WHEN PSERV.      
IF PLOGICAL IS INITIAL.
*       User must enter a logical path to save to        
MESSAGE E000(OOWITH 'You must enter a logical file name'.      
ENDIF.  
ENDCASE.

*----------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON PLOGICAL.
*----------------------------------------------------------------------------------------------------------------------  

IF NOT PSERV IS INITIAL.    
CALL FUNCTION 'FILE_GET_NAME'      
EXPORTING        LOGICAL_FILENAME 
= PLOGICAL      
IMPORTING        FILE_NAME        
= SERVERFOLDER      
EXCEPTIONS        FILE_NOT_FOUND   
1        
OTHERS           2.    
IF SY-SUBRC 0.      
IF SERVERFOLDER IS INITIAL.        
MESSAGE E000(OOWITH 'No file path returned from logical filename'.      
ELSE.
*       Path to display on the selection screen        TSDPATH 
= SERVERFOLDER.
*       Remove the trailing slash off the path as the subroutine buildFilename will add an extra one        
SHIFT SERVERFOLDER RIGHT DELETING TRAILING SERVERSLASHSEPARATOR.        
SHIFT SERVERFOLDER LEFT DELETING LEADING SPACE.      
ENDIF.    
ELSE.      
MESSAGE E000(OOWITH 'Logical filename does not exist'.    
ENDIF.  
ENDIF.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOPROG-LOW.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'PROG'      OBJECT_NAME           
= SOPROG-LOW      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOPROG-LOW    
EXCEPTIONS      CANCEL                
1.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOPROG-HIGH.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'PROG'      OBJECT_NAME           
= SOPROG-HIGH      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOPROG-HIGH    
EXCEPTIONS      CANCEL                
1.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOCLASS-LOW.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'F4_DD_ALLTYPES'    
EXPORTING      OBJECT               
= SOCLASS-LOW      SUPPRESS_SELECTION   
'X'      DISPLAY_ONLY         
''      ONLY_TYPES_FOR_CLIFS 
'X'    
IMPORTING      RESULT               
= SOCLASS-LOW.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOCLASS-HIGH.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'F4_DD_ALLTYPES'    
EXPORTING      OBJECT               
= SOCLASS-HIGH      SUPPRESS_SELECTION   
'X'      DISPLAY_ONLY         
''      ONLY_TYPES_FOR_CLIFS 
'X'    
IMPORTING      RESULT               
= SOCLASS-HIGH.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOFNAME-LOW.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'FUNC'      OBJECT_NAME           
= SOFNAME-LOW      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOFNAME-LOW    
EXCEPTIONS      CANCEL                
1.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOFNAME-HIGH.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'FUNC'      OBJECT_NAME           
= SOFNAME-HIGH      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOFNAME-HIGH    
EXCEPTIONS      CANCEL                
1.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOFGROUP-LOW.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'FUGR'      OBJECT_NAME           
= SOFGROUP-LOW      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOFGROUP-LOW    
EXCEPTIONS      CANCEL                
1.

* ---------------------------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SOFGROUP-HIGH.
* ---------------------------------------------------------------------------------------------------------------------  
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'    
EXPORTING      OBJECT_TYPE           
'FUGR'      OBJECT_NAME           
= SOFGROUP-HIGH      SUPPRESS_SELECTION    
'X'      USE_ALV_GRID          
''      WITHOUT_PERSONAL_LIST 
''    
IMPORTING      OBJECT_NAME_SELECTED  
= SOFGROUP-HIGH    
EXCEPTIONS      CANCEL                
1.

*----------------------------------------------------------------------------------------------------------------------
* initialisation
*----------------------------------------------------------------------------------------------------------------------
INITIALIZATION.
* Parameter screen texts.  TBLOCK1 
'Author (Optional)'.  T$TMP   
'Programs only: include local objects'.  TBLOCK2 
'Objects to download'.  TBLOCK3 
'Additional downloads for programs, function modules and classes'.  TBLOCK4 
'Download parameters'.  TBLOCK5 
'Display options'.  TAUTH   
'Author name'.  TPMOD   
'Include programs modified by author'.  TCUST   
'Only customer objects'.  TNRANGE 
'Alt customer name range'.  TRTABLE 
'Tables / Structures'.  TPTABLE 
'Table name'.  TTNOTE  
'Note: tables are stored under the username of the last person who modified them'.  TRFUNC  
'Function modules'.  TPFNAME 
'Function name'.  TFGROUP 
'Function group'.  TRCLASS  
'Classes'.  TPCNAME 
'Class name'.  TMESS   
'Message class'.  TMNAME  
'Class name'.  TMLANG  
'Language'.  TPROG   
'Programs'.  TRPNAME 
'Program name'.  TPACK   
'Package'.  TPTXT   
'Text document'.  TPHTML  
'HTML document'.  TCOMM   
'Highlight comments'.  TBACK   
'Include background colour'.  TPTEXT  
'Text elements'.  TPINC   
'Include programs'.  TRECC   
'Recursive search'.  TPPATH  
'File path'.  TSPATH  
'Logical file name'.  TPMES   
'Message classes'.  TPFUNC  
'Function modules'.  TDOC    
'Function module documentation'.  TRECF   
'Recursive search'.  TPSCR   
'Screens'.  TPDICT  
'Dictionary structures'.  TSORTT  
'Sort table fields alphabetically'.  TSERV   
'Download to server'.  TPC     
'Download to PC'.  TREP    
'Display download report'.  TPROMESS  
'Display progress messages'.

* Determine the frontend operating system type.  
IF SY-BATCH IS INITIAL.    
PERFORM DETERMINEFRONTENDOPSYSTEM USING FRONTENDSLASHSEPARATOR FRONTENDOPSYSTEM.  
ENDIF.  
PERFORM DETERMINESERVEROPSYSTEM USING SERVERSLASHSEPARATOR SERVERFILESYSTEM SERVEROPSYSTEM.

* Determine if the external command exists.  If it doesn't then disable the server input field  
PERFORM FINDEXTERNALCOMMAND.

*----------------------------------------------------------------------------------------------------------------------
* start-of-selection.
*----------------------------------------------------------------------------------------------------------------------
START-OF-SELECTION.  

PERFORM CHECKCOMBOBOXES.  
PERFORM FILLSELECTIONRANGES.  STARTTIME 
= SY-UZEIT.

* Don't display status messages if we are running in the background  
IF NOT SY-BATCH IS INITIAL.    PPROMESS 
''.  
ENDIF.

* Fool the HTML routines to stop them hyperlinking anything with a space in them  
IF PCNAME IS INITIAL.    CUSTOMERNAMESPACE  
'^'.  
ELSE.    CUSTOMERNAMESPACE 
= PCNAME.  
ENDIF.

* Determine which operating slash and download directory to use  
CASE 'X'.    
WHEN PPC.      SLASHSEPARATORTOUSE 
= FRONTENDSLASHSEPARATOR.      DOWNLOADFOLDER 
= PFOLDER.    
WHEN PSERV.      SLASHSEPARATORTOUSE 
= SERVERSLASHSEPARATOR.      DOWNLOADFOLDER 
= SERVERFOLDER.  
ENDCASE.

* Main program flow.  
CASE 'X'.
*   Select tables    
WHEN RTABLE.      
PERFORM RETRIEVETABLES USING IDICTIONARY[]                                   SOTABLENAMES[]                                   SOAUTHOR[]

.

*   Select message classes tables    
WHEN RMESS.      
PERFORM RETRIEVEMESSAGECLASS USING IMESSAGES[]                                         SOAUTHOR[]      
"Author                                         PMNAME          
"Message class name                                         PMLANG          
"Message class language                                         PMOD
.           "Modified by author

*   Select function modules    
WHEN RFUNC.      
PERFORM RETRIEVEFUNCTIONS USING SOFUNCTIONNAME[]   "Function name                                      SOFUNCTIONGROUP[]  
"Function group                                      IFUNCTIONS[]       
"Found functions                                      PAUTH              
"Author                                      PTEXT              
"Get text elements                                      PSCR               
"Get screens                                      PCUST              
"Customer data only                                      CUSTOMERNAMESPACE
"Customer name range      


LOOP AT IFUNCTIONS.
*       Find Dict structures, messages, functions, includes etc.        
PERFORM SCANFORADDITIONALFUNCSTUFF USING IFUNCTIONS[]                                                 PRECI                   
"Search for includes recursively                                                 PRECF                   
"Search for functions recursively                                                 PINC                    
"Search for includes                                                 PFUNC                   
"Search for functions                                                 PDICT                   
"search for dictionary objects                                                 PMESS                   
"Search for messages                                                 PCUST                   
"Customer data only                                                 CUSTOMERNAMESPACE
.      "Customer name range      
ENDLOOP.

*   Select Classes    
WHEN RCLASS.      
PERFORM RETRIEVECLASSES USING ICLASSES[]                                    IFUNCTIONS[]                                    SOCLASSNAME[]       

"Class name                                    SOAUTHOR[]          
"Author                                    CUSTOMERNAMESPACE   
"Customer name range                                    PMOD                
"Also modified by author                                    PCUST               
"Customer object only                                    PMESS               
"Find messages                                    PTEXT               
"Text Elements                                    PDICT               
"Dictionary structures                                    PFUNC               
"Get functions                                    PINC                
"Get includes                                    PRECF               
"Search recursively for functions                                    PRECI               
"Search recursively for includes                                    
'X'                 "Search recursively for classes                                    PMLANG
.             "Language      

LOOP AT IFUNCTIONS.
*       Find Dict structures, messages, functions, includes etc.        
PERFORM SCANFORADDITIONALFUNCSTUFF USING IFUNCTIONS[]                                                 PRECI                   
"Search for includes recursively                                                 PRECF                   
"Search for functions recursively                                                 PINC                    
"Search for includes                                                 PFUNC                   
"Search for functions                                                 PDICT                   
"search for dictionary objects                                                 PMESS                   
"Search for messages                                                 PCUST                   
"Customer data only                                                 CUSTOMERNAMESPACE
.      "Customer name range      
ENDLOOP.

*   Select programs    
WHEN RPROG.      
PERFORM RETRIEVEPROGRAMS USING IPROGRAMS[]                                     IFUNCTIONS[]                                     SOPROGRAMNAME[]    

"Program name                                     SOAUTHOR[]         
"Author                                     CUSTOMERNAMESPACE  
"Customer name range                                     PMOD               
"Also modified by author                                     PCUST              
"Customer object only                                     PMESS              
"Find messages                                     PTEXT              
"Text Elements                                     PDICT              
"Dictionay structures                                     PFUNC              
"Get functions                                     PINC               
"Get includes                                     PSCR               
"Get screens                                     PRECF              
"Search recursively for functions                                     PRECI              
"Search recursively for includes                                     P$TMP              
"local objects                                     PPACK
.             "Package  
ENDCASE.

*----------------------------------------------------------------------------------------------------------------------
* end-of-selection
*----------------------------------------------------------------------------------------------------------------------
END-OF-SELECTION.  

IF FORCEDEXIT 0.
*   Set the file extension and output type of the file    
IF PTXT IS INITIAL.      DOWNLOADFILEEXTENSION 
= HTMLEXTENSION.    
ELSE.      DOWNLOADFILEEXTENSION 
= TEXTEXTENSION.    
ENDIF.

*   Decide what to download    
CASE 'X'.
*     Download tables      
WHEN RTABLE.        
IF NOT ( IDICTIONARY[] IS INITIAL ).          
PERFORM DOWNLOADDDSTRUCTURES USING IDICTIONARY[]                                             DOWNLOADFOLDER                                             HTMLEXTENSION                                             SPACE                                             PSORTT                                             SLASHSEPARATORTOUSE                                             PSERV                                             PPROMESS






.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IDICTIONARY.            
FREE MEMORY ID IDICTIONARY-TABLENAME.          
ENDLOOP.

*         Display donwload report          
IF NOT PREP IS INITIAL.            
GET TIME.            RUNTIME 
= SY-UZEIT - STARTTIME.            
PERFORM FILLTREENODETABLES USING IDICTIONARY[]                                             ITREEDISPLAY[]                                             RUNTIME

.          
ENDIF.          

CLEAR IDICTIONARY[].        
ENDIF.

*     Download message class      
WHEN RMESS.        
IF NOT ( IMESSAGES[] IS INITIAL ).          
SORT IMESSAGES ASCENDING BY ARBGB MSGNR.          
LOOP AT IMESSAGES.            
APPEND IMESSAGES TO ISINGLEMESSAGECLASS.            
AT END OF ARBGB.              
PERFORM DOWNLOADMESSAGECLASS USING ISINGLEMESSAGECLASS[]                                                 IMESSAGES
-ARBGB                                                 DOWNLOADFOLDER                                                 DOWNLOADFILEEXTENSION                                                 PHTML                                                 SPACE                                                 PCOMM                                                 CUSTOMERNAMESPACE                                                 PINC                                                 PDICT                                                 PMESS                                                 SLASHSEPARATORTOUSE                                                 PSERV                                                 PPROMESS











.              
CLEAR ISINGLEMESSAGECLASS[].            
ENDAT.          
ENDLOOP.

*         Display download report          
IF NOT PREP IS INITIAL.            
GET TIME.            RUNTIME 
= SY-UZEIT - STARTTIME.            
PERFORM FILLTREENODEMESSAGES USING IMESSAGES[]                                               ITREEDISPLAY[]                                               RUNTIME

.          
ENDIF.          

CLEAR IMESSAGES[].        
ENDIF.

*     Download functions      
WHEN RFUNC.        
IF NOT ( IFUNCTIONS[] IS INITIAL ).          
PERFORM DOWNLOADFUNCTIONS USING IFUNCTIONS[]                                          DOWNLOADFOLDER                                          DOWNLOADFILEEXTENSION                                          SPACE                                          PDOC                                          PHTML                                          PCOMM                                          CUSTOMERNAMESPACE                                          PINC                                          PDICT                                          TEXTEXTENSION                                          HTMLEXTENSION                                          PSORTT                                          SLASHSEPARATORTOUSE                                          PSERV                                          PPROMESS














.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IFUNCTIONS.            
LOOP AT IFUNCTIONS-IDICTSTRUCT ASSIGNING <WADICTSTRUCT>.              
FREE MEMORY ID <WADICTSTRUCT>-TABLENAME.            
ENDLOOP.          
ENDLOOP.

*         Display donwload report          
IF NOT PREP IS INITIAL.            
GET TIME.            RUNTIME 
= SY-UZEIT - STARTTIME.            
PERFORM FILLTREENODEFUNCTIONS USING IFUNCTIONS[]                                                ITREEDISPLAY[]                                                RUNTIME

.          
ENDIF.          

CLEAR IFUNCTIONS[].        
ENDIF.

*     Download Classes      
WHEN RCLASS.        
IF NOT ( ICLASSES[] IS INITIAL ).          
PERFORM DOWNLOADCLASSES USING ICLASSES[]                                        IFUNCTIONS[]                                        DOWNLOADFOLDER                                        DOWNLOADFILEEXTENSION                                        HTMLEXTENSION                                        TEXTEXTENSION                                        PHTML                                        PCOMM                                        CUSTOMERNAMESPACE                                        PINC                                        PDICT                                        PDOC                                        PSORTT                                        SLASHSEPARATORTOUSE                                        PSERV                                        PPROMESS














.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IFUNCTIONS.            
LOOP AT IFUNCTIONS-IDICTSTRUCT ASSIGNING <WADICTSTRUCT>.              
FREE MEMORY ID <WADICTSTRUCT>-TABLENAME.            
ENDLOOP.          
ENDLOOP.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IPROGRAMS.            
LOOP AT IPROGRAMS-IDICTSTRUCT ASSIGNING <WADICTSTRUCT>.              
FREE MEMORY ID <WADICTSTRUCT>-TABLENAME.            
ENDLOOP.          
ENDLOOP.

*         Display donwload report          
IF NOT PREP IS INITIAL.            
GET TIME.            RUNTIME 
= SY-UZEIT - STARTTIME.            
PERFORM FILLTREENODECLASSES USING ICLASSES[]                                              IFUNCTIONS[]                                              ITREEDISPLAY[]                                              RUNTIME


.          
ENDIF.          

CLEAR ICLASSES[].          
CLEAR IFUNCTIONS[].        
ENDIF.

*     Download programs      
WHEN RPROG.        
IF NOT ( IPROGRAMS[] IS INITIAL ).          
PERFORM DOWNLOADPROGRAMS USING IPROGRAMS[]                                         IFUNCTIONS[]                                         DOWNLOADFOLDER                                         DOWNLOADFILEEXTENSION                                         HTMLEXTENSION                                         TEXTEXTENSION                                         PHTML                                         PCOMM                                         CUSTOMERNAMESPACE                                         PINC                                         PDICT                                         PDOC                                         PSORTT                                         SLASHSEPARATORTOUSE                                         PSERV                                         PPROMESS














.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IFUNCTIONS.            
LOOP AT IFUNCTIONS-IDICTSTRUCT ASSIGNING <WADICTSTRUCT>.              
FREE MEMORY ID <WADICTSTRUCT>-TABLENAME.            
ENDLOOP.          
ENDLOOP.

*         Free up any memory used for caching HTML versions of tables          
LOOP AT IPROGRAMS.            
LOOP AT IPROGRAMS-IDICTSTRUCT ASSIGNING <WADICTSTRUCT>.              
FREE MEMORY ID <WADICTSTRUCT>-TABLENAME.            
ENDLOOP.          
ENDLOOP.

*         Display donwload report          
IF NOT PREP IS INITIAL.            
GET TIME.            RUNTIME 
= SY-UZEIT - STARTTIME.            
PERFORM FILLTREENODEPROGRAMS USING IPROGRAMS[]                                               IFUNCTIONS[]                                               ITREEDISPLAY[]                                               RUNTIME


.          
ENDIF.          

CLEAR IPROGRAMS[].          
CLEAR IFUNCTIONS[].        
ENDIF.    
ENDCASE.    

IF NOT PREP IS INITIAL.      
IF NOT ( ITREEDISPLAY[] IS INITIAL ).        
PERFORM DISPLAYTREE USING ITREEDISPLAY[].      
ELSE.        STATUSBARMESSAGE 
'No items found matching selection criteria'.        
PERFORM DISPLAYSTATUS USING STATUSBARMESSAGE 2.      
ENDIF.    
ENDIF.  
ENDIF.

*--- Memory IDs
* User name  
SET PARAMETER ID 'MAUTH' FIELD PAUTH.
* Message class  
SET PARAMETER ID 'MMNAME' FIELD PMNAME.
* Customer namespace  
SET PARAMETER ID 'MNAMESPACE' FIELD PCNAME.
* Folder  
SET PARAMETER ID 'MFOLDER' FIELD PFOLDER.
* Logical filepath  
SET PARAMETER ID 'MLOGICAL' FIELD PLOGICAL.
* Package  
SET PARAMETER ID 'MPACK' FIELD PPACK.
* Text element checkbox  
SET PARAMETER ID 'MTEXT' FIELD PTEXT.
* Messages checkbox  
SET PARAMETER ID 'MMESS' FIELD PMESS.
* Includes checkbox  
SET PARAMETER ID 'MINC' FIELD PINC.
* Recursive includes checkbox.  
SET PARAMETER ID 'MRECI' FIELD PRECI.
* Functions checkbox  
SET PARAMETER ID 'MFUNC' FIELD PFUNC.
* Recursive functions checkbox  
SET PARAMETER ID 'MRECF' FIELD PRECF.
* Function module documntation checkbox  
SET PARAMETER ID 'MDOC' FIELD PDOC.
* Screens checkbox  
SET PARAMETER ID 'MSCR' FIELD PSCR.
* Dictionary checkbox  
SET PARAMETER ID 'MDICT' FIELD PDICT.
* Sort table ascending checkBox  
SET PARAMETER ID 'MSORTT' FIELD PSORTT.

***********************************************************************************************************************
***************************************************SUBROUTINES*********************************************************
***********************************************************************************************************************

*----------------------------------------------------------------------------------------------------------------------
*  checkComboBoxes...  Check input parameters
*----------------------------------------------------------------------------------------------------------------------
FORM CHECKCOMBOBOXES.  

IF PAUTH IS INITIAL.    
CASE 'X'.      
WHEN RTABLE.        
IF SOTABLE[] IS INITIAL.          STATUSBARMESSAGE 
'You must enter either a table name or author.'.        
ENDIF.      
WHEN RFUNC.        
IF ( SOFNAME[] IS INITIAL AND ( SOFGROUP[] IS INITIAL ).          
IF SOFNAME[] IS INITIAL.            STATUSBARMESSAGE 
'You must enter either a function name or author.'.          
ELSE.            
IF SOFGROUP[] IS INITIAL.              STATUSBARMESSAGE 
'You must enter either a function group, or an author name.'.            
ENDIF.          
ENDIF.        
ENDIF.      
WHEN RPROG.        
IF SOPROG[] IS INITIAL.          STATUSBARMESSAGE 
'You must enter either a program name or author name.'.        
ENDIF.    
ENDCASE.
* Check the user name of the person objects are to be downloaded for  
ELSE.    
IF PAUTH 'SAP*' OR PAUTH 'SAP'.      STATUSBARMESSAGE 
'Sorry cannot download all objects for SAP standard user'.    
ENDIF.  
ENDIF.  

IF NOT STATUSBARMESSAGE IS INITIAL.    
PERFORM DISPLAYSTATUS USING STATUSBARMESSAGE 3.    FORCEDEXIT 
1.    
STOP.  
ENDIF.
ENDFORM.                                                                                "checkComboBoxes

*----------------------------------------------------------------------------------------------------------------------
* fillSelectionRanges...      for selection routines
*----------------------------------------------------------------------------------------------------------------------
FORM FILLSELECTIONRANGES.  

DATA: STRLENGTH TYPE I.  STRLENGTH 

STRLEN( PCNAME ).  

IF NOT PAUTH IS INITIAL.    SOAUTHOR
-SIGN 'I'.    SOAUTHOR
-OPTION 'EQ'.    SOAUTHOR
-LOW = PAUTH.    
APPEND SOAUTHOR.  
ENDIF.

* Tables  
IF NOT SOTABLE IS INITIAL.    SOTABLENAMES[] 
= SOTABLE[].
*   Add in the customer namespace if we need to    
IF NOT PCNAME IS INITIAL.      
LOOP AT SOTABLENAMES.        
IF SOTABLENAMES-LOW+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOTABLENAMES-LOW INTO SOTABLENAMES-LOW.        
ENDIF.        

IF SOTABLENAMES-HIGH+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOTABLENAMES-HIGH INTO SOTABLENAMES-HIGH.        
ENDIF.        

MODIFY SOTABLENAMES.      
ENDLOOP.    
ENDIF.  
ENDIF.

* Function names  
IF NOT SOFNAME IS INITIAL.    SOFUNCTIONNAME[] 
= SOFNAME[].
*   Add in the customer namespace if we need to    
IF NOT PCNAME IS INITIAL.      
LOOP AT SOFUNCTIONNAME.        
IF SOFUNCTIONNAME-LOW+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOFUNCTIONNAME-LOW INTO SOFUNCTIONNAME-LOW.        
ENDIF.        

IF SOFUNCTIONNAME-HIGH+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOFUNCTIONNAME-HIGH INTO SOFUNCTIONNAME-HIGH.        
ENDIF.        

MODIFY SOFUNCTIONNAME.      
ENDLOOP.    
ENDIF.  
ENDIF.

* Function group  
IF NOT SOFGROUP IS INITIAL.    SOFUNCTIONGROUP[] 
= SOFGROUP[].
*   Add in the customer namespace if we need to    
IF NOT PCNAME IS INITIAL.      
LOOP AT SOFUNCTIONNAME.        
IF SOFUNCTIONGROUP-LOW+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOFUNCTIONGROUP-LOW INTO SOFUNCTIONGROUP-LOW.        
ENDIF.        

IF SOFUNCTIONGROUP-HIGH+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOFUNCTIONGROUP-HIGH INTO SOFUNCTIONGROUP-HIGH.        
ENDIF.        

MODIFY SOFUNCTIONGROUP.      
ENDLOOP.    
ENDIF.  
ENDIF.

* Class names  
IF NOT SOCLASS IS INITIAL.    SOCLASSNAME[] 
= SOCLASS[].
*   Add in the customer namespace if we need to    
IF NOT PCNAME IS INITIAL.      
LOOP AT SOCLASSNAME.        
IF SOCLASSNAME-LOW+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOCLASSNAME-LOW INTO SOCLASSNAME-LOW.        
ENDIF.        

IF SOCLASSNAME-HIGH+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOCLASSNAME-HIGH INTO SOCLASSNAME-HIGH.        
ENDIF.        

MODIFY SOCLASSNAME.      
ENDLOOP.    
ENDIF.  
ENDIF.

* Program names  
IF NOT SOPROG IS INITIAL.    SOPROGRAMNAME[] 
= SOPROG[].
*   Add in the customer namespace if we need to    
IF NOT PCNAME IS INITIAL.      
LOOP AT SOPROGRAMNAME.        
IF SOPROGRAMNAME-LOW+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOPROGRAMNAME-LOW INTO SOPROGRAMNAME-LOW.        
ENDIF.        

IF SOPROGRAMNAME-HIGH+0(STRLENGTH) <> PCNAME.          
CONCATENATE PCNAME SOPROGRAMNAME-HIGH INTO SOPROGRAMNAME-HIGH.        
ENDIF.        

MODIFY SOPROGRAMNAME.      
ENDLOOP.    
ENDIF.  
ENDIF.
ENDFORM.                                                                                          " fillSelectionRanges

*----------------------------------------------------------------------------------------------------------------------
*  retrieveTables...             Search for tables in dictionary
*----------------------------------------------------------------------------------------------------------------------
FORM RETRIEVETABLES USING ILOCDICTSTRUCTURE LIKE IDICTIONARY[]                          SOTABLE 
LIKE SOTABLE[]                          SOAUTHOR 
LIKE SOAUTHOR[].  

DATA: WADICTSTRUCTURE TYPE TDICTTABLE.  

SELECT TABNAME FROM DD02L INTO WADICTSTRUCTURE-TABLENAME                            
WHERE TABNAME IN SOTABLE                              
AND TABCLASS <> 'CLUSTER'                              
AND TABCLASS <> 'POOL'                              
AND TABCLASS <> 'VIEW'                              
AND AS4USER IN SOAUTHOR                              
AND AS4LOCAL 'A'.    

PERFORM FINDTABLEDESCRIPTION USING WADICTSTRUCTURE-TABLENAME                                       WADICTSTRUCTURE
-TABLETITLE.    

PERFORM FINDTABLEDEFINITION USING WADICTSTRUCTURE-TABLENAME                                      WADICTSTRUCTURE
-ISTRUCTURE[].    

APPEND WADICTSTRUCTURE TO ILOCDICTSTRUCTURE.    
CLEAR WADICTSTRUCTURE.  
ENDSELECT.
ENDFORM.                                                                                                "retrieveTables

*----------------------------------------------------------------------------------------------------------------------
*  findTableDescription...  Search for table description in dictionary
*----------------------------------------------------------------------------------------------------------------------
FORM FINDTABLEDESCRIPTION USING VALUE(TABLENAME)                                      TABLEDESCRIPTION
.  

SELECT SINGLE DDTEXT FROM DD02T INTO TABLEDESCRIPTION                                  
WHERE TABNAME = TABLENAME                                    
AND DDLANGUAGE = SY-LANGU.
ENDFORM.                                                                                          "findTableDescription

*----------------------------------------------------------------------------------------------------------------------
*  findTableDefinition... Find the structure of a table from the SAP database.
*----------------------------------------------------------------------------------------------------------------------
FORM FINDTABLEDEFINITION USING VALUE(TABLENAME)                               IDICTSTRUCT 
LIKE DUMIDICTSTRUCTURE[].  

DATA GOTSTATE LIKE DCOBJIF-GOTSTATE.  
DATADEFINITION TYPE STANDARD TABLE OF DD03P WITH HEADER LINE.  
DATA: WADICTSTRUCT TYPE TDICTTABLESTRUCTURE.  

CALL FUNCTION 'DDIF_TABL_GET'    
EXPORTING      NAME          
= TABLENAME      STATE         
'A'      LANGU         
= SY-LANGU    
IMPORTING      GOTSTATE      
= GOTSTATE    
TABLES      DD03P_TAB     
DEFINITION    
EXCEPTIONS      ILLEGAL_INPUT 
1      
OTHERS        2.  

IF SY-SUBRC AND GOTSTATE 'A'.    
LOOP AT DEFINITION.      
MOVE-CORRESPONDING DEFINITION TO WADICTSTRUCT.      
PERFORM REMOVELEADINGZEROS CHANGING WADICTSTRUCT-POSITION.      
PERFORM REMOVELEADINGZEROS CHANGING WADICTSTRUCT-LENG.      
APPEND WADICTSTRUCT TO IDICTSTRUCT.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                           "findTableDefinition

*----------------------------------------------------------------------------------------------------------------------
*  retrieveMessageClass...   Retrieve a message class from the SAP database
*----------------------------------------------------------------------------------------------------------------------
FORM RETRIEVEMESSAGECLASS USING ILOCMESSAGES LIKE IMESSAGES[]                                RANGEAUTHOR 
LIKE SOAUTHOR[]                                
VALUE(MESSAGECLASSNAME)                                
VALUE(MESSAGECLASSLANG)                                
VALUE(MODIFIEDBY).  

DATA: WAMESSAGE TYPE TMESSAGE.  

IF NOT MESSAGECLASSNAME IS INITIAL.    
SELECT * FROM T100             
APPENDING CORRESPONDING FIELDS OF TABLE ILOCMESSAGES             
WHERE SPRSL = MESSAGECLASSLANG               
AND ARBGB = MESSAGECLASSNAME.    

LOOP AT ILOCMESSAGES INTO WAMESSAGE.      
SELECT SINGLE STEXT FROM T100A                   "#EC CI_BUFFJOIN                          
INTO WAMESSAGE-STEXT WHERE ARBGB = WAMESSAGE-ARBGB.      
MODIFY ILOCMESSAGES FROM WAMESSAGE INDEX SY-TABIX.    
ENDLOOP.  
ELSE.    
IF MODIFIEDBY IS INITIAL.
*     Select by author      
SELECT T100~ARBGB                                "#EC CI_BUFFJOIN             T100
~MSGNR             T100
~TEXT             T100A
~STEXT             
APPENDING CORRESPONDING FIELDS OF TABLE ILOCMESSAGES               
FROM T100               INNER 
JOIN T100A ON T100A~ARBGB = T100~ARBGB               
WHERE T100A~MASTERLANG = MESSAGECLASSLANG AND T100A~RESPUSER IN RANGEAUTHOR[].    
ELSE.
*     Select also by the last person who modified the message class      
SELECT T100~ARBGB                                "#EC CI_BUFFJOIN             T100
~MSGNR             T100
~TEXT             T100A
~STEXT             
APPENDING CORRESPONDING FIELDS OF TABLE ILOCMESSAGES             
FROM T100             INNER 
JOIN T100A ON T100A~ARBGB = T100~ARBGB             
WHERE T100A~MASTERLANG = MESSAGECLASSLANG               
AND T100A~RESPUSER IN RANGEAUTHOR[]               
AND T100A~LASTUSER IN RANGEAUTHOR[].    
ENDIF.  
ENDIF.
ENDFORM.                                                                                          "retrieveMessageClass

*----------------------------------------------------------------------------------------------------------------------
*  retrieveFunctions...   Retrieve function modules from SAP DB.  May be called in one of two ways
*----------------------------------------------------------------------------------------------------------------------
FORM RETRIEVEFUNCTIONS USING SOFNAME LIKE SOFUNCTIONNAME[]                             SOFGROUP 
LIKE SOFUNCTIONGROUP[]                             IFUNCTIONNAMES 
LIKE IFUNCTIONS[]                             
VALUE(AUTHOR)                             
VALUE(GETTEXTELEMENTS)                             
VALUE(GETSCREENS)                             
VALUE(CUSTOMERONLY)                             
VALUE(CUSTOMERNAMERANGE).  

RANGES: RANGEFUNCNAME  FOR TFDIR-FUNCNAME.  
RANGES: RANGEFUNCGROUP FOR ENLFDIR-AREA.  
DATA: WAFUNCTIONNAME TYPE TFUNCTION.  
DATA: PREVIOUSFG TYPE V_FDIR-AREA.  RANGEFUNCNAME[] 

= SOFNAME[].  RANGEFUNCGROUP[] 
= SOFGROUP[].  

IF NOT PAUTH IS INITIAL AND ( SOFNAME[] IS INITIAL AND SOFGROUP IS INITIAL ).
*-- Need to select all function groups by author    
SELECT AREA FROM TLIBV INTO RANGEFUNCGROUP-LOW WHERE UNAME = AUTHOR.      RANGEFUNCGROUP
-SIGN 'I'.      RANGEFUNCGROUP
-OPTION 'EQ'.      
APPEND RANGEFUNCGROUP.    
ENDSELECT.  
ENDIF.

*--- select by function name and/or function group.  
SELECT FUNCNAME AREA FROM V_FDIR                  
INTO (WAFUNCTIONNAME-FUNCTIONNAME, WAFUNCTIONNAME-FUNCTIONGROUP)                  
WHERE FUNCNAME IN RANGEFUNCNAME                    
AND AREA IN RANGEFUNCGROUP                    
AND GENERATED ''                    
ORDER BY AREA.    

PERFORM RETRIEVEFUNCTIONDETAIL USING WAFUNCTIONNAME-FUNCTIONNAME                                         WAFUNCTIONNAME
-PROGNAME                                         WAFUNCTIONNAME
-INCLUDENUMBER                                         WAFUNCTIONNAME
-FUNCTIONTITLE.    

PERFORM FINDMAINFUNCTIONINCLUDE USING WAFUNCTIONNAME-PROGNAME                                          WAFUNCTIONNAME
-INCLUDENUMBER                                          WAFUNCTIONNAME
-FUNCTIONMAININCLUDE.    

PERFORM FINDFUNCTIONTOPINCLUDE USING WAFUNCTIONNAME-PROGNAME                                         WAFUNCTIONNAME
-TOPINCLUDENAME.

*   Find all user defined includes within the function group    
PERFORM SCANFORFUNCTIONINCLUDES USING WAFUNCTIONNAME-PROGNAME                                          CUSTOMERONLY                                          CUSTOMERNAMERANGE                                          WAFUNCTIONNAME


-IINCLUDES[].
*   Find main message class    
PERFORM FINDMAINMESSAGECLASS USING WAFUNCTIONNAME-PROGNAME                                       WAFUNCTIONNAME
-MESSAGECLASS.

*   Find any screens declared within the main include    
IF NOT GETSCREENS IS INITIAL.      
IF PREVIOUSFG IS INITIAL OR PREVIOUSFG <> WAFUNCTIONNAME-FUNCTIONGROUP.        
PERFORM FINDFUNCTIONSCREENFLOW USING WAFUNCTIONNAME.

*       Search for any GUI texts        
PERFORM RETRIEVEGUITITLES USING WAFUNCTIONNAME-IGUITITLE[]                                        WAFUNCTIONNAME
-PROGNAME.      
ENDIF.    
ENDIF.    

IF NOT GETTEXTELEMENTS IS INITIAL.
*     Find the program texts from out of the database.      
PERFORM RETRIEVEPROGRAMTEXTS USING WAFUNCTIONNAME-ISELECTIONTEXTS[]                                         WAFUNCTIONNAME
-ITEXTELEMENTS[]                                         WAFUNCTIONNAME
-PROGNAME.    
ENDIF.    

APPEND WAFUNCTIONNAME TO IFUNCTIONNAMES.    PREVIOUSFG 
= WAFUNCTIONNAME-FUNCTIONGROUP.    
CLEAR WAFUNCTIONNAME.  
ENDSELECT.
ENDFORM.                                                                                             "retrieveFunctions

*----------------------------------------------------------------------------------------------------------------------
*  retrieveFunctionDetail...   Retrieve function module details from SAP DB.
*----------------------------------------------------------------------------------------------------------------------
FORM RETRIEVEFUNCTIONDETAIL USING VALUE(FUNCTIONNAME)                                        PROGNAME                                        INCLUDENAME                                        TITLETEXT


.  

SELECT SINGLE PNAME INCLUDE                
FROM TFDIR                
INTO (PROGNAME, INCLUDENAME)                
WHERE FUNCNAME = FUNCTIONNAME.  

IF SY-SUBRC 0.    
SELECT SINGLE STEXT FROM TFTIT                  
INTO TITLETEXT                  
WHERE SPRAS = SY-LANGU                    
AND FUNCNAME = FUNCTIONNAME.  
ENDIF.
ENDFORM.                                                                                        "retrieveFunctionDetail

*----------------------------------------------------------------------------------------------------------------------
*  findMainFunctionInclude...  Find the main include that contains the source code
*----------------------------------------------------------------------------------------------------------------------
FORM FINDMAINFUNCTIONINCLUDE USING VALUE(PROGRAMNAME)                                   
VALUE(INCLUDENO)                                         INTERNALINCLUDENAME
.  
DATA: NEWINCLUDENUMBER TYPE STRING.  

CONCATENATE '%U' INCLUDENO INTO NEWINCLUDENUMBER.  
SELECT SINGLE INCLUDE FROM D010INC                        
INTO INTERNALINCLUDENAME                        
WHERE MASTER = PROGRAMNAME                          
AND INCLUDE LIKE NEWINCLUDENUMBER.
ENDFORM.                                                                                       "findMainFunctionInclude

*----------------------------------------------------------------------------------------------------------------------
*  findFunctionTopInclude...  Find the top include for the function group
*----------------------------------------------------------------------------------------------------------------------
FORM FINDFUNCTIONTOPINCLUDE USING VALUE(PROGRAMNAME)                                        TOPINCLUDENAME
.  

SELECT SINGLE INCLUDE FROM D010INC                        
INTO TOPINCLUDENAME                        
WHERE MASTER = PROGRAMNAME                          
AND INCLUDE LIKE '%TOP'.
ENDFORM.                                                                                        "findFunctionTopInclude

*----------------------------------------------------------------------------------------------------------------------
* scanForAdditionalFuncStuff... Search for additional things relating to functions
*----------------------------------------------------------------------------------------------------------------------
FORM SCANFORADDITIONALFUNCSTUFF USING ILOCFUNCTIONS LIKE IFUNCTIONS[]                                      
VALUE(RECURSIVEINCLUDES)                                      
VALUE(RECURSIVEFUNCTIONS)                                      
VALUE(SEARCHFORINCLUDES)                                      
VALUE(SEARCHFORFUNCTIONS)                                      
VALUE(SEARCHFORDICTIONARY)                                      
VALUE(SEARCHFORMESSAGES)                                      
VALUE(CUSTOMERONLY)                                      
VALUE(CUSTOMERNAMERANGE).  

DATA: WAFUNCTION TYPE TFUNCTION.  
DATA: WAINCLUDE TYPE TINCLUDE.  

LOOP AT ILOCFUNCTIONS INTO WAFUNCTION.    
IF NOT SEARCHFORINCLUDES IS INITIAL.
*     Search in the main include      
PERFORM SCANFORINCLUDEPROGRAMS USING WAFUNCTION-FUNCTIONMAININCLUDE                                           RECURSIVEINCLUDES                                           CUSTOMERONLY                                           CUSTOMERNAMERANGE                                           WAFUNCTION



-IINCLUDES[].

*     Search in the top include      
PERFORM SCANFORINCLUDEPROGRAMS USING WAFUNCTION-TOPINCLUDENAME                                           RECURSIVEINCLUDES                                           CUSTOMERONLY                                           CUSTOMERNAMERANGE                                           WAFUNCTION



-IINCLUDES[].    
ENDIF.    

IF NOT SEARCHFORFUNCTIONS IS INITIAL.      
PERFORM SCANFORFUNCTIONS USING WAFUNCTION-FUNCTIONMAININCLUDE                                     WAFUNCTION
-PROGRAMLINKNAME                                     RECURSIVEINCLUDES                                     RECURSIVEFUNCTIONS                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE                                     ILOCFUNCTIONS[]




.    
ENDIF.    

MODIFY ILOCFUNCTIONS FROM WAFUNCTION.  
ENDLOOP.

* Now we have everthing perhaps we had better find all the dictionary structures  
IF NOT SEARCHFORDICTIONARY IS INITIAL.    
LOOP AT ILOCFUNCTIONS INTO WAFUNCTION.      
PERFORM SCANFORTABLES USING WAFUNCTION-PROGNAME                                  CUSTOMERONLY                                  CUSTOMERNAMERANGE                                  WAFUNCTION


-IDICTSTRUCT[].      

PERFORM SCANFORLIKEORTYPE USING WAFUNCTION-PROGNAME                                      CUSTOMERONLY                                      CUSTOMERNAMERANGE                                      WAFUNCTION


-IDICTSTRUCT[].      

LOOP AT WAFUNCTION-IINCLUDES INTO WAINCLUDE.        
PERFORM SCANFORTABLES USING WAINCLUDE-INCLUDENAME                                    CUSTOMERONLY                                    CUSTOMERNAMERANGE                                    WAFUNCTION


-IDICTSTRUCT[].        

PERFORM SCANFORLIKEORTYPE USING WAINCLUDE-INCLUDENAME                                        CUSTOMERONLY                                        CUSTOMERNAMERANGE                                        WAFUNCTION


-IDICTSTRUCT[].      
ENDLOOP.      

MODIFY ILOCFUNCTIONS FROM WAFUNCTION.    
ENDLOOP.  
ENDIF.

* Now search for all messages  
IF NOT SEARCHFORMESSAGES IS INITIAL.    
LOOP AT ILOCFUNCTIONS INTO WAFUNCTION.      
PERFORM SCANFORMESSAGES USING WAFUNCTION-PROGNAME                                    WAFUNCTION
-MESSAGECLASS                                    WAFUNCTION
-IMESSAGES[].      
MODIFY ILOCFUNCTIONS FROM WAFUNCTION.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                    "scanForAdditionalFuncStuff

*----------------------------------------------------------------------------------------------------------------------
* scanForClasses... Search each class or method for other classes
*----------------------------------------------------------------------------------------------------------------------
FORM SCANFORCLASSES USING VALUE(CLASSNAME)                          
VALUE(CLASSLINKNAME)                          
VALUE(CUSTOMERONLY)                          
VALUE(CUSTOMERNAMERANGE)                                ILOCCLASSES 
LIKE ICLASSES[].  

DATA ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: HEAD TYPE STRING.  
DATA: TAIL TYPE STRING.  
DATA: LINELENGTH TYPE VALUE 0.  
DATA: WALINE TYPE STRING.  
DATA: WACLASS TYPE TCLASS.  
DATA: CASTCLASSNAME TYPE PROGRAM.  
DATA: EXCEPTIONCUSTOMERNAMERANGE TYPE STRING.

* Build the name of the possible cusotmer exception classes  
CONCATENATE CUSTOMERNAMERANGE 'CX_' INTO  EXCEPTIONCUSTOMERNAMERANGE.

* Read the program code from the textpool.  CASTCLASSNAME 
= CLASSNAME.  
READ REPORT CASTCLASSNAME INTO ILINES.  

LOOP AT ILINES INTO WALINE.
*   Find custom tables.    LINELENGTH 
STRLEN( WALINE ).    
IF LINELENGTH > 0.      
IF WALINE(1= ASTERIX.        
CONTINUE.      
ENDIF.      

TRANSLATE WALINE TO UPPER CASE.      

FIND TYPEREFTO IN WALINE IGNORING CASE.      
IF SY-SUBRC 0.
*       Have found a reference to another class        
SPLIT WALINE AT TYPE INTO HEAD TAIL.        
SHIFT TAIL LEFT DELETING LEADING SPACE.        
SPLIT TAIL AT 'REF' INTO HEAD TAIL.        
SHIFT TAIL LEFT DELETING LEADING SPACE.        
SPLIT TAIL AT 'TO' INTO HEAD TAIL.        
SHIFT TAIL LEFT DELETING LEADING SPACE.        
IF TAIL CS PERIOD.          
SPLIT TAIL AT PERIOD INTO HEAD TAIL.        
ELSE.          
IF TAIL CS COMMA.            
SPLIT TAIL AT COMMA INTO HEAD TAIL.          
ENDIF.        
ENDIF.      
ELSE.
*       Try and find classes which are only referenced through static mehods        
FIND '=>' IN WALINE MATCH OFFSET SY-FDPOS.        
IF SY-SUBRC 0.          HEAD 
= WALINE+0(SY-FDPOS).          
SHIFT HEAD LEFT DELETING LEADING SPACE.          
CONDENSE HEAD.          
FIND 'call method' IN HEAD IGNORING CASE.          
IF SY-SUBRC 0.            
SHIFT HEAD LEFT DELETING LEADING SPACE.            
SPLIT HEAD AT SPACE INTO HEAD TAIL.            
SPLIT TAIL AT SPACE INTO HEAD TAIL.
*           Should have the class name here            HEAD 
= TAIL.          
ELSE.
*           Still have a class name even though it does not have the words call method in front            
IF WALINE CS '='.              
SPLIT WALINE AT '=' INTO TAIL HEAD.              
SHIFT HEAD LEFT DELETING LEADING SPACE.              
SPLIT HEAD AT '=' INTO HEAD TAIL.            
ENDIF.            SY
-SUBRC 0.          
ENDIF.        
ENDIF.      
ENDIF.      

IF SY-SUBRC 0.        
TRY.            
IF HEAD+0(1'Y' OR HEAD+0(1'Z' OR HEAD CS CUSTOMERNAMERANGE.
*           We have found a class best append it to our class table if we do not already have it.              
READ TABLE ILOCCLASSES INTO WACLASS WITH KEY CLSNAME = HEAD.              
IF SY-SUBRC <> 0.                
IF HEAD+0(3'CX_'                   
OR HEAD+0(4'ZCX_'                   
OR HEAD+0(4'YCX_'                   
OR HEAD CS EXCEPTIONCUSTOMERNAMERANGE.                  WACLASS

-EXCEPTIONCLASS = TRUE.                
ENDIF.                WACLASS

-CLSNAME = HEAD.                
APPEND WACLASS TO ILOCCLASSES.              
ENDIF.            
ENDIF.          
CATCH CX_SY_RANGE_OUT_OF_BOUNDS.        
ENDTRY.      
ENDIF.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                                "scanForClasses

*----------------------------------------------------------------------------------------------------------------------
* scanForIncludePrograms... Search each program for include programs
*----------------------------------------------------------------------------------------------------------------------
FORM SCANFORINCLUDEPROGRAMS USING VALUE(PROGRAMNAME)                                  
VALUE(RECURSIVEINCLUDES)                                  
VALUE(CUSTOMERONLY)                                  
VALUE(CUSTOMERNAMERANGE)                                        ILOCINCLUDES 
LIKE DUMIINCLUDES[].  

DATA: IINCLUDELINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: IKEYWORDS TYPE STANDARD TABLE OF TEXT20 WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: WATOKENS TYPE STOKES.  
DATA: WAINCLUDE TYPE TINCLUDE.  
DATA: WAINCLUDEEXISTS TYPE TINCLUDE.  
DATA: MAXLINES TYPE I.  
DATA: NEXTLINE TYPE I.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= PROGRAMNAME.  
READ REPORT CASTPROGRAMNAME INTO IINCLUDELINES.  

APPEND INCLUDE TO IKEYWORDS.  
SCAN ABAP-SOURCE IINCLUDELINES TOKENS INTO ITOKENS WITH INCLUDES STATEMENTS INTO ISTATEMENTS KEYWORDS FROM IKEYWORDS.  

CLEAR IINCLUDELINES[].  MAXLINES 

LINES( ITOKENS ).  
LOOP AT ITOKENS WHERE STR INCLUDE AND TYPE 'I'.    NEXTLINE 
= SY-TABIX + 1.    
IF NEXTLINE <= MAXLINES.      
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.

*      Are we only to find customer includes?      
IF NOT CUSTOMERONLY IS INITIAL.        
TRY.            
IF WATOKENS-STR+0(1'Y' OR WATOKENS-STR+0(1'Z' OR WATOKENS-STR CS CUSTOMERNAMERANGE               
OR WATOKENS-STR+0(2'MZ' OR WATOKENS-STR+0(2'MY'.            

ELSE.              
CONTINUE.            
ENDIF.          
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.        
ENDTRY.      
ENDIF.      WAINCLUDE

-INCLUDENAME = WATOKENS-STR.

*      Best find the program title text as well.      
PERFORM FINDPROGRAMORINCLUDETITLE USING WAINCLUDE-INCLUDENAME                                              WAINCLUDE
-INCLUDETITLE.

*      Don't append the include if we already have it listed      
READ TABLE ILOCINCLUDES INTO WAINCLUDEEXISTS WITH KEY INCLUDENAME = WAINCLUDE-INCLUDENAME.      
IF SY-SUBRC <> 0.        
APPEND WAINCLUDE TO ILOCINCLUDES.        

IF NOT RECURSIVEINCLUDES IS INITIAL.
*          Do a recursive search for other includes          
PERFORM SCANFORINCLUDEPROGRAMS USING WAINCLUDE-INCLUDENAME                                               RECURSIVEINCLUDES                                               CUSTOMERONLY                                               CUSTOMERNAMERANGE                                               ILOCINCLUDES[]



.        
ENDIF.      
ENDIF.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                        "scanForIncludePrograms

*----------------------------------------------------------------------------------------------------------------------
* scanForFunctions... Search each program for function modules
*----------------------------------------------------------------------------------------------------------------------
FORM SCANFORFUNCTIONS USING VALUE(PROGRAMNAME)                            
VALUE(PROGRAMLINKNAME)                            
VALUE(RECURSIVEINCLUDES)                            
VALUE(RECURSIVEFUNCTIONS)                            
VALUE(CUSTOMERONLY)                            
VALUE(CUSTOMERNAMERANGE)                                  ILOCFUNCTIONS 
LIKE IFUNCTIONS[].  

DATA: IINCLUDELINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: WATOKENS TYPE STOKES.  
DATA: WAFUNCTION TYPE TFUNCTION.  
DATA: WAFUNCTIONCOMPARISON TYPE TFUNCTION.  
DATA: MAXLINES TYPE I.  
DATA: NEXTLINE TYPE I.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.  
DATA: SKIPTHISLOOP TYPE I.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= PROGRAMNAME.  
READ REPORT CASTPROGRAMNAME INTO IINCLUDELINES.  
SCAN ABAP-SOURCE IINCLUDELINES TOKENS INTO ITOKENS WITH INCLUDES STATEMENTS INTO ISTATEMENTS.  
CLEAR IINCLUDELINES[].  MAXLINES 

LINES( ITOKENS ).  
LOOP AT ITOKENS WHERE STR FUNCTION AND TYPE 'I'.    NEXTLINE 

= SY-TABIX + 1.    
IF NEXTLINE <= MAXLINES.      
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.

*      Are we only to find customer functions      SKIPTHISLOOP 
= FALSE.      
IF NOT CUSTOMERONLY IS INITIAL.        
TRY.            
IF WATOKENS-STR+1(1'Y' OR WATOKENS-STR+1(1'Z' OR WATOKENS-STR CS CUSTOMERNAMERANGE.            
ELSE.              SKIPTHISLOOP 
= TRUE.            
ENDIF.          
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.          
CLEANUP.            SKIPTHISLOOP 
= TRUE.        
ENDTRY.      
ENDIF.      

IF SKIPTHISLOOP = FALSE.        WAFUNCTION
-FUNCTIONNAME = WATOKENS-STR.        
REPLACE ALL OCCURRENCES OF '''' IN WAFUNCTION-FUNCTIONNAME WITH ' '.        
CONDENSE WAFUNCTION-FUNCTIONNAME.

*        Don't add a function if we alread have it listed.        
READ TABLE ILOCFUNCTIONS WITH KEY FUNCTIONNAME = WAFUNCTION-FUNCTIONNAME INTO WAFUNCTIONCOMPARISON.        
IF SY-SUBRC <> 0.
*          Add in the link name if the function is linked to a program          WAFUNCTION
-PROGRAMLINKNAME = PROGRAMLINKNAME.

*          Don't download functions which are called through an RFC destination          NEXTLINE 
= SY-TABIX + 2.          
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.          
IF WATOKENS-STR <> DESTINATION.

*            Find the function group            
SELECT SINGLE AREA FROM V_FDIR INTO WAFUNCTION-FUNCTIONGROUP WHERE FUNCNAME = WAFUNCTION-FUNCTIONNAME.            

IF SY-SUBRC 0.
*              Best find the function number as well.              
PERFORM RETRIEVEFUNCTIONDETAIL USING WAFUNCTION-FUNCTIONNAME                                                   WAFUNCTION
-PROGNAME                                                   WAFUNCTION
-INCLUDENUMBER                                                   WAFUNCTION
-FUNCTIONTITLE.              

PERFORM FINDMAINFUNCTIONINCLUDE USING WAFUNCTION-PROGNAME                                                    WAFUNCTION
-INCLUDENUMBER                                                    WAFUNCTION
-FUNCTIONMAININCLUDE.              

PERFORM FINDFUNCTIONTOPINCLUDE USING WAFUNCTION-PROGNAME                                                   WAFUNCTION
-TOPINCLUDENAME.

*              Find main message class              
PERFORM FINDMAINMESSAGECLASS USING WAFUNCTION-PROGNAME                                                 WAFUNCTION
-MESSAGECLASS.              

APPEND WAFUNCTION TO ILOCFUNCTIONS.

*              Now lets search a little bit deeper and do a recursive search for other includes              
IF NOT RECURSIVEINCLUDES IS INITIAL.                
PERFORM SCANFORINCLUDEPROGRAMS USING WAFUNCTION-FUNCTIONMAININCLUDE                                                     RECURSIVEINCLUDES                                                     CUSTOMERONLY                                                     CUSTOMERNAMERANGE                                                     WAFUNCTION



-IINCLUDES[].              
ENDIF.

*              Now lets search a little bit deeper and do a recursive search for other functions              
IF NOT RECURSIVEFUNCTIONS IS INITIAL.                
PERFORM SCANFORFUNCTIONS USING WAFUNCTION-FUNCTIONMAININCLUDE                                               SPACE                                               RECURSIVEINCLUDES                                               RECURSIVEFUNCTIONS                                               CUSTOMERONLY                                               CUSTOMERNAMERANGE                                               ILOCFUNCTIONS[]





.              
ENDIF.              
CLEAR WAFUNCTION.            
ENDIF.          
ENDIF.        
ENDIF.        

CLEAR WAFUNCTION.      
ENDIF.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                              "scanForFunctions

*----------------------------------------------------------------------------------------------------------------------
*  scanForFunctionIncludes... Find all user defined includes within the function group
*----------------------------------------------------------------------------------------------------------------------
FORM SCANFORFUNCTIONINCLUDES USING POOLNAME                                   
VALUE(CUSTOMERONLY)                                   
VALUE(CUSTOMERNAMERANGE)                                   ILOCINCLUDES 
LIKE DUMIINCLUDES[].  

DATA: IINCLUDELINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: IKEYWORDS TYPE STANDARD TABLE OF TEXT20 WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: WATOKENS TYPE STOKES.  
DATA: WAINCLUDE TYPE TINCLUDE.  
DATA: WAINCLUDEEXISTS TYPE TINCLUDE.  
DATA: MAXLINES TYPE I.  
DATA: NEXTLINE TYPE I.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= POOLNAME.  
READ REPORT CASTPROGRAMNAME INTO IINCLUDELINES.  

APPEND INCLUDE TO IKEYWORDS.  
SCAN ABAP-SOURCE IINCLUDELINES TOKENS INTO ITOKENS WITH INCLUDES STATEMENTS INTO ISTATEMENTS KEYWORDS FROM IKEYWORDS.  

CLEAR IINCLUDELINES[].  MAXLINES 

LINES( ITOKENS ).  
LOOP AT ITOKENS WHERE STR INCLUDE AND TYPE 'I'.    NEXTLINE 
= SY-TABIX + 1.    
IF NEXTLINE <= MAXLINES.      
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.      

IF WATOKENS-STR CP '*F++'.
*        Are we only to find customer includes?        
IF NOT CUSTOMERONLY IS INITIAL.          
TRY.              
IF WATOKENS-STR+0(2'LY' OR WATOKENS-STR+0(2'LZ' OR WATOKENS-STR CS CUSTOMERNAMERANGE.              
ELSE.                
CONTINUE.              
ENDIF.            
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.          
ENDTRY.        
ENDIF.        WAINCLUDE

-INCLUDENAME = WATOKENS-STR.

*        Best find the program title text as well.        
PERFORM FINDPROGRAMORINCLUDETITLE USING WAINCLUDE-INCLUDENAME                                                WAINCLUDE
-INCLUDETITLE.

*        Don't append the include if we already have it listed        
READ TABLE ILOCINCLUDES INTO WAINCLUDEEXISTS WITH KEY INCLUDENAME = WAINCLUDE-INCLUDENAME.        
IF SY-SUBRC <> 0.          
APPEND WAINCLUDE TO ILOCINCLUDES.        
ENDIF.      
ENDIF.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                       "scanForFunctionIncludes

*----------------------------------------------------------------------------------------------------------------------
*  findProgramOrIncludeTitle...   Finds the title text of a program.
*----------------------------------------------------------------------------------------------------------------------
FORM FINDPROGRAMORINCLUDETITLE USING VALUE(PROGRAMNAME)                                           TITLETEXT
.  

SELECT SINGLE TEXT FROM TRDIRT                     
INTO TITLETEXT                     
WHERE NAME = PROGRAMNAME                       
AND SPRSL = SY-LANGU.
ENDFORM.                                                                                     "findProgramOrIncludeTitle

*----------------------------------------------------------------------------------------------------------------------
* retrievePrograms...    find programs and sub objects from SAP DB
*----------------------------------------------------------------------------------------------------------------------
FORM RETRIEVEPROGRAMS USING ILOCPROGRAM LIKE IPROGRAMS[]                            ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                            RANGEPROGRAM 
LIKE SOPROGRAMNAME[]                            RANGEAUTHOR 
LIKE SOAUTHOR[]                            
VALUE(CUSTNAMERANGE)                            
VALUE(ALSOMODIFIEDBYAUTHOR)                            
VALUE(CUSTOMERPROGSONLY)                            
VALUE(GETMESSAGES)                            
VALUE(GETTEXTELEMENTS)                            
VALUE(GETCUSTDICTSTRUCTURES)                            
VALUE(GETFUNCTIONS)                            
VALUE(GETINCLUDES)                            
VALUE(GETSCREENS)                            
VALUE(RECURSIVEFUNCSEARCH)                            
VALUE(RECURSIVEINCLUDESEARCH)                            
VALUE(GETLOCALOBJECTS)                            
VALUE(PACKAGE).  

DATA: WARANGEPROGRAM LIKE LINE OF RANGEPROGRAM.  

IF RANGEPROGRAM[] IS INITIAL.
*   We are finding all programs by an author    
PERFORM FINDALLPROGRAMSFORAUTHOR USING ILOCPROGRAM[]                                           RANGEPROGRAM[]                                           RANGEAUTHOR[]                                           CUSTNAMERANGE                                           ALSOMODIFIEDBYAUTHOR                                           CUSTOMERPROGSONLY                                           GETLOCALOBJECTS                                           PACKAGE






.  
ELSE.    
READ TABLE RANGEPROGRAM INDEX INTO WARANGEPROGRAM.    
IF WARANGEPROGRAM-LOW CS ASTERIX.      
PERFORM FINDPROGRAMSBYWILDCARD USING ILOCPROGRAM[]                                           RANGEPROGRAM[]                                           RANGEAUTHOR[]                                           CUSTNAMERANGE                                           CUSTOMERPROGSONLY                                           GETLOCALOBJECTS                                           PACKAGE





.    
ELSE.      
PERFORM CHECKPROGRAMDOESEXIST USING ILOCPROGRAM[]                                          RANGEPROGRAM[]
.    
ENDIF.  
ENDIF.

* Find extra items  
PERFORM SCANFORADDITIONALPROGSTUFF USING ILOCPROGRAM[]                                           ILOCFUNCTIONS[]                                           GETTEXTELEMENTS                                           GETMESSAGES                                           GETSCREENS                                           GETCUSTDICTSTRUCTURES                                           GETFUNCTIONS                                           GETINCLUDES                                           CUSTOMERPROGSONLY                                           CUSTNAMERANGE                                           RECURSIVEINCLUDESEARCH                                           RECURSIVEFUNCSEARCH










.
ENDFORM.                                                                               "retrievePrograms

*-------------------------------------------------------------------------------------------------------
*  scanForAdditionalProgStuff...
*-------------------------------------------------------------------------------------------------------
FORM SCANFORADDITIONALPROGSTUFF USING ILOCPROGRAM LIKE IPROGRAMS[]                                      ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                                      
VALUE(GETTEXTELEMENTS)                                      
VALUE(GETMESSAGES)                                      
VALUE(GETSCREENS)                                      
VALUE(GETCUSTDICTSTRUCTURES)                                      
VALUE(GETFUNCTIONS)                                      
VALUE(GETINCLUDES)                                      
VALUE(CUSTOMERONLY)                                      
VALUE(CUSTOMERNAMERANGE)                                      
VALUE(RECURSIVEINCLUDESEARCH)                                      
VALUE(RECURSIVEFUNCSEARCH).  

DATA: WAPROGRAM TYPE TPROGRAM.  
DATA: WAINCLUDE TYPE TINCLUDE.  
DATA: MYTABIX TYPE SYTABIX.

* Best to find all the includes used in a program first  
IF NOT GETINCLUDES IS INITIAL.    
LOOP AT ILOCPROGRAM INTO WAPROGRAM.      MYTABIX 
= SY-TABIX.      
PERFORM SCANFORINCLUDEPROGRAMS USING WAPROGRAM-PROGNAME                                           RECURSIVEINCLUDESEARCH                                           CUSTOMERONLY                                           CUSTOMERNAMERANGE                                           WAPROGRAM



-IINCLUDES[].      

MODIFY ILOCPROGRAM FROM WAPROGRAM INDEX MYTABIX.    
ENDLOOP.  
ENDIF.

* Once we have a list of all the includes we need to loop round them an select all the other objects  
LOOP AT ILOCPROGRAM INTO WAPROGRAM.    MYTABIX 
= SY-TABIX.    
PERFORM FINDPROGRAMDETAILS USING WAPROGRAM-PROGNAME                                     WAPROGRAM
-SUBC                                     WAPROGRAM
-PROGRAMTITLE                                     WAPROGRAM                                     GETTEXTELEMENTS                                     GETMESSAGES                                     GETSCREENS                                     GETCUSTDICTSTRUCTURES                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE






.

*   Find any screens    
IF NOT GETSCREENS IS INITIAL.      
PERFORM FINDPROGRAMSCREENFLOW USING WAPROGRAM.    
ENDIF.    

LOOP AT WAPROGRAM-IINCLUDES INTO WAINCLUDE.      
PERFORM FINDPROGRAMDETAILS USING WAINCLUDE-INCLUDENAME                                       
'I'                                       WAINCLUDE
-INCLUDETITLE                                       WAPROGRAM                                       GETTEXTELEMENTS                                       GETMESSAGES                                       GETSCREENS                                       GETCUSTDICTSTRUCTURES                                       CUSTOMERONLY                                       CUSTOMERNAMERANGE






.    
ENDLOOP.    

MODIFY ILOCPROGRAM FROM WAPROGRAM INDEX MYTABIX.  
ENDLOOP.

* Now we have all the program includes and details we need to find extra functions  
IF NOT GETFUNCTIONS IS INITIAL.    
LOOP AT ILOCPROGRAM INTO WAPROGRAM.
*     Find any functions defined in the code      
PERFORM SCANFORFUNCTIONS USING WAPROGRAM-PROGNAME                                     WAPROGRAM
-PROGNAME                                     SPACE                                     SPACE                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE                                     ILOCFUNCTIONS[]




.    
ENDLOOP.  
ENDIF.

* We have a list of all the functions so lets go and find details and other function calls  
PERFORM SCANFORADDITIONALFUNCSTUFF USING ILOCFUNCTIONS[]                                           RECURSIVEINCLUDESEARCH                                           RECURSIVEFUNCSEARCH                                           GETINCLUDES                                           GETFUNCTIONS                                           GETCUSTDICTSTRUCTURES                                           GETMESSAGES                                           CUSTOMERONLY                                           CUSTOMERNAMERANGE







.
ENDFORM.                                                                     "scanForAdditionalProgStuff

*-------------------------------------------------------------------------------------------------------
*  findProgramDetails...
*-------------------------------------------------------------------------------------------------------
FORM FINDPROGRAMDETAILS USING VALUE(PROGRAMNAME)                              
VALUE(PROGRAMTYPE)                                    PROGRAMTITLE                                    WAPROGRAM 

TYPE TPROGRAM                              
VALUE(GETTEXTELEMENTS)                              
VALUE(GETMESSAGES)                              
VALUE(GETSCREENS)                              
VALUE(GETCUSTDICTSTRUCTURES)                              
VALUE(CUSTOMERONLY)                              
VALUE(CUSTOMERNAMERANGE).  

PERFORM FINDPROGRAMORINCLUDETITLE USING PROGRAMNAME                                          PROGRAMTITLE
.  

IF NOT GETTEXTELEMENTS IS INITIAL.
*   Find the program texts from out of the database.    
PERFORM RETRIEVEPROGRAMTEXTS USING WAPROGRAM-ISELECTIONTEXTS[]                                       WAPROGRAM
-ITEXTELEMENTS[]                                       PROGRAMNAME
.  
ENDIF.

* Search for any GUI texts  
IF NOT GETSCREENS IS INITIAL AND ( PROGRAMTYPE 'M' OR PROGRAMTYPE '1' ).    
PERFORM RETRIEVEGUITITLES USING WAPROGRAM-IGUITITLE[]                                    PROGRAMNAME
.  
ENDIF.

* Find individual messages  
IF NOT GETMESSAGES IS INITIAL.    
IF PROGRAMTYPE 'M' OR PROGRAMTYPE '1'.      
PERFORM FINDMAINMESSAGECLASS USING PROGRAMNAME                                         WAPROGRAM
-MESSAGECLASS.    
ENDIF.    

PERFORM SCANFORMESSAGES USING PROGRAMNAME                                  WAPROGRAM
-MESSAGECLASS                                  WAPROGRAM
-IMESSAGES[].  
ENDIF.  

IF NOT GETCUSTDICTSTRUCTURES IS INITIAL.    
PERFORM SCANFORTABLES USING PROGRAMNAME                                CUSTOMERONLY                                CUSTOMERNAMERANGE                                WAPROGRAM


-IDICTSTRUCT[].    

PERFORM SCANFORLIKEORTYPE USING PROGRAMNAME                                    CUSTOMERONLY                                    CUSTOMERNAMERANGE                                    WAPROGRAM


-IDICTSTRUCT[].  
ENDIF.
ENDFORM.                                                                             "findProgramDetails

*-------------------------------------------------------------------------------------------------------
*  findAllProgramsForAuthor...
*-------------------------------------------------------------------------------------------------------
FORM FINDALLPROGRAMSFORAUTHOR USING ILOCPROGRAM LIKE IPROGRAMS[]                                    RANGEPROGRAM 
LIKE SOPROGRAMNAME[]                                    RANGEAUTHOR 
LIKE SOAUTHOR[]                                    
VALUE(CUSTNAMERANGE)                                    
VALUE(ALSOMODIFIEDBYAUTHOR)                                    
VALUE(CUSTOMERPROGSONLY)                                    
VALUE(GETLOCALOBJECTS)                                    
VALUE(PACKAGE).  

DATA: ALTCUSTOMERNAMERANGE TYPE STRING.  
FIELD-SYMBOLS: <WAPROGRAM> TYPE TPROGRAM.  
DATA: GENFLAG TYPE GENFLAG.

* build up the customer name range used for select statements  
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.

* select by name and author  
IF NOT ALSOMODIFIEDBYAUTHOR IS INITIAL.
*   Programs modified by author
*   Program to search for is an executable program    
IF CUSTOMERPROGSONLY IS INITIAL.
*     Select all programs      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME IN RANGEPROGRAM                        
AND CNAM IN RANGEAUTHOR                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' ).    

ELSE.
*     Select only customer specific programs      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME  IN RANGEPROGRAM                        
AND ( PROGNAME LIKE ALTCUSTOMERNAMERANGE                              
OR PROGNAME LIKE 'Z%' OR PROGNAME LIKE 'Y%'                              
OR PROGNAME LIKE 'SAPMZ%' OR PROGNAME LIKE 'SAPMY%')                        
AND CNAM IN RANGEAUTHOR                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' ).    
ENDIF.  
ELSE.

*   Programs created by author    
IF CUSTOMERPROGSONLY IS INITIAL.
*     Select all programs      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME IN RANGEPROGRAM                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ELSE.
*     Select only customer specific programs      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME IN RANGEPROGRAM                        
AND ( PROGNAME LIKE ALTCUSTOMERNAMERANGE                              
OR PROGNAME LIKE 'Z%' OR PROGNAME LIKE 'Y%'                              
OR PROGNAME LIKE 'SAPMZ%' OR PROGNAME LIKE 'SAPMY%')                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ENDIF.  
ENDIF.

* Delete any programs which are local objects  
IF GETLOCALOBJECTS IS INITIAL.    
LOOP AT ILOCPROGRAM ASSIGNING <WAPROGRAM>.      
SELECT SINGLE GENFLAG FROM TADIV                    
INTO GENFLAG                    
WHERE PGMID 'R3TR'                      
AND OBJECT 'PROG'                      
AND OBJ_NAME = <WAPROGRAM>-PROGNAME                      
AND DEVCLASS '$TMP'.      
IF SY-SUBRC 0.        
DELETE ILOCPROGRAM.      
ENDIF.    
ENDLOOP.  
ENDIF.

* Delete any programs which are not in the specified package  
IF NOT PACKAGE IS INITIAL.    
LOOP AT ILOCPROGRAM ASSIGNING <WAPROGRAM>.      
SELECT SINGLE GENFLAG FROM TADIV                    
INTO GENFLAG                    
WHERE PGMID 'R3TR'                      
AND OBJECT 'PROG'                      
AND OBJ_NAME = <WAPROGRAM>-PROGNAME                      
AND DEVCLASS <> PACKAGE.      
IF SY-SUBRC 0.        
DELETE ILOCPROGRAM.      
ENDIF.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                       "findAllProgramsForAuthor

*-------------------------------------------------------------------------------------------------------
*  checkProgramDoesExist...
*-------------------------------------------------------------------------------------------------------
FORM CHECKPROGRAMDOESEXIST USING ILOCPROGRAM LIKE IPROGRAMS[]                                 RANGEPROGRAM 
LIKE SOPROGRAMNAME[].  

DATA: WAPROGRAM TYPE TPROGRAM.

*  Check to see if the program is an executable program
*   select single progname subc  
SELECT PROGNAME SUBC                
INTO (WAPROGRAM-PROGNAME, WAPROGRAM-SUBC)                
FROM REPOSRC                
WHERE PROGNAME IN RANGEPROGRAM                  
AND ( SUBC '1' OR                        SUBC 
'I' OR                        SUBC 
'M' OR                        SUBC 
'S' ).    

IF NOT WAPROGRAM-PROGNAME IS INITIAL.      
APPEND WAPROGRAM TO ILOCPROGRAM.    
ENDIF.  
ENDSELECT.
ENDFORM.                                                                          "checkProgramDoesExist

*-------------------------------------------------------------------------------------------------------
*  findProgramsByWildcard.. Search in the system for programs
*-------------------------------------------------------------------------------------------------------
FORM FINDPROGRAMSBYWILDCARD USING ILOCPROGRAM LIKE IPROGRAMS[]                                  
VALUE(RANGEPROGRAMLIKE SOPROGRAMNAME[]                                  
VALUE(RANGEAUTHORLIKE SOAUTHOR[]                                  
VALUE(CUSTNAMERANGE)                                  
VALUE(CUSTOMERPROGSONLY)                                  
VALUE(GETLOCALOBJECTS)                                  
VALUE(PACKAGE).  

DATA: ALTCUSTOMERNAMERANGE TYPE STRING.  
FIELD-SYMBOLS: <WAPROGRAM> TYPE TPROGRAM.  
DATA: GENFLAG TYPE GENFLAG.  

IF CUSTOMERPROGSONLY IS INITIAL.
*   build up the customer name range used for select statements    
IF CUSTNAMERANGE <> '^'.      
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.      

SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME  IN RANGEPROGRAM                        
AND PROGNAME LIKE ALTCUSTOMERNAMERANGE                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ELSE.      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME  IN RANGEPROGRAM                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ENDIF.  
ELSE.
*   Only customer programs    
IF CUSTNAMERANGE <> '^'.      
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.      

SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME  IN RANGEPROGRAM                        
AND ( PROGNAME LIKE ALTCUSTOMERNAMERANGE                              
OR PROGNAME LIKE 'Z%' OR PROGNAME LIKE 'Y%'                              
OR PROGNAME LIKE 'SAPMZ%' OR PROGNAME LIKE 'SAPMY%')                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ELSE.      
SELECT PROGNAME SUBC FROM REPOSRC APPENDING CORRESPONDING FIELDS OF TABLE ILOCPROGRAM                      
WHERE PROGNAME  IN RANGEPROGRAM                        
AND ( PROGNAME LIKE 'Z%' OR PROGNAME LIKE 'Y%' OR PROGNAME LIKE 'SAPMZ%' OR PROGNAME LIKE 'SAPMY%')                        
AND ( SUBC '1' OR SUBC 'M' OR SUBC 'S' )                        
AND ( CNAM IN RANGEAUTHOR OR UNAM IN RANGEAUTHOR ).    
ENDIF.  
ENDIF.

* Delete any programs which are local objects  
IF GETLOCALOBJECTS IS INITIAL.    
LOOP AT ILOCPROGRAM ASSIGNING <WAPROGRAM>.      
SELECT SINGLE GENFLAG FROM TADIV                    
INTO GENFLAG                    
WHERE PGMID 'R3TR'                      
AND OBJECT 'PROG'                      
AND OBJ_NAME = <WAPROGRAM>-PROGNAME                      
AND DEVCLASS '$TMP'.      
IF SY-SUBRC 0.        
DELETE ILOCPROGRAM.      
ENDIF.    
ENDLOOP.  
ENDIF.

* Delete any programs which are not in the specified package  
IF NOT PACKAGE IS INITIAL.    
LOOP AT ILOCPROGRAM ASSIGNING <WAPROGRAM>.      
SELECT SINGLE GENFLAG FROM TADIV                    
INTO GENFLAG                    
WHERE PGMID 'R3TR'                      
AND OBJECT 'PROG'                      
AND OBJ_NAME = <WAPROGRAM>-PROGNAME                      
AND DEVCLASS <> PACKAGE.      
IF SY-SUBRC 0.        
DELETE ILOCPROGRAM.      
ENDIF.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                         "findProgramsByWildcard

*-------------------------------------------------------------------------------------------------------
*  retrieveProgramTexts... Find the text elements and selection texts for a program
*-------------------------------------------------------------------------------------------------------
FORM RETRIEVEPROGRAMTEXTS USING ILOCSELECTIONTEXTS LIKE DUMITEXTTAB[]                                ILOCTEXTELEMENTS 
LIKE DUMITEXTTAB[]                                
VALUE(PROGRAMNAME).  

DATA: ITEXTTABLE TYPE STANDARD TABLE OF TTEXTTABLE WITH HEADER LINE.  
DATA: WATEXTS TYPE TTEXTTABLE.  
DATA: CASTPROGRAMNAME(50).  

MOVE PROGRAMNAME TO CASTPROGRAMNAME.  

READ TEXTPOOL CASTPROGRAMNAME INTO ITEXTTABLE LANGUAGE SY-LANGU.  
DELETE ITEXTTABLE WHERE KEY 'R'.

* Selection texts.  
LOOP AT ITEXTTABLE WHERE ID 'S'.    
MOVE ITEXTTABLE-KEY TO WATEXTS-KEY.    
MOVE ITEXTTABLE-ENTRY TO WATEXTS-ENTRY.    
APPEND WATEXTS TO ILOCSELECTIONTEXTS.    
CLEAR WATEXTS.  
ENDLOOP.

* Text elements.  
DELETE ITEXTTABLE WHERE KEY 'S'.  
LOOP AT ITEXTTABLE WHERE ID 'I'.    
MOVE ITEXTTABLE-KEY TO WATEXTS-KEY.    
MOVE ITEXTTABLE-ENTRY TO WATEXTS-ENTRY.    
APPEND WATEXTS TO ILOCTEXTELEMENTS.  
ENDLOOP.
ENDFORM.                                                                           "retrieveProgramTexts

*-------------------------------------------------------------------------------------------------------
*  retrieveGUITitles...  Search for any GUI texts
*-------------------------------------------------------------------------------------------------------
FORM RETRIEVEGUITITLES USING ILOCGUITITLE LIKE DUMIGUITITLE[]                             
VALUE(PROGRAMNAME).  

SELECT OBJ_CODE         
TEXT         
FROM D347T         
APPENDING CORRESPONDING FIELDS OF TABLE ILOCGUITITLE         
WHERE PROGNAME = PROGRAMNAME.
ENDFORM.                                                                              "retrieveGUITitles

*-------------------------------------------------------------------------------------------------------
*   findMainMessageClass... find the message class stated at the top of  program.
*-------------------------------------------------------------------------------------------------------
FORM FINDMAINMESSAGECLASS USING VALUE(PROGRAMNAME)                                      MESSAGECLASS
.  

SELECT SINGLE MSGID                
FROM TRDIRE INTO MESSAGECLASS                
WHERE REPORT = PROGRAMNAME.
ENDFORM.                                                                           "findMainMessageClass

*-------------------------------------------------------------------------------------------------------
* retrieveClasses...    find classes and sub objects from SAP DB
*-------------------------------------------------------------------------------------------------------
FORM RETRIEVECLASSES USING ILOCCLASSES LIKE ICLASSES[]                           ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                           RANGECLASS 
LIKE SOCLASSNAME[]                           RANGEAUTHOR 
LIKE SOAUTHOR[]                           
VALUE(CUSTNAMERANGE)                           
VALUE(ALSOMODIFIEDBYAUTHOR)                           
VALUE(CUSTOMERPROGSONLY)                           
VALUE(GETMESSAGES)                           
VALUE(GETTEXTELEMENTS)                           
VALUE(GETCUSTDICTSTRUCTURES)                           
VALUE(GETFUNCTIONS)                           
VALUE(GETINCLUDES)                           
VALUE(RECURSIVEFUNCSEARCH)                           
VALUE(RECURSIVEINCLUDESEARCH)                           
VALUE(RECURSIVECLASSSEARCH)                           
VALUE(LANGUAGE).  

DATA: WARANGECLASS LIKE LINE OF RANGECLASS.  

IF RANGECLASS[] IS INITIAL.
*   We are finding all programs by an author    
PERFORM FINDALLCLASSESFORAUTHOR USING ILOCCLASSES[]                                           RANGECLASS[]                                           RANGEAUTHOR[]                                           CUSTNAMERANGE                                           ALSOMODIFIEDBYAUTHOR                                           CUSTOMERPROGSONLY                                           





LANGUAGE.  
ELSE.    
READ TABLE RANGECLASS INDEX INTO WARANGECLASS.    
IF WARANGECLASS-LOW CS ASTERIX.      
PERFORM FINDCLASSESBYWILDCARD USING ILOCCLASSES[]                                          RANGECLASS[]                                          RANGEAUTHOR[]                                          CUSTNAMERANGE                                          CUSTOMERPROGSONLY                                          




LANGUAGE.    
ELSE.      
PERFORM CHECKCLASSDOESEXIST USING ILOCCLASSES[]                                        RANGECLASS[]
.    
ENDIF.  
ENDIF.

* Find extra items  
IF NOT ILOCCLASSES[] IS INITIAL.    
PERFORM SCANFORADDITIONALCLASSSTUFF USING ILOCCLASSES[]                                              ILOCFUNCTIONS[]                                              GETTEXTELEMENTS                                              GETMESSAGES                                              GETCUSTDICTSTRUCTURES                                              GETFUNCTIONS                                              GETINCLUDES                                              CUSTOMERPROGSONLY                                              CUSTNAMERANGE                                              RECURSIVEINCLUDESEARCH                                              RECURSIVEFUNCSEARCH                                              RECURSIVECLASSSEARCH










.  
ENDIF.
ENDFORM.                                                                                "retrieveClasses

*-------------------------------------------------------------------------------------------------------
*  findAllClassesForAuthor...
*-------------------------------------------------------------------------------------------------------
FORM FINDALLCLASSESFORAUTHOR USING ILOCCLASS LIKE ICLASSES[]                                   RANGECLASS 
LIKE SOCLASSNAME[]                                   RANGEAUTHOR 
LIKE SOAUTHOR[]                                   
VALUE(CUSTNAMERANGE)                                   
VALUE(ALSOMODIFIEDBYAUTHOR)                                   
VALUE(CUSTOMERCLASSESONLY)                                   
VALUE(LANGUAGE).  

DATA: ALTCUSTOMERNAMERANGE(2).

* build up the customer name range used for select statements  
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.

* select by name and author  
IF NOT ALSOMODIFIEDBYAUTHOR IS INITIAL.
*   Classes modified by author    
IF CUSTOMERCLASSESONLY IS INITIAL.
*     Select all classes      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND LANGU LANGUAGE               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      

IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS               
AND LANGU LANGUAGE                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ELSE.
*     Select only customer specific classes      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND ( CLSNAME LIKE ALTCUSTOMERNAMERANGE OR CLSNAME LIKE 'Z%' OR CLSNAME LIKE 'Y%')               
AND LANGU LANGUAGE               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      

IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND ( CLSNAME LIKE ALTCUSTOMERNAMERANGE OR CLSNAME LIKE 'Z%' OR CLSNAME LIKE 'Y%')                 
AND LANGU LANGUAGE                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ENDIF.  
ELSE.
*   Programs created by author    
IF CUSTOMERCLASSESONLY IS INITIAL.
*     Select all classes      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND LANGU LANGUAGE               
AND AUTHOR IN RANGEAUTHOR               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      

IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND LANGU LANGUAGE                 
AND AUTHOR IN RANGEAUTHOR                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ELSE.
*     Select only customer specific classes      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND ( CLSNAME LIKE ALTCUSTOMERNAMERANGE OR CLSNAME LIKE 'Z%' OR CLSNAME LIKE 'Y%')               
AND LANGU LANGUAGE               
AND AUTHOR IN RANGEAUTHOR               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      

IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND ( CLSNAME LIKE ALTCUSTOMERNAMERANGE OR CLSNAME LIKE 'Z%' OR CLSNAME LIKE 'Y%')                 
AND LANGU LANGUAGE                 
AND AUTHOR IN RANGEAUTHOR                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ENDIF.  
ENDIF.
ENDFORM.                                                                        "findAllClassesForAuthor

*-------------------------------------------------------------------------------------------------------
*  findClassesByWildcard...  Find classes using a wildcard search
*-------------------------------------------------------------------------------------------------------
FORM FINDCLASSESBYWILDCARD USING ILOCCLASS LIKE ICLASSES[]                                 RANGECLASS 
LIKE SOCLASSNAME[]                                 
VALUE(RANGEAUTHORLIKE SOAUTHOR[]                                 
VALUE(CUSTNAMERANGE)                                 
VALUE(CUSTOMERCLASSESONLY)                                 
VALUE(LANGUAGE).  

DATA: ALTCUSTOMERNAMERANGE(2).  

IF CUSTOMERCLASSESONLY IS INITIAL.
*   Searching for customer and SAP classes    
IF CUSTNAMERANGE <> '^'.
*     build up the customer name range used for select statements      
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.      

SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND CLSNAME LIKE CUSTNAMERANGE               
AND LANGU LANGUAGE               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      
IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND CLSNAME LIKE CUSTNAMERANGE                 
AND LANGU LANGUAGE                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ELSE.
*     Searching using normal name ranges      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND LANGU LANGUAGE               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      
IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND LANGU LANGUAGE                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ENDIF.  
ELSE.
*   searching for only customer classes    
IF CUSTNAMERANGE <> '^'.
*     build up the customer name range used for select statements      
CONCATENATE CUSTNAMERANGE '%' INTO ALTCUSTOMERNAMERANGE.      

SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND CLSNAME LIKE CUSTNAMERANGE               
AND LANGU LANGUAGE               
AND ( CLSNAME LIKE 'ZC%' OR CLSNAME LIKE 'YC%' )               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      
IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND LANGU LANGUAGE                 
AND ( CLSNAME LIKE 'ZC%' OR CLSNAME LIKE 'YC%' )                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ELSE.
*     Searching using normal name ranges      
SELECT CLSNAME DESCRIPT MSG_ID             
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS             
WHERE CLSNAME IN RANGECLASS               
AND ( CLSNAME LIKE 'ZC%' OR CLSNAME LIKE 'YC%' )               
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )               
AND VERSION '1'               
AND ( STATE '0' OR STATE '1' ).      
IF SY-SUBRC <> 0.        
SELECT CLSNAME DESCRIPT MSG_ID               
FROM VSEOCLASS APPENDING CORRESPONDING FIELDS OF TABLE ILOCCLASS               
WHERE CLSNAME IN RANGECLASS                 
AND ( CLSNAME LIKE 'ZC%' OR CLSNAME LIKE 'YC%' )                 
AND ( AUTHOR IN RANGEAUTHOR OR CHANGEDBY IN RANGEAUTHOR )                 
AND VERSION '0'                 
AND ( STATE '0' OR STATE '1' ).      
ENDIF.    
ENDIF.  
ENDIF.
ENDFORM.                                                                          "findClassesByWildcard

*-------------------------------------------------------------------------------------------------------
*  checkClassDoesExist...
*-------------------------------------------------------------------------------------------------------
FORM CHECKCLASSDOESEXIST USING ILOCCLASS LIKE ICLASSES[]                               RANGECLASS 
LIKE SOCLASSNAME[].  

DATA: WACLASS TYPE TCLASS.  

SELECT SINGLE CLSNAME DESCRIPT MSG_ID         
FROM VSEOCLASS INTO CORRESPONDING FIELDS OF WACLASS         
WHERE CLSNAME IN RANGECLASS           
AND VERSION '1'           
AND ( STATE '0' OR STATE '1' ).  

IF SY-SUBRC <> 0.    
SELECT SINGLE CLSNAME DESCRIPT MSG_ID         
FROM VSEOCLASS INTO CORRESPONDING FIELDS OF WACLASS           
WHERE CLSNAME IN RANGECLASS             
AND VERSION '0'             
AND ( STATE '0' OR STATE '1' ).  
ENDIF.  

IF NOT WACLASS-CLSNAME IS INITIAL.    
APPEND WACLASS TO ILOCCLASS.  
ENDIF.
ENDFORM.                                                                            "checkClassDoesExist

*-------------------------------------------------------------------------------------------------------
*  scanForAdditionalClassStuff...
*-------------------------------------------------------------------------------------------------------
FORM SCANFORADDITIONALCLASSSTUFF USING ILOCCLASSES LIKE ICLASSES[]                                       ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                                       
VALUE(GETTEXTELEMENTS)                                       
VALUE(GETMESSAGES)                                       
VALUE(GETCUSTDICTSTRUCTURES)                                       
VALUE(GETFUNCTIONS)                                       
VALUE(GETINCLUDES)                                       
VALUE(CUSTOMERONLY)                                       
VALUE(CUSTOMERNAMERANGE)                                       
VALUE(RECURSIVEINCLUDESEARCH)                                       
VALUE(RECURSIVEFUNCSEARCH)                                       
VALUE(RECURSIVECLASSSEARCH).  

DATA: WACLASS TYPE TCLASS.  
DATA: WAMETHOD TYPE TMETHOD.  
DATA: MYTABIX TYPE SYTABIX.  
DATA: SCANNINGFORCLASSES TYPE VALUE FALSE.  
DATA: CLASSNEWLINES TYPE VALUE 0.  
DATA: CLASSCURRENTLINES TYPE VALUE 0.  

LOOP AT ILOCCLASSES INTO WACLASS WHERE SCANNED IS INITIAL.
*  Once we have a list of all the classes we need to loop round them an select all the other objects    MYTABIX 
= SY-TABIX.    
PERFORM FINDCLASSDETAILS USING WACLASS-CLSNAME                                   WACLASS                                   ILOCFUNCTIONS[]                                   GETTEXTELEMENTS                                   GETMESSAGES                                   GETFUNCTIONS                                   GETCUSTDICTSTRUCTURES                                   CUSTOMERONLY                                   CUSTOMERNAMERANGE







.

*   Set the scanned class so we do not check them again when running recursively.    WACLASS
-SCANNED 'X'.    
MODIFY ILOCCLASSES FROM WACLASS INDEX MYTABIX.  
ENDLOOP.

* Now we have all the classes and details we need to find extra classes  
IF NOT RECURSIVECLASSSEARCH IS INITIAL.    CLASSCURRENTLINES 
LINES( ILOCCLASSES ).    
LOOP AT ILOCCLASSES INTO WACLASS.
*     Don't try and find any other details for an exception class      
IF ( WACLASS-CLSNAME NS 'ZCX_' OR WACLASS-CLSNAME NS 'CX_'  ).
*       Find any classes defined in the main class definition        
PERFORM SCANFORCLASSES USING WACLASS-PRIVATECLASSKEY                                     WACLASS
-CLSNAME                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE                                     ILOCCLASSES[]


.        

PERFORM SCANFORCLASSES USING WACLASS-PUBLICCLASSKEY                                     WACLASS
-CLSNAME                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE                                     ILOCCLASSES[]


.        

PERFORM SCANFORCLASSES USING WACLASS-PROTECTEDCLASSKEY                                     WACLASS
-CLSNAME                                     CUSTOMERONLY                                     CUSTOMERNAMERANGE                                     ILOCCLASSES[]


.        

LOOP AT WACLASS-IMETHODS INTO WAMETHOD.
*         Find any classes defined in any of the methods          
PERFORM SCANFORCLASSES USING WAMETHOD-METHODKEY                                       WACLASS
-CLSNAME                                       CUSTOMERONLY                                       CUSTOMERNAMERANGE                                       ILOCCLASSES[]


.        
ENDLOOP.      
ENDIF.    
ENDLOOP.

*   We have a list of all the classes so lets go and find their details    CLASSNEWLINES 
LINES( ILOCCLASSES ).    
IF CLASSNEWLINES > CLASSCURRENTLINES.      
PERFORM SCANFORADDITIONALCLASSSTUFF USING ILOCCLASSES[]                                                ILOCFUNCTIONS[]                                                GETTEXTELEMENTS                                                GETMESSAGES                                                GETCUSTDICTSTRUCTURES                                                GETFUNCTIONS                                                GETINCLUDES                                                CUSTOMERONLY                                                CUSTOMERNAMERANGE                                                RECURSIVEINCLUDESEARCH                                                RECURSIVEFUNCSEARCH                                                RECURSIVECLASSSEARCH










.    
ENDIF.  
ENDIF.
ENDFORM.                                                                   "scanForAdditionalClassStuff

*-------------------------------------------------------------------------------------------------------
*  findClassDetails...
*-------------------------------------------------------------------------------------------------------
FORM FINDCLASSDETAILS USING VALUE(CLASSNAME)                                  WACLASS 
TYPE TCLASS                              ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                              
VALUE(GETTEXTELEMENTS)                              
VALUE(GETMESSAGES)                              
VALUE(GETFUNCTIONS)                              
VALUE(GETCUSTDICTSTRUCTURES)                              
VALUE(CUSTOMERONLY)                              
VALUE(CUSTOMERNAMERANGE).  

DATA: IEMPTYSELECTIONTEXTS TYPE STANDARD TABLE OF TTEXTTABLE.  
DATA: MYTABIX TYPE SYTABIX.  
DATA: WAMETHOD TYPE TMETHOD.

* Build up the keys we will use for finding data  
PERFORM BUILDCLASSKEYS USING WACLASS.  

IF WACLASS-DESCRIPT IS INITIAL.    
PERFORM FINDCLASSDESCRIPTION USING CLASSNAME                                       WACLASS
-DESCRIPT.  
ENDIF.

* Find the class attributes.  
SELECT SINGLE EXPOSURE MSG_ID STATE CLSFINAL R3RELEASE                
FROM VSEOCLASS                
INTO (WACLASS-EXPOSURE, WACLASS-MSG_ID, WACLASS-STATE, WACLASS-CLSFINAL, WACLASS-R3RELEASE)                       
WHERE CLSNAME = WACLASS-CLSNAME.

* Don't try and find any other details for an exception class  
IF ( WACLASS-CLSNAME CS 'ZCX_' OR WACLASS-CLSNAME CS 'CX_'  ).
*   Exception texts    
PERFORM FINDEXCEPTIONTEXTS USING WACLASS-PUBLICCLASSKEY                                     WACLASS
-ICONCEPTS[].    WACLASS
-SCANNED 'X'.  
ELSE.    
IF NOT GETTEXTELEMENTS IS INITIAL.
*     Find the class texts from out of the database.      
PERFORM RETRIEVEPROGRAMTEXTS USING IEMPTYSELECTIONTEXTS[]                                         WACLASS
-ITEXTELEMENTS[]                                         WACLASS
-TEXTELEMENTKEY.    
ENDIF.

*   Find any declared dictionary structures    
IF NOT GETCUSTDICTSTRUCTURES IS INITIAL.      
PERFORM SCANFORTABLES USING WACLASS-PRIVATECLASSKEY                                  CUSTOMERONLY                                  CUSTOMERNAMERANGE                                  WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORTABLES USING WACLASS-PUBLICCLASSKEY                                  CUSTOMERONLY                                  CUSTOMERNAMERANGE                                  WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORTABLES USING WACLASS-PROTECTEDCLASSKEY                                  CUSTOMERONLY                                  CUSTOMERNAMERANGE                                  WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORTABLES USING WACLASS-TYPESCLASSKEY                                  CUSTOMERONLY                                  CUSTOMERNAMERANGE                                  WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORLIKEORTYPE USING WACLASS-PRIVATECLASSKEY                                      CUSTOMERONLY                                      CUSTOMERNAMERANGE                                      WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORLIKEORTYPE USING WACLASS-PUBLICCLASSKEY                                      CUSTOMERONLY                                      CUSTOMERNAMERANGE                                      WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORLIKEORTYPE USING WACLASS-PROTECTEDCLASSKEY                                      CUSTOMERONLY                                      CUSTOMERNAMERANGE                                      WACLASS


-IDICTSTRUCT[].      

PERFORM SCANFORLIKEORTYPE USING WACLASS-TYPESCLASSKEY                                      CUSTOMERONLY                                      CUSTOMERNAMERANGE                                      WACLASS


-IDICTSTRUCT[].    
ENDIF.


*   Methods
*   Find all the methods for this class    
PERFORM FINDCLASSMETHODS USING CLASSNAME                                   WACLASS
-IMETHODS[].    

LOOP AT WACLASS-IMETHODS[] INTO WAMETHOD.      MYTABIX 
= SY-TABIX.
*     Find individual messages      
IF NOT GETMESSAGES IS INITIAL.        
PERFORM SCANFORMESSAGES USING WAMETHOD-METHODKEY                                      WACLASS
-MSG_ID                                      WACLASS
-IMESSAGES[].      
ENDIF.      

IF NOT GETCUSTDICTSTRUCTURES IS INITIAL.
*       Find any declared dictionary structures        
PERFORM SCANFORTABLES USING WAMETHOD-METHODKEY                                    CUSTOMERONLY                                    CUSTOMERNAMERANGE                                    WACLASS


-IDICTSTRUCT[].        

PERFORM SCANFORLIKEORTYPE USING WAMETHOD-METHODKEY                                        CUSTOMERONLY                                        CUSTOMERNAMERANGE                                        WACLASS


-IDICTSTRUCT[].      
ENDIF.      

IF NOT GETFUNCTIONS IS INITIAL.        
PERFORM SCANFORFUNCTIONS USING WAMETHOD-METHODKEY                                       WACLASS
-CLSNAME                                       SPACE                                       SPACE                                       CUSTOMERONLY                                       CUSTOMERNAMERANGE                                       ILOCFUNCTIONS[]




.      
ENDIF.      

MODIFY WACLASS-IMETHODS FROM WAMETHOD INDEX MYTABIX.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                               "findClassDetails

*-------------------------------------------------------------------------------------------------------
*  buildClassKeys...   Finds the title text of a class.
*-------------------------------------------------------------------------------------------------------
FORM BUILDCLASSKEYS USING WACLASS TYPE TCLASS.  

DATA: CLASSNAMELENGTH TYPE I.  
DATA: LOOPS TYPE I.  CLASSNAMELENGTH 

STRLEN( WACLASS-CLSNAME ).  CL_OO_CLASSNAME_SERVICE

=>GET_PUBSEC_NAMEEXPORTING CLSNAME = WACLASS-CLSNAME                                            RECEIVING RESULT 
= WACLASS-PUBLICCLASSKEY ).  CL_OO_CLASSNAME_SERVICE

=>GET_PRISEC_NAMEEXPORTING CLSNAME = WACLASS-CLSNAME                                            RECEIVING RESULT 
= WACLASS-PRIVATECLASSKEY ).  CL_OO_CLASSNAME_SERVICE

=>GET_PROSEC_NAMEEXPORTING CLSNAME = WACLASS-CLSNAME                                            RECEIVING RESULT 
= WACLASS-PROTECTEDCLASSKEY ).


* Text element key - length of text element key has to be 32 characters.  LOOPS 
30 - CLASSNAMELENGTH.  WACLASS
-TEXTELEMENTKEY = WACLASS-CLSNAME.  
DO LOOPS TIMES.    
CONCATENATE WACLASS-TEXTELEMENTKEY '=' INTO WACLASS-TEXTELEMENTKEY.  
ENDDO.
* Save this for later.  
CONCATENATE WACLASS-TEXTELEMENTKEY 'CP' INTO WACLASS-TEXTELEMENTKEY.

* Types Class key - length of class name has to be 32 characters.  LOOPS 
30 - CLASSNAMELENGTH.  WACLASS
-TYPESCLASSKEY = WACLASS-CLSNAME.  
DO LOOPS TIMES.    
CONCATENATE WACLASS-TYPESCLASSKEY '=' INTO WACLASS-TYPESCLASSKEY.  
ENDDO.
* Save this for later  
CONCATENATE WACLASS-TYPESCLASSKEY 'CT' INTO WACLASS-TYPESCLASSKEY.
ENDFORM.                                                                                 "buildClassKeys

*-------------------------------------------------------------------------------------------------------
*  findClassDescription...   Finds the title text of a class.
*-------------------------------------------------------------------------------------------------------
FORM FINDCLASSDESCRIPTION USING VALUE(CLASSNAME)                                      TITLETEXT
.  

SELECT SINGLE DESCRIPT FROM VSEOCLASS                     
INTO TITLETEXT                     
WHERE CLSNAME = CLASSNAME                       
AND LANGU = SY-LANGU.  
IF SY-SUBRC <> 0.    
SELECT SINGLE DESCRIPT FROM VSEOCLASS                       
INTO TITLETEXT                       
WHERE CLSNAME = CLASSNAME.  
ENDIF.
ENDFORM.                                                                           "findClassDescription

*-------------------------------------------------------------------------------------------------------
*  findExceptionTexts...   Fiond the texts of an exception class.
*-------------------------------------------------------------------------------------------------------
FORM FINDEXCEPTIONTEXTS USING PUBLICCLASSKEY                              ICONCEPTS 
LIKE DUMICONCEPTS[].  

DATA: CASTCLASSNAME TYPE PROGRAM.  
DATA: ITEMPLINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: IKEYWORDS TYPE STANDARD TABLE OF TEXT20 WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: WATOKENS TYPE STOKES.  
DATA: WACURRENTTOKEN TYPE STOKES.  
DATA: WACONCEPT LIKE LINE OF ICONCEPTS.  
DATA: TOKENLENGTH TYPE I.  
DATA: MYROW TYPE I.  CASTCLASSNAME 

= PUBLICCLASSKEY.  
READ REPORT CASTCLASSNAME INTO ITEMPLINES.  

APPEND 'CONSTANTS' TO IKEYWORDS.  
SCAN ABAP-SOURCE ITEMPLINES TOKENS INTO ITOKENS STATEMENTS INTO ISTATEMENTS KEYWORDS FROM IKEYWORDS.  

DELETE ITOKENS WHERE STR 'CONSTANTS'.  
DELETE ITOKENS WHERE STR 'VALUE'.  
DELETE ITOKENS WHERE STR 'TYPE'.  

LOOP AT ITOKENS INTO WATOKENS WHERE STR 'SOTR_CONC'.
*   The loop before holds the constant name    MYROW 
= SY-TABIX 1.    
READ TABLE ITOKENS INDEX MYROW INTO WACURRENTTOKEN.    WACONCEPT
-CONSTNAME = WACURRENTTOKEN-STR.

*   The loop after holds the constant name    MYROW 
= MYROW + 2.    
READ TABLE ITOKENS INDEX MYROW INTO WACURRENTTOKEN.    TOKENLENGTH 
STRLEN( WACURRENTTOKEN-STR ).    
IF TOKENLENGTH 34.
*     Most likely an exception text.      
REPLACE ALL OCCURRENCES OF '''' IN WACURRENTTOKEN-STR WITH ' ' .      WACONCEPT
-CONCEPT = WACURRENTTOKEN-STR.      
APPEND WACONCEPT TO ICONCEPTS.    
ENDIF.  
ENDLOOP.
ENDFORM.                    "findExceptionTexts

*-------------------------------------------------------------------------------------------------------
*  findClassMethods...   Finds the methods of a class.
*-------------------------------------------------------------------------------------------------------
FORM FINDCLASSMETHODS USING VALUE(CLASSNAME)                            ILOCMETHODS 
LIKE DUMIMETHODS[].  

DATA: IMETHODS TYPE STANDARD TABLE OF TMETHOD WITH HEADER LINE.  

SELECT CMPNAME DESCRIPT EXPOSURE         
FROM VSEOMETHOD         
INTO CORRESPONDING FIELDS OF TABLE IMETHODS           
WHERE CLSNAME = CLASSNAME             
AND VERSION '1'             
AND LANGU = SY-LANGU             
AND ( STATE '0' OR STATE '1' ).  

IF SY-SUBRC <> 0.    
SELECT CMPNAME DESCRIPT EXPOSURE           
FROM VSEOMETHOD           
INTO CORRESPONDING FIELDS OF TABLE IMETHODS           
WHERE CLSNAME = CLASSNAME             
AND VERSION '0'             
AND LANGU = SY-LANGU             
AND ( STATE '0' OR STATE '1' ).  
ENDIF.

* Find the method key so that we can acces the source code later  
LOOP AT IMETHODS.    
PERFORM FINDMETHODKEY USING CLASSNAME                                IMETHODS
-CMPNAME                                IMETHODS
-METHODKEY.    
MODIFY IMETHODS.  
ENDLOOP.  ILOCMETHODS[] 

= IMETHODS[].
ENDFORM.                                                                               "findClassMethods

*-------------------------------------------------------------------------------------------------------
* findMethodKey... find the unique key which identifes this method
*-------------------------------------------------------------------------------------------------------
FORM FINDMETHODKEY USING VALUE(CLASSNAME)                         
VALUE(METHODNAME)                               METHODKEY
.  

DATA: METHODID TYPE SEOCPDKEY.  
DATA: LOCMETHODKEY TYPE PROGRAM.  METHODID

-CLSNAME = CLASSNAME.  METHODID
-CPDNAME = METHODNAME.  CL_OO_CLASSNAME_SERVICE

=>GET_METHOD_INCLUDEEXPORTING MTDKEY = METHODID                                               RECEIVING RESULT 
= LOCMETHODKEY                                               
EXCEPTIONS CLASS_NOT_EXISTING 1                                                          METHOD_NOT_EXISTING 
).  METHODKEY 

= LOCMETHODKEY.
ENDFORM.                                                                                  "findMethodKey

*-------------------------------------------------------------------------------------------------------
* scanForMessages... Search each program for messages
*-------------------------------------------------------------------------------------------------------
FORM SCANFORMESSAGES USING VALUE(PROGRAMNAME)                           
VALUE(MAINMESSAGECLASS)                                 ILOCMESSAGES 
LIKE IMESSAGES[].  

DATA: IINCLUDELINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: IKEYWORDS TYPE STANDARD TABLE OF TEXT20 WITH HEADER LINE.  
DATA: WAMESSAGE TYPE TMESSAGE.  
DATA: WAMESSAGECOMPARISON TYPE TMESSAGE.  
DATA: WATOKENS TYPE STOKES.  
DATA: NEXTLINE TYPE I.  
DATA: STRINGLENGTH TYPE VALUE 0.  
DATA: WORKINGONMESSAGE TYPE VALUE FALSE.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= PROGRAMNAME.  
READ REPORT CASTPROGRAMNAME INTO IINCLUDELINES.  

APPEND MESSAGE TO IKEYWORDS.  
SCAN ABAP-SOURCE IINCLUDELINES TOKENS INTO ITOKENS WITH INCLUDES STATEMENTS INTO ISTATEMENTS KEYWORDS FROM IKEYWORDS.  

CLEAR IINCLUDELINES[].  

LOOP AT ITOKENS.    
IF ITOKENS-STR MESSAGE.      WORKINGONMESSAGE 
= TRUE.      
CONTINUE.    
ENDIF.    

IF WORKINGONMESSAGE = TRUE.      STRINGLENGTH 
STRLEN( ITOKENS-STR ).

*     Message declaration 1      
IF STRINGLENGTH AND ITOKENS-STR+0(1CA SY-ABCDE.        WAMESSAGE
-MSGNR = ITOKENS-STR+1(3).        WAMESSAGE
-ARBGB = MAINMESSAGECLASS.      
ELSE.        
IF ITOKENS-STR CS '''' OR ITOKENS-STR CS '`'.
*         Message declaration 2          
TRANSLATE ITOKENS-STR USING ''' '.          
TRANSLATE ITOKENS-STR USING '` '.          
CONDENSE ITOKENS-STR.          
SHIFT ITOKENS-STR LEFT DELETING LEADING SPACE.          WAMESSAGE
-TEXT = ITOKENS-STR.          WAMESSAGE
-ARBGB 'Hard coded'.        
ELSE.          
IF ITOKENS-STR 'ID'.
*           Message declaration 3            NEXTLINE 
= SY-TABIX + 1.            
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.            
TRANSLATE WATOKENS-STR USING ''' '.            
CONDENSE ITOKENS-STR.            
SHIFT WATOKENS-STR LEFT DELETING LEADING SPACE.            
IF NOT WATOKENS-STR 'SY-MSGID'.              WAMESSAGE
-ARBGB = WATOKENS-STR.              NEXTLINE 

= NEXTLINE + 4.              
READ TABLE ITOKENS INDEX NEXTLINE INTO WATOKENS.              
TRANSLATE WATOKENS-STR USING ''' '.              
CONDENSE WATOKENS-STR.              
SHIFT WATOKENS-STR LEFT DELETING LEADING SPACE.              WAMESSAGE
-MSGNR = WATOKENS-STR.            
ELSE.              WORKINGONMESSAGE 
= FALSE.            
ENDIF.          
ELSE.            
IF STRINGLENGTH >= AND ITOKENS-STR+4(1'('.
*              Message declaration 4              WAMESSAGE
-MSGNR = ITOKENS-STR+1(3).              
SHIFT ITOKENS-STR LEFT UP TO '('.              
REPLACE '(' INTO ITOKENS-STR WITH SPACE.              
REPLACE ')' INTO ITOKENS-STR WITH SPACE.              
CONDENSE ITOKENS-STR.              WAMESSAGE
-ARBGB = ITOKENS-STR.            
ENDIF.          
ENDIF.        
ENDIF.      
ENDIF.

*      find the message text      
IF NOT WAMESSAGE-ARBGB IS INITIAL AND NOT WAMESSAGE-MSGNR IS INITIAL AND WAMESSAGE-TEXT IS INITIAL.        
SELECT SINGLE TEXT FROM T100 INTO WAMESSAGE-TEXT                           
WHERE SPRSL = SY-LANGU                             
AND ARBGB = WAMESSAGE-ARBGB                             
AND MSGNR = WAMESSAGE-MSGNR.      
ENDIF.

*      Append the message      
IF NOT WAMESSAGE IS INITIAL.
*        Don't append the message if we already have it listed        
READ TABLE ILOCMESSAGES WITH KEY ARBGB = WAMESSAGE-ARBGB                                         MSGNR 
= WAMESSAGE-MSGNR                                         
INTO WAMESSAGECOMPARISON.        
IF SY-SUBRC <> 0.          
APPEND WAMESSAGE TO ILOCMESSAGES.        
ENDIF.        
CLEAR WAMESSAGE.        WORKINGONMESSAGE 
= FALSE.      
ENDIF.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                 "scanForMessages

*-------------------------------------------------------------------------------------------------------
* scanForTables... Search each program for dictionary tables
*-------------------------------------------------------------------------------------------------------
FORM SCANFORTABLES USING VALUE(PROGRAMNAME)                         
VALUE(CUSTOMERONLY)                         
VALUE(CUSTOMERNAMERANGE)                               ILOCDICTIONARY 
LIKE IDICTIONARY[].  

DATA: IINCLUDELINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITOKENS TYPE STANDARD TABLE OF STOKES WITH HEADER LINE.  
DATA: ISTATEMENTS TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE.  
DATA: IKEYWORDS TYPE STANDARD TABLE OF TEXT20 WITH HEADER LINE.  
DATA: WADICTIONARY TYPE TDICTTABLE.  
DATA: WADICTIONARYCOMPARISON TYPE TDICTTABLE.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= PROGRAMNAME.  
READ REPORT CASTPROGRAMNAME INTO IINCLUDELINES.  

APPEND TABLES TO IKEYWORDS.  

SCAN ABAP-SOURCE IINCLUDELINES TOKENS INTO ITOKENS WITH INCLUDES STATEMENTS INTO ISTATEMENTS KEYWORDS FROM IKEYWORDS.  
CLEAR IINCLUDELINES[].  

SORT ITOKENS ASCENDING BY STR.  
DELETE ITOKENS WHERE STR TABLES.  

LOOP AT ITOKENS.    
IF NOT CUSTOMERONLY IS INITIAL.      
TRY.          
IF ( ITOKENS-STR+0(1) <> 'Y' OR ITOKENS-STR+0(1) <> 'Z' OR ITOKENS-STR NS CUSTOMERNAMERANGE ).            
CONTINUE.          
ENDIF.        
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.      
ENDTRY.    
ENDIF.    WADICTIONARY

-TABLENAME = ITOKENS-STR.
*   Don't append the object if we already have it listed    
READ TABLE ILOCDICTIONARY INTO WADICTIONARYCOMPARISON WITH KEY TABLENAME = WADICTIONARY-TABLENAME.    
IF SY-SUBRC <> 0.      
PERFORM FINDTABLEDESCRIPTION USING WADICTIONARY-TABLENAME                                         WADICTIONARY
-TABLETITLE.      

PERFORM FINDTABLEDEFINITION USING WADICTIONARY-TABLENAME                                        WADICTIONARY
-ISTRUCTURE[].      

APPEND WADICTIONARY TO ILOCDICTIONARY.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                 "scanForTables

*-------------------------------------------------------------------------------------------------------
*  findProgramScreenFlow...
*-------------------------------------------------------------------------------------------------------
FORM FINDPROGRAMSCREENFLOW USING WAPROGRAM TYPE TPROGRAM.  

DATA: IFLOW TYPE STANDARD TABLE OF TSCREENFLOW WITH HEADER LINE.  

CALL FUNCTION 'DYNPRO_PROCESSINGLOGIC'    
EXPORTING      REP_NAME  
= WAPROGRAM-PROGNAME    
TABLES      SCR_LOGIC 
= IFLOW.  

SORT IFLOW ASCENDING BY SCREEN.  
DELETE ADJACENT DUPLICATES FROM IFLOW COMPARING SCREEN.  
IF WAPROGRAM-SUBC <> 'M'.    
DELETE IFLOW WHERE SCREEN >= '1000' AND SCREEN <= '1099'.  
ENDIF.  

LOOP AT IFLOW.    
APPEND IFLOW TO WAPROGRAM-ISCREENFLOW.  
ENDLOOP.
ENDFORM.                                                                          "findProgramScreenFlow

*-------------------------------------------------------------------------------------------------------
*  findFunctionScreenFlow...
*-------------------------------------------------------------------------------------------------------
FORM FINDFUNCTIONSCREENFLOW USING WAFUNCTION TYPE TFUNCTION.  

DATA: IFLOW TYPE STANDARD TABLE OF TSCREENFLOW WITH HEADER LINE.  

CALL FUNCTION 'DYNPRO_PROCESSINGLOGIC'    
EXPORTING      REP_NAME  
= WAFUNCTION-PROGNAME    
TABLES      SCR_LOGIC 
= IFLOW.  

SORT IFLOW ASCENDING BY SCREEN.  
DELETE ADJACENT DUPLICATES FROM IFLOW COMPARING SCREEN.  

LOOP AT IFLOW.    
APPEND IFLOW TO WAFUNCTION-ISCREENFLOW.  
ENDLOOP.
ENDFORM.                                                                          "findFunctionScreenFlow

*-------------------------------------------------------------------------------------------------------
* scanForLikeOrType... Look for any dictionary objects referenced by a like or type statement
*-------------------------------------------------------------------------------------------------------
FORM SCANFORLIKEORTYPE USING VALUE(PROGRAMNAME)                             
VALUE(CUSTOMERONLY)                             
VALUE(CUSTOMERNAMERANGE)                             ILOCDICTIONARY 
LIKE IDICTIONARY[].  

DATA ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: HEAD TYPE STRING.  
DATA: TAIL TYPE STRING.  
DATA: JUNK TYPE STRING.  
DATA: LINETYPE TYPE STRING.  
DATA: LINELENGTH TYPE VALUE 0.  
DATA: ENDOFLINE TYPE VALUE TRUE.  
DATA: WADICTIONARY TYPE TDICTTABLE.  
DATA: WADICTIONARYCOMPARISON TYPE TDICTTABLE.  
DATA: WALINE TYPE STRING.  
DATA: CASTPROGRAMNAME TYPE PROGRAM.

* Read the program code from the textpool.  CASTPROGRAMNAME 
= PROGRAMNAME.  
READ REPORT CASTPROGRAMNAME INTO ILINES.  

LOOP AT ILINES INTO WALINE.
*   Find custom tables.    LINELENGTH 
STRLEN( WALINE ).    
IF LINELENGTH > 0.      
IF WALINE(1= ASTERIX.        
CONTINUE.      
ENDIF.      

TRANSLATE WALINE TO UPPER CASE.

*   Determine the lineType.      
IF ENDOFLINE = TRUE.        
SHIFT WALINE UP TO LIKE.        
IF SY-SUBRC 0.          LINETYPE 
LIKE.        
ELSE.          
SHIFT WALINE UP TO TYPE.          
IF SY-SUBRC 0.            
FIND 'BEGIN OF' IN WALINE.            
IF SY-SUBRC <> 0.              
FIND 'END OF' IN WALINE.              
IF SY-SUBRC <> 0.                
FIND 'VALUE' IN WALINE.                
IF SY-SUBRC <> 0.                  LINETYPE 
TYPE.                
ENDIF.              
ENDIF.            
ENDIF.          
ELSE.            
SHIFT WALINE UP TO INCLUDE.            
IF SY-SUBRC 0.              
SPLIT WALINE AT SPACE INTO JUNK ILINES.            
ENDIF.            

SHIFT WALINE UP TO STRUCTURE.            
IF SY-SUBRC 0.              LINETYPE 
STRUCTURE.            
ELSE.              
CONTINUE.            
ENDIF.          
ENDIF.        
ENDIF.      
ELSE.        LINETYPE 
= COMMA.      
ENDIF.      

CASE LINETYPE.        
WHEN LIKE OR TYPE OR STRUCTURE.
*         Work on the appropriate lineType          
SHIFT WALINE UP TO SPACE.          
SHIFT WALINE LEFT DELETING LEADING SPACE.          
IF WALINE CS TABLE.            
SPLIT WALINE AT TABLE INTO HEAD TAIL.            
SPLIT TAIL AT 'OF' INTO HEAD TAIL.            WALINE 
= TAIL.            
SHIFT WALINE LEFT DELETING LEADING SPACE.          
ENDIF.

*         Are we only to download SAP dictionary structures.          
IF NOT CUSTOMERONLY IS INITIAL.            
TRY.                
IF WALINE+0(1'Y' OR WALINE+0(1'Z' OR WALINE CS CUSTOMERNAMERANGE.                
ELSE.                  LINETYPE 
''.                  
CONTINUE.                
ENDIF.              
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.            
ENDTRY.          
ENDIF.          

IF WALINE CS COMMA.            
SPLIT WALINE AT COMMA INTO HEAD TAIL.            
IF WALINE CS DASH.              
SPLIT HEAD AT DASH INTO HEAD TAIL.            
ENDIF.            
IF WALINE CS OCCURS.              
SPLIT WALINE AT SPACE INTO HEAD TAIL.            
ENDIF.          
ELSE.            
IF WALINE CS PERIOD.              
SPLIT WALINE AT PERIOD INTO HEAD TAIL.              
IF WALINE CS DASH.                
SPLIT HEAD AT DASH INTO HEAD TAIL.              
ENDIF.              
IF WALINE CS OCCURS.                
SPLIT WALINE AT SPACE INTO HEAD TAIL.              
ENDIF.            
ELSE.              
SPLIT WALINE AT SPACE INTO HEAD TAIL.              
IF WALINE CS DASH.                
SPLIT HEAD AT DASH INTO HEAD TAIL.              
ENDIF.            
ENDIF.          
ENDIF.          

IF NOT HEAD IS INITIAL.            WADICTIONARY
-TABLENAME = HEAD.
*           Don't append the object if we already have it listed            
READ TABLE ILOCDICTIONARY INTO WADICTIONARYCOMPARISON                                      
WITH KEY TABLENAME = WADICTIONARY-TABLENAME.            
IF SY-SUBRC <> 0.              
PERFORM FINDTABLEDESCRIPTION USING WADICTIONARY-TABLENAME                                                 WADICTIONARY
-TABLETITLE.              

PERFORM FINDTABLEDEFINITION USING WADICTIONARY-TABLENAME                                                WADICTIONARY
-ISTRUCTURE[].

*             Only append if the item is a table and not a structure or data element              
IF NOT WADICTIONARY-ISTRUCTURE[] IS INITIAL.                
APPEND WADICTIONARY TO ILOCDICTIONARY.              
ENDIF.            
ENDIF.            
CLEAR WADICTIONARY.          
ENDIF.          LINETYPE 

''.      
ENDCASE.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                              "scanForLikeOrType

*-------------------------------------------------------------------------------------------------------
*  displayStatus...
*-------------------------------------------------------------------------------------------------------
FORM DISPLAYSTATUS USING VALUE(MESSAGE)                         
VALUE(DELAY).  

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'    
EXPORTING      PERCENTAGE 
0      
TEXT       MESSAGE    
EXCEPTIONS      
OTHERS     1.  

IF DELAY > 0.    
WAIT UP TO DELAY SECONDS.  
ENDIF.
ENDFORM.                                                                                  "displayStatus

*-------------------------------------------------------------------------------------------------------
*  removeLeadingZeros...
*-------------------------------------------------------------------------------------------------------
FORM REMOVELEADINGZEROS CHANGING MYVALUE.  

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'    
EXPORTING      
INPUT  = MYVALUE    
IMPORTING      
OUTPUT = MYVALUE    
EXCEPTIONS      
OTHERS 1.
ENDFORM.                                                                             "removeLeadingZeros

*-------------------------------------------------------------------------------------------------------
* determineFrontendOPSystem.... Determine the frontend operating system type.
*-------------------------------------------------------------------------------------------------------
FORM DETERMINEFRONTENDOPSYSTEM USING SEPARATOR                                     OPERATINGSYSTEM
.  

DATA: PLATFORMID TYPE VALUE 0.  

CREATE OBJECT OBJFILE.  

CALL METHOD OBJFILE->GET_PLATFORM    RECEIVING      PLATFORM             

= PLATFORMID    
EXCEPTIONS      CNTL_ERROR           
1      ERROR_NO_GUI         
2      NOT_SUPPORTED_BY_GUI 
3.  
CASE PLATFORMID.    
WHEN OBJFILE->PLATFORM_WINDOWS95         
OR OBJFILE->PLATFORM_WINDOWS98         
OR OBJFILE->PLATFORM_NT351         
OR OBJFILE->PLATFORM_NT40         
OR OBJFILE->PLATFORM_NT50         
OR OBJFILE->PLATFORM_MAC         
OR OBJFILE->PLATFORM_OS2         
OR 14.      "XP      SEPARATOR 
'\'.      OPERATINGSYSTEM 
= NON_UNIX.    
WHEN OTHERS.      SEPARATOR 
'/'.      OPERATINGSYSTEM 
= UNIX.  
ENDCASE.
ENDFORM.                                                                      "determineFrontendOpSystem

*-------------------------------------------------------------------------------------------------------
* determineServerOPSystem.... Determine the server operating system type.
*-------------------------------------------------------------------------------------------------------
FORM DETERMINESERVEROPSYSTEM USING SEPARATOR                                   SERVERFILESYSTEM                                   SERVEROPSYSTEM

.

* Find the file system  
SELECT SINGLE FILESYS                
FROM OPSYSTEM                
INTO SERVERFILESYSTEM                
WHERE OPSYS = SY-OPSYS.  

FIND 'WINDOWS' IN SERVERFILESYSTEM IGNORING CASE.  
IF SY-SUBRC 0.    SEPARATOR 
'\'.    SERVEROPSYSTEM 
= NON_UNIX.  
ELSE.    
FIND 'DOS' IN SERVERFILESYSTEM IGNORING CASE.    
IF SY-SUBRC 0.      SEPARATOR 
'\'.      SERVEROPSYSTEM 
= NON_UNIX.    
ELSE.      SEPARATOR 
'/'.      SERVEROPSYSTEM 
= UNIX.    
ENDIF.  
ENDIF.
ENDFORM.                                                                        "determineServerOpSystem

*-------------------------------------------------------------------------------------------------------
* findExternalCommand.... Determine if the external command exists.  If it doesn't then disable the
*                         server input field
*-------------------------------------------------------------------------------------------------------
FORM FINDEXTERNALCOMMAND.  

CALL FUNCTION 'SXPG_COMMAND_CHECK'    
EXPORTING      COMMANDNAME       
'ZMKDIR'      OPERATINGSYSTEM   
= SY-OPSYS    
EXCEPTIONS      COMMAND_NOT_FOUND 
1      
OTHERS            0.  

IF SY-SUBRC <> 0.    
LOOP AT SCREEN.      
IF SCREEN-NAME 'PLOGICAL'.        
SCREEN-INPUT 0.        
MODIFY SCREEN.      
ENDIF.      

IF SCREEN-NAME 'PSERV'.        
SCREEN-INPUT 0.        
MODIFY SCREEN.      
ENDIF.      

IF SCREEN-NAME 'PPC'.        
SCREEN-INPUT 0.        
MODIFY SCREEN.      
ENDIF.    
ENDLOOP.    

MESSAGE S000(OOWITH 'Download to server disabled,' 'external command ZMKDIR not defined.'.  
ENDIF.
ENDFORM.                    "findExternalCommand

********************************************************************************************************
*****************************************DOWNLOAD ROUTINES**********************************************
********************************************************************************************************

*-------------------------------------------------------------------------------------------------------
* downloadDDStructures... download database objects to file
*-------------------------------------------------------------------------------------------------------
FORM DOWNLOADDDSTRUCTURES USING ILOCDICTIONARY LIKE IDICTIONARY[]                                
VALUE(PATHNAME)                                
VALUE(HTMLFILEEXTENSION)                                
VALUE(SUBDIR)                                
VALUE(SORTTABLESASC)                                
VALUE(SLASHSEPARATOR)                                
VALUE(SAVETOSERVER)                                
VALUE(DISPLAYPROGRESSMESSAGE).  

FIELD-SYMBOLS: <WADICTIONARY> TYPE TDICTTABLE.  
DATA: TABLEFILENAME TYPE STRING.  
DATA: TABLEFILENAMEWITHPATH TYPE STRING.  
DATA: IHTMLTABLE TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

LOOP AT ILOCDICTIONARY ASSIGNING <WADICTIONARY>.    
PERFORM BUILDFILENAME USING PATHNAME                                SUBDIR                                <WADICTIONARY>

-TABLENAME                                SPACE                                SPACE                                HTMLFILEEXTENSION                                IS_TABLE                                SAVETOSERVER                                SLASHSEPARATOR                                TABLEFILENAMEWITHPATH                                TABLEFILENAME                                NEWSUBDIRECTORY                                COMPLETESAVEPATH









.

*   Try and import a converted table to memory as it will be much quicker than converting it again    
IMPORT IHTMLTABLE FROM MEMORY ID <WADICTIONARY>-TABLENAME.    
IF SY-SUBRC <> 0.      
CONCATENATE 'Converting table' <WADICTIONARY>-TABLENAME 'to html' INTO STATUSBARMESSAGE SEPARATED BY SPACE.      
PERFORM DISPLAYSTATUS USING STATUSBARMESSAGE 0.      

PERFORM CONVERTDDTOHTML USING <WADICTIONARY>-ISTRUCTURE[]                                    IHTMLTABLE[]                                    <WADICTIONARY>

-TABLENAME                                    <WADICTIONARY>
-TABLETITLE                                    SORTTABLESASC
.      

EXPORT IHTMLTABLE TO MEMORY ID <WADICTIONARY>-TABLENAME.    
ENDIF.    

IF SAVETOSERVER IS INITIAL.      
PERFORM SAVEFILETOPC USING IHTMLTABLE[]                                 TABLEFILENAMEWITHPATH                                 TABLEFILENAME                                 SPACE                                 SPACE                                 DISPLAYPROGRESSMESSAGE




.    
ELSE.      
PERFORM SAVEFILETOSERVER USING IHTMLTABLE[]                                     TABLEFILENAMEWITHPATH                                     TABLEFILENAME                                     COMPLETESAVEPATH                                     DISPLAYPROGRESSMESSAGE



.    
ENDIF.    

CLEAR IHTMLTABLE[].  
ENDLOOP.
ENDFORM.                                                                           "downloadDDStructures

*-------------------------------------------------------------------------------------------------------
* downloadMessageClass...
*-------------------------------------------------------------------------------------------------------
FORM DOWNLOADMESSAGECLASS USING ILOCMESSAGES LIKE IMESSAGES[]                                
VALUE(MESSAGECLASSNAME)                                
VALUE(USERFILEPATH)                                
VALUE(FILEEXTENSION)                                
VALUE(HTMLFILEFLAG)                                      SUBDIR                                

VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                
VALUE(CUSTOMERNAMERANGE)                                
VALUE(GETINCLUDES)                                
VALUE(GETDICTSTRUCTURES)                                
VALUE(USERHASSELECTEDMESSAGECLASSES)                                
VALUE(SLASHSEPARATOR)                                
VALUE(SAVETOSERVER)                                
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: HTMLPAGENAME TYPE STRING.  
DATA: NEWFILENAMEONLY TYPE STRING.  
DATA: NEWFILENAMEWITHPATH TYPE STRING.  
DATA: IHTMLTABLE TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

PERFORM APPENDMESSAGESTOFILE USING ILOCMESSAGES[]                                     IHTMLTABLE[]                                     USERHASSELECTEDMESSAGECLASSES

.  


CONCATENATE `message class ` MESSAGECLASSNAME INTO HTMLPAGENAME.  

IF HTMLFILEFLAG IS INITIAL.    
APPEND '' TO IHTMLTABLE.    
APPEND  '----------------------------------------------------------------------------------' TO IHTMLTABLE.    

PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                     IHTMLTABLE
.    
APPEND IHTMLTABLE.  
ELSE.    
PERFORM CONVERTCODETOHTML USING IHTMLTABLE[]                                    HTMLPAGENAME                                    SPACE                                    IS_MESSAGECLASS                                    



''                                    FALSE                                    SYNTAXHIGHLIGHTCOMMENTS                                    FILEEXTENSION                                    CUSTOMERNAMERANGE                                    GETINCLUDES                                    GETDICTSTRUCTURES





.  
ENDIF.  

PERFORM BUILDFILENAME USING USERFILEPATH                              SUBDIR                              MESSAGECLASSNAME                              SPACE                              SPACE                              FILEEXTENSION                              IS_MESSAGECLASS                              SAVETOSERVER                              SLASHSEPARATOR                              NEWFILENAMEWITHPATH                              NEWFILENAMEONLY                              NEWSUBDIRECTORY                              COMPLETESAVEPATH











.  

IF SAVETOSERVER IS INITIAL.    
PERFORM SAVEFILETOPC USING IHTMLTABLE[]                               NEWFILENAMEWITHPATH                               NEWFILENAMEONLY                               SPACE                               SPACE                               DISPLAYPROGRESSMESSAGE




.  
ELSE.
*     Save the file to the SAP server    
PERFORM SAVEFILETOSERVER USING IHTMLTABLE[]                                   NEWFILENAMEWITHPATH                                   NEWFILENAMEONLY                                   COMPLETESAVEPATH                                   DISPLAYPROGRESSMESSAGE



.  
ENDIF.
ENDFORM.                                                                          "downloadMessageClass

*-------------------------------------------------------------------------------------------------------
*  appendMessagesToFile
*-------------------------------------------------------------------------------------------------------
FORM APPENDMESSAGESTOFILE USING ILOCMESSAGES LIKE IMESSAGES[]                                ILOCHTML 
LIKE DUMIHTML[]                                
VALUE(USERHASSELECTEDMESSAGECLASSES).  

DATA: PREVIOUSMESSAGEID LIKE IMESSAGES-ARBGB.  
FIELD-SYMBOLS: <WAMESSAGE> TYPE TMESSAGE.  
DATA: WAHTML TYPE STRING.  

SORT ILOCMESSAGES ASCENDING BY ARBGB MSGNR.  

IF NOT ILOCMESSAGES[] IS INITIAL.    
IF USERHASSELECTEDMESSAGECLASSES IS INITIAL.
*     Only add these extra lines if we are actually appending them to the end of some program code      
APPEND WAHTML TO ILOCHTML.      
APPEND WAHTML TO ILOCHTML.      

APPEND '*Messages' TO ILOCHTML.      
APPEND '*----------------------------------------------------------' TO ILOCHTML.    
ENDIF.    

LOOP AT ILOCMESSAGES ASSIGNING <WAMESSAGE>.      
IF ( <WAMESSAGE>-ARBGB <> PREVIOUSMESSAGEID ).        

IF USERHASSELECTEDMESSAGECLASSES IS INITIAL.
*         Only add this extra lines if we are actually appending them to the end of some program code          
APPEND '*' TO ILOCHTML.          
CONCATENATE `* Message class: ` <WAMESSAGE>-ARBGB INTO WAHTML.          
APPEND WAHTML TO ILOCHTML.        
ENDIF.        PREVIOUSMESSAGEID 

= <WAMESSAGE>-ARBGB.        
CLEAR WAHTML.      
ENDIF.      

IF USERHASSELECTEDMESSAGECLASSES IS INITIAL.
*       Only add this extra lines if we are actually appending them to the end of some program code        
CONCATENATE '*' <WAMESSAGE>-MSGNR `   ` <WAMESSAGE>-TEXT INTO WAHTML.      
ELSE.        
CONCATENATE <WAMESSAGE>-MSGNR `   ` <WAMESSAGE>-TEXT INTO WAHTML.      
ENDIF.      

APPEND WAHTML TO ILOCHTML.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                           "appendMessagesToFile

*-------------------------------------------------------------------------------------------------------
*  downloadFunctions...       Download function modules to file.
*-------------------------------------------------------------------------------------------------------
FORM DOWNLOADFUNCTIONS USING ILOCFUNCTIONS LIKE IFUNCTIONS[]                             
VALUE(USERFILEPATH)                             
VALUE(FILEEXTENSION)                             
VALUE(SUBDIR)                             
VALUE(DOWNLOADDOCUMENTATION)                             
VALUE(CONVERTTOHTML)                             
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                             
VALUE(CUSTOMERNAMERANGE)                             
VALUE(GETINCLUDES)                             
VALUE(GETDICTSTRUCT)                             
VALUE(TEXTFILEEXTENSION)                             
VALUE(HTMLFILEEXTENSION)                             
VALUE(SORTTABLESASC)                             
VALUE(SLASHSEPARATOR)                             
VALUE(SAVETOSERVER)                             
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: MAINSUBDIR TYPE STRING.  
DATA: INCSUBDIR TYPE STRING.  
FIELD-SYMBOLS: <WAFUNCTION> TYPE TFUNCTION.  
FIELD-SYMBOLS: <WAINCLUDE> TYPE TINCLUDE.  
DATA: IEMPTYTEXTELEMENTS TYPE STANDARD TABLE OF TTEXTTABLE.  
DATA: IEMPTYSELECTIONTEXTS TYPE STANDARD TABLE OF TTEXTTABLE.  
DATA: IEMPTYMESSAGES TYPE STANDARD TABLE OF TMESSAGE.  
DATA: IEMPTYGUITITLES TYPE STANDARD TABLE OF TGUITITLE.  
DATA: FUNCTIONDOCUMENTATIONEXISTS TYPE VALUE FALSE.  

LOOP AT ILOCFUNCTIONS ASSIGNING <WAFUNCTION>.    
IF SUBDIR IS INITIAL.      INCSUBDIR 
= <WAFUNCTION>-FUNCTIONNAME.      MAINSUBDIR 
''.    
ELSE.      
CONCATENATE SUBDIR <WAFUNCTION>-FUNCTIONNAME INTO INCSUBDIR SEPARATED BY SLASHSEPARATOR.      MAINSUBDIR 
= SUBDIR.    
ENDIF.    

IF NOT DOWNLOADDOCUMENTATION IS INITIAL.      
PERFORM DOWNLOADFUNCTIONDOCS USING <WAFUNCTION>-FUNCTIONNAME                                         <WAFUNCTION>
-FUNCTIONTITLE                                         USERFILEPATH                                         FILEEXTENSION                                         CONVERTTOHTML                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE                                         MAINSUBDIR                                         FUNCTIONDOCUMENTATIONEXISTS







.    
ENDIF.

*   Download main source code    
PERFORM READFUNCTIONANDDOWNLOAD USING <WAFUNCTION>-ITEXTELEMENTS[]                                          <WAFUNCTION>
-ISELECTIONTEXTS[]                                          <WAFUNCTION>
-IMESSAGES[]                                          <WAFUNCTION>
-FUNCTIONNAME                                          <WAFUNCTION>
-FUNCTIONMAININCLUDE                                          <WAFUNCTION>
-FUNCTIONTITLE                                          USERFILEPATH                                          FILEEXTENSION                                          MAINSUBDIR                                          CONVERTTOHTML                                          FUNCTIONDOCUMENTATIONEXISTS                                          SYNTAXHIGHLIGHTCOMMENTS                                          CUSTOMERNAMERANGE                                          GETINCLUDES                                          GETDICTSTRUCT                                          SLASHSEPARATOR                                          SAVETOSERVER                                          DISPLAYPROGRESSMESSAGE











.

*   Download top include    
PERFORM READINCLUDEANDDOWNLOAD USING IEMPTYTEXTELEMENTS[]                                         IEMPTYSELECTIONTEXTS[]                                         IEMPTYMESSAGES[]                                         IEMPTYGUITITLES[]                                         <WAFUNCTION>



-TOPINCLUDENAME                                         <WAFUNCTION>
-FUNCTIONNAME                                         <WAFUNCTION>
-FUNCTIONTITLE                                         IS_FUNCTION                                         USERFILEPATH                                         FILEEXTENSION                                         MAINSUBDIR                                         CONVERTTOHTML                                         SYNTAXHIGHLIGHTCOMMENTS                                         CUSTOMERNAMERANGE                                         GETINCLUDES                                         GETDICTSTRUCT                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE











.

*   Download screens.    
IF NOT <WAFUNCTION>-ISCREENFLOW[] IS INITIAL.      
PERFORM DOWNLOADSCREENS USING <WAFUNCTION>-ISCREENFLOW[]                                    <WAFUNCTION>
-PROGNAME                                    USERFILEPATH                                    TEXTFILEEXTENSION                                    MAINSUBDIR                                    SLASHSEPARATOR                                    SAVETOSERVER                                    DISPLAYPROGRESSMESSAGE





.    
ENDIF.

*   Download GUI titles    
IF NOT <WAFUNCTION>-IGUITITLE[] IS INITIAL.      
PERFORM DOWNLOADGUITITLES USING <WAFUNCTION>-IGUITITLE                                      USERFILEPATH                                      TEXTFILEEXTENSION                                      MAINSUBDIR                                      SLASHSEPARATOR                                      SAVETOSERVER                                      DISPLAYPROGRESSMESSAGE





.    
ENDIF.

*   Download all other includes    
LOOP AT <WAFUNCTION>-IINCLUDES ASSIGNING <WAINCLUDE>.      
PERFORM READINCLUDEANDDOWNLOAD USING IEMPTYTEXTELEMENTS[]                                           IEMPTYSELECTIONTEXTS[]                                           IEMPTYMESSAGES[]                                           IEMPTYGUITITLES[]                                           <WAINCLUDE>



-INCLUDENAME                                           SPACE                                           <WAINCLUDE>

-INCLUDETITLE                                           IS_PROGRAM                                           USERFILEPATH                                           FILEEXTENSION                                           INCSUBDIR                                           CONVERTTOHTML                                           SYNTAXHIGHLIGHTCOMMENTS                                           CUSTOMERNAMERANGE                                           GETINCLUDES                                           GETDICTSTRUCT                                           SLASHSEPARATOR                                           SAVETOSERVER                                           DISPLAYPROGRESSMESSAGE











.    

ENDLOOP.

*   Download all dictionary structures    
IF NOT <WAFUNCTION>-IDICTSTRUCT[] IS INITIAL.      
PERFORM DOWNLOADDDSTRUCTURES USING <WAFUNCTION>-IDICTSTRUCT[]                                         USERFILEPATH                                         HTMLFILEEXTENSION                                         INCSUBDIR                                         SORTTABLESASC                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE






.    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                              "downloadFunctions

*-------------------------------------------------------------------------------------------------------
*   readIcludeAndDownload...
*-------------------------------------------------------------------------------------------------------
FORM READINCLUDEANDDOWNLOAD USING ILOCTEXTELEMENTS LIKE DUMITEXTTAB[]                                  ILOCSELECTIONTEXTS 
LIKE DUMITEXTTAB[]                                  ILOCMESSAGES 
LIKE IMESSAGES[]                                  ILOCGUITITLES 
LIKE DUMIGUITITLE[]                                  
VALUE(PROGRAMNAME)                                  
VALUE(FUNCTIONNAME)                                  
VALUE(SHORTTEXT)                                  
VALUE(OVERIDEPROGTYPE)                                  
VALUE(USERFILEPATH)                                  
VALUE(FILEEXTENSION)                                  
VALUE(ADDITIONALSUBDIR)                                  
VALUE(CONVERTTOHTML)                                  
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                  
VALUE(CUSTOMERNAMERANGE)                                  
VALUE(GETINCLUDES)                                  
VALUE(GETDICTSTRUCTURES)                                  
VALUE(SLASHSEPARATOR)                                  
VALUE(SAVETOSERVER)                                  
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LOCALFILENAMEWITHPATH TYPE STRING.  
DATA: LOCALFILENAMEONLY TYPE STRING.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: OBJECTNAME TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

READ REPORT PROGRAMNAME INTO ILINES.

* Download GUI titles for main program  
IF NOT ILOCGUITITLES[] IS INITIAL.    
PERFORM APPENDGUITITLES USING ILOCGUITITLES[]                                  ILINES[]
.  
ENDIF.

* Download text elements for main program  
IF NOT ILOCTEXTELEMENTS[] IS INITIAL.    
PERFORM APPENDTEXTELEMENTS USING ILOCTEXTELEMENTS[]                                     ILINES[]
.  
ENDIF.

* Download selection texts for main program  
IF NOT ILOCSELECTIONTEXTS[] IS INITIAL.    
PERFORM APPENDSELECTIONTEXTS USING ILOCSELECTIONTEXTS[]                                       ILINES[]
.  
ENDIF.

* Download messages classes for main program.  
IF NOT ILOCMESSAGES[] IS INITIAL.    
PERFORM APPENDMESSAGESTOFILE USING ILOCMESSAGES[]                                       ILINES[]                                       SPACE

.  
ENDIF.  

IF CONVERTTOHTML IS INITIAL.    
APPEND '' TO ILINES.    
APPEND '----------------------------------------------------------------------------------' TO ILINES.    
PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                     ILINES
.    
APPEND ILINES.  
ELSE.    
PERFORM CONVERTCODETOHTML USING ILINES[]                                    PROGRAMNAME                                    SHORTTEXT                                    OVERIDEPROGTYPE                                    SPACE                                    SPACE                                    SYNTAXHIGHLIGHTCOMMENTS                                    FILEEXTENSION                                    CUSTOMERNAMERANGE                                    GETINCLUDES                                    GETDICTSTRUCTURES









.  
ENDIF.  

IF FUNCTIONNAME IS INITIAL.    OBJECTNAME 
= PROGRAMNAME.  
ELSE.    OBJECTNAME 
= FUNCTIONNAME.  
ENDIF.  

PERFORM BUILDFILENAME USING USERFILEPATH                              ADDITIONALSUBDIR                              OBJECTNAME                              SPACE                              PROGRAMNAME                              FILEEXTENSION                              OVERIDEPROGTYPE                              SAVETOSERVER                              SLASHSEPARATOR                              LOCALFILENAMEWITHPATH                              LOCALFILENAMEONLY                              NEWSUBDIRECTORY                              COMPLETESAVEPATH











.  

IF SAVETOSERVER IS INITIAL.    
PERFORM SAVEFILETOPC USING ILINES[]                               LOCALFILENAMEWITHPATH                               LOCALFILENAMEONLY                               SPACE                               SPACE                               DISPLAYPROGRESSMESSAGE




.  
ELSE.    
PERFORM SAVEFILETOSERVER USING ILINES[]                                   LOCALFILENAMEWITHPATH                                   LOCALFILENAMEONLY                                   COMPLETESAVEPATH                                   DISPLAYPROGRESSMESSAGE



.  
ENDIF.
ENDFORM.                                                                         "readIncludeAndDownload

*-------------------------------------------------------------------------------------------------------
*   readClassAndDownload...
*-------------------------------------------------------------------------------------------------------
FORM READCLASSANDDOWNLOAD USING WALOCCLASS TYPE TCLASS                                
VALUE(CLASSNAME)                                
VALUE(FUNCTIONNAME)                                
VALUE(OVERIDEPROGTYPE)                                
VALUE(USERFILEPATH)                                
VALUE(FILEEXTENSION)                                
VALUE(ADDITIONALSUBDIR)                                
VALUE(CONVERTTOHTML)                                
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                
VALUE(CUSTOMERNAMERANGE)                                
VALUE(GETINCLUDES)                                
VALUE(GETDICTSTRUCTURES)                                
VALUE(SLASHSEPARATOR)                                
VALUE(SAVETOSERVER)                                
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: ITEMPLINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LOCALFILENAMEWITHPATH TYPE STRING.  
DATA: LOCALFILENAMEONLY TYPE STRING.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: OBJECTNAME TYPE STRING.  
DATA: CASTCLASSNAME TYPE PROGRAM.  
DATA: COMPLETESAVEPATH TYPE STRING.

* Build up attribute comments  
APPEND '**************************************************************************' TO ILINES.  
APPEND '*   Class attributes.                                                    *' TO ILINES.  
APPEND '**************************************************************************' TO ILINES.  
CASE WALOCCLASS-EXPOSURE.    
WHEN 0.      
APPEND `Instantiation: Private` TO ILINES.    
WHEN 1.      
APPEND `Instantiation: Protected` TO ILINES.    
WHEN 2.      
APPEND `Instantiation: Public` TO ILINES.  
ENDCASE.  
CONCATENATE `Message class: ` WALOCCLASS-MSG_ID INTO ILINES.  
APPEND ILINES.  
CASE WALOCCLASS-STATE.    
WHEN 0.      
APPEND `State: Only Modelled` TO ILINES.    
WHEN 1.      
APPEND `State: Implemented` TO ILINES.  
ENDCASE.  
CONCATENATE `Final Indicator: ` WALOCCLASS-CLSFINAL INTO ILINES.  
APPEND ILINES.  
CONCATENATE `R/3 Release: ` WALOCCLASS-R3RELEASE INTO ILINES.  
APPEND ILINES.  
CLEAR ILINES.  
APPEND ILINES.  CASTCLASSNAME 

= WALOCCLASS-PUBLICCLASSKEY.  
READ REPORT CASTCLASSNAME INTO ITEMPLINES.  
IF SY-SUBRC 0.    
PERFORM REFORMATCLASSCODE USING ITEMPLINES[].    

APPEND '**************************************************************************' TO ILINES.    
APPEND '*   Public section of class.                                             *' TO ILINES.    
APPEND '**************************************************************************' TO ILINES.    
LOOP AT ITEMPLINES.      
APPEND ITEMPLINES TO ILINES.    
ENDLOOP.  
ENDIF.  CASTCLASSNAME 

= WALOCCLASS-PRIVATECLASSKEY.  
READ REPORT CASTCLASSNAME INTO ITEMPLINES.  
IF SY-SUBRC 0.    
PERFORM REFORMATCLASSCODE USING ITEMPLINES[].    

APPEND ILINES.    
APPEND '**************************************************************************' TO ILINES.    
APPEND '*   Private section of class.                                            *' TO ILINES.    
APPEND '**************************************************************************' TO ILINES.    
LOOP AT ITEMPLINES.      
APPEND ITEMPLINES TO ILINES.    
ENDLOOP.  
ENDIF.  CASTCLASSNAME 

= WALOCCLASS-PROTECTEDCLASSKEY.  
READ REPORT CASTCLASSNAME INTO ITEMPLINES.  
IF SY-SUBRC 0.    
PERFORM REFORMATCLASSCODE USING ITEMPLINES[].    

APPEND ILINES.    
APPEND '**************************************************************************' TO ILINES.    
APPEND '*   Protected section of class.                                          *' TO ILINES.    
APPEND '**************************************************************************' TO ILINES.    
LOOP AT ITEMPLINES.      
APPEND ITEMPLINES TO ILINES.    
ENDLOOP.  
ENDIF.  CASTCLASSNAME 

= WALOCCLASS-TYPESCLASSKEY.  
READ REPORT CASTCLASSNAME INTO ITEMPLINES.  
IF SY-SUBRC 0.    
APPEND ILINES.    
APPEND '**************************************************************************' TO ILINES.    
APPEND '*   Types section of class.                                              *' TO ILINES.    
APPEND '**************************************************************************' TO ILINES.    
LOOP AT ITEMPLINES.      
APPEND ITEMPLINES TO ILINES.    
ENDLOOP.  
ENDIF.

* Download text elements for this class  
IF NOT WALOCCLASS-ITEXTELEMENTS[] IS INITIAL.    
PERFORM APPENDTEXTELEMENTS USING WALOCCLASS-ITEXTELEMENTS[]                                     ILINES[]
.  
ENDIF.

* Download messages classes for this class.  
IF NOT WALOCCLASS-IMESSAGES[] IS INITIAL.    
PERFORM APPENDMESSAGESTOFILE USING WALOCCLASS-IMESSAGES[]                                       ILINES[]                                       SPACE

.  
ENDIF.

* Download exception texts for this class  
IF NOT WALOCCLASS-ICONCEPTS[] IS INITIAL.    
PERFORM APPENDEXCEPTIONTEXTS USING WALOCCLASS-ICONCEPTS[]                                       ILINES[]
.  
ENDIF.  


IF CONVERTTOHTML IS INITIAL.    
APPEND '' TO ILINES.    
APPEND '----------------------------------------------------------------------------------' TO ILINES.    
PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                     ILINES
.    
APPEND ILINES.  
ELSE.    
PERFORM CONVERTCLASSTOHTML USING ILINES[]                                    CLASSNAME                                    WALOCCLASS

-DESCRIPT                                    OVERIDEPROGTYPE                                    SYNTAXHIGHLIGHTCOMMENTS                                    FILEEXTENSION                                    CUSTOMERNAMERANGE                                    GETDICTSTRUCTURES




.  
ENDIF.  

IF FUNCTIONNAME IS INITIAL.    OBJECTNAME 
= CLASSNAME.  
ELSE.    OBJECTNAME 
= FUNCTIONNAME.  
ENDIF.  

PERFORM BUILDFILENAME USING USERFILEPATH                              ADDITIONALSUBDIR                              OBJECTNAME                              SPACE                              CLASSNAME                              FILEEXTENSION                              OVERIDEPROGTYPE                              SAVETOSERVER                              SLASHSEPARATOR                              LOCALFILENAMEWITHPATH                              LOCALFILENAMEONLY                              NEWSUBDIRECTORY                              COMPLETESAVEPATH











.  

IF SAVETOSERVER IS INITIAL.    
PERFORM SAVEFILETOPC USING ILINES[]                               LOCALFILENAMEWITHPATH                               LOCALFILENAMEONLY                               SPACE                               SPACE                               DISPLAYPROGRESSMESSAGE




.  
ELSE.    
PERFORM SAVEFILETOSERVER USING ILINES[]                                   LOCALFILENAMEWITHPATH                                   LOCALFILENAMEONLY                                   COMPLETESAVEPATH                                   DISPLAYPROGRESSMESSAGE



.  
ENDIF.
ENDFORM.                                                                           "readClassAndDownload

*-------------------------------------------------------------------------------------------------------
*   readMethodAndDownload...
*-------------------------------------------------------------------------------------------------------
FORM READMETHODANDDOWNLOAD USING WALOCMETHOD TYPE TMETHOD                                
VALUE(METHODNAME)                                
VALUE(METHODKEY)                                
VALUE(FUNCTIONNAME)                                
VALUE(OVERIDEPROGTYPE)                                
VALUE(USERFILEPATH)                                
VALUE(FILEEXTENSION)                                
VALUE(ADDITIONALSUBDIR)                                
VALUE(CONVERTTOHTML)                                
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                
VALUE(CUSTOMERNAMERANGE)                                
VALUE(GETINCLUDES)                                
VALUE(GETDICTSTRUCTURES)                                
VALUE(SLASHSEPARATOR)                                
VALUE(SAVETOSERVER)                                
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: ITEMPLINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LOCALFILENAMEWITHPATH TYPE STRING.  
DATA: LOCALFILENAMEONLY TYPE STRING.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: OBJECTNAME TYPE STRING.  
DATA: CASTMETHODKEY TYPE PROGRAM.  
DATA: COMPLETESAVEPATH TYPE STRING.

* Add the method scope to the downloaded file  
APPEND '**************************************************************************' TO ILINES.  
APPEND '*   Method attributes.                                                   *' TO ILINES.  
APPEND '**************************************************************************' TO ILINES.  
CASE WALOCMETHOD-EXPOSURE.    
WHEN 0.      
APPEND `Instantiation: Private` TO ILINES.    
WHEN 1.      
APPEND `Instantiation: Protected` TO ILINES.    
WHEN 2.      
APPEND `Instantiation: Public` TO ILINES.  
ENDCASE.  
APPEND '**************************************************************************' TO ILINES.  
APPEND '' TO ILINES.  CASTMETHODKEY 

= WALOCMETHOD-METHODKEY.  
READ REPORT CASTMETHODKEY INTO ITEMPLINES.  
LOOP AT ITEMPLINES.    
APPEND ITEMPLINES TO ILINES.  
ENDLOOP.  

IF CONVERTTOHTML IS INITIAL.    
APPEND '' TO ILINES.    
APPEND '----------------------------------------------------------------------------------' TO ILINES.    
PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                     ILINES
.    
APPEND ILINES.  
ELSE.    
PERFORM CONVERTCODETOHTML USING ILINES[]                                    METHODNAME                                    WALOCMETHOD

-DESCRIPT                                    OVERIDEPROGTYPE                                    SPACE                                    SPACE                                    SYNTAXHIGHLIGHTCOMMENTS                                    FILEEXTENSION                                    CUSTOMERNAMERANGE                                    GETINCLUDES                                    GETDICTSTRUCTURES








.  
ENDIF.  

IF FUNCTIONNAME IS INITIAL.    OBJECTNAME 
= METHODNAME.  
ELSE.    OBJECTNAME 
= FUNCTIONNAME.  
ENDIF.  

PERFORM BUILDFILENAME USING USERFILEPATH                              ADDITIONALSUBDIR                              OBJECTNAME                              SPACE                              METHODNAME                              FILEEXTENSION                              OVERIDEPROGTYPE                              SAVETOSERVER                              SLASHSEPARATOR                              LOCALFILENAMEWITHPATH                              LOCALFILENAMEONLY                              NEWSUBDIRECTORY                              COMPLETESAVEPATH











.  

IF SAVETOSERVER IS INITIAL.    
PERFORM SAVEFILETOPC USING ILINES[]                               LOCALFILENAMEWITHPATH                               LOCALFILENAMEONLY                               SPACE                               SPACE                               DISPLAYPROGRESSMESSAGE




.  
ELSE.    
PERFORM SAVEFILETOSERVER USING ILINES[]                                   LOCALFILENAMEWITHPATH                                   LOCALFILENAMEONLY                                   COMPLETESAVEPATH                                   DISPLAYPROGRESSMESSAGE



.  
ENDIF.
ENDFORM.                                                                          "readMethodAndDownload

*-------------------------------------------------------------------------------------------------------
*   readFunctionAndDownload...
*-------------------------------------------------------------------------------------------------------
FORM READFUNCTIONANDDOWNLOAD USING ILOCTEXTELEMENTS LIKE DUMITEXTTAB[]                                   ILOCSELECTIONTEXTS 
LIKE DUMITEXTTAB[]                                   ILOCMESSAGES 
LIKE IMESSAGES[]                                   
VALUE(FUNCTIONNAME)                                   
VALUE(FUNCTIONINTERNALNAME)                                   
VALUE(SHORTTEXT)                                   
VALUE(USERFILEPATH)                                   
VALUE(FILEEXTENSION)                                   
VALUE(SUBDIR)                                   
VALUE(CONVERTTOHTML)                                   
VALUE(FUNCTIONDOCUMENTATIONEXISTS)                                   
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                   
VALUE(CUSTOMERNAMERANGE)                                   
VALUE(GETINCLUDES)                                   
VALUE(GETDICTSTRUCTURES)                                   
VALUE(SLASHSEPARATOR)                                   
VALUE(SAVETOSERVER)                                   
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LOCALFILENAMEWITHPATH TYPE STRING.  
DATA: LOCALFILENAMEONLY TYPE STRING.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

READ REPORT FUNCTIONINTERNALNAME INTO ILINES.

* If we found any text elements for this function then we ought to append them to the main include.  
IF NOT ILOCTEXTELEMENTS[] IS INITIAL.    
PERFORM APPENDTEXTELEMENTS USING ILOCTEXTELEMENTS[]                                     ILINES[]
.  
ENDIF.

* If we found any message classes for this function then we ought to append them to the main include.  
IF NOT ILOCMESSAGES[] IS INITIAL.    
PERFORM APPENDMESSAGESTOFILE USING ILOCMESSAGES[]                                       ILINES[]                                       SPACE

.  
ENDIF.  

IF CONVERTTOHTML IS INITIAL.    
APPEND '' TO ILINES.    
APPEND '----------------------------------------------------------------------------------' TO ILINES.    
PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                     ILINES
.    
APPEND ILINES.  
ELSE.    
PERFORM CONVERTFUNCTIONTOHTML USING ILINES[]                                        FUNCTIONNAME                                        SHORTTEXT                                        IS_FUNCTION                                        FUNCTIONDOCUMENTATIONEXISTS                                        TRUE                                        SYNTAXHIGHLIGHTCOMMENTS                                        FILEEXTENSION                                        CUSTOMERNAMERANGE                                        GETINCLUDES                                        GETDICTSTRUCTURES









.  
ENDIF.  

PERFORM BUILDFILENAME USING USERFILEPATH                              SUBDIR                              FUNCTIONNAME                              SPACE                              SPACE                              FILEEXTENSION                              IS_FUNCTION                              SAVETOSERVER                              SLASHSEPARATOR                              LOCALFILENAMEWITHPATH                              LOCALFILENAMEONLY                              NEWSUBDIRECTORY                              COMPLETESAVEPATH











.  

IF SAVETOSERVER IS INITIAL.    
PERFORM SAVEFILETOPC USING ILINES[]                               LOCALFILENAMEWITHPATH                               LOCALFILENAMEONLY                               SPACE                               SPACE                               DISPLAYPROGRESSMESSAGE




.  
ELSE.    
PERFORM SAVEFILETOSERVER USING ILINES[]                                   LOCALFILENAMEWITHPATH                                   LOCALFILENAMEONLY                                   COMPLETESAVEPATH                                   DISPLAYPROGRESSMESSAGE



.  
ENDIF.
ENDFORM.                                                                        "readFunctionAndDownload

*-------------------------------------------------------------------------------------------------------
*  buildFilename...
*-------------------------------------------------------------------------------------------------------
FORM BUILDFILENAME USING VALUE(USERPATH)                         
VALUE(ADDITIONALSUBDIRECTORY)                         
VALUE(OBJECTNAME)                         
VALUE(MAINFUNCTIONNO)                         
VALUE(INCLUDENAME)                         
VALUE(FILEEXTENSION)                         
VALUE(DOWNLOADTYPE)                         
VALUE(DOWNLOADTOSERVER)                         
VALUE(SLASHSEPARATOR)                               NEWFILENAMEWITHPATH                               NEWFILENAMEONLY                               NEWSUBDIRECTORY                               COMPLETEPATH



.

* If we are running on a non UNIX environment we will need to remove forward slashes from the additional path.  
IF DOWNLOADTOSERVER IS INITIAL.    
IF FRONTENDOPSYSTEM = NON_UNIX.      
IF NOT ADDITIONALSUBDIRECTORY IS INITIAL.        
TRANSLATE ADDITIONALSUBDIRECTORY USING '/_'.        
IF ADDITIONALSUBDIRECTORY+0(1'_'.          
SHIFT ADDITIONALSUBDIRECTORY LEFT BY PLACES.        
ENDIF.      
ENDIF.    
ENDIF.  
ELSE.    
IF SERVEROPSYSTEM = NON_UNIX.      
IF NOT ADDITIONALSUBDIRECTORY IS INITIAL.        
TRANSLATE ADDITIONALSUBDIRECTORY USING '/_'.        
IF ADDITIONALSUBDIRECTORY+0(1'_'.          
SHIFT ADDITIONALSUBDIRECTORY LEFT BY PLACES.        
ENDIF.      
ENDIF.    
ENDIF.  
ENDIF.  

CASE DOWNLOADTYPE.
*   Programs    
WHEN IS_PROGRAM.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME PERIOD FILEEXTENSION INTO NEWFILENAMEWITHPATH.        
CONCATENATE USERPATH SLASHSEPARATOR INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR OBJECTNAME PERIOD FILEEXTENSION 
INTO NEWFILENAMEWITHPATH.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY INTO COMPLETEPATH.      
ENDIF.

*   Function Modules    
WHEN IS_FUNCTION.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
FIND 'top' IN INCLUDENAME IGNORING CASE.        
IF SY-SUBRC 0.          
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                               SLASHSEPARATOR 
'Global-' OBJECTNAME                               PERIOD FILEEXTENSION                               

INTO NEWFILENAMEWITHPATH.        
ELSE.          
IF INCLUDENAME CS MAINFUNCTIONNO AND NOT MAINFUNCTIONNO IS INITIAL.            
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                                 SLASHSEPARATOR OBJECTNAME                                 PERIOD FILEEXTENSION                                 


INTO NEWFILENAMEWITHPATH.          
ELSE.            
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                                 SLASHSEPARATOR OBJECTNAME                                 PERIOD FILEEXTENSION                                 


INTO NEWFILENAMEWITHPATH.          
ENDIF.        
ENDIF.        NEWSUBDIRECTORY 
= OBJECTNAME.        
CONCATENATE USERPATH SLASHSEPARATOR INTO COMPLETEPATH.      
ELSE.        
FIND 'top' IN INCLUDENAME IGNORING CASE.        
IF SY-SUBRC 0.          
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                               SLASHSEPARATOR OBJECTNAME                               SLASHSEPARATOR 

'Global-' OBJECTNAME                               PERIOD FILEEXTENSION                               

INTO NEWFILENAMEWITHPATH.        
ELSE.          
IF INCLUDENAME CS MAINFUNCTIONNO AND NOT MAINFUNCTIONNO IS INITIAL.            
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                                 SLASHSEPARATOR OBJECTNAME                                 SLASHSEPARATOR OBJECTNAME                                 PERIOD FILEEXTENSION                                 



INTO NEWFILENAMEWITHPATH.          
ELSE.            
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                                 SLASHSEPARATOR OBJECTNAME                                 SLASHSEPARATOR OBJECTNAME                                 PERIOD FILEEXTENSION                                 



INTO NEWFILENAMEWITHPATH.          
ENDIF.        
ENDIF.        
CONCATENATE ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.

*   Table definition    
WHEN IS_TABLE.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 
'Dictionary-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 

'Dictionary-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.

*   Program & Function documentation    
WHEN IS_DOCUMENTATION.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 
'Docs-'                             OBJECTNAME PERIOD                             FILEEXTENSION                             


INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 

'Docs-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.

*   Screens    
WHEN IS_SCREEN.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR 'Screens'                             SLASHSEPARATOR 
'screen_'                             OBJECTNAME PERIOD                             FILEEXTENSION 

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR 'screens' INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR 'screens' INTO COMPLETEPATH.      

ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR 
'Screens'                             SLASHSEPARATOR 
'screen_'                             OBJECTNAME PERIOD                             FILEEXTENSION 

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR 'screens' INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR 'screens' INTO COMPLETEPATH.      
ENDIF.

*   GUI title    
WHEN IS_GUITITLE.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR 'Screens'                             SLASHSEPARATOR 
'gui_title_'                             OBJECTNAME PERIOD                             FILEEXTENSION 

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR 'screens' INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR 'screens' INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR 
'Screens'                             SLASHSEPARATOR 
'gui_title_'                             OBJECTNAME PERIOD                             FILEEXTENSION 

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR 'Screens' INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR 'Screens' INTO COMPLETEPATH.      
ENDIF.

*   Message Class    
WHEN IS_MESSAGECLASS.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 
'Message class-'                             OBJECTNAME PERIOD                             FILEEXTENSION                             


INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 

'Message class-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.

*   Class definition    
WHEN IS_CLASS.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 
'Class-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR OBJECTNAME                             SLASHSEPARATOR 

'Class-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.

*   Class definition    
WHEN IS_METHOD.      
IF ADDITIONALSUBDIRECTORY IS INITIAL.        
CONCATENATE USERPATH SLASHSEPARATOR 'Method-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ELSE.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY                             SLASHSEPARATOR 
'Method-'                             OBJECTNAME PERIOD FILEEXTENSION                             

INTO NEWFILENAMEWITHPATH.        

CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO NEWSUBDIRECTORY.        
CONCATENATE USERPATH SLASHSEPARATOR ADDITIONALSUBDIRECTORY SLASHSEPARATOR OBJECTNAME INTO COMPLETEPATH.      
ENDIF.  
ENDCASE.  

TRANSLATE COMPLETEPATH TO LOWER CASE.  
CONCATENATE OBJECTNAME PERIOD FILEEXTENSION INTO NEWFILENAMEONLY.  
TRANSLATE NEWFILENAMEONLY TO LOWER CASE.  
TRANSLATE NEWFILENAMEWITHPATH TO LOWER CASE.  
TRANSLATE NEWSUBDIRECTORY TO LOWER CASE.

* If we are running on a non UNIX environment we will need to remove incorrect characters from the filename.  
IF DOWNLOADTOSERVER IS INITIAL.    
IF FRONTENDOPSYSTEM = NON_UNIX.      
TRANSLATE NEWFILENAMEONLY USING '/_'.      
TRANSLATE NEWFILENAMEWITHPATH USING '/_'.      
TRANSLATE NEWFILENAMEONLY USING '< '.      
TRANSLATE NEWFILENAMEWITHPATH USING '< '.      
TRANSLATE NEWFILENAMEONLY USING '> '.      
TRANSLATE NEWFILENAMEWITHPATH USING '> '.      
TRANSLATE NEWFILENAMEONLY USING '? '.      
TRANSLATE NEWFILENAMEWITHPATH USING '? '.      
TRANSLATE NEWFILENAMEONLY USING '| '.      
TRANSLATE NEWFILENAMEWITHPATH USING '| '.      
CONDENSE NEWFILENAMEONLY NO-GAPS.      
CONDENSE NEWFILENAMEWITHPATH NO-GAPS.    
ENDIF.  
ELSE.    
IF SERVEROPSYSTEM = NON_UNIX.      
TRANSLATE NEWFILENAMEONLY USING '/_'.      
TRANSLATE NEWFILENAMEWITHPATH USING '/_'.      
TRANSLATE NEWFILENAMEONLY USING '< '.      
TRANSLATE NEWFILENAMEWITHPATH USING '< '.      
TRANSLATE NEWFILENAMEONLY USING '> '.      
TRANSLATE NEWFILENAMEWITHPATH USING '> '.      
TRANSLATE NEWFILENAMEONLY USING '? '.      
TRANSLATE NEWFILENAMEWITHPATH USING '? '.      
TRANSLATE NEWFILENAMEONLY USING '| '.      
TRANSLATE NEWFILENAMEWITHPATH USING '| '.      
CONDENSE NEWFILENAMEONLY NO-GAPS.      
CONDENSE NEWFILENAMEWITHPATH NO-GAPS.    
ENDIF.  
ENDIF.
ENDFORM.                                                                                 "buildFilename

*-------------------------------------------------------------------------------------------------------
*  saveFileToPc...    write an internal table to a file on the local PC
*-------------------------------------------------------------------------------------------------------
FORM SAVEFILETOPC USING IDOWNLOAD TYPE STANDARD TABLE                        
VALUE(FILENAMEWITHPATH)                        
VALUE(FILENAME)                        
VALUE(WRITEFIELDSEPARATOR)                        
VALUE(TRUNCATETRAILINGBLANKS)                        
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: STATUSMESSAGE TYPE STRING.  
DATA: OBJFILE TYPE REF TO CL_GUI_FRONTEND_SERVICES.  
DATA: STRSUBRC TYPE STRING.  

IF NOT DISPLAYPROGRESSMESSAGE IS INITIAL.    
CONCATENATE `Downloading: ` FILENAME INTO STATUSMESSAGE.    
PERFORM DISPLAYSTATUS USING STATUSMESSAGE 0.  
ENDIF.  

CREATE OBJECT OBJFILE.  
CALL METHOD OBJFILE->GUI_DOWNLOAD    
EXPORTING      FILENAME                
= FILENAMEWITHPATH      FILETYPE                
'ASC'      WRITE_FIELD_SEPARATOR   
= WRITEFIELDSEPARATOR      TRUNC_TRAILING_BLANKS   
= TRUNCATETRAILINGBLANKS    
CHANGING      DATA_TAB                
= IDOWNLOAD[]    
EXCEPTIONS      FILE_WRITE_ERROR        
1      NO_BATCH                
2      GUI_REFUSE_FILETRANSFER 
3      INVALID_TYPE            
4      NO_AUTHORITY            
5      UNKNOWN_ERROR           
6      HEADER_NOT_ALLOWED      
7      SEPARATOR_NOT_ALLOWED   
8      FILESIZE_NOT_ALLOWED    
9      HEADER_TOO_LONG         
10      DP_ERROR_CREATE         
11      DP_ERROR_SEND           
12      DP_ERROR_WRITE          
13      UNKNOWN_DP_ERROR        
14      ACCESS_DENIED           
15      DP_OUT_OF_MEMORY        
16      DISK_FULL               
17      DP_TIMEOUT              
18      FILE_NOT_FOUND          
19      DATAPROVIDER_EXCEPTION  
20      CONTROL_FLUSH_ERROR     
21      NOT_SUPPORTED_BY_GUI    
22      ERROR_NO_GUI            
23.  

IF SY-SUBRC <> 0.    STRSUBRC 
= SY-SUBRC.    
CONCATENATE `File save error: ` FILENAME ` sy-subrc: ` STRSUBRC INTO STATUSMESSAGE.    
PERFORM DISPLAYSTATUS USING STATUSMESSAGE 3.  
ENDIF.
ENDFORM.                                                                                                  "saveFileToPc

*----------------------------------------------------------------------------------------------------------------------
*  saveFileToServer...    write an internal table to a file on the SAP server
*----------------------------------------------------------------------------------------------------------------------
FORM SAVEFILETOSERVER USING IDOWNLOAD TYPE STANDARD TABLE                            
VALUE(FILENAMEWITHPATH)                            
VALUE(FILENAME)                            
VALUE(PATH)                            
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: WADOWNLOAD TYPE STRING.  
DATA: STATUSMESSAGE TYPE STRING.  

IF NOT DISPLAYPROGRESSMESSAGE IS INITIAL.    
CONCATENATE `Downloading: ` FILENAME INTO STATUSMESSAGE.    
PERFORM DISPLAYSTATUS USING STATUSMESSAGE 0.  
ENDIF.  

READ TABLE ISERVERPATHS WITH KEY TABLE_LINE = PATH.  
IF SY-SUBRC <> 0.    
PERFORM CREATESERVERDIRECTORY USING PATH.    
APPEND PATH TO ISERVERPATHS.  
ENDIF.  

OPEN DATASET FILENAMEWITHPATH FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.  
IF SY-SUBRC 0.    
LOOP AT IDOWNLOAD INTO WADOWNLOAD.      
TRANSFER WADOWNLOAD TO FILENAMEWITHPATH.      
IF SY-SUBRC <> 0.        
MESSAGE E000(OOWITH 'Error transferring data to file'.      
ENDIF.    
ENDLOOP.    

CLOSE DATASET FILENAMEWITHPATH.    
IF SY-SUBRC <> 0.      
MESSAGE E000(OOWITH 'Error closing file'.    
ENDIF.  
ELSE.
*   Unable to create a file    
MESSAGE E000(OOWITH 'Error creating file on SAP server' 'check permissions'.  
ENDIF.
ENDFORM.                                                                                              "saveFileToServer

*----------------------------------------------------------------------------------------------------------------------
* createServerDirectory...
*----------------------------------------------------------------------------------------------------------------------
FORM CREATESERVERDIRECTORY USING VALUE(PATH).

*  Parameters for remove command.  
DATA: PARAM1 TYPE SXPGCOLIST-PARAMETERS.
*  Return status  
DATA: FUNCSTATUS TYPE EXTCMDEXEX-STATUS.
*  Command line listing returned by the function  
DATA: ISERVEROUTPUT TYPE STANDARD TABLE OF BTCXPM.  
DATA: WASERVEROUTPUT TYPE BTCXPM.
*  Targetsystem type conversion variable.  
DATA: TARGET TYPE RFCDISPLAY-RFCHOST.
* Operating system  
DATA: OPERATINGSYSTEM TYPE SXPGCOLIST-OPSYSTEM.
*  Head for split command.  
DATA: HEAD TYPE STRING..  
DATA: TAIL TYPE STRING.  PARAM1 

= PATH.  TARGET 
= SY-HOST.  OPERATINGSYSTEM 
= SY-OPSYS.  

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'    
EXPORTING      COMMANDNAME                   
'ZMKDIR'      ADDITIONAL_PARAMETERS         
= PARAM1      OPERATINGSYSTEM               
= OPERATINGSYSTEM      TARGETSYSTEM                  
= TARGET      STDOUT                        
'X'      STDERR                        
'X'      TERMINATIONWAIT               
'X'    
IMPORTING      STATUS                        
= FUNCSTATUS    
TABLES      EXEC_PROTOCOL                 
= ISERVEROUTPUT[]    
EXCEPTIONS      NO_PERMISSION                 
1      COMMAND_NOT_FOUND             
2      PARAMETERS_TOO_LONG           
3      SECURITY_RISK                 
4      WRONG_CHECK_CALL_INTERFACE    
5      PROGRAM_START_ERROR           
6      PROGRAM_TERMINATION_ERROR     
7      X_ERROR                       
8      PARAMETER_EXPECTED            
9      TOO_MANY_PARAMETERS           
10      ILLEGAL_COMMAND               
11      WRONG_ASYNCHRONOUS_PARAMETERS 
12      CANT_ENQ_TBTCO_ENTRY          
13      JOBCOUNT_GENERATION_ERROR     
14      
OTHERS                        15.  

IF SY-SUBRC 0.
*   Although the function succeded did the external command actually work    
IF FUNCSTATUS 'E'.
*     External command returned with an error      
IF SY-OPSYS CS 'Windows NT'.        
READ TABLE ISERVEROUTPUT INDEX INTO WASERVEROUTPUT.        
IF WASERVEROUTPUT-MESSAGE NS 'already exists'.
*         An error occurred creating the directory on the server          
MESSAGE E000(OOWITH 'An error occurred creating a directory'.        
ENDIF.      
ELSE.        
READ TABLE ISERVEROUTPUT INDEX INTO WASERVEROUTPUT.        
SPLIT WASERVEROUTPUT-MESSAGE AT SPACE INTO HEAD TAIL.        
SHIFT TAIL LEFT DELETING LEADING SPACE.        
IF TAIL <> 'Do not specify an existing file.'.
*         An error occurred creating the directory on the server          
MESSAGE E000(OOWITH 'An error occurred creating a directory'.        
ENDIF.      
ENDIF.    
ENDIF.  
ELSE.    
CASE SY-SUBRC.      
WHEN 1.
*       No permissions to run the command        
MESSAGE E000(OOWITH 'No permissions to run external command ZMKDIR'.      
WHEN 2.
*       External command not found        
MESSAGE E000(OOWITH 'External comand ZMKDIR not found'.      

WHEN OTHERS.
*       Unable to create the directory        
MESSAGE E000(OOWITH 'An error occurred creating a directory'                              
', subrc:'                              SY
-SUBRC.    
ENDCASE.  
ENDIF.
ENDFORM.                                                                                         "createServerDirectory

*----------------------------------------------------------------------------------------------------------------------
* appendTextElements...
*----------------------------------------------------------------------------------------------------------------------
FORM APPENDTEXTELEMENTS USING ILOCTEXTELEMENTS LIKE DUMITEXTTAB[]                              ILOCLINES 
LIKE DUMIHTML[].  

FIELD-SYMBOLS: <WATEXTELEMENT> TYPE TTEXTTABLE.  
DATA: WALINE TYPE STRING.  

IF LINES( ILOCTEXTELEMENTS ) > 0.    
APPEND '' TO ILOCLINES.    

APPEND '*Text elements' TO ILOCLINES.    
APPEND '*----------------------------------------------------------' TO  ILOCLINES.    
LOOP AT ILOCTEXTELEMENTS ASSIGNING <WATEXTELEMENT>.      
CONCATENATE '*  ' <WATEXTELEMENT>-KEY <WATEXTELEMENT>-ENTRY INTO WALINE SEPARATED BY SPACE.      
APPEND WALINE TO ILOCLINES.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                            "appendTextElements

*----------------------------------------------------------------------------------------------------------------------
* appendGUITitles...
*----------------------------------------------------------------------------------------------------------------------
FORM APPENDGUITITLES USING ILOCGUITITLES LIKE DUMIGUITITLE[]                           ILOCLINES 
LIKE DUMIHTML[].  

FIELD-SYMBOLS: <WAGUITITLE> TYPE TGUITITLE.  
DATA: WALINE TYPE STRING.  

IF LINES( ILOCGUITITLES ) > 0.    
APPEND '' TO ILOCLINES.    

APPEND '*GUI Texts' TO ILOCLINES.    
APPEND '*----------------------------------------------------------' TO  ILOCLINES.    
LOOP AT ILOCGUITITLES ASSIGNING <WAGUITITLE>.      
CONCATENATE '*  ' <WAGUITITLE>-OBJ_CODE '-->' <WAGUITITLE>-TEXT INTO WALINE SEPARATED BY SPACE.      
APPEND WALINE TO ILOCLINES.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                               "appendGUITitles

*----------------------------------------------------------------------------------------------------------------------
* appendSelectionTexts...
*----------------------------------------------------------------------------------------------------------------------
FORM APPENDSELECTIONTEXTS USING ILOCSELECTIONTEXTS LIKE DUMITEXTTAB[]                                ILOCLINES 
LIKE DUMIHTML[].  

FIELD-SYMBOLS: <WASELECTIONTEXT> TYPE TTEXTTABLE.  
DATA: WALINE TYPE STRING.  

IF LINES( ILOCSELECTIONTEXTS ) > 0.    
APPEND '' TO ILOCLINES.    
APPEND '' TO ILOCLINES.    

APPEND '*Selection texts' TO ILOCLINES.    
APPEND '*----------------------------------------------------------' TO  ILOCLINES.    
LOOP AT ILOCSELECTIONTEXTS ASSIGNING <WASELECTIONTEXT>.      
CONCATENATE '*  ' <WASELECTIONTEXT>-KEY <WASELECTIONTEXT>-ENTRY INTO WALINE SEPARATED BY SPACE.      
APPEND WALINE TO ILOCLINES.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                          "appendSelectionTexts

*----------------------------------------------------------------------------------------------------------------------
* appendExceptionTexts...
*----------------------------------------------------------------------------------------------------------------------
FORM APPENDEXCEPTIONTEXTS USING ICONCEPTS LIKE DUMICONCEPTS[]                                ILOCLINES 
LIKE DUMIHTML[].  

FIELD-SYMBOLS: <WACONCEPT> TYPE TCONCEPT.  
DATA: WALINE TYPE STRING.  
DATA: CONCEPTTEXT TYPE SOTR_TXT.  

IF LINES( ICONCEPTS ) > 0.    
APPEND '' TO ILOCLINES.    

APPEND '*Exception texts' TO ILOCLINES.    
APPEND '*----------------------------------------------------------' TO  ILOCLINES.    
LOOP AT ICONCEPTS ASSIGNING <WACONCEPT>.
*     Find the text for this concept      
CALL FUNCTION 'SOTR_GET_TEXT_KEY'        
EXPORTING          CONCEPT                
= <WACONCEPT>-CONCEPT          LANGU                  
= SY-LANGU          SEARCH_IN_SECOND_LANGU 
'X'
*         second_langu           = 'DE'        
IMPORTING          E_TEXT                 
= CONCEPTTEXT        
EXCEPTIONS          NO_ENTRY_FOUND         
1          PARAMETER_ERROR        
2          
OTHERS                 3.      

IF SY-SUBRC 0.        
CONCATENATE '*  ' <WACONCEPT>-CONSTNAME '-' CONCEPTTEXT  INTO WALINE SEPARATED BY SPACE.        
APPEND WALINE TO ILOCLINES.      
ENDIF.    
ENDLOOP.  
ENDIF.
ENDFORM.                                                                                          "appendExceptionTexts

*----------------------------------------------------------------------------------------------------------------------
* downloadFunctionDocs...
*----------------------------------------------------------------------------------------------------------------------
FORM DOWNLOADFUNCTIONDOCS USING VALUE(FUNCTIONNAME)                                
VALUE(FUNCTIONDESCRIPTION)                                
VALUE(USERFILEPATH)                                
VALUE(FILEEXTENSION)                                
VALUE(CONVERTTOHTML)                                
VALUE(SLASHSEPARATOR)                                
VALUE(SAVETOSERVER)                                
VALUE(DISPLAYPROGRESSMESSAGE)                                      SUBDIR                                      DOCUMENTATIONDOWNLOADED

.  

DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: IDOCUMENTATION TYPE STANDARD TABLE OF FUNCT WITH HEADER LINE.  
DATA: IEXCEPTIONS TYPE STANDARD TABLE OF RSEXC WITH HEADER LINE.  
DATA: IEXPORT TYPE STANDARD TABLE OF RSEXP WITH HEADER LINE.  
DATA: IPARAMETER TYPE STANDARD TABLE OF RSIMP WITH HEADER LINE.  
DATA: ITABLES TYPE STANDARD TABLE OF RSTBL WITH HEADER LINE.  
DATA: ISCRIPTLINES TYPE STANDARD TABLE OF TLINE WITH HEADER LINE.  
DATA: HTMLPAGENAME TYPE STRING.  
DATA: NEWFILENAMEWITHPATH TYPE STRING.  
DATA: NEWFILENAMEONLY TYPE STRING.  
DATA: OBJECT LIKE DOKHL-OBJECT.  
DATA: STRINGLENGTH TYPE VALUE 0.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: WALINE(255).  
DATA: COMPLETESAVEPATH TYPE STRING.  DOCUMENTATIONDOWNLOADED 

= FALSE.  OBJECT 
= FUNCTIONNAME.  

CALL FUNCTION 'FUNCTION_IMPORT_DOKU'    
EXPORTING      FUNCNAME           
= FUNCTIONNAME    
TABLES      DOKUMENTATION      
= IDOCUMENTATION      EXCEPTION_LIST     
= IEXCEPTIONS      EXPORT_PARAMETER   
= IEXPORT      IMPORT_PARAMETER   
= IPARAMETER      TABLES_PARAMETER   
= ITABLES    
EXCEPTIONS      ERROR_MESSAGE      
1      FUNCTION_NOT_FOUND 
2      INVALID_NAME       
3      
OTHERS             4.  

CALL FUNCTION 'DOCU_GET'    
EXPORTING      
ID                     'FU'      LANGU                  
= SY-LANGU      OBJECT                 
= OBJECT      TYP                    
'T'      VERSION_ACTIVE_OR_LAST 
'L'    
TABLES      
LINE                   = ISCRIPTLINES    
EXCEPTIONS      NO_DOCU_ON_SCREEN      
1      NO_DOCU_SELF_DEF       
2      NO_DOCU_TEMP           
3      RET_CODE               
4      
OTHERS                 5.  

IF SY-SUBRC AND NOT ( ISCRIPTLINES[] IS INITIAL ).    
APPEND 'SHORT TEXT' TO ILINES.    
CONCATENATE SPACE FUNCTIONDESCRIPTION INTO FUNCTIONDESCRIPTION SEPARATED BY SPACE.    
APPEND FUNCTIONDESCRIPTION TO ILINES.    
APPEND SPACE TO ILINES.    
LOOP AT ISCRIPTLINES.      
MOVE ISCRIPTLINES-TDLINE TO ILINES.      
CONCATENATE SPACE ILINES INTO ILINES SEPARATED BY SPACE.      
WHILE ILINES CP '&*' OR ILINES CP '*&'.        
REPLACE '&' INTO ILINES WITH SPACE.        
SHIFT ILINES LEFT DELETING LEADING SPACE.      
ENDWHILE.      
APPEND ILINES.    
ENDLOOP.    

CLEAR ILINES.    
IF NOT ( IDOCUMENTATION[] IS INITIAL ).      
APPEND ILINES.      
APPEND 'PARAMETER DOCUMENTATION' TO ILINES.      
APPEND '-----------------------' TO ILINES.      
APPEND ILINES.      

DESCRIBE FIELD IDOCUMENTATION-PARAMETER LENGTH STRINGLENGTH IN CHARACTER MODE.      STRINGLENGTH 
= STRINGLENGTH + 3.      
LOOP AT IDOCUMENTATION.        
MOVE IDOCUMENTATION-PARAMETER TO WALINE.        
MOVE IDOCUMENTATION-STEXT TO WALINE+STRINGLENGTH.        
APPEND WALINE TO ILINES.      
ENDLOOP.    
ENDIF.    

CONCATENATE `Documentation - ` FUNCTIONNAME INTO HTMLPAGENAME.    

IF CONVERTTOHTML IS INITIAL.      
APPEND ILINES.      
APPEND  '----------------------------------------------------------------------------------' TO ILINES.      
APPEND ILINES.      
PERFORM BUILDFOOTERMESSAGE USING 'TEXT'                                       ILINES
.      
APPEND ILINES.    
ELSE.      
PERFORM CONVERTCODETOHTML USING ILINES[]                                      HTMLPAGENAME                                      SPACE                                      IS_DOCUMENTATION                                      TRUE                                      SPACE                                      SPACE                                      SPACE                                      SPACE                                      SPACE                                      SPACE









.    
ENDIF.    

PERFORM BUILDFILENAME USING USERFILEPATH                                SUBDIR                                FUNCTIONNAME                                SPACE                                SPACE                                FILEEXTENSION                                IS_DOCUMENTATION                                SAVETOSERVER                                SLASHSEPARATOR                                NEWFILENAMEWITHPATH                                NEWFILENAMEONLY                                NEWSUBDIRECTORY                                COMPLETESAVEPATH











.    

IF SAVETOSERVER IS INITIAL.      
PERFORM SAVEFILETOPC USING ILINES[]                                 NEWFILENAMEWITHPATH                                 NEWFILENAMEONLY                                 SPACE                                 SPACE                                 DISPLAYPROGRESSMESSAGE




.    
ELSE.      
PERFORM SAVEFILETOSERVER USING ILINES[]                                     NEWFILENAMEWITHPATH                                     NEWFILENAMEONLY                                     COMPLETESAVEPATH                                     DISPLAYPROGRESSMESSAGE



.    
ENDIF.    DOCUMENTATIONDOWNLOADED 

= TRUE.  
ENDIF.
ENDFORM.                                                                                          "downloadFunctionDocs

*----------------------------------------------------------------------------------------------------------------------
*  downloadScreens...
*----------------------------------------------------------------------------------------------------------------------
FORM DOWNLOADSCREENS USING ILOCSCREENFLOW LIKE DUMISCREEN[]                           
VALUE(PROGRAMNAME)                           
VALUE(USERFILEPATH)                           
VALUE(TEXTFILEEXTENSION)                           
VALUE(SUBDIR)                           
VALUE(SLASHSEPARATOR)                           
VALUE(SAVETOSERVER)                           
VALUE(DISPLAYPROGRESSMESSAGE).  


TABLES: D020T.  
DATAHEADER LIKE D020S.  
DATA: IFIELDS TYPE STANDARD TABLE OF D021S WITH HEADER LINE.  
DATA: IFLOWLOGIC TYPE STANDARD TABLE OF D022S WITH HEADER LINE.  
FIELD-SYMBOLS <WASCREEN> TYPE TSCREENFLOW.  
DATA: WACHARHEADER TYPE SCR_CHHEAD.  
DATA: ISCREENCHAR TYPE STANDARD TABLE OF SCR_CHFLD WITH HEADER LINE.  
DATA: IFIELDSCHAR TYPE STANDARD TABLE OF SCR_CHFLD WITH HEADER LINE.  
DATA: STARS TYPE STRING VALUE '****************************************************************'.  
DATA: COMMENT1 TYPE STRING VALUE '*   This file was generated by Direct Download Enterprise.     *'.  
DATA: COMMENT2 TYPE STRING VALUE '*   Please do not change it manually.                          *'.  
DATA: DYNPROTEXT TYPE STRING VALUE '%_DYNPRO'.  
DATA: HEADERTEXT TYPE STRING VALUE '%_HEADER'.  
DATA: PARAMSTEXT TYPE STRING VALUE '%_PARAMS'.  
DATA: DESCRIPTIONTEXT TYPE STRING VALUE '%_DESCRIPTION'.  
DATA: FIELDSTEXT TYPE STRING VALUE '%_FIELDS'.  
DATA: FLOWLOGICTEXT TYPE STRING VALUE '%_FLOWLOGIC'.  
DATA: PROGRAMLENGTH TYPE STRING.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: NEWFILENAMEWITHPATH TYPE STRING.  
DATA: NEWFILENAMEONLY TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

LOOP AT ILOCSCREENFLOW ASSIGNING <WASCREEN>.    
CALL FUNCTION 'RS_IMPORT_DYNPRO'      
EXPORTING        DYLANG 
= SY-LANGU        DYNAME 
= PROGRAMNAME        DYNUMB 
= <WASCREEN>-SCREEN      
IMPORTING        
HEADER HEADER      
TABLES        FTAB   
= IFIELDS        PLTAB  
= IFLOWLOGIC.    

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

*   Add in the top comments for the file    
APPEND STARS TO ISCREENCHAR .    
APPEND COMMENT1 TO ISCREENCHAR.    
APPEND COMMENT2 TO ISCREENCHAR.    
APPEND STARS TO ISCREENCHAR.

*   Screen identification    
APPEND DYNPROTEXT TO ISCREENCHAR.    
APPEND WACHARHEADER-PROG TO ISCREENCHAR.    
APPEND WACHARHEADER-DNUM TO ISCREENCHAR.    
APPEND SY-SAPRL TO ISCREENCHAR.    
DESCRIBE FIELD D020T-PROG LENGTH PROGRAMLENGTH IN CHARACTER MODE.    
CONCATENATE `                ` PROGRAMLENGTH INTO ISCREENCHAR.    
APPEND ISCREENCHAR.

*   Header    
APPEND HEADERTEXT TO ISCREENCHAR.    
APPEND WACHARHEADER TO ISCREENCHAR.

*   Description text    
APPEND DESCRIPTIONTEXT TO ISCREENCHAR.    
SELECT SINGLE DTXT FROM D020T INTO ISCREENCHAR                       
WHERE PROG = PROGRAMNAME                             
AND DYNR = <WASCREEN>-SCREEN                             
AND LANG = SY-LANGU.    
APPEND ISCREENCHAR.

*   Fieldlist text    
APPEND FIELDSTEXT TO ISCREENCHAR.    

CALL FUNCTION 'RS_SCRP_FIELDS_RAW_TO_CHAR'      
TABLES        FIELDS_INT  
= IFIELDS[]        FIELDS_CHAR 
= IFIELDSCHAR[]      
EXCEPTIONS        
OTHERS      1.    

LOOP AT IFIELDSCHAR.      
MOVE-CORRESPONDING IFIELDSCHAR TO ISCREENCHAR.      
APPEND ISCREENCHAR.    
ENDLOOP.

*   Flowlogic text    
APPEND FLOWLOGICTEXT TO ISCREENCHAR.
*   Flow logic.    
LOOP AT IFLOWLOGIC.      
APPEND IFLOWLOGIC TO ISCREENCHAR.    
ENDLOOP.    

PERFORM BUILDFILENAME USING USERFILEPATH                                SUBDIR                                WACHARHEADER

-DNUM                                SPACE                                SPACE                                TEXTFILEEXTENSION                                IS_SCREEN                                SAVETOSERVER                                SLASHSEPARATOR                                NEWFILENAMEWITHPATH                                NEWFILENAMEONLY                                NEWSUBDIRECTORY                                COMPLETESAVEPATH









.    

IF SAVETOSERVER IS INITIAL.
*     Save the screen to the local computer      
PERFORM SAVEFILETOPC USING ISCREENCHAR[]                                 NEWFILENAMEWITHPATH                                 NEWFILENAMEONLY                                 


'X'                                 
'X'                                 DISPLAYPROGRESSMESSAGE
.    
ELSE.
*     Save the screen to the SAP server      
PERFORM SAVEFILETOSERVER USING ISCREENCHAR[]                                     NEWFILENAMEWITHPATH                                     NEWFILENAMEONLY                                     COMPLETESAVEPATH                                     DISPLAYPROGRESSMESSAGE



.    
ENDIF.    

CLEAR HEADERCLEAR WACHARHEADER.    
CLEAR ISCREENCHAR[].    
CLEAR IFIELDSCHAR[].    
CLEAR IFIELDS[].    
CLEAR IFLOWLOGIC[].  
ENDLOOP.
ENDFORM.                                                                                               "downloadScreens

*----------------------------------------------------------------------------------------------------------------------
*  downloadGUITitles..
*----------------------------------------------------------------------------------------------------------------------
FORM DOWNLOADGUITITLES USING ILOCGUITITLES LIKE DUMIGUITITLE[]                             
VALUE(USERFILEPATH)                             
VALUE(TEXTFILEEXTENSION)                             
VALUE(SUBDIR)                             
VALUE(SLASHSEPARATOR)                             
VALUE(SAVETOSERVER)                             
VALUE(DISPLAYPROGRESSMESSAGE).  

DATA: ILINES TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
FIELD-SYMBOLS: <WAGUITITLE> TYPE TGUITITLE.  
DATA: NEWSUBDIRECTORY TYPE STRING.  
DATA: NEWFILENAMEWITHPATH TYPE STRING.  
DATA: NEWFILENAMEONLY TYPE STRING.  
DATA: COMPLETESAVEPATH TYPE STRING.  

LOOP AT ILOCGUITITLES ASSIGNING <WAGUITITLE>.    
APPEND <WAGUITITLE>-TEXT TO ILINES.    

PERFORM BUILDFILENAME USING USERFILEPATH                                SUBDIR                                <WAGUITITLE>

-OBJ_CODE                                SPACE                                SPACE                                TEXTFILEEXTENSION                                IS_GUITITLE                                SAVETOSERVER                                SLASHSEPARATOR                                NEWFILENAMEWITHPATH                                NEWFILENAMEONLY                                NEWSUBDIRECTORY                                COMPLETESAVEPATH









.    

IF SAVETOSERVER IS INITIAL.      
PERFORM SAVEFILETOPC USING ILINES[]                                 NEWFILENAMEWITHPATH                                 NEWFILENAMEONLY                                 SPACE                                 SPACE                                 DISPLAYPROGRESSMESSAGE




.    
ELSE.      
PERFORM SAVEFILETOSERVER USING ILINES[]                                     NEWFILENAMEWITHPATH                                     NEWFILENAMEONLY                                     COMPLETESAVEPATH                                     DISPLAYPROGRESSMESSAGE



.    
ENDIF.    

CLEAR ILINES[].  
ENDLOOP.
ENDFORM.                                                                                             "downloadGUITitles

*----------------------------------------------------------------------------------------------------------------------
*  downloadPrograms..
*----------------------------------------------------------------------------------------------------------------------
FORM DOWNLOADPROGRAMS USING ILOCPROGRAM LIKE IPROGRAMS[]                            ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                            
VALUE(USERFILEPATH)                            
VALUE(FILEEXTENSION)                            
VALUE(HTMLFILEEXTENSION)                            
VALUE(TEXTFILEEXTENSION)                            
VALUE(CONVERTTOHTML)                            
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                            
VALUE(CUSTOMERNAMERANGE)                            
VALUE(GETINCLUDES)                            
VALUE(GETDICTSTRUCT)                            
VALUE(DOWNLOADDOCUMENTATION)                            
VALUE(SORTTABLESASC)                            
VALUE(SLASHSEPARATOR)                            
VALUE(SAVETOSERVER)                            
VALUE(DISPLAYPROGRESSMESSAGE).  


DATA: IPROGFUNCTIONS TYPE STANDARD TABLE OF TFUNCTION WITH HEADER LINE.  
FIELD-SYMBOLS: <WAPROGRAM> TYPE TPROGRAM.  
FIELD-SYMBOLS: <WAINCLUDE> TYPE TINCLUDE.  
DATA: IEMPTYTEXTELEMENTS TYPE STANDARD TABLE OF TTEXTTABLE.  
DATA: IEMPTYSELECTIONTEXTS TYPE STANDARD TABLE OF TTEXTTABLE.  
DATA: IEMPTYMESSAGES TYPE STANDARD TABLE OF TMESSAGE.  
DATA: IEMPTYGUITITLES TYPE STANDARD TABLE OF TGUITITLE.  
DATA: LOCCONVERTTOHTML(1).  
DATA: LOCFILEEXTENSION TYPE STRING.  

SORT ILOCPROGRAM ASCENDING BY PROGNAME.  

LOOP AT ILOCPROGRAM ASSIGNING <WAPROGRAM>.
*   if the program to download is this program then always download as text otherwise you will get a rubbish file    
IF <WAPROGRAM>-PROGNAME = SY-CPROG.      LOCCONVERTTOHTML 
''.      LOCFILEEXTENSION 
= TEXTEXTENSION.    
ELSE.      LOCCONVERTTOHTML 
= CONVERTTOHTML.      LOCFILEEXTENSION 
= FILEEXTENSION.    
ENDIF.

*   Download the main program    
PERFORM READINCLUDEANDDOWNLOAD USING <WAPROGRAM>-ITEXTELEMENTS[]                                         <WAPROGRAM>
-ISELECTIONTEXTS[]                                         <WAPROGRAM>
-IMESSAGES[]                                         <WAPROGRAM>
-IGUITITLE[]                                         <WAPROGRAM>
-PROGNAME                                         SPACE                                         <WAPROGRAM>

-PROGRAMTITLE                                         IS_PROGRAM                                         USERFILEPATH                                         LOCFILEEXTENSION                                         <WAPROGRAM>



-PROGNAME                                         LOCCONVERTTOHTML                                         SYNTAXHIGHLIGHTCOMMENTS                                         CUSTOMERNAMERANGE                                         GETINCLUDES                                         GETDICTSTRUCT                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE







.

*   Download screens.    
IF NOT <WAPROGRAM>-ISCREENFLOW[] IS INITIAL.      
PERFORM DOWNLOADSCREENS USING <WAPROGRAM>-ISCREENFLOW[]                                    <WAPROGRAM>
-PROGNAME                                    USERFILEPATH                                    TEXTFILEEXTENSION                                    <WAPROGRAM>


-PROGNAME                                    SLASHSEPARATOR                                    SAVETOSERVER                                    DISPLAYPROGRESSMESSAGE


.    
ENDIF.

*   Download GUI titles    
IF NOT <WAPROGRAM>-IGUITITLE[] IS INITIAL.      
PERFORM DOWNLOADGUITITLES USING <WAPROGRAM>-IGUITITLE                                      USERFILEPATH                                      TEXTFILEEXTENSION                                      <WAPROGRAM>


-PROGNAME                                      SLASHSEPARATOR                                      SAVETOSERVER                                      DISPLAYPROGRESSMESSAGE


.    
ENDIF.

*   Download all other includes    
LOOP AT <WAPROGRAM>-IINCLUDES ASSIGNING <WAINCLUDE>.      
PERFORM READINCLUDEANDDOWNLOAD USING IEMPTYTEXTELEMENTS[]                                           IEMPTYSELECTIONTEXTS[]                                           IEMPTYMESSAGES[]                                           IEMPTYGUITITLES[]                                           <WAINCLUDE>



-INCLUDENAME                                           SPACE                                           <WAINCLUDE>

-INCLUDETITLE                                           IS_PROGRAM                                           USERFILEPATH                                           FILEEXTENSION                                           <WAPROGRAM>



-PROGNAME                                           CONVERTTOHTML                                           SYNTAXHIGHLIGHTCOMMENTS                                           CUSTOMERNAMERANGE                                           GETINCLUDES                                           GETDICTSTRUCT                                           SLASHSEPARATOR                                           SAVETOSERVER                                           DISPLAYPROGRESSMESSAGE







.    

ENDLOOP.

*   Download all dictionary structures    
IF NOT <WAPROGRAM>-IDICTSTRUCT[] IS INITIAL.      
PERFORM DOWNLOADDDSTRUCTURES USING <WAPROGRAM>-IDICTSTRUCT[]                                         USERFILEPATH                                         HTMLFILEEXTENSION                                         <WAPROGRAM>


-PROGNAME                                         SORTTABLESASC                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE



.    
ENDIF.

*   Download any functions used by these programs    
LOOP AT ILOCFUNCTIONS INTO IPROGFUNCTIONS WHERE PROGRAMLINKNAME = <WAPROGRAM>-PROGNAME.      
APPEND IPROGFUNCTIONS.    
ENDLOOP.    

IF NOT IPROGFUNCTIONS[] IS INITIAL.      
PERFORM DOWNLOADFUNCTIONS USING IPROGFUNCTIONS[]                                      USERFILEPATH                                      FILEEXTENSION                                      <WAPROGRAM>


-PROGNAME                                      DOWNLOADDOCUMENTATION                                      CONVERTTOHTML                                      SYNTAXHIGHLIGHTCOMMENTS                                      CUSTOMERNAMERANGE                                      GETINCLUDES                                      GETDICTSTRUCT                                      TEXTFILEEXTENSION                                      HTMLFILEEXTENSION                                      SORTTABLESASC                                      SLASHSEPARATOR                                      SAVETOSERVER                                      DISPLAYPROGRESSMESSAGE











.      
CLEAR IPROGFUNCTIONS[].    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                              "downloadPrograms

*----------------------------------------------------------------------------------------------------------------------
*  downloadClasses..
*----------------------------------------------------------------------------------------------------------------------
FORM DOWNLOADCLASSES USING ILOCCLASSES LIKE ICLASSES[]                           ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                           
VALUE(USERFILEPATH)                           
VALUE(FILEEXTENSION)                           
VALUE(HTMLFILEEXTENSION)                           
VALUE(TEXTFILEEXTENSION)                           
VALUE(CONVERTTOHTML)                           
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                           
VALUE(CUSTOMERNAMERANGE)                           
VALUE(GETINCLUDES)                           
VALUE(GETDICTSTRUCT)                           
VALUE(DOWNLOADDOCUMENTATION)                           
VALUE(SORTTABLESASC)                           
VALUE(SLASHSEPARATOR)                           
VALUE(SAVETOSERVER)                           
VALUE(DISPLAYPROGRESSMESSAGE).  


DATA: ICLASSFUNCTIONS TYPE STANDARD TABLE OF TFUNCTION WITH HEADER LINE.  
FIELD-SYMBOLS: <WACLASS> TYPE TCLASS.  
FIELD-SYMBOLS: <WAMETHOD> TYPE TMETHOD.  

SORT ILOCCLASSES ASCENDING BY CLSNAME.  

LOOP AT ILOCCLASSES ASSIGNING <WACLASS>.
*   Download the class    
PERFORM READCLASSANDDOWNLOAD USING <WACLASS>                                        <WACLASS>
-CLSNAME                                        SPACE                                        IS_CLASS                                        USERFILEPATH                                        FILEEXTENSION                                        SPACE                                        CONVERTTOHTML                                        SYNTAXHIGHLIGHTCOMMENTS                                        CUSTOMERNAMERANGE                                        GETINCLUDES                                        GETDICTSTRUCT                                        SLASHSEPARATOR                                        SAVETOSERVER                                        DISPLAYPROGRESSMESSAGE












.


*   Download all of the methods    
LOOP AT <WACLASS>-IMETHODS ASSIGNING <WAMETHOD>.      
PERFORM READMETHODANDDOWNLOAD USING <WAMETHOD>                                          <WAMETHOD>
-CMPNAME                                          <WAMETHOD>
-METHODKEY                                          SPACE                                          IS_METHOD                                          USERFILEPATH                                          FILEEXTENSION                                          <WACLASS>




-CLSNAME                                          CONVERTTOHTML                                          SYNTAXHIGHLIGHTCOMMENTS                                          CUSTOMERNAMERANGE                                          GETINCLUDES                                          GETDICTSTRUCT                                          SLASHSEPARATOR                                          SAVETOSERVER                                          DISPLAYPROGRESSMESSAGE







.    

ENDLOOP.

*   Download all dictionary structures    
IF NOT <WACLASS>-IDICTSTRUCT[] IS INITIAL.      
PERFORM DOWNLOADDDSTRUCTURES USING <WACLASS>-IDICTSTRUCT[]                                         USERFILEPATH                                         HTMLFILEEXTENSION                                         <WACLASS>


-CLSNAME                                         SORTTABLESASC                                         SLASHSEPARATOR                                         SAVETOSERVER                                         DISPLAYPROGRESSMESSAGE



.    
ENDIF.

*   Download any functions used by these programs    
LOOP AT ILOCFUNCTIONS INTO ICLASSFUNCTIONS WHERE PROGRAMLINKNAME = <WACLASS>-CLSNAME.      
APPEND ICLASSFUNCTIONS.    
ENDLOOP.    

IF NOT ICLASSFUNCTIONS[] IS INITIAL.      
PERFORM DOWNLOADFUNCTIONS USING ICLASSFUNCTIONS[]                                      USERFILEPATH                                      FILEEXTENSION                                      <WACLASS>


-CLSNAME                                      DOWNLOADDOCUMENTATION                                      CONVERTTOHTML                                      SYNTAXHIGHLIGHTCOMMENTS                                      CUSTOMERNAMERANGE                                      GETINCLUDES                                      GETDICTSTRUCT                                      TEXTFILEEXTENSION                                      HTMLFILEEXTENSION                                      SORTTABLESASC                                      SLASHSEPARATOR                                      SAVETOSERVER                                      DISPLAYPROGRESSMESSAGE











.      
CLEAR ICLASSFUNCTIONS[].    
ENDIF.  
ENDLOOP.
ENDFORM.                                                                                               "downloadClasses

*----------------------------------------------------------------------------------------------------------------------
*  reFormatClassCode...   Expand a classes public, private and protected section from the 72 characters that the class
*                         builder sets it to back to the wide editor mode
*----------------------------------------------------------------------------------------------------------------------
FORM REFORMATCLASSCODE USING ITEMPLINES LIKE DUMIHTML[].  

FIELD-SYMBOLS: <WALINE> TYPE STRING.  
DATA: NEWLINE TYPE STRING.  
DATA: INEWTABLE TYPE STANDARD TABLE OF STRING.  
DATA: FOUNDONE TYPE VALUE FALSE.  

LOOP AT ITEMPLINES ASSIGNING <WALINE>.    
IF NOT <WALINE> IS INITIAL.      
IF FOUNDONE = FALSE.        
FIND 'data' IN <WALINE> RESPECTING CASE.        
IF SY-SUBRC 0.          FOUNDONE 
= TRUE.        
ENDIF.        

FIND 'constants' IN <WALINE> RESPECTING CASE.        
IF SY-SUBRC 0.          FOUNDONE 
= TRUE.        
ENDIF.        

IF FOUNDONE = TRUE.          NEWLINE 
= <WALINE>.          

IF ( NEWLINE CS '.' OR NEWLINE CS '*' ).            
REPLACE '!' IN <WALINE> WITH ''.            
APPEND NEWLINE TO INEWTABLE.            
CLEAR NEWLINE.            FOUNDONE 
= FALSE.          
ENDIF.        
ELSE.          
REPLACE '!' IN <WALINE> WITH ''.          
APPEND <WALINE> TO INEWTABLE.        
ENDIF.      
ELSE.        
CONCATENATE NEWLINE <WALINE> INTO NEWLINE SEPARATED BY SPACE.        
IF ( NEWLINE CS '.' OR NEWLINE CS '*' ).          
APPEND NEWLINE TO INEWTABLE.          
CLEAR NEWLINE.          FOUNDONE 
= FALSE.        
ENDIF.      
ENDIF.    
ELSE.      
REPLACE '!' IN <WALINE> WITH ''.      
APPEND <WALINE> TO INEWTABLE[].    
ENDIF.  
ENDLOOP.  ITEMPLINES[] 

= INEWTABLE[].
ENDFORM.                                                                             "reFormatClassCode

***********************************************************************************************************************
**********************************************HTML ROUTINES************************************************************
***********************************************************************************************************************

*----------------------------------------------------------------------------------------------------------------------
*  convertDDToHTML...   Convert text description to HTML
*----------------------------------------------------------------------------------------------------------------------
FORM CONVERTDDTOHTML USING ILOCDICTSTRUCTURE LIKE DUMIDICTSTRUCTURE[]                           ILOCHTML 
LIKE DUMIHTML[]                           
VALUE(TABLENAME)                           
VALUE(TABLETITLE)                           
VALUE(SORTTABLESASC).  

DATA: ICOLUMNCAPTIONS TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: WADICTIONARY TYPE TDICTTABLESTRUCTURE.  
DATA: WAHTML TYPE STRING.  
DATATITLE TYPE STRING.  

PERFORM BUILDCOLUMNHEADERS USING ICOLUMNCAPTIONS[].

* Add a html header to the table  
CONCATENATE 'Dictionary object-' TABLENAME INTO TITLE SEPARATED BY SPACE.  
PERFORM ADDHTMLHEADER USING ILOCHTML[]                              
TITLE.  

CONCATENATE '<h2>' TABLENAME '</h2>' INTO WAHTML.  
APPEND WAHTML TO ILOCHTML.  
APPEND '' TO ILOCHTML.  

CONCATENATE '<h3>' TABLETITLE '</h3>' INTO WAHTML.  
APPEND WAHTML TO ILOCHTML.  
APPEND '' TO ILOCHTML.

* Do we need to sort the fields into alphabetical order  
IF NOT SORTTABLESASC IS INITIAL.    
SORT ILOCDICTSTRUCTURE ASCENDING BY FIELDNAME.  
ENDIF.  

PERFORM CONVERTITABTOHTML USING ICOLUMNCAPTIONS[]                                  ILOCDICTSTRUCTURE[]                                  ILOCHTML                                  


'X'                                  COLOUR_BLACK                                  

''                                  COLOUR_YELLOW                                  

''                                  BACKGROUND_COLOUR                                  

'Arial'                                  
'green'                                  
'1'                                  
'1'.

* Add a html footer to the table  
APPEND '<br>' TO ILOCHTML.  
PERFORM ADDHTMLFOOTER USING ILOCHTML[].
ENDFORM.                                                                                               "convertDDToHTML

*----------------------------------------------------------------------------------------------------------------------
*  convertITABtoHtml... produces a html table from an internal table
*----------------------------------------------------------------------------------------------------------------------
FORM CONVERTITABTOHTML USING ILOCHEADER LIKE DUMIHEADER[]                             ILOCDICTSTRUCTURE 
LIKE DUMIDICTSTRUCTURE[]                             ILOCHTML 
LIKE DUMIHTML[]                             
VALUE(INCLUDEROWCOUNT)                             HEADINGBACKCOLOUR                             HEADINGFONTNAME                             HEADINGFONTCOLOUR                             HEADINGFONTSIZE                             BODYBACKCOLOUR                             BODYFONTNAME                             BODYFONTCOLOUR                             BODYFONTSIZE                             BORDERSIZE








.

* Holds one cell from the internal table  
FIELD-SYMBOLS: <FSFIELD>.
* The value of one cell form the internal table  
DATA: WTEXTCELL TYPE STRING.
* work area for putting the CSV value into  
DATA: WACSVTABLE TYPE STRING.
* Have we used any font tags in the html code  
DATA: USEDAFONTATTRIBUTE TYPE VALUE 0.
* Work area for HTML table  
DATA: WAHTML TYPE STRING.
* Loop counter for adding row numbers onto the output table  
DATA: LOOPCOUNTER TYPE STRING.
* Work area for header table  
FIELD-SYMBOLS: <WAHEADER> TYPE STRING.  
FIELD-SYMBOLS: <ILOCDICTSTRUCTURE> TYPE TDICTTABLESTRUCTURE.  

CONCATENATE '<table border="' BORDERSIZE '">' INTO WAHTML.  
APPEND WAHTML TO ILOCHTML.  

IF NOT ILOCHEADER[] IS INITIAL.    
APPEND '<tr>' TO ILOCHTML.  
ENDIF.  

LOOP AT ILOCHEADER ASSIGNING <WAHEADER>.    
IF HEADINGBACKCOLOUR IS INITIAL.      WAHTML 
'<th>'.    
ELSE.      
CONCATENATE '<th bgcolor="' HEADINGBACKCOLOUR '">' INTO WAHTML.    
ENDIF.    

IF NOT HEADINGFONTNAME IS INITIAL OR NOT HEADINGFONTCOLOUR IS INITIAL OR NOT HEADINGFONTSIZE IS INITIAL.      
CONCATENATE WAHTML '<font' INTO WAHTML.

*      Add the font name      
IF NOT HEADINGFONTNAME IS INITIAL.        
CONCATENATE WAHTML ' face ="' INTO WAHTML.        
CONCATENATE WAHTML HEADINGFONTNAME '"' INTO WAHTML.      
ENDIF.

*      Add the font colour      
IF NOT HEADINGFONTCOLOUR IS INITIAL.        
CONCATENATE WAHTML ' color ="' INTO WAHTML.        
CONCATENATE WAHTML HEADINGFONTCOLOUR '"' INTO WAHTML.      
ENDIF.

*      Add the fontsize      
IF NOT HEADINGFONTSIZE IS INITIAL.        
CONCATENATE WAHTML' size ="' INTO WAHTML.        
CONCATENATE WAHTML  HEADINGFONTSIZE '"' INTO WAHTML.      
ENDIF.      

CONCATENATE WAHTML '>' INTO WAHTML.      USEDAFONTATTRIBUTE 
= TRUE.    
ENDIF.

*   Add the caption name    
CONCATENATE WAHTML <WAHEADER> INTO WAHTML.    

IF USEDAFONTATTRIBUTE = TRUE.      
CONCATENATE WAHTML '</font>' INTO WAHTML.      USEDAFONTATTRIBUTE 
= FALSE.    
ENDIF.    

CONCATENATE WAHTML '</th>' INTO WAHTML.    
APPEND WAHTML TO ILOCHTML.  
ENDLOOP.  

APPEND '</tr>' TO ILOCHTML.  
FREE ILOCHEADER.


*  Line item data  
LOOP AT ILOCDICTSTRUCTURE ASSIGNING <ILOCDICTSTRUCTURE>.    LOOPCOUNTER 

= SY-TABIX.    

APPEND '' TO ILOCHTML.    
APPEND '<tr>' TO ILOCHTML.

*   Add the row count    
IF NOT INCLUDEROWCOUNT IS INITIAL.      
IF BODYBACKCOLOUR IS INITIAL.        WAHTML 
'<td>'.      
ELSE.        
CONCATENATE '<td bgcolor="' BODYBACKCOLOUR '">' INTO WAHTML.      
ENDIF.      

IF NOT BODYFONTNAME IS INITIAL OR NOT BODYFONTCOLOUR IS INITIAL OR NOT BODYFONTSIZE IS INITIAL.        
CONCATENATE WAHTML '<font' INTO WAHTML.

*        Add the font name        
IF NOT BODYFONTNAME IS INITIAL.          
CONCATENATE WAHTML ' face ="' INTO WAHTML.          
CONCATENATE WAHTML BODYFONTNAME '"' INTO WAHTML.        
ENDIF.

*        Add the font colour        
IF NOT BODYFONTCOLOUR IS INITIAL.          
CONCATENATE WAHTML ' color ="' INTO WAHTML.          
CONCATENATE WAHTML BODYFONTCOLOUR '"' INTO WAHTML.        
ENDIF.

*        Add the fontsize        
IF NOT BODYFONTSIZE IS INITIAL.          
CONCATENATE WAHTML ' size ="' INTO WAHTML.          
CONCATENATE WAHTML BODYFONTSIZE '"' INTO WAHTML.        
ENDIF.        

CONCATENATE WAHTML '>' INTO WAHTML.        USEDAFONTATTRIBUTE 
= TRUE.      
ENDIF.

*     Add the row number into the table      
CONCATENATE WAHTML LOOPCOUNTER INTO WAHTML.      


IF USEDAFONTATTRIBUTE = TRUE.        
CONCATENATE WAHTML '</font>' INTO WAHTML.        USEDAFONTATTRIBUTE 
= FALSE.      
ENDIF.      

CONCATENATE WAHTML '</td>' INTO WAHTML.      
APPEND WAHTML TO ILOCHTML.    
ENDIF.    

DO.
*     Assign each field in the table to the field symbol      
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <ILOCDICTSTRUCTURE> TO <FSFIELD>.      
IF SY-SUBRC 0.        
MOVE <FSFIELD> TO WTEXTCELL.

*       Cell data processing        
IF BODYBACKCOLOUR IS INITIAL.          WAHTML 
'<td>'.        
ELSE.          
CONCATENATE '<td bgcolor="' BODYBACKCOLOUR '">' INTO WAHTML.        
ENDIF.        

IF NOT BODYFONTNAME IS INITIAL OR NOT BODYFONTCOLOUR IS INITIAL OR NOT BODYFONTSIZE IS INITIAL.          
CONCATENATE WAHTML '<font' INTO WAHTML.

*          Add the font name          
IF NOT BODYFONTNAME IS INITIAL.            
CONCATENATE WAHTML ' face ="' INTO WAHTML.            
CONCATENATE WAHTML BODYFONTNAME '"' INTO WAHTML.          
ENDIF.

*          Add the font colour          
IF NOT BODYFONTCOLOUR IS INITIAL.            
CONCATENATE WAHTML ' color ="' INTO WAHTML.            
CONCATENATE WAHTML BODYFONTCOLOUR '"' INTO WAHTML.          
ENDIF.

*          Add the fontsize          
IF NOT BODYFONTSIZE IS INITIAL.            
CONCATENATE WAHTML ' size ="' INTO WAHTML.            
CONCATENATE WAHTML BODYFONTSIZE '"' INTO WAHTML.          
ENDIF.          

CONCATENATE WAHTML '>' INTO WAHTML.          USEDAFONTATTRIBUTE 
= TRUE.        
ENDIF.

*       Add the caption name        
IF WTEXTCELL IS INITIAL.          
CONCATENATE WAHTML '&nbsp;' INTO WAHTML.        
ELSE.          
CONCATENATE WAHTML WTEXTCELL INTO WAHTML.        
ENDIF.        

IF USEDAFONTATTRIBUTE = TRUE.          
CONCATENATE WAHTML '</font>' INTO WAHTML.          USEDAFONTATTRIBUTE 
= FALSE.        
ENDIF.        

CONCATENATE WAHTML '</td>' INTO WAHTML.        
APPEND WAHTML TO ILOCHTML.      
ELSE.        
EXIT.      
ENDIF.    
ENDDO.    

APPEND '</tr>' TO ILOCHTML.  
ENDLOOP.  

APPEND '</table>' TO ILOCHTML.
ENDFORM.                                                                                             "convertITABtoHtml

*----------------------------------------------------------------------------------------------------------------------
*  convertCodeToHtml... Builds an HTML table based upon a text table.
*----------------------------------------------------------------------------------------------------------------------
FORM CONVERTCODETOHTML USING ICONTENTS LIKE DUMIHTML[]                             
VALUE(PROGRAMNAME)                             
VALUE(SHORTDESCRIPTION)                             
VALUE(SOURCECODETYPE)                             
VALUE(FUNCTIONDOCUMENTATIONEXISTS)                             
VALUE(ISMAINFUNCTIONINCLUDE)                             
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                             
VALUE(HTMLEXTENSION)                             
VALUE(CUSTOMERNAMERANGE)                             
VALUE(GETINCLUDES)                             
VALUE(GETDICTSTRUCTURES).  

DATA: HTMLTABLE TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LISTINGNAME TYPE STRING VALUE 'Code listing for:'.  
DATA: DESCRIPTIONNAME TYPE STRING VALUE `Description: `.  
DATA: HEAD(255).  
DATA: TAIL(255).  
DATA: MYTABIX TYPE SYTABIX.  
DATA: NEXTLINE TYPE SYTABIX.  
DATA: HYPERLINKNAME TYPE STRING.  
DATA: COPYOFCURRENTLINE TYPE STRING.  
DATA: CURRENTLINELENGTH TYPE VALUE 0.  
DATA: COPYLINELENGTH TYPE VALUE 0.  
DATA: IGNOREFUTURELINES TYPE VALUE FALSE.  
DATA: FOUNDASTERIX TYPE VALUE FALSE.  
DATA: LOWERCASELINK TYPE STRING.  
DATA: WANEXTLINE TYPE STRING.  
DATA: WACONTENT(255).

* Add a html header to the table  
PERFORM ADDHTMLHEADER USING HTMLTABLE[]                              PROGRAMNAME
.  

CONCATENATE LISTINGNAME PROGRAMNAME INTO LISTINGNAME SEPARATED BY SPACE.  
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' LISTINGNAME '</b></font>' INTO HTMLTABLE.  
APPEND HTMLTABLE.  

IF NOT SHORTDESCRIPTION IS INITIAL.    
APPEND '<br>' TO HTMLTABLE.    
CONCATENATE DESCRIPTIONNAME SHORTDESCRIPTION INTO DESCRIPTIONNAME SEPARATED BY SPACE.    
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' DESCRIPTIONNAME '</b></font>' INTO HTMLTABLE.    
APPEND HTMLTABLE.  
ENDIF.  HTMLTABLE 

'<hr>'.  
APPEND HTMLTABLE.  HTMLTABLE 

'<pre width="150">'.  
APPEND HTMLTABLE.  

LOOP AT ICONTENTS INTO WACONTENT.    MYTABIX 
= SY-TABIX.    

IF NOT ( ICONTENTS IS INITIAL ).      
WHILE ( WACONTENT CS '<' OR WACONTENT CS '>' ).        
REPLACE '<' IN WACONTENT WITH LT.        
REPLACE '>' IN WACONTENT WITH GT.      
ENDWHILE.      

IF WACONTENT+0(1) <> ASTERIX.        CURRENTLINELENGTH 
STRLEN( WACONTENT ).        COPYOFCURRENTLINE 
= WACONTENT.

*       Don't hyperlink anything for files of type documentation        
IF SOURCECODETYPE <> IS_DOCUMENTATION.
*         Check for any functions to highlight          
IF ( WACONTENT CS CALLFUNCTION AND ( WACONTENT <> 'DESTINATION' ).            NEXTLINE 
= MYTABIX + 1.            
READ TABLE ICONTENTS INTO WANEXTLINE INDEX NEXTLINE.            
TRANSLATE WANEXTLINE TO UPPER CASE.            
IF WANEXTLINE NS 'DESTINATION'.              
SHIFT COPYOFCURRENTLINE LEFT DELETING LEADING SPACE.              COPYLINELENGTH 

STRLEN( COPYOFCURRENTLINE ).              

SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.              
SPLIT TAIL AT SPACE INTO HEAD TAIL.              
SPLIT TAIL AT SPACE INTO HEAD TAIL.
*             Function name is now in head              
TRANSLATE HEAD USING ''' '.              
SHIFT HEAD LEFT DELETING LEADING SPACE.              

TRY.                  
IF HEAD+0(1'Y' OR HEAD+0(1'Z' OR HEAD+0(1'y' OR HEAD+0(1'z' OR HEAD CS CUSTOMERNAMERANGE.
*                 Definately a customer function module                    HYPERLINKNAME 
= HEAD.                    

IF SOURCECODETYPE = IS_FUNCTION.                      COPYOFCURRENTLINE 
'call function <a href ="../'.                    
ELSE.                      COPYOFCURRENTLINE 
'call function <a href ="'.                    
ENDIF.                    LOWERCASELINK 

= HYPERLINKNAME.                    
TRANSLATE LOWERCASELINK TO LOWER CASE.
*                 If we are running on a non UNIX environment we will need to remove forward slashes                    
IF FRONTENDOPSYSTEM = NON_UNIX.                      
TRANSLATE LOWERCASELINK USING '/_'.                    
ENDIF.                    

CONCATENATE COPYOFCURRENTLINE                                LOWERCASELINK     
"hyperlinkName                                
'/'                                LOWERCASELINK     
"hyperlinkName                                PERIOD HTMLEXTENSION 
'">'                                
''''                                HYPERLINKNAME                                

''''                                
'</a>'                                TAIL 
INTO COPYOFCURRENTLINE.

*                 Pad the string back out with spaces                    
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                      
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                      COPYLINELENGTH 
= COPYLINELENGTH + 1.                    
ENDWHILE.                    WACONTENT 

= COPYOFCURRENTLINE.                  
ENDIF.                
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.              
ENDTRY.            
ENDIF.          
ENDIF.        
ENDIF.

*       Check for any customer includes to hyperlink        
IF WACONTENT CS INCLUDE OR WACONTENT CS LOWINCLUDE.          
SHIFT COPYOFCURRENTLINE LEFT DELETING LEADING SPACE.          COPYLINELENGTH 
STRLEN( COPYOFCURRENTLINE ).          

SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.          
SHIFT TAIL LEFT DELETING LEADING SPACE.          

TRY.              
IF ( TAIL+0(1'Y' OR TAIL+0(1'Z' OR TAIL+0(1'y' OR TAIL+0(1'z' OR TAIL CS CUSTOMERNAMERANGE OR TAIL+0(2'mz' OR TAIL+0(2'MZ' )                  
AND NOT GETINCLUDES IS INITIAL AND  TAIL NS STRUCTURE AND TAIL NS LOWSTRUCTURE.

*             Hyperlink for program includes                
CLEAR WACONTENT.                
SHIFT TAIL LEFT DELETING LEADING SPACE.                
SPLIT TAIL AT PERIOD INTO HYPERLINKNAME TAIL.                COPYOFCURRENTLINE 
'include <a href ="'.                LOWERCASELINK 

= HYPERLINKNAME.                
TRANSLATE LOWERCASELINK TO LOWER CASE.

*             If we are running on a non UNIX environment we will need to remove forward slashes                
IF FRONTENDOPSYSTEM = NON_UNIX.                  
TRANSLATE LOWERCASELINK USING '/_'.                
ENDIF.                

CONCATENATE COPYOFCURRENTLINE                            LOWERCASELINK       
"hyperlinkName                            PERIOD HTMLEXTENSION 
'">'                            HYPERLINKNAME                            

'</a>'                            PERIOD TAIL 
INTO COPYOFCURRENTLINE.

*             Pad the string back out with spaces                
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                  
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                  COPYLINELENGTH 
= COPYLINELENGTH + 1.                
ENDWHILE.                WACONTENT 
= COPYOFCURRENTLINE.              
ELSE.                
IF NOT GETDICTSTRUCTURES IS INITIAL.
*              Hyperlink for structure include e.g. "include structure zfred."                  COPYLINELENGTH 
STRLEN( COPYOFCURRENTLINE ).                  
SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.                  
SHIFT TAIL LEFT DELETING LEADING SPACE.                  
SPLIT TAIL AT SPACE INTO HEAD TAIL.                  

TRY.                      
IF TAIL+0(1'Y' OR TAIL+0(1'Z' OR TAIL+0(1'y' OR TAIL+0(1'z' OR TAIL CS CUSTOMERNAMERANGE.                        
CLEAR WACONTENT.                        
SHIFT TAIL LEFT DELETING LEADING SPACE.                        
SPLIT TAIL AT PERIOD INTO HYPERLINKNAME TAIL.                        COPYOFCURRENTLINE 
'include structure <a href ='.                        LOWERCASELINK 

= HYPERLINKNAME.                        
TRANSLATE LOWERCASELINK TO LOWER CASE.
*                  If we are running on a non UNIX environment we will need to remove forward slashes                        
IF FRONTENDOPSYSTEM = NON_UNIX.                          
TRANSLATE LOWERCASELINK USING '/_'.                        
ENDIF.                        

CONCATENATE COPYOFCURRENTLINE                                    
'"'                                    LOWERCASELINK    
"hyperlinkName                                    
'/'                                    
'dictionary-'                                    LOWERCASELINK    
"hyperlinkName                                    PERIOD HTMLEXTENSION                                    

'">'                                    HYPERLINKNAME                                    

'</a>'                                    PERIOD TAIL 
INTO COPYOFCURRENTLINE.

*                  Pad the string back out with spaces                        
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                          
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                          COPYLINELENGTH 
= COPYLINELENGTH + 1.                        
ENDWHILE.                        WACONTENT 
= COPYOFCURRENTLINE.                      
ENDIF.                    
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.                  
ENDTRY.                
ENDIF.              
ENDIF.            
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.          
ENDTRY.        
ENDIF.      
ELSE.        
IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL AND WACONTENT+0(1= ASTERIX.          
CONCATENATE '<font color ="' COMMENT_COLOUR '">' INTO HEAD.          
CONCATENATE HEAD WACONTENT '</font>' INTO TAIL.          WACONTENT 
= TAIL.        
ENDIF.      
ENDIF.      HTMLTABLE 

= WACONTENT.    

ELSE.      HTMLTABLE 
''.    
ENDIF.    
APPEND HTMLTABLE.  
ENDLOOP.  HTMLTABLE 

'</pre>'.  
APPEND HTMLTABLE.

* Add a html footer to the table  
PERFORM ADDHTMLFOOTER USING HTMLTABLE[].  ICONTENTS[] 

= HTMLTABLE[].
ENDFORM.                                                                                             "convertCodeToHtml

*----------------------------------------------------------------------------------------------------------------------
*  convertClassToHtml... Builds an HTML table based upon a text table.
*----------------------------------------------------------------------------------------------------------------------
FORM CONVERTCLASSTOHTML USING ICONTENTS LIKE DUMIHTML[]                              
VALUE(CLASSNAME)                              
VALUE(SHORTDESCRIPTION)                              
VALUE(SOURCECODETYPE)                              
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                              
VALUE(HTMLEXTENSION)                              
VALUE(CUSTOMERNAMERANGE)                              
VALUE(GETDICTSTRUCTURES).  

DATA: HTMLTABLE TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LISTINGNAME TYPE STRING VALUE 'Code listing for class:'.  
DATA: DESCRIPTIONNAME TYPE STRING VALUE `Description: `.  
DATA: MYTABIX TYPE SYTABIX.  
DATA: WACONTENT(255).  
DATA: HEAD TYPE STRING.  
DATA: TAIL TYPE STRING.  
DATA: HYPERLINKNAME TYPE STRING.  
DATA: LOWERCASELINK TYPE STRING.  
DATA: COPYOFCURRENTLINE TYPE STRING.  
DATA: CURRENTLINELENGTH TYPE VALUE 0.  
DATA: COPYLINELENGTH TYPE VALUE 0.

* Add a html header to the table  
PERFORM ADDHTMLHEADER USING HTMLTABLE[]                              CLASSNAME
.  

CONCATENATE LISTINGNAME CLASSNAME INTO LISTINGNAME SEPARATED BY SPACE.  
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' LISTINGNAME '</b></font>' INTO HTMLTABLE.  
APPEND HTMLTABLE.  

IF NOT SHORTDESCRIPTION IS INITIAL.    
APPEND '<br>' TO HTMLTABLE.    
CONCATENATE DESCRIPTIONNAME SHORTDESCRIPTION INTO DESCRIPTIONNAME SEPARATED BY SPACE.    
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' DESCRIPTIONNAME '</b></font>' INTO HTMLTABLE.    
APPEND HTMLTABLE.  
ENDIF.  HTMLTABLE 

'<hr>'.  
APPEND HTMLTABLE.  HTMLTABLE 

'<pre width="150">'.  
APPEND HTMLTABLE.  

LOOP AT ICONTENTS INTO WACONTENT.    MYTABIX 
= SY-TABIX.

*   Comments    
IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL AND WACONTENT+0(1= ASTERIX.      
CONCATENATE '<font color ="' COMMENT_COLOUR '">' INTO HEAD.      
CONCATENATE HEAD WACONTENT '</font>' INTO WACONTENT.      HTMLTABLE 
= WACONTENT.    
ELSE.
*     Smaller than, greater than signs      
IF NOT ( ICONTENTS IS INITIAL ).        
WHILE ( WACONTENT CS '<' OR WACONTENT CS '>' ).          
REPLACE '<' IN WACONTENT WITH LT.          
REPLACE '>' IN WACONTENT WITH GT.        
ENDWHILE.

*       Dictionary structure        
IF NOT GETDICTSTRUCTURES IS INITIAL.          
FIND 'class' IN WACONTENT IGNORING CASE.          
IF SY-SUBRC <> 0.            
FIND 'default' IN WACONTENT IGNORING CASE.            
IF SY-SUBRC <> 0.
*             Hyperlink for dictionary/structure include              COPYLINELENGTH 
STRLEN( WACONTENT ).              COPYOFCURRENTLINE 
= WACONTENT.              
SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.              
SHIFT TAIL LEFT DELETING LEADING SPACE.              
SPLIT TAIL AT SPACE INTO HEAD TAIL.              

TRY.                  
IF TAIL+0(1'Y' OR TAIL+0(1'Z' OR TAIL+0(1'y' OR TAIL+0(1'z' OR TAIL CS CUSTOMERNAMERANGE.                    
CLEAR WACONTENT.                    
SHIFT TAIL LEFT DELETING LEADING SPACE.                    
SPLIT TAIL AT PERIOD INTO HYPERLINKNAME TAIL.                    COPYOFCURRENTLINE 
'include structure <a href ='.                    LOWERCASELINK 

= HYPERLINKNAME.                    
TRANSLATE LOWERCASELINK TO LOWER CASE.
*                 If we are running on a non UNIX environment we will need to remove forward slashes                    
IF FRONTENDOPSYSTEM = NON_UNIX.                      
TRANSLATE LOWERCASELINK USING '/_'.                    
ENDIF.                    

CONCATENATE COPYOFCURRENTLINE                                
'"'                                LOWERCASELINK    
"hyperlinkName                                
'/'                                
'dictionary-'                                LOWERCASELINK    
"hyperlinkName                                PERIOD HTMLEXTENSION                                

'">'                                HYPERLINKNAME                                

'</a>'                                PERIOD TAIL 
INTO COPYOFCURRENTLINE.

*                 Pad the string back out with spaces                    
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                      
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                      COPYLINELENGTH 
= COPYLINELENGTH + 1.                    
ENDWHILE.                    WACONTENT 
= COPYOFCURRENTLINE.                  
ENDIF.                
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.              
ENDTRY.            
ENDIF.          
ENDIF.        
ENDIF.        HTMLTABLE 

= WACONTENT.      
ELSE.        HTMLTABLE 
''.      
ENDIF.    
ENDIF.    

APPEND HTMLTABLE.  
ENDLOOP.  HTMLTABLE 

'</pre>'.  
APPEND HTMLTABLE.

* Add a html footer to the table  
PERFORM ADDHTMLFOOTER USING HTMLTABLE[].  ICONTENTS[] 

= HTMLTABLE[].
ENDFORM.                                                                                            "convertClassToHtml

*----------------------------------------------------------------------------------------------------------------------
*  convertFunctionToHtml... Builds an HTML table based upon a text table.
*----------------------------------------------------------------------------------------------------------------------
FORM CONVERTFUNCTIONTOHTML USING ICONTENTS LIKE DUMIHTML[]                                 
VALUE(FUNCTIONNAME)                                 
VALUE(SHORTDESCRIPTION)                                 
VALUE(SOURCECODETYPE)                                 
VALUE(FUNCTIONDOCUMENTATIONEXISTS)                                 
VALUE(ISMAINFUNCTIONINCLUDE)                                 
VALUE(SYNTAXHIGHLIGHTCOMMENTS)                                 
VALUE(HTMLEXTENSION)                                 
VALUE(CUSTOMERNAMERANGE)                                 
VALUE(GETINCLUDES)                                 
VALUE(GETDICTSTRUCTURES).  

DATA: HTMLTABLE TYPE STANDARD TABLE OF STRING WITH HEADER LINE.  
DATA: LISTINGNAME TYPE STRING VALUE 'Code listing for function:'.  
DATA: DESCRIPTIONNAME TYPE STRING VALUE `Description: `.  
DATA: HEAD(255).  
DATA: TAIL(255).  
DATA: MYTABIX TYPE SYTABIX.  
DATA: NEXTLINE TYPE SYTABIX.  
DATA: HYPERLINKNAME TYPE STRING.  
DATA: COPYOFCURRENTLINE TYPE STRING.  
DATA: CURRENTLINELENGTH TYPE VALUE 0.  
DATA: COPYLINELENGTH TYPE VALUE 0.  
DATA: IGNOREFUTURELINES TYPE VALUE FALSE.  
DATA: FOUNDASTERIX TYPE VALUE FALSE.  
DATA: LOWERCASELINK TYPE STRING.  
DATA: WANEXTLINE TYPE STRING.  
DATA: WACONTENT(255).

* Add a html header to the table  
PERFORM ADDHTMLHEADER USING HTMLTABLE[]                              FUNCTIONNAME
.  

CONCATENATE LISTINGNAME FUNCTIONNAME INTO LISTINGNAME SEPARATED BY SPACE.  
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' LISTINGNAME '</b></font>' INTO HTMLTABLE.  
APPEND HTMLTABLE.  

IF NOT SHORTDESCRIPTION IS INITIAL.    
APPEND '<br>' TO HTMLTABLE.    
CONCATENATE DESCRIPTIONNAME SHORTDESCRIPTION INTO DESCRIPTIONNAME SEPARATED BY SPACE.    
CONCATENATE '<font size="3" face = "Arial" color="' COLOUR_BLACK '"><b>' DESCRIPTIONNAME '</b></font>' INTO HTMLTABLE.    
APPEND HTMLTABLE.  
ENDIF.  HTMLTABLE 

'<hr>'.  
APPEND HTMLTABLE.  HTMLTABLE 

'<pre width="150">'.  
APPEND HTMLTABLE.  

LOOP AT ICONTENTS INTO WACONTENT.    MYTABIX 
= SY-TABIX.

*   Extra code for adding global and doc hyperlinks to functions    
IF SOURCECODETYPE = IS_FUNCTION AND ISMAINFUNCTIONINCLUDE = TRUE.      
IF SY-TABIX > 1.        
IF WACONTENT+0(1= ASTERIX AND IGNOREFUTURELINES = FALSE.          FOUNDASTERIX 
= TRUE.        
ELSE.          
IF FOUNDASTERIX = TRUE.
*           Lets add our extra HTML lines in here            
APPEND '' TO HTMLTABLE.

*           Global data hyperlink            
IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL.              
CONCATENATE '<font color ="' COMMENT_COLOUR '">' INTO COPYOFCURRENTLINE.            
ENDIF.            

CONCATENATE COPYOFCURRENTLINE '*       <a href ="' INTO COPYOFCURRENTLINE.            LOWERCASELINK 
= FUNCTIONNAME.            
TRANSLATE LOWERCASELINK TO LOWER CASE.
*           If we are running on a non UNIX environment we will need to remove forward slashes            
IF FRONTENDOPSYSTEM = NON_UNIX.              
TRANSLATE LOWERCASELINK USING '/_'.            
ENDIF.            

CONCATENATE COPYOFCURRENTLINE 'global-' LOWERCASELINK  "functionName                        PERIOD HTMLEXTENSION 
'">' 'Global data declarations' '</a>' INTO COPYOFCURRENTLINE.            

IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL.              
CONCATENATE COPYOFCURRENTLINE '</font>' INTO COPYOFCURRENTLINE.            
ENDIF.            

APPEND COPYOFCURRENTLINE TO HTMLTABLE.

*           Documentation hyperlink.            
IF FUNCTIONDOCUMENTATIONEXISTS = TRUE.              
IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL.                
CONCATENATE '<font color ="' COMMENT_COLOUR '">' INTO COPYOFCURRENTLINE.              
ENDIF.              

CONCATENATE COPYOFCURRENTLINE '*       <a href ="' INTO COPYOFCURRENTLINE.              LOWERCASELINK 

= FUNCTIONNAME.              
TRANSLATE LOWERCASELINK TO LOWER CASE.
*             If we are running on a non UNIX environment we will need to remove forward slashes              
IF FRONTENDOPSYSTEM = NON_UNIX.                
TRANSLATE LOWERCASELINK USING '/_'.              
ENDIF.              

CONCATENATE COPYOFCURRENTLINE                          
'docs-'                          LOWERCASELINK  
"functionName                          PERIOD HTMLEXTENSION 
'">'                          
'Function module documentation'                          
'</a>'                          
INTO COPYOFCURRENTLINE.              

IF NOT PCOMM IS INITIAL.                
CONCATENATE COPYOFCURRENTLINE '</font>' INTO COPYOFCURRENTLINE.              
ENDIF.              
APPEND COPYOFCURRENTLINE TO HTMLTABLE.            
ENDIF.            FOUNDASTERIX 

= FALSE.            IGNOREFUTURELINES 
= TRUE.          
ENDIF.        
ENDIF.      
ENDIF.    
ENDIF.

*   Carry on as normal    
IF NOT ( ICONTENTS IS INITIAL ).      
WHILE ( WACONTENT CS '<' OR WACONTENT CS '>' ).        
REPLACE '<' IN WACONTENT WITH LT.        
REPLACE '>' IN WACONTENT WITH GT.      
ENDWHILE.      

IF WACONTENT+0(1) <> ASTERIX.        CURRENTLINELENGTH 
STRLEN( WACONTENT ).

*       Don't hyperlink anything for files of type documentation        
IF SOURCECODETYPE <> IS_DOCUMENTATION.
*       Check for any functions to highlight          
IF ( WACONTENT CS CALLFUNCTION AND ( WACONTENT <> 'DESTINATION' ).            NEXTLINE 
= MYTABIX + 1.            
READ TABLE ICONTENTS INTO WANEXTLINE INDEX NEXTLINE.            
TRANSLATE WANEXTLINE TO UPPER CASE.            
IF WANEXTLINE NS 'DESTINATION'.              COPYOFCURRENTLINE 
= WACONTENT.              
SHIFT COPYOFCURRENTLINE LEFT DELETING LEADING SPACE.              COPYLINELENGTH 

STRLEN( COPYOFCURRENTLINE ).              

SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.              
SPLIT TAIL AT SPACE INTO HEAD TAIL.              
SPLIT TAIL AT SPACE INTO HEAD TAIL.
*             Function name is now in head              
TRANSLATE HEAD USING ''' '.              
SHIFT HEAD LEFT DELETING LEADING SPACE.              

TRY.                  
IF HEAD+0(1'Y' OR HEAD+0(1'Z' OR HEAD+0(1'y' OR HEAD+0(1'z' OR HEAD CS CUSTOMERNAMERANGE.

*                 Definately a customer function module                    HYPERLINKNAME 
= HEAD.                    

IF SOURCECODETYPE = IS_FUNCTION.                      COPYOFCURRENTLINE 
'call function <a href ="../'.                    
ELSE.                      COPYOFCURRENTLINE 
'call function <a href ="'.                    
ENDIF.                    LOWERCASELINK 

= HYPERLINKNAME.                    
TRANSLATE LOWERCASELINK TO LOWER CASE.
*                 If we are running on a non UNIX environment we will need to remove forward slashes                    
IF FRONTENDOPSYSTEM = NON_UNIX.                      
TRANSLATE LOWERCASELINK USING '/_'.                    
ENDIF.                    

CONCATENATE COPYOFCURRENTLINE                                LOWERCASELINK     
"hyperlinkName                                
'/'                                LOWERCASELINK     
"hyperlinkName                                PERIOD HTMLEXTENSION 
'">'                                
''''                                HYPERLINKNAME                                

''''                                
'</a>'                                TAIL 
INTO COPYOFCURRENTLINE.

*                 Pad the string back out with spaces                    
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                      
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                      COPYLINELENGTH 
= COPYLINELENGTH + 1.                    
ENDWHILE.                    WACONTENT 

= COPYOFCURRENTLINE.                  
ENDIF.                
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.              
ENDTRY.            
ENDIF.          
ENDIF.        
ENDIF.

*       Check for any customer includes to hyperlink        
IF WACONTENT CS INCLUDE OR WACONTENT CS LOWINCLUDE.          COPYOFCURRENTLINE 
= WACONTENT.          

SHIFT COPYOFCURRENTLINE LEFT DELETING LEADING SPACE.          COPYLINELENGTH 
STRLEN( COPYOFCURRENTLINE ).          

SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.          
SHIFT TAIL LEFT DELETING LEADING SPACE.          

TRY.              
IF ( TAIL+0(1'Y' OR TAIL+0(1'Z' OR TAIL+0(1'y' OR TAIL+0(1'z'                   
OR TAIL CS CUSTOMERNAMERANGE OR TAIL+0(2'mz' OR TAIL+0(2'MZ' AND NOT GETINCLUDES IS INITIAL.

*             Hyperlink for program includes                
CLEAR WACONTENT.                
SHIFT TAIL LEFT DELETING LEADING SPACE.                
SPLIT TAIL AT PERIOD INTO HYPERLINKNAME TAIL.                COPYOFCURRENTLINE 
'include <a href ="'.                LOWERCASELINK 

= HYPERLINKNAME.                
TRANSLATE LOWERCASELINK TO LOWER CASE.
*             If we are running on a non UNIX environment we will need to remove forward slashes                
IF FRONTENDOPSYSTEM = NON_UNIX.                  
TRANSLATE LOWERCASELINK USING '/_'.                
ENDIF.                

CONCATENATE COPYOFCURRENTLINE                            LOWERCASELINK       
"hyperlinkName                            PERIOD HTMLEXTENSION 
'">'                            HYPERLINKNAME                            

'</a>'                            PERIOD TAIL 
INTO COPYOFCURRENTLINE.

*             Pad the string back out with spaces                
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                  
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                  COPYLINELENGTH 
= COPYLINELENGTH + 1.                
ENDWHILE.                WACONTENT 
= COPYOFCURRENTLINE.              
ELSE.                
IF NOT GETDICTSTRUCTURES IS INITIAL.
*               Hyperlink for structure include                  COPYLINELENGTH 
STRLEN( COPYOFCURRENTLINE ).                  
SPLIT COPYOFCURRENTLINE AT SPACE INTO HEAD TAIL.                  
SHIFT TAIL LEFT DELETING LEADING SPACE.                  
SPLIT TAIL AT SPACE INTO HEAD TAIL.                  

TRY.                      
IF TAIL+0(1'Y' OR TAIL+0(1'Z' OR TAIL+0(1'y' OR TAIL+0(1'z' OR TAIL CS CUSTOMERNAMERANGE.                        
CLEAR WACONTENT.                        
SHIFT TAIL LEFT DELETING LEADING SPACE.                        
SPLIT TAIL AT PERIOD INTO HYPERLINKNAME TAIL.                        COPYOFCURRENTLINE 
'include structure <a href ='.                        LOWERCASELINK 

= HYPERLINKNAME.                        
TRANSLATE LOWERCASELINK TO LOWER CASE.
*                   If we are running on a non UNIX environment we will need to remove forward slashes                        
IF FRONTENDOPSYSTEM = NON_UNIX.                          
TRANSLATE LOWERCASELINK USING '/_'.                        
ENDIF.                        

CONCATENATE COPYOFCURRENTLINE                                    
'"'                                    LOWERCASELINK    
"hyperlinkName                                    
'/'                                    
'dictionary-'                                    LOWERCASELINK    
"hyperlinkName                                    PERIOD HTMLEXTENSION                                    

'">'                                    HYPERLINKNAME                                    

'</a>'                                    PERIOD TAIL 
INTO COPYOFCURRENTLINE.

*                   Pad the string back out with spaces                        
WHILE COPYLINELENGTH < CURRENTLINELENGTH.                          
SHIFT COPYOFCURRENTLINE RIGHT BY PLACES.                          COPYLINELENGTH 
= COPYLINELENGTH + 1.                        
ENDWHILE.                        WACONTENT 
= COPYOFCURRENTLINE.                      
ENDIF.                    
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.                  
ENDTRY.                
ENDIF.              
ENDIF.            
CATCH CX_SY_RANGE_OUT_OF_BOUNDS INTO OBJRUNTIMEERROR.          
ENDTRY.        
ENDIF.      
ELSE.        
IF NOT SYNTAXHIGHLIGHTCOMMENTS IS INITIAL AND WACONTENT+0(1= ASTERIX.          
CONCATENATE '<font color ="' COMMENT_COLOUR '">' INTO HEAD.          
CONCATENATE HEAD WACONTENT '</font>' INTO TAIL.          WACONTENT 
= TAIL.        
ENDIF.      
ENDIF.      HTMLTABLE 

= WACONTENT.    

ELSE.      HTMLTABLE 
''.    
ENDIF.    
APPEND HTMLTABLE.  
ENDLOOP.  HTMLTABLE 

'</pre>'.  
APPEND HTMLTABLE.

* Add a html footer to the table  
PERFORM ADDHTMLFOOTER USING HTMLTABLE[].  ICONTENTS[] 

= HTMLTABLE[].
ENDFORM.                                                                                         "convertFunctionToHtml

*----------------------------------------------------------------------------------------------------------------------
*  buildColumnHeaders... build table column names
*----------------------------------------------------------------------------------------------------------------------
FORM BUILDCOLUMNHEADERS USING ILOCCOLUMNCAPTIONS LIKE DUMIHTML[].  

APPEND 'Row' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Field name' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Position' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Key' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Data element' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Domain' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Datatype' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Length' TO ILOCCOLUMNCAPTIONS.  
APPEND 'Domain text' TO ILOCCOLUMNCAPTIONS.
ENDFORM.                                                                                            "buildColumnHeaders

*----------------------------------------------------------------------------------------------------------------------
* addHTMLHeader...  add a html formatted header to our output table
*----------------------------------------------------------------------------------------------------------------------
FORM ADDHTMLHEADER USING ILOCHEADER LIKE DUMIHTML[]                         
VALUE(TITLE).  

DATA: WAHEADER TYPE STRING.  

APPEND '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' TO ILOCHEADER.  
APPEND '<html>' TO ILOCHEADER.  
APPEND '<head>' TO ILOCHEADER.  

CONCATENATE '<title>' TITLE '</title>' INTO WAHEADER.  
APPEND WAHEADER TO ILOCHEADER.  

APPEND '</head>' TO ILOCHEADER.  

IF NOT PBACK IS INITIAL.    
CONCATENATE '<body bgcolor="' BACKGROUND_COLOUR '">' INTO WAHEADER.  
ELSE.    
CONCATENATE '<body bgcolor="' COLOUR_WHITE '">' INTO WAHEADER.  
ENDIF.  

APPEND WAHEADER TO ILOCHEADER.
ENDFORM.                                                                                                 "addHTMLHeader

*----------------------------------------------------------------------------------------------------------------------
* addHTMLFooter...  add a html formatted footer to our output table
*----------------------------------------------------------------------------------------------------------------------
FORM ADDHTMLFOOTER USING ILOCFOOTER LIKE DUMIHTML[].  

DATA: FOOTERMESSAGE TYPE STRING.  
DATA: WAFOOTER TYPE STRING.  

PERFORM BUILDFOOTERMESSAGE USING 'HTML'                                   FOOTERMESSAGE
.  

APPEND '<hr>' TO ILOCFOOTER.  
CONCATENATE '<font size="2" face = "Sans Serif">' FOOTERMESSAGE INTO WAFOOTER.  
APPEND WAFOOTER TO ILOCFOOTER.  
APPEND '</font>' TO ILOCFOOTER.  
APPEND '</body>' TO ILOCFOOTER.  
APPEND '</html>' TO ILOCFOOTER.
ENDFORM.                                                                                                 "addHTMLFooter

*----------------------------------------------------------------------------------------------------------------------
* buildFooterMessage...Returns a footer message based on the output file type.
*----------------------------------------------------------------------------------------------------------------------
FORM BUILDFOOTERMESSAGE USING FILETYPE                              RETURNMESSAGE
.  

IF FILETYPE 'HTML'.    
CONCATENATE `Extracted by Direct Download Enterprise version `                 VERSIONNO 
` - E.G.Mellodew. 1998-2004 UK. Sap Release ` SY-SAPRL                
INTO RETURNMESSAGE.  
ELSE.    
CONCATENATE `Extracted by Direct Download Enterprise version `                 VERSIONNO 
` - E.G.Mellodew. 1998-2004 UK. Sap Release ` SY-SAPRL                
INTO RETURNMESSAGE.  
ENDIF.
ENDFORM.                                                                                            "buildFooterMessage

***********************************************************************************************************************
********************************************DISPLAY ROUTINES***********************************************************
***********************************************************************************************************************

*----------------------------------------------------------------------------------------------------------------------
*  fillTreeNodeTables...
*----------------------------------------------------------------------------------------------------------------------
FORM FILLTREENODETABLES USING ILOCDICTIONARY LIKE IDICTIONARY[]                              ILOCTREEDISPLAY 
LIKE ITREEDISPLAY[]                              
VALUE(RUNTIME).  

DATA: TABLELINES TYPE I.  
DATA: WATREEDISPLAY LIKE SNODETEXT.  
FIELD-SYMBOLS: <WADICTIONARY> TYPE TDICTTABLE.  
DATA: TABLELINESSTRING TYPE STRING.  
DATA: RUNTIMECHAR(10).  
DATA: SUBLEVEL TYPE STRING.  TABLELINES 

LINES( ILOCDICTIONARY ).  TABLELINESSTRING 
= TABLELINES.  

IF TABLELINES 1.    
CONCATENATE TABLELINESSTRING 'table downloaded' INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.  
ELSE.    
CONCATENATE TABLELINESSTRING 'tables downloaded' INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.  
ENDIF.  

WRITE RUNTIME TO RUNTIMECHAR.  
CONCATENATE WATREEDISPLAY-TEXT2 '- runtime' RUNTIMECHAR INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.

* include header display record.  WATREEDISPLAY
-TLEVEL '1'.  WATREEDISPLAY
-TLENGTH2  60.  WATREEDISPLAY
-TCOLOR2    1.  
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.  

LOOP AT ILOCDICTIONARY ASSIGNING <WADICTIONARY>.    WATREEDISPLAY
-TLEVEL '2'.    WATREEDISPLAY
-TEXT2 = <WADICTIONARY>-TABLENAME.    WATREEDISPLAY
-TCOLOR2    3.    WATREEDISPLAY
-TLENGTH3   80.    WATREEDISPLAY
-TCOLOR3    3.    WATREEDISPLAY
-TPOS3      60.    
CONCATENATE 'Dictionary:' <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3 SEPARATED BY SPACE.    

APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.  
ENDLOOP.
ENDFORM.                                                                                            "fillTreeNodeTables

*----------------------------------------------------------------------------------------------------------------------
*  fillTreeNodeMessages...
*----------------------------------------------------------------------------------------------------------------------
FORM FILLTREENODEMESSAGES USING ILOCMESSAGES LIKE IMESSAGES[]                                ILOCTREEDISPLAY 
LIKE ITREEDISPLAY[]                                
VALUE(RUNTIME).  

DATA: TABLELINES TYPE I.  
DATA: WATREEDISPLAY LIKE SNODETEXT.  
FIELD-SYMBOLS: <WAMESSAGE> TYPE TMESSAGE.  
DATA: TABLELINESSTRING TYPE STRING.  
DATA: RUNTIMECHAR(10).  

SORT ILOCMESSAGES ASCENDING BY ARBGB.  

LOOP AT ILOCMESSAGES ASSIGNING <WAMESSAGE>.    
AT NEW ARBGB.      TABLELINES 
= TABLELINES + 1.    
ENDAT.  
ENDLOOP.  TABLELINESSTRING 
= TABLELINES.  

IF TABLELINES 1.    
CONCATENATE TABLELINESSTRING 'message class downloaded' INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.  
ELSE.    
CONCATENATE TABLELINESSTRING 'message classes downloaded' INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.  
ENDIF.  

WRITE RUNTIME TO RUNTIMECHAR.  
CONCATENATE WATREEDISPLAY-TEXT2 '- runtime' RUNTIMECHAR INTO WATREEDISPLAY-TEXT2 SEPARATED BY SPACE.

* include header display record.  WATREEDISPLAY
-TLEVEL '1'.  WATREEDISPLAY
-TLENGTH2 60.  WATREEDISPLAY
-TCOLOR2 1.  
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.  

LOOP AT ILOCMESSAGES ASSIGNING <WAMESSAGE>.    
AT NEW ARBGB.      WATREEDISPLAY
-TLEVEL '2'.      WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.      WATREEDISPLAY
-TCOLOR2    5.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    5.      WATREEDISPLAY
-TPOS3      60.      WATREEDISPLAY
-TEXT3 = <WAMESSAGE>-STEXT.      
CONCATENATE 'Message class:'  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3 SEPARATED BY SPACE.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDAT.  
ENDLOOP.
ENDFORM.                                                                                          "fillTreeNodeMessages

*----------------------------------------------------------------------------------------------------------------------
*  fillTreeNodeFunctions...
*----------------------------------------------------------------------------------------------------------------------
FORM FILLTREENODEFUNCTIONS USING ILOCFUNCTIONS LIKE IFUNCTIONS[]                                 ILOCTREEDISPLAY 
LIKE ITREEDISPLAY[]                                 
VALUE(RUNTIME).  

DATA: TABLELINES TYPE I.  
DATA: WATREEDISPLAY LIKE SNODETEXT.  
FIELD-SYMBOLS: <WAFUNCTION> TYPE TFUNCTION.  
FIELD-SYMBOLS: <WASCREEN> TYPE TSCREENFLOW.  
FIELD-SYMBOLS: <WAGUITITLE> TYPE TGUITITLE.  
FIELD-SYMBOLS: <WADICTIONARY> TYPE TDICTTABLE.  
FIELD-SYMBOLS: <WAINCLUDE> TYPE TINCLUDE.  
FIELD-SYMBOLS: <WAMESSAGE> TYPE TMESSAGE.  
DATA: TABLELINESSTRING TYPE STRING.  
DATA: RUNTIMECHAR(10).  

SORT ILOCFUNCTIONS ASCENDING BY FUNCTIONNAME.  TABLELINES 

LINES( ILOCFUNCTIONS ).  TABLELINESSTRING 
= TABLELINES.  

IF TABLELINES 1.    
CONCATENATE TABLELINESSTRING ` function downloaded` INTO WATREEDISPLAY-TEXT2.  
ELSE.    
CONCATENATE TABLELINESSTRING ` functions downloaded` INTO WATREEDISPLAY-TEXT2.  
ENDIF.  

WRITE RUNTIME TO RUNTIMECHAR.  

CONCATENATE WATREEDISPLAY-TEXT2 ` - runtime ` RUNTIMECHAR INTO WATREEDISPLAY-TEXT2.
* include header display record.  WATREEDISPLAY
-TLEVEL '1'.  WATREEDISPLAY
-TLENGTH2  60.  WATREEDISPLAY
-TCOLOR2    1.  
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.

* Lets fill the detail in  
LOOP AT ILOCFUNCTIONS ASSIGNING <WAFUNCTION>.    WATREEDISPLAY
-TLEVEL 2.    WATREEDISPLAY
-TEXT2 = <WAFUNCTION>-FUNCTIONNAME.    WATREEDISPLAY
-TCOLOR2    7.    WATREEDISPLAY
-TLENGTH3   80.    WATREEDISPLAY
-TCOLOR3    7.    WATREEDISPLAY
-TPOS3      60.    
CONCATENATE `Function: ` <WAFUNCTION>-FUNCTIONNAME INTO WATREEDISPLAY-TEXT3.    
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.

*   Screens.    
LOOP AT <WAFUNCTION>-ISCREENFLOW ASSIGNING <WASCREEN>.      WATREEDISPLAY
-TLEVEL '2'.      WATREEDISPLAY
-TEXT2 = <WASCREEN>-SCREEN.      WATREEDISPLAY
-TCOLOR2    6.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    6.      WATREEDISPLAY
-TPOS3      60.      WATREEDISPLAY
-TEXT3 'Screen'.      
APPEND WATREEDISPLAY TO ITREEDISPLAY.    
ENDLOOP.

*   GUI Title.    
LOOP AT <WAFUNCTION>-IGUITITLE ASSIGNING <WAGUITITLE>.      WATREEDISPLAY
-TLEVEL '2'.      WATREEDISPLAY
-TEXT2 = <WAGUITITLE>-OBJ_CODE.      WATREEDISPLAY
-TCOLOR2    6.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    6.      WATREEDISPLAY
-TPOS3      60.      WATREEDISPLAY
-TEXT3 'GUI Title'.      
APPEND WATREEDISPLAY TO ITREEDISPLAY.    
ENDLOOP.

*   Fill in the tree with include information    
LOOP AT <WAFUNCTION>-IINCLUDES ASSIGNING <WAINCLUDE>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WAINCLUDE>-INCLUDENAME.      WATREEDISPLAY
-TCOLOR2    4.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    4.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Include:   ` <WAINCLUDE>-INCLUDETITLE INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.

*   fill in the tree with dictionary information    
LOOP AT <WAFUNCTION>-IDICTSTRUCT ASSIGNING <WADICTIONARY>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WADICTIONARY>-TABLENAME.      WATREEDISPLAY
-TCOLOR2    3.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    3.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Dictionary:` <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.

*   fill in the tree with message information    
SORT <WAFUNCTION>-IMESSAGES[] ASCENDING BY ARBGB.    
LOOP AT <WAFUNCTION>-IMESSAGES ASSIGNING <WAMESSAGE>.      
AT NEW ARBGB.        WATREEDISPLAY
-TLEVEL 3.        WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.        WATREEDISPLAY
-TCOLOR2    5.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    5.        WATREEDISPLAY
-TPOS3      60.

*       Select the message class text if we do not have it already        
IF <WAMESSAGE>-STEXT IS INITIAL.          
SELECT SINGLE STEXT FROM T100A                              
INTO <WAMESSAGE>-STEXT                              
WHERE ARBGB = <WAMESSAGE>-ARBGB.        
ENDIF.        WATREEDISPLAY

-TEXT3 = <WAMESSAGE>-STEXT.        
CONCATENATE `Message class: `  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDAT.    
ENDLOOP.  
ENDLOOP.
ENDFORM.                                                                                         "fillTreeNodeFunctions

*----------------------------------------------------------------------------------------------------------------------
*  fillTreeNodePrograms
*----------------------------------------------------------------------------------------------------------------------
FORM FILLTREENODEPROGRAMS USING ILOCPROGRAMS LIKE IPROGRAMS[]                                ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                                ILOCTREEDISPLAY 
LIKE ITREEDISPLAY[]                                
VALUE(RUNTIME).  

DATA: TABLELINES TYPE I.  
DATA: WATREEDISPLAY LIKE SNODETEXT.  
FIELD-SYMBOLS: <WAPROGRAM> TYPE TPROGRAM.  
FIELD-SYMBOLS: <WASCREEN> TYPE TSCREENFLOW.  
FIELD-SYMBOLS: <WAFUNCTION> TYPE TFUNCTION.  
FIELD-SYMBOLS: <WADICTIONARY> TYPE TDICTTABLE.  
FIELD-SYMBOLS: <WAINCLUDE> TYPE TINCLUDE.  
FIELD-SYMBOLS: <WAMESSAGE> TYPE TMESSAGE.  
DATA: TABLELINESSTRING TYPE STRING.  
DATA: RUNTIMECHAR(10).  TABLELINES 

LINES( ILOCPROGRAMS ).  TABLELINESSTRING 
= TABLELINES.  

IF TABLELINES 1.    
CONCATENATE TABLELINESSTRING ` program downloaded` INTO WATREEDISPLAY-TEXT2.  
ELSE.    
CONCATENATE TABLELINESSTRING ` programs downloaded` INTO WATREEDISPLAY-TEXT2.  
ENDIF.  

WRITE RUNTIME TO RUNTIMECHAR.  

CONCATENATE WATREEDISPLAY-TEXT2 ` - runtime ` RUNTIMECHAR INTO WATREEDISPLAY-TEXT2.
* include header display record.  WATREEDISPLAY
-TLEVEL '1'.  WATREEDISPLAY
-TLENGTH2  60.  WATREEDISPLAY
-TCOLOR2    1.  
APPEND WATREEDISPLAY TO ITREEDISPLAY.  

LOOP AT ILOCPROGRAMS ASSIGNING <WAPROGRAM>.
*   Main programs.    WATREEDISPLAY
-TLEVEL '2'.    WATREEDISPLAY
-TEXT2 = <WAPROGRAM>-PROGNAME.    WATREEDISPLAY
-TCOLOR2    1.
*   Description    WATREEDISPLAY
-TLENGTH3   80.    WATREEDISPLAY
-TCOLOR3    1.    WATREEDISPLAY
-TPOS3      60.    
CONCATENATE `Program: ` <WAPROGRAM>-PROGRAMTITLE INTO WATREEDISPLAY-TEXT3.    
APPEND WATREEDISPLAY TO ITREEDISPLAY.
*   Screens.    
LOOP AT <WAPROGRAM>-ISCREENFLOW ASSIGNING <WASCREEN>.      WATREEDISPLAY
-TLEVEL '3'.      WATREEDISPLAY
-TEXT2 = <WASCREEN>-SCREEN.      WATREEDISPLAY
-TCOLOR2    6.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    6.      WATREEDISPLAY
-TPOS3      60.      WATREEDISPLAY
-TEXT3 'Screen'.      
APPEND WATREEDISPLAY TO ITREEDISPLAY.    
ENDLOOP.
*   fill in the tree with message information    
SORT <WAPROGRAM>-IMESSAGES[] ASCENDING BY ARBGB.    
LOOP AT <WAPROGRAM>-IMESSAGES ASSIGNING <WAMESSAGE>.      
AT NEW ARBGB.        WATREEDISPLAY
-TLEVEL 3.        WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.        WATREEDISPLAY
-TCOLOR2    5.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    5.        WATREEDISPLAY
-TPOS3      60.

*       Select the message class text if we do not have it already        
IF <WAMESSAGE>-STEXT IS INITIAL.          
SELECT SINGLE STEXT FROM T100A                              
INTO <WAMESSAGE>-STEXT                              
WHERE ARBGB = <WAMESSAGE>-ARBGB.        
ENDIF.        WATREEDISPLAY

-TEXT3 = <WAMESSAGE>-STEXT.        
CONCATENATE `Message class: `  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDAT.    
ENDLOOP.
*   Fill in the tree with include information    
LOOP AT <WAPROGRAM>-IINCLUDES ASSIGNING <WAINCLUDE>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WAINCLUDE>-INCLUDENAME.      WATREEDISPLAY
-TCOLOR2    4.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    4.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Include:   ` <WAINCLUDE>-INCLUDETITLE INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.
*   fill in the tree with dictionary information    
LOOP AT <WAPROGRAM>-IDICTSTRUCT ASSIGNING <WADICTIONARY>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WADICTIONARY>-TABLENAME.      WATREEDISPLAY
-TCOLOR2    3.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    3.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Dictionary:    ` <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.

*   Function Modules    
LOOP AT ILOCFUNCTIONS ASSIGNING <WAFUNCTION> WHERE PROGRAMLINKNAME = <WAPROGRAM>-PROGNAME.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 = <WAFUNCTION>-FUNCTIONNAME.      WATREEDISPLAY
-TCOLOR2    7.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    7.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Function:      ` <WAFUNCTION>-FUNCTIONNAME INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.

*     Fill in the tree with include information      
LOOP AT <WAFUNCTION>-IINCLUDES ASSIGNING <WAINCLUDE>.        WATREEDISPLAY
-TLEVEL 4.        WATREEDISPLAY
-TEXT2 =  <WAINCLUDE>-INCLUDENAME.        WATREEDISPLAY
-TCOLOR2    4.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    4.        WATREEDISPLAY
-TPOS3      60.        
CONCATENATE `Include:       ` <WAINCLUDE>-INCLUDETITLE INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDLOOP.

*     fill in the tree with dictionary information      
LOOP AT <WAFUNCTION>-IDICTSTRUCT ASSIGNING <WADICTIONARY>.        WATREEDISPLAY
-TLEVEL 4.        WATREEDISPLAY
-TEXT2 =  <WADICTIONARY>-TABLENAME.        WATREEDISPLAY
-TCOLOR2    3.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    3.        WATREEDISPLAY
-TPOS3      60.        
CONCATENATE `Dictionary:    ` <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDLOOP.

*     fill in the tree with message information      
SORT <WAFUNCTION>-IMESSAGES[] ASCENDING BY ARBGB.      
LOOP AT <WAFUNCTION>-IMESSAGES ASSIGNING <WAMESSAGE>.        
AT NEW ARBGB.          WATREEDISPLAY
-TLEVEL 4.          WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.          WATREEDISPLAY
-TCOLOR2    5.          WATREEDISPLAY
-TLENGTH3   80.          WATREEDISPLAY
-TCOLOR3    5.          WATREEDISPLAY
-TPOS3      60.

*         Select the message class text if we do not have it already          
IF <WAMESSAGE>-STEXT IS INITIAL.            
SELECT SINGLE STEXT FROM T100A                                
INTO <WAMESSAGE>-STEXT                                
WHERE ARBGB = <WAMESSAGE>-ARBGB.          
ENDIF.          WATREEDISPLAY

-TEXT3 = <WAMESSAGE>-STEXT.          
CONCATENATE `Message class:  `  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3.          
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.        
ENDAT.      
ENDLOOP.    
ENDLOOP.  
ENDLOOP.
ENDFORM.                                                                                          "fillTreeNodePrograms

*----------------------------------------------------------------------------------------------------------------------
*  fillTreeNodeClasses
*----------------------------------------------------------------------------------------------------------------------
FORM FILLTREENODECLASSES USING ILOCCLASSES LIKE ICLASSES[]                               ILOCFUNCTIONS 
LIKE IFUNCTIONS[]                               ILOCTREEDISPLAY 
LIKE ITREEDISPLAY[]                               
VALUE(RUNTIME).  

DATA: TABLELINES TYPE I.  
DATA: WATREEDISPLAY LIKE SNODETEXT.  
FIELD-SYMBOLS: <WACLASS> TYPE TCLASS.  
FIELD-SYMBOLS: <WAMETHOD> TYPE TMETHOD.  
FIELD-SYMBOLS: <WAFUNCTION> TYPE TFUNCTION.  
FIELD-SYMBOLS: <WADICTIONARY> TYPE TDICTTABLE.  
FIELD-SYMBOLS: <WAINCLUDE> TYPE TINCLUDE.  
FIELD-SYMBOLS: <WAMESSAGE> TYPE TMESSAGE.  
DATA: TABLELINESSTRING TYPE STRING.  
DATA: RUNTIMECHAR(10).  TABLELINES 

LINES( ILOCCLASSES ).  TABLELINESSTRING 
= TABLELINES.  

IF TABLELINES 1.    
CONCATENATE TABLELINESSTRING ` class downloaded` INTO WATREEDISPLAY-TEXT2.  
ELSE.    
CONCATENATE TABLELINESSTRING ` classes downloaded` INTO WATREEDISPLAY-TEXT2.  
ENDIF.  

WRITE RUNTIME TO RUNTIMECHAR.  

CONCATENATE WATREEDISPLAY-TEXT2 ` - runtime ` RUNTIMECHAR INTO WATREEDISPLAY-TEXT2.
* include header display record.  WATREEDISPLAY
-TLEVEL '1'.  WATREEDISPLAY
-TLENGTH2  60.  WATREEDISPLAY
-TCOLOR2    1.  
APPEND WATREEDISPLAY TO ITREEDISPLAY.  

LOOP AT ILOCCLASSES ASSIGNING <WACLASS>.
*   Main Class.    WATREEDISPLAY
-TLEVEL '2'.    WATREEDISPLAY
-TEXT2 = <WACLASS>-CLSNAME.    WATREEDISPLAY
-TCOLOR2    1.
*   Description    WATREEDISPLAY
-TLENGTH3   80.    WATREEDISPLAY
-TCOLOR3    1.    WATREEDISPLAY
-TPOS3      60.    
CONCATENATE `Class:    ` <WACLASS>-DESCRIPT INTO WATREEDISPLAY-TEXT3.    
APPEND WATREEDISPLAY TO ITREEDISPLAY.

*   fill in the tree with method information    
LOOP AT <WACLASS>-IMETHODS[] ASSIGNING <WAMETHOD>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WAMETHOD>-CMPNAME.      WATREEDISPLAY
-TCOLOR2    2.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    2.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Method:   ` <WAMETHOD>-DESCRIPT INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.

*   fill in the tree with message information    
SORT <WACLASS>-IMESSAGES[] ASCENDING BY ARBGB.    
LOOP AT <WACLASS>-IMESSAGES ASSIGNING <WAMESSAGE>.      
AT NEW ARBGB.        WATREEDISPLAY
-TLEVEL 3.        WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.        WATREEDISPLAY
-TCOLOR2    5.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    5.        WATREEDISPLAY
-TPOS3      60.

*       Select the message class text if we do not have it already        
IF <WAMESSAGE>-STEXT IS INITIAL.          
SELECT SINGLE STEXT FROM T100A                              
INTO <WAMESSAGE>-STEXT                              
WHERE ARBGB = <WAMESSAGE>-ARBGB.        
ENDIF.        WATREEDISPLAY

-TEXT3 = <WAMESSAGE>-STEXT.        
CONCATENATE `Message class: `  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDAT.    
ENDLOOP.

*   fill in the tree with dictionary information    
LOOP AT <WACLASS>-IDICTSTRUCT ASSIGNING <WADICTIONARY>.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 =  <WADICTIONARY>-TABLENAME.      WATREEDISPLAY
-TCOLOR2    3.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    3.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Dictionary:    ` <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.    
ENDLOOP.

*   Function Modules    
LOOP AT ILOCFUNCTIONS ASSIGNING <WAFUNCTION> WHERE PROGRAMLINKNAME = <WACLASS>-CLSNAME.      WATREEDISPLAY
-TLEVEL 3.      WATREEDISPLAY
-TEXT2 = <WAFUNCTION>-FUNCTIONNAME.      WATREEDISPLAY
-TCOLOR2    7.      WATREEDISPLAY
-TLENGTH3   80.      WATREEDISPLAY
-TCOLOR3    7.      WATREEDISPLAY
-TPOS3      60.      
CONCATENATE `Function:      ` <WAFUNCTION>-FUNCTIONNAME INTO WATREEDISPLAY-TEXT3.      
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.

*     Fill in the tree with include information      
LOOP AT <WAFUNCTION>-IINCLUDES ASSIGNING <WAINCLUDE>.        WATREEDISPLAY
-TLEVEL 4.        WATREEDISPLAY
-TEXT2 =  <WAINCLUDE>-INCLUDENAME.        WATREEDISPLAY
-TCOLOR2    4.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    4.        WATREEDISPLAY
-TPOS3      60.        
CONCATENATE `Include:       ` <WAINCLUDE>-INCLUDETITLE INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDLOOP.

*     fill in the tree with dictionary information      
LOOP AT <WAFUNCTION>-IDICTSTRUCT ASSIGNING <WADICTIONARY>.        WATREEDISPLAY
-TLEVEL 4.        WATREEDISPLAY
-TEXT2 =  <WADICTIONARY>-TABLENAME.        WATREEDISPLAY
-TCOLOR2    3.        WATREEDISPLAY
-TLENGTH3   80.        WATREEDISPLAY
-TCOLOR3    3.        WATREEDISPLAY
-TPOS3      60.        
CONCATENATE `Dictionary:    ` <WADICTIONARY>-TABLETITLE INTO WATREEDISPLAY-TEXT3.        
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.      
ENDLOOP.

*     fill in the tree with message information      
SORT <WAFUNCTION>-IMESSAGES[] ASCENDING BY ARBGB.      
LOOP AT <WAFUNCTION>-IMESSAGES ASSIGNING <WAMESSAGE>.        
AT NEW ARBGB.          WATREEDISPLAY
-TLEVEL 4.          WATREEDISPLAY
-TEXT2 = <WAMESSAGE>-ARBGB.          WATREEDISPLAY
-TCOLOR2    5.          WATREEDISPLAY
-TLENGTH3   80.          WATREEDISPLAY
-TCOLOR3    5.          WATREEDISPLAY
-TPOS3      60.

*         Select the message class text if we do not have it already          
IF <WAMESSAGE>-STEXT IS INITIAL.            
SELECT SINGLE STEXT FROM T100A                                
INTO <WAMESSAGE>-STEXT                                
WHERE ARBGB = <WAMESSAGE>-ARBGB.          
ENDIF.          WATREEDISPLAY

-TEXT3 = <WAMESSAGE>-STEXT.          
CONCATENATE `Message class:  `  WATREEDISPLAY-TEXT3 INTO WATREEDISPLAY-TEXT3.          
APPEND WATREEDISPLAY TO ILOCTREEDISPLAY.        
ENDAT.      
ENDLOOP.    
ENDLOOP.  
ENDLOOP.
ENDFORM.                                                                                           "fillTreeNodeClasses

*----------------------------------------------------------------------------------------------------------------------
* displayTree...
*----------------------------------------------------------------------------------------------------------------------
FORM DISPLAYTREE USING ILOCTREEDISPLAY LIKE ITREEDISPLAY[].  

DATA: WATREEDISPLAY TYPE SNODETEXT.

* build up the tree from the internal table node  
CALL FUNCTION 'RS_TREE_CONSTRUCT'    
TABLES      NODETAB            
= ITREEDISPLAY    
EXCEPTIONS      TREE_FAILURE       
1      ID_NOT_FOUND       
2      WRONG_RELATIONSHIP 
3      
OTHERS             4.

* get the first index and expand the whole tree  
READ TABLE ILOCTREEDISPLAY INTO WATREEDISPLAY INDEX 1.  
CALL FUNCTION 'RS_TREE_EXPAND'    
EXPORTING      NODE_ID   
= WATREEDISPLAY-ID      
ALL       'X'    
EXCEPTIONS      NOT_FOUND 
1      
OTHERS    2.

* now display the tree  
CALL FUNCTION 'RS_TREE_LIST_DISPLAY'    
EXPORTING      CALLBACK_PROGRAM      
= SY-CPROG      CALLBACK_USER_COMMAND 
'CB_USER_COMMAND'      CALLBACK_TEXT_DISPLAY 
'CB_text_DISPLAY'      CALLBACK_TOP_OF_PAGE  
'TOP_OF_PAGE'    
EXCEPTIONS      
OTHERS                1.
ENDFORM.                                                                                                   "displayTree

*----------------------------------------------------------------------------------------------------------------------
*  topOfPage... for tree display routines.
*----------------------------------------------------------------------------------------------------------------------
FORM TOPOFPAGE.

ENDFORM.                    "topOfPageto server disabled,' 'external command ZMKDIR not defined

SAP-Garson
原文链接:https://www.cnblogs.com/ddtrs/p/16954961.html

文章来自于网络,如果侵犯了您的权益,请联系站长删除!

上一篇:如何使用 Java 程序通过 SAP Java Connector 调用 ABAP 系统的函数试读版
下一篇:SAP ABAP FICO FAGLL03H CODING BLOCK新增自定义字段
评论列表

发表评论

评论内容
昵称:
关联文章

ABAP SAP自定义程序导出
ABAP 导出程序
SAP-ABAP-后台导出大批量数据及本地导出数据程序
【SAP Abap】SAP系统数据快速导出
用OLE/DOI 实现ABAP导出EXCEL表格[
SAP ABAP EXCEL导出多个SHEET页签
ABAP-小工具之Program的导出与导入
ABAP程序开发规范
ABAP内表导出MYSQL 代码
ABAP 语法效率测试程序
SAP 导出
ABAP Excel处理-内表导出为Excel文件
abap 导出数据到excle,粘贴复制法
ABAP程序执行过程
SAP 备份ABAP程序为html网页(程序非原创)
从SAP导出大数据表
ABAP-动态程序生成
ABAP 检索程序的字符串
将 SAP ABAP 内表内容本地导出成 Excel 文件试读版
导出SAP系统表结构及数据供HANA使用

热门标签
CBP 问题处理 # ALV # 【SAP | 前世今生】 # 1.moonsec-2020-[持续更新] # ABAP # ABAP-接口 # abap学习路线 # ALV # AVRCP协议 # bdc # BMS项目实战记录 # BW # ClickHouse # crud 框架 (mybatis-plus/ jpa等) # dynpro # ERP # JCo3.0 # PyRFC # Python数据分析与机器学习 # SAP ABAP # SAP FICO # SAP FTP # SAP HANA # SAP MM # SAP-Restful # SAP消息号A类 # sap应用技巧 # 工具使用 # 数据库 # 网安神器篇 # 优化篇 # 语法 # 筑基08:渗透测试综合实验 (path.Combinee(rootDir, "nwrfcsdk", "icuuc50")) ,ides .NET .NET 6 .NET Core .NET Remoting和WebServices .net(C#) .NET/C# .netcore .NET技术 .NET连接SAP .UD选择集 /h /ui2/cl_json @click.prevent _E8_AE_BA_E6_96_87 ~ { ABAP} ~ ~{一起学ABAP}~ “SAP.Middleware.Connector.RfcConfigParameters”的类型初 《ABAP专栏》 《SAP ABAP基础通关百宝书》【从入门到精通】 《测绘程序设计精品案例合集》 《计算机网络自顶向下方法》学习笔记 【Azure 应用服务】 【SAP】ABAP-CDSVIEW 【速成之路】SQLserver 0.0-SAP BW学习 001-计算机基础 01检验类型 1 10.Abap 10.ABAP-CTS 102 1024程序员节 103 1155服务器装系统 12.SAP-SKILL 122 13台根服务器位置 15行 1809 1909 1核1g1m服务器相当于什么性能 2003服务器修改ftp密码 2010 2012服务器系统安装数据库 2012服务器系统安装数据库吗 2018年终总结 2019 2019java专科 2019年终总结之SAP项目实践篇 2022跨年烟花代码 2022年 2023云数据库技术沙龙 2023云数据库技术沙龙 “MySQL x ClickHouse” 专场 2-step picking 2-step拣配 2月一次的flyback 321 32位服务器系统安装教程 3D 40 408 408——计算机网络 408学习笔记 40位 478g+ 虚拟服务器 4hana 545移动类型 5G 6.824 60.技术开发 6------SAP 701 711 740新语法 7------SAP A a2dp AA AB01 ABAP ABAP 语法 ABAP AES加密解密 ABAP ALV abap alv 更改数据 abap alv新增行数据 ABAP AMDP abap bapi ABAP BAPI分享 ABAP BASE64加解密 ABAP BC400 ABAP CDS ABAP checkbox ABAP Dialog开发 ABAP DOI ABAP EXCEL ABAP Expression ABAP GUID ABAP Handy program abap hr ABAP IDOC abap java ABAP JSON ABAP JSON大小写 ABAP JSON驼峰 abap me21n增强 abap mm后台表 ABAP Modify 的用法 ABAP New ABAP REST API ABAP REST JSON ABAP RSA PSE ABAP RSA 加密解密 ABAP SAP ABAP SESSION传递 ABAP SMARTFORMS 默认 WORD 编辑 ABAP Table ABAP Toolbar ABAP tools ABAP wait abap xml 日期格式 ABAP 报错 ABAP 笔记 ABAP 常见错误 ABAP 程序开发 abap 程序模板 ABAP 初级技术 abap 创建出口历程 abap 调用java abap 发送json报文 ABAP 关键字 ABAP 基础知识 ABAP 技巧 ABAP 接口 ABAP 开发 ABAP 乱乱记 ABAP 内表 ABAP 内表 排序 abap 内表 条件查找 ABAP 配置相关 ABAP 批量创建货源清单 ABAP 屏幕开发激活显示 ABAP 人事模块 abap 上传excel数字去除千分符 ABAP 实用程序记录 ABAP 事务代码 ABAP 数据字典 ABAP 替换 ABAP 替换字符 ABAP 条件断点 DEBUG ABAP 未按大小排序 ABAP 销售模块 ABAP 新语法 ABAP 选择屏幕 ABAP 学习 ABAP 学习笔记 ABAP 一些常用技巧 ABAP 语法备忘 ABAP 增强 abap 指定长度服务器上传数据 ABAP 中级技术 abap 转换成字符串 ABAP 字符查找 abap 字符串操作 ABAP  屏幕流 ABAP 开发模块 ABAP/4 ABAP_01 ABAP_02 ABAP_BASIS ABAP_FUNCTION MODULE ABAP_OTHERS ABAP_SYNTAX ABAP_各路小技能 ABAP2XLSX ABAP4 ABAP7.50 ABAP740新语法 abapdata定义方法 abaper ABAP-FICO ABAP报表程序结构框架 ABAP报错 abap捕获当前功能键sy ABAP查找代码块 ABAP常用代码段 ABAP程序例子 ABAP初级 ABAP创建搜索帮助 ABAP打印 ABAP的BAPI ABAP调优 LOOP ABAP定时job abap动态变量 ABAP动态修改屏幕 abap读取sap服务器文件名 abap对接外围系统 abap分页 ABAP工具 ABAP关键字 ABAP函数 abap获取日期 ABAP基础 abap基础入门 ABAP基础语法 ABAP基础知识 ABAP技能树 ABAP技巧之游标 ABAP技术 abap技术栈 ABAP加密 ABAP-接口 ABAP开发 ABAP开发回顾总结 ABAP开发随便记录 ABAP开发学习 ABAP开发语言 abap开发注释快捷键 ABAP开源项目清单 ABAP快捷键 abap连接mysql ABAP模块 ABAP内表汇总 abap判断包含字符当中包含小数点 ABAP屏幕相关 ABAP其他增强 ABAP入门 ABAP时间戳 ABAP实例分享 ABAP使用技巧 abap视图字段限制 ABAP数据库删除 abap数据类型转换 ABAP四代增强 ABAP四舍五入 ABAP随笔 ABAP提取汉字 abap文件上传 abap文件下载导出 ABAP问题记录 abap系列 ABAP相关 ABAP小工具 ABAP小记 ABAP小技巧 ABAP校验时间日期格式 abap新语法 ABAP新语法汇总 ABAP新语法收集整理 ABAP修改删除数据 ABAP选择屏幕 ABAP选择屏幕开发 ABAP学习 ABAP学习记录 ABAP学习实用网址 abap语法 ABAP语法优化 ABAP语言 ABAP增强 ABAP知识点总结 ABAP指针 ABAP中RANGES的用法 ABAP中的同步和异步调用 abap字符串值变量 Abaqus ABLDT ABLDT_OI ABMA AC_DOCUMENT Account Group ACDOCA Activate ADD NEW FONT ADO.NET Adobe Form ADT AES AFAB/AFABN AFAMA AG1280 AirByte AJAB ajax AL11 ALE all in one Allocation Rule ALV ALV List ALV SEL_MODE alv 刷新 ALV报表 ALV横列单元格颜色 ALV模板 ALV鼠标右键 alv下拉 alv显示基础 ALV知识点 AMDP amp AMS系列产品 android android studio Android9设备打开WIFI热点 android不同版本风格 android模拟器 android热点流程 Android网络接入框架分析 Android系统开发 Angular angular.js ANSYS Ant Anywhere数据库监控 AO25 aof apache Apache DolphinScheduler API api document APM APO APO函数 APO开发 app App Service for Window application app测试 app服务器设计文档 app服务器数据库文件夹下 aps APT Architecture Archiving Area Menu arm arraylist ar路由器的虚拟服务器 ASAP asp.net asp.net MVC Assortment ATO Attribute AuCs authorization Automatic AutomaticScrg automation AVForamt AW01N Awesome Java awk awr AWS AWS SAP AWS SAP认证 aws认证 AWS战报 Azure Azure Storage B2B增长 Backflush BADI BANK Bank Account BAPI bapi sap 创建物料 BASE base64 bash BASIS Basis Consultant Questionnaire BASIS基础知识 BASIS模块 BASIS系统配置及操作 BASIS中遇到的问题 batch Batch Data Conversion BD87 BDC bdv021-clickHouse Beginning WF 4.0翻译 BGP路由器协议排错 bgRFC BI BI+BW+BO仓库管理 big data BigData ble bluetooth BO BOBF bom bom成本分析模型 bom更改编号 sap books bookv001——navigationing Boost完整实战教程 bootstrap BOPF BP BPC BPC开发 BP共用编码 BP和客商关联后台表 BP-客商 BP配置 bp配置 sap BP文档 break BRF+ BRFplus BSP BSTAT=U bt BTE BTEs BTP BUG BUG问题解决 BulkStorage BurpSuite插件 Business Suite BusinessPartner BUT000 BW BW/4 HANA BW4 bw4/ hana BW4/HANA BW4HANA BW报表使用操作手册 BW技术 BW建模 BW实施 ByteDance C# C# IO相关 C# sap集成 C# WPF C# 编程 C# 窗体应用 C# 读取txt文本数据 C# 读取文本每行每列数据 C# Stopwatch C#Winform C#编程 C#高级 C#格式转化 C#基础 C#基础知识 C#教程 C#入门经典 C#算法演义 c#学习 C#知识点笔记 C/4 C/4HANA c/c++ C++ C4C CA CS CO cad项目数据库服务器 Calculation CapacityCheck case when Cash Management cast CA周记 CBS CCNP题库 CDISC CDS CDS View CDS Views CDS视图 Cell Popin centos certificate CertificateType Change Log ChatGPT CHECK_ACCESS_KEYS CHECKBOX CheckBoxGroup Check按钮 chrome CI & CD CIO ci上传文件到不同服务器 cj20n sap 报错未知列的名称 CKM3 CKMLCP CL_GUI_ALV_GRID cl_ukm_facade Class ClickHouse clickhouse数据库 Client Copy CLIENTCOPY Cloud Cloud Native Cloud Platform CloudFoundry CMS CMU15-445 (Fall 2019) CO CO01 co88 sap 实际结算 COCA单词表 COCA高频单词 COCA核心词汇 COCA英语分频词汇 COCA英语语料库 CO-CCA CODE COGI COKEY Commerce Commvault Commvault技术知识点 Configuration connect_by_path ContentServer continue Control ControlQuantity CONV Conversion COPA COPC COPY来源 Cording Block Core Data Service(CDS View) CO控制 CO配置 CPI CPI技术小知识 CPLD CPM cpu CRM CRM系统 crm系统服务器要求 cross warehouse Crystal Reports CS CSharp CSI SAP2000 CSI SAP2000安装教程 css css3 CSV认证 CTCM ctf CTF-MISC CTF-Misc-wp CTS Customers CVI_CUST_LINK CVI_VEND_LINK C和C++Everything教程 C语言 C语言程序设计 Dapr Data Services Data sources database datagridview dataTable交换列 dataTable列操作 DATAX date DateNavigator DB DB LUW DB2 dba DBA 实战系列 DBCO DD08V DDIC DDS算法 debian debian云服务器项目 Debug debug方法 DEBUG改SAP表数据 Decal Decline demo DEMO程序 des DESADV DESTINATION DestinationProvider devexpress v22.1 devops DevSecOps DIalog Dictionary Encoding Diff discuz服务器系统 disk dms dns怎么修改默认服务器 docker docker容器 dom dont show this message again Driver E5调用API E5开发者 E5续订 EBS Ecc ECC_常用标准函数标准方法 ECC6 ECC6是否支持linux7 echarts eclips Eclipse eclipse报错 ECM ecmascript ECM企业管理 ecn EDI EDIT Ehancement EHP EHP4 EHP8 elasticsearch elementui ELT emqx English Enhancement enhancement MBCF0007 Enterprise Servers and Development Entity Linking Enumeration EOS空项目添加服务器 EPIC EPIC_PROC epoll EPPM erp erp oracle数据库连接失败 ERP 增强 erp5 ERP-SAP erp服务器系统分区多大 ERP供应链 ERP实施 erp无线架设服务器 ERP系统 erp系统 服务器在哪里的 ERP项目 ERP小讲堂 es6 esb ESP8266 esri ESXI ETBAS二次开发 eth节点计划服务器维护 ETL etl工程师 ETL工具 ETL开发规范 ETL社区版 ETL数据集成 ETO events EWM EWM模块 Example examples EXCEL Excel服务器数据库修改 Exception EXCLUDING express F.13 F-02 F110 F5080 FAA_CMP_LDT FAGL_FC_VAL FAGLGVTR FB05 FBB1 FBL1N ffmpeg FI FI01 FI12 FI12_HBANK FI-AA FICO fico bapi FICO Integration FICO-AA FICO模块 FICO-年结 FICO问题点 FICO-月结 FICO增强 field-symbols fifaol服务器不稳定 file Fine finereport FINSC_LEDGER Fiori fiori 2.0 fiori app configuration fiori launchpad Fiori-Web FIORI配置 Fixed point arithmetic FixedStorageBin FI财务 FI金额 FI配置 FLCU00 flex FLVN00 FM Focus FONT FONTS For FOR ALL ENTRIES IN FPGA fpga开发 FPGA项目例子总结 FPM framework freemarker Freight标签页 freshman to ABAP FS15会计科目扩充 FTP ftp 网页如何上传到服务器 ftp传输文件到其他服务器 ftp服务器存放文档 ftp服务器端文件大小设置 ftp服务器设置上文件大小 ftp服务器生成xml文件 FTP服务器收不到传送的文件 ftp服务器数据存放位置 ftp服务器文件路径怎么写 ftp服务器限制文件大小 function Function ALV Function Modules functional programming Functions Game Gartner Gateway GATEWAY100 GBase gdal GeneXus GeneXus 2021 gentoo 安装php7 GeoTools GET Parameter GIS Git github Gizmos gnu go google Google 微软 亚马逊 阿里 腾讯 字节跳动面试总结 GR GR Date GR/IR GR/IR余额清单 GRaph Process groovy GroupNumber gui GUI STATUS gui740的消息服务器 GUID GW100 H3c 服务器bmc管理芯片 h3c服务器 raid 型号 h3虚拟服务器 h5修改服务器数据 hadoop HAHA SQL halcon HANA HANA Advanced Data Modeling HANA Advanced Data Modeling 读书笔记 HANA DB HANA DBA hana s4 服务器 HANA SQL hana sql mysql oracle HANA SQLScript HANA Studio HANA VIEW hana vs oracle hana 表空间 hana 查看表字段 HANA 导入数据 hana 服务器性能测试 HANA Studio HANA安装 hana查询去重 HANA常用函数 hana抽数到mysql hana的date对应oracle日期 hana服务器销售资质 HANA进阶学习 hana生产系统服务器 HANA实战 hana数据库 hana数据库 字段长度 hana数据库导入mysql hana数据库导入到oracle hana数据库服务器文件丢失 hana数据库教程php hana数据库连接mysql hana数据库连接oracle hana数据库与mysql HANA信息建模 Hana性能优化 hana修改字段 HANA学习 hana语法 HANA在线日志 Hashid hash-identifier hbase HCM HCP HDI Container HEC hibernate hierarchy Hints his系统服务器数据存在哪里 His系统数据库服务器关系 hive HNUST湖南科技大学计科专业考试复习资料 hp380G5服务器系统安装 hp服务器产品文档 HR HR模块 HR薪资发放过账 HR增强 HTAP HTAP for MySQL html html5 HTML5/CSS/Bootstrap http http://95u.free.fr/index.php httpcompnents https https://mp.weixin.qq.com/s/keb HU Hybris I/F IBAN IBP ICF ID ide idea idea中项目如何上传到服务器中 IDES IDoc idoc java IDOC技术 IDT ifm_research_notes IFRS16 iis ftp服务器文件大小 ijkplayer IM image imessage IMG子菜单 import IM层面 Include Informatica inspection point intellij idea Inter-company Intergration Internal table Interview INVOIC ios iot IP ipad协议 ipfs存储服务器销售 IQ02 IQ09 IR IRPA ISO IS-RETAIL issue IT IT - Linux ITS ityangjia IT技术 IT企划 IT生涯 IT项目与团队 IT养家 j2ee J3RCALD jar Java java b1 b1 be a9 Java Connector java jco sap 重连 JAVA PI PO SOAP JAVA PO SOAP java sap总账凭证接口 java webservice调用sap Java Why java 访问hana java 薪水完爆abap JavaScript javaSE基础篇 Java并发 Java调用SAP java调用sap接口 JAVA调用SAP接口地址 java对接sap java更换sap配置不生效 Java工具类 JAVA工作日常 java函数调用报错 java获取hana接口数据 java获取sap数据 java开发 java连接hana java连接sap Java连接sap无明显报错信息 java实战 java项目所需服务器 JAVA学习 java云服务器怎么上传文件大小 java怎么安装apple JAVA重点部分的笔记 java转sap hybris方向 JCo jco.client.saprouter JCo3 JCO连接 jdbc JDBC连接 JDK jira JOC Join JOIN 内表 jpa jquery js json json 服务器 文件 js基础笔记 junit JVM jwt K3 kafka KANBAN KE24 kernel kettle KEY kohana KP06与KP26 KSU5 KSV5 kubernetes labview lambda lamp LAN leetcode LEFT DELETING LEADING LENGTH Leonardo less linq Linux linux 64位vcs linux hana linux hana 版本查询 linux 安装sap linux 划分两个VDisk linux 命令是 的sap linux64 solvers Linux查看hana数据库进程 linux登录Hana数据库 linux调用rfc函数配置 Linux开发分享 Linux启动SAP服务 linux如何查看MBFE版本信息 Linux网络 linux系统的服务器怎么重启 linux相关 linux中停sap服务 lisp list LISTING Lock Logic LogicSystem lpfs存储服务器怎样维护 LQ02 LSETBF01 LSMW LT23 LT41 LT42 LT45 LTMC LTMC和LSMW等 LTMOM LX03 LX09 LX10 LX11 LX12 LX29 LX39 M_MSEG_LGO mac mac os x macos Mail makefile Manage Banks manager mariadb Markdown mass MASTER DATA MAST表 matdoc Material Group Material Ledger MaterialSpec matplotlib matrix maven MaxDB MaxWeight MB04 MB51清单格式 MB5B MB5M MBSM MBST MBST冲销 mcu md01和md02区别 MD04 MD04中例外信息30 MDBS MDG MDG 2021 MDG 2022 MDG BP MDG顾问 MDG项目 ME me15 me21nme22nme23n增强ME_ ME22N ME57界面看到的供应源跟Source List主数据不一致 MEBV memcached MES Mesh Message Messages MetaERP Method List MF47和COGI MI10 MIBC microsoft Microsoft Access Microsoft Azure Microsoft365 E5 MIGO MIGO 241 migo 311 MIGO+201 migo初始化库存 s4 MIGO事务代码 MIGO增强 MIGO子功能 migration Migration cock MIRO MIRO发票校验 MIRO发票校验多采购订单选择 mkpf ml MM mm bapi MM/SD mm17 MM41创建的商品主数据 MM41创建商品主数据 MM60 MMBE MMPV MMSC MM-报表功能开发 MM-采购管理 MM-采购审批 MM常用BAPI MM-定价过程 MM更改物料类型 MM顾问 MM教程 MM模块 MM配置 MM物料管理 mobile MODIFY table MOVE TO movement type mp3 MP38 MPN MPN物料的采购初探 mps MQTT mqtt服务器数据存储位置 mqtt协议库服务器 MRP MRP标识 MRP处理代码 MRP过程 MRP组 MS SQL mseg mssql MTE MTO MTO/MTS MTS MTS/MTO/ATO/ETO MTS/MTO/ETO Mule ESB 开发 Mule ESB 社区版 实施 Mule ESB 实施 Mule ESB开发 Mule ESB社区版实施 Mule ESB实施 MultipleBOM MultipleSpecifications MultipleSpecs Muxer mvc MWSI mybatis mybatis-plus myeclipse mysql mysql 1060指定的服务未安装 mysql hana数据同步 mysql版本情况 Mysql等数据库 MySQL高级 mysql和hana mysql数据库停库停不下来 MZ SAP FICO精讲视频 MZ SAP那些事 nagios name_mappings Naming Convention NAST nas怎么备份服务器文件夹 NativeLibrary.Load nat服务器性能 nc 二次开发 NCO NCO3.0 nc文件服务器 数据库文件 NDSS NetSuite 案例 NetSuite新闻 Netweaver network New NineData nlp Node node.js nodejs nokia NoSQL NOTE npm null Number Range numbers numpy NW751 nwa key-storage NWBC NX文档服务器 o365 OA OAAQ OABL oa办公 OB07 OB08 OB13 OB52 OB62 OB74 OBBH OBJK ObjType OBR1 OBR2 OBR3 OBYC-DIF OBYC-PRD oceanbase ocx OData odbc odoo office OI-题解 olap OMIR OMSJ OMSY OMX6 Onenote_DB Onenote_Others onetime vendor On-premise OO OOALV OOALV进阶 OOALV增删改查 OPEN open item OPEN SQL Open Storage Opengauss openGauss核心技术 OPENSAP UI5 扫盲 OPENSQL Openui5 openwrt系统安装到云服务器异常 ops$ oracle数据库用户 ora 01005 linux Oracle oracle 60401 oracle clob minus oracle dba Oracle EBS oracle e-business suite 下载 Oracle ERP oracle ftp 文件乱码 oracle hana 字段长度 oracle logon 乱码 oracle nid ora 24324 oracle sap 备份 oracle sap金蝶 oracle set newpage Oracle Tuning oracle 抽数据到 hana oracle 创建一揽子协议 oracle 打开数据库三步 oracle 应用系统 oracle创建服务出错1073 oracle和netsuite培训 Oracle数据库 oracle数据库恢复版本不一致 oracle与用友的差别 OS other Others Outbound Overtime p2p PA PaaS PACKAGE SIZE Pandas parallel Parameter Partner payment Payment method Payment Terms PA认证 PB00 PBXX PC PC00_M99_CIPE PCo PCP0 PC安装服务器系统 PDA pdf performance PE安装服务器系统6 PFCG PGI Pharos(小白路标) php php功能函数 PHP开发erp功能模块 php连接sap hana数据库 php清理服务器文件大小 php与sap系统 php转行自学java PhysicalSamples PI PI/PO ping pip PIPO PIR PI接口常见问题处理 pi节点虚拟服务器怎么弄 Plant Group PLG PLG Application跳转传参 plm PLSQL PLSQL13 PLSQL弹出框 PM pmp pms PMW PO po 价格条件表 PO&amp poi PolarDB Popup Port Portal POS POS Interface PostgreSQL posting key postman Postman 接口测试 Power BI PowerBI PowerBuilder Powered by 金山文档 powerpoint PowerQuery&amp PO接口常见问题处理 PO中基于GR的IV清单 PP PP &amp PP Module PPM PP模块 pp模块常用表 sap PP生产订单 PP生产过程 PR PREPACK Pricing Print PROCEDURE Product Hierarchy project management PS PS模块 pu Purchase Purchase Order History Categor pyautogui pycharm python Python Golang 人工智能 机器学习 图像处理 Python场景积累 python获取sap数据 Python基础 PYTHON接口开发 python连接sap接口 python能连sap吗 python学习 python与sap QA08 QA11 QC51 QE01 QE23 QM QM Control Key QM采购质量管理 QM质量管理 QP01 qRFC QS28 QS61 qt qt5 Quality Certificate Quant QUERY R3 rabbitmq rac 服务器 修改时间 RadioButtonGroup Random react react.js READ receive idoc redhat redis REDUCE Reflex WMS REM REP Report ReRAM rest REST ADAPTER RESTful RETAIL ReturnDelivery RFC rfcv函数实现 RFC查询SAP数据库 rfc方式的集成 sap RFC封装WEBService RFC函数 rfc垮端口 sap RFSEPA02 RIGHT DELETING TRAILING Rollout project Routing RPA RPA机器人 RPA机器人流程自动化 RPA魔力象限 RPA资讯 RPC0 RSA RSA Encryption RSA PRIVATE KEY RSS RTMP协议云服务器 runtime rust RV_ORDER_FLOW RWBE r语言 R语言入门课 S/4 S/4 HANA S/4 HANA 1809 S/4HANA S/4HANA 2020 S/4HANA 2021 S/4HANA 2022 S/4HANA迁移 S/4补0 去0 s_alr_87013127 S_ALR_87013611 S_ALR_870136XX s2k S4 S4 CLOUD/ FIORI S4 CRM S4 HANA s4 hana ecc S4 HANA 功能变化清单 S4 HANA数据迁移工具 S4 HAVA S4 Kernel S4CRM S4H PA S4HANA S4HANA Conversion S4HC S4HC产品相关 S4新表ACDOCA S4新型数据导入工具 saas SAC Sales Area SALES PRICE SampleSize SAP sap abap SAP ABAP学习 SAP Basis SAP / 后台配置 SAP 1809 sap 46c oracle 从unix 迁移至 windows SAP ABAP SAP ABAP  Excel模板上传及Excel数据批导 SAP ABAP AES128 SAP ABAP AES256 SAP ABAP for HANA SAP ABAP HANA SAP ABAP Runtime Error SAP ABAP SHA512 SAP ABAP 编程教程 SAP ABAP 并发 SAP ABAP 核心代码 SAP ABAP 基础 学习 SAP ABAP 李斌的分享笔记本 SAP ABAP 问题整理 SAP ABAP 学习资料 SAP ABAP 增强 SAP ABAP(总结) sap abap接口篇 SAP ABAP开发 sap abap开发从入门到精通 SAP ABAP开发实战——从入门到精通 SAP ABAP开发问题记录 SAP ABAP开发专栏 SAP ABAP零碎知识 SAP ABAP浅尝截止 SAP ABAP实例大全 SAP ABAP性能优化 SAP ABAP增强 SAP ABAP自学教程 SAP Adapter SAP Adobe Form SAP AES加密解密 SAP ALE SAP ALV SAP Analytics Cloud sap and oracle SAP APO SAP APO 介绍 SAP Ariba SAP ARM SAP B1 SAP B1 License Serve SAP B1原创 SAP BAPI SAP Basis SAP Basis Tips SAP Basis 系统学习 SAP Basis&amp SAP BDC SAP BDC MODE SAP BDC模式 SAP BI on HANA SAP BO SAP BOBF/FPM/WEBDYNPRO SAP BOBJ SAP BOM反查 SAP BOM记录查询 SAP BOM修改记录 SAP BP SAP BTP SAP business one SAP Business One 二次开 SAP BW sap bw、echar、smart bi sap bw4 sap C/4HANA SAP C4C SAP CAR sap cds view SAP client2.0 download SAP Cloud SAP Cloud Platform SAP Cloud Platform Cockpit SAP CO SAP Consultancy SAP CP SAP CPI SAP CRM sap crm button SAP Data Service sap dbco访问oracle SAP DEMO数据增加 SAP Dialog调用 SAP Dialog开发 SAP Dialog学习 SAP ECC SAP ECC6 SAP ECC6 / CO SAP ECC6 / FI SAP EDI SAP EPIC SAP ERP SAP ERP系统 SAP EWM SAP excel数据导入 SAP FI sap fi  凭证跳号 SAP FI-AA SAP FICO SAP FICO 报错处理办法 SAP FICO 开发说明书03(源代码仅做参考) SAP FICO 系统配置 SAP FICO 资料免费分享 SAP FICO开发说明书_01(源代码仅作参考) SAP FICO开发说明书_02(源代码仅作参考) SAP Fiori SAP Fiori & SAP(open) UI5 SAP Fiori 开发实践 SAP FM SAP freelancer SAP Frori SAP Gateway SAP GUI sap gui script SAP GUI 登录不需要密码 SAP GUI 界面 SAP GUI 快捷方式密码 SAP GUI 密码保存 SAP GUI 免密登录 SAP GUI 主题 SAP GUI 主题切换 SAP GUI+WEBGUI SAP GUI界面切换 SAP GUI密码设定 SAP GUI切换 SAP HAN SAP HANA SAP HANA Hint sap hana oracle exadata SAP HANA SDI sap hana 迁移 oracle SAP HANA 数据库学习 SAP HANA  上云 SAP HANA2.0 SAP HANA总结 SAP HCM SAP HCM学习 SAP HR sap http SAP IBP SAP IDOC sap idoc java SAP INBOX SAP IRPA SAP ISSUE sap java客户端 sap java乱码 SAP JCO NCO SAP JCO 负载均衡 SAP License sap linux客户端 sap linux系统安装教程 sap linux下配置文件 SAP List Viewer(ALV) SAP LOGON SAP LSMW SAP LSMW教程 SAP LUW SAP MASS SAP material classification SAP MDG SAP ME sap me21n增强 sap me22n增强 sap me23n增强 sap mes java SAP MII SAP MM SAP MM BAPI SAP MM 对于MRKO事务代码的几点优化建议 SAP MM 后台配置 SAP MM 特殊库存之T库存初探 SAP MM 小贴士 SAP MM/SD 业务相关 SAP MM06 SAP MM基础配置 SAP MM模块面试 SAP MRP默认值 SAP MRP默认值设置 SAP MRP配置 sap mysql SAP Native SQL SAP Nco 3 Connector 连接SAP 并接收数据 SAP NetWeaver sap netweaver 7.02 sap netweaver application server java SAP NetWeaver RFC library SAP NWBC sap nwds as java SAP ODATA SAP OData 开发实战教程 - 从入门到提高 sap oracle client SAP PA证书 SAP PI SAP PI - 同步 vs. 异步 SAP PI PO 接口调用 SAP PI PO 接口问题 SAP PI SSL证书 SAP PI&amp SAP PI/PO SAP PI/PO 系统集成 SAP PI架构 SAP PLM SAP PM SAP PM 工厂维护 SAP PO SAP PO PI 系统接口集成 SAP PO SSL证书 SAP PO 导入SSL证书 SAP PO/PI接口 sap powerdesigner SAP PO安装 SAP PP SAP project SAP PS SAP QM sap query SAP R/3 SAP R3 SAP R3 ABAP4 SAP R3 主流系统EAI接口技术剖析 sap r3的lanuage 代码 SAP REST API SAP REST JSON SAP Retail SAP RFC SAP RFC 与 Web有啥区别 SAP ROUTRE SAP RSA 加密解密 SAP S/4 SAP S/4 HANA SAP S/4 HANA Cloud Sap S/4 Hana 和Sap ERP有什么不同 SAP S/4 HANA新变化-FI数据模型 SAP S/4 HANA新变化-MM物料管理 SAP S/4 HANA新变化-SD销售与分销 SAP S/4 HANA新变化-信用管理 SAP S/4 HANA新变化-主数据:物料主数据 SAP S/4 HANA新变化-主数据:业务伙伴之后台配置 SAP S/4 HANA与SAP Business Suit SAP S/4 MM SAP S/4HANA SAP S/4HANA表结构之变 SAP S4 SAP S4 HANA SAP S4 HANA CLOUD SAP S4  有用链接 SAP S4/Cloud应用 SAP S4/HANA FICO都有哪些改变? SAP S4HANA SAP S4HANA里委外加工采购功能的变化 SAP SBO9.1 SAP SBO重装 SAP SCM EWM SAP script SAP SD SAP SD MM PP FICO SAP SD 常用表 SAP SD 基础知识之定价配置(Pricing Confi SAP SD 基础知识之计划行类别(Schedule Lin SAP SD 基础知识之物料列表与物料排除 SAP SD 基础知识之行项目类别(Item Categor SAP SD 销售中的借贷项凭证 SAP SD 信贷管理的操作流程 sap sdi mysql SAP SD常用表 SAP SD基础知识之凭证流(Document Flow) SAP SD基础知识之输出控制(Output Control SAP SD模块 SAP SD模块-送达方和售达方的区别和联系 SAP SD微观研究 SAP SHIFT SAP SICF REST SAP smartforms乱码 SAP smartforms转pdf SAP smartforms转pdf乱码 SAP SQL sap srm SAP SRM 开发 SAP SRM  函数 sap strans解析json SAP TIPS SAP UI5 SAP UI5&amp SAP Variant 配置 SAP VC SAP Web Service SAP Web Service简介与配置方法 SAP Webservice SAP WM SAP WORKFLOW SAP XI/PI SAP 案例方案分享 sap 报错 注册服务器错误 SAP 报错集合大全 SAP 标准功能 SAP 标准教材和自学方法 sap 标准委外和工序委外 sap 查看服务器文件夹 SAP 常规 SAP 常用表 SAP 常用操作 sap 成本中心下的po SAP 成都研究院 SAP 导出 HTML sap 导出系统所有的单位 SAP 登录图片修改 SAP 顶级BOM查询 sap 订单状态修改时间 SAP 端口 SAP 发票合并与拆分 sap 发送mesage SAP 反查顶级BOM SAP 反查一级BOM sap 服务器信息 SAP 功能函数 sap 供应商表 SAP 顾问宝典 SAP 函数 SAP 后台表 SAP 后台配置 sap 计划订单 sap 假脱机请求 SAP 接口 SAP 接口测试 SAP 结账流程 sap 界面创建凭证 SAP 金税接口介绍 SAP 开发 sap 流程图 退货销售订单 sap 默认屏幕变式 SAP 配置 &amp SAP 批量创建货源清单 SAP 请求号 SAP 权限 SAP 权限配置 SAP 商超订单统一管理系统 SAP 商品主数据 SAP 数据库删除 SAP 数据字典 sap 双计量单位 sap 思维导图 SAP 锁机制认识 SAP 通用功能手册 SAP 透明表 SAP 图片修改 sap 文档服务器安装 SAP 问题以及报错 SAP 物料版次 SAP 物料不一致 SAP 物料删除标记 SAP 物料在启用序列号管理或者不启用序列号管理之间快速切换 SAP 系统 sap 消耗策略999 sap 消息服务器 bat sap 小技巧 sap 新建事务 sap 新增科目表 sap 修改服务器时间格式 sap 修改许可服务器 SAP 虚拟机配置1-FI SAP 虚拟机配置2-CO SAP 虚拟机配置3-MM SAP 虚拟机配置7-WM SAP 序列号与库存关联起来? SAP 选择屏幕 SAP 选择屏幕开发 SAP 演示数据增加 SAP 业务 SAP 业务顾问成长之路 sap 一代增强 SAP 银企直连 SAP 银企直联 SAP 银行对账 sap 用户权限表 SAP 语法(Syntax) SAP 员工主数据 SAP 原材料 SAP 云 SAP 杂项 SAP 增強 SAP 增强 SAP 之门 01 SAP 中国研究院 SAP 主题 SAP 字段增强 SAP 自动化 SAP  ERROR sap  hana SAP  MM知识点 SAP  PP SAP  配置 BOM SAP Enhancement SAP Migration SAP SD SAP STMS SAP&amp SAP* sap*账号 SAP,SD SAP/ABAP SAP/ABAP 相关汇总 SAP/ABAP记录 SAP/ERP SAP/FICO sap/hana SAP_ABAP SAP_ABAP知识点 SAP_BAPI SAP_BASIS SAP_FICO sap_mm SAP_PP SAP_SD SAP_Table SAP_TCODE SAP_モジュール_MM SAP_モジュール_SD SAP_常见问题集合 SAP_常用BAPI SAP_常用表 SAP_各路小技能 SAP_基本配置 SAP_接口 SAP_视图 SAP·SD SAP2000 sap2000学习笔记 SAPabap SAP-ABAP SAP-ABAP-Function SAP-ABAP基础语法 SAP-ABAP-基础知识 SAP-ABAP小白学习日常 SAP-ALL SAP-ALV SAPB1 SAP-BASIC SAP-Basis SAP-Bassic-基础知识 SAP-C01 SAP-CO SAPECC6.0 SAPFI SAP-FI SAP-FI/CO SAP-FICO SAP-FICO-CO SAP-Fiori SAP-GR SAPGUI SAPHANA SAP-HANA saphana服务器操作系统说明 saphana服务器硬件评估 SAP-IR sapjco SAPJCO3 sapjco配置文件下载 sapjoc3 SAPLINK SAP-MDG SAP-MDG-GEN SAP-MDG-HOWTO SAP-MDG-INTEGRATION SAPMM SAP-MM SAP--MM SAP-MM-采购管理 SAP-MM-后台 SAP-MM-前台 SAP-MM问题集锦 SAP-MM-问题记录 sapmto生产模式配置及操作详解 sapnco sapnco3 receive idoc sapnco3 接收 idoc sapnco3.0 SapNwRfc.dll SAPOSS SAP-Other SAP-PM SAP-PO SAPPP SAP-PP SAP-PP模块 SAP-PS SAP-QM SAP-RETAIL SAProuter SAP-RPA SAP-SD SAPUI5 SAP-UI5 SAPUI5核心内容 SAPUI5教程 SAP-WDA SAP-WM SAP案例教程 SAP宝典 SAP报表开发工具 Report Painter SAP边做边学(自学)-看看坚持多久 SAP标准工具程序 SAP表 SAP--表相关 sap采购订单更改记录 SAP采购订单增强 sap采购申请自动转采购订单 SAP仓储单位SU SAP-操作文档 SAP策略组 sap产品 sap产品图谱 - road to sap.pdf SAP常规功能 SAP-常见问题 SAP常用BAPI SAP常用表 SAP超时设置 sap成本流怎么看 SAP创建自定义权限 SAP呆滞库存的计算 SAP代码分享 SAP单链接 SAP的NOTE sap的pod确认 sap的工作日历 SAP的技术战略 SAP的竞争战略 sap的清账是什么意思 SAP调用 SAP队列 SAP访问本机虚拟机服务器 sap放弃java sap服务器安全证书 sap服务器查看系统日志目录 sap服务器出pdf文件 sap服务器迁移性能问题 sap服务器数据库配置文件 sap服务器文件上传 sap服务器怎么安装双系统 sap服务器之间文件复制 SAP改表 SAP--概念 SAP干货分享 SAP各种BOM汇总——含义解释 SAP更改物料类型 sap更改主题 SAP工具 SAP-工作 SAP公司 sap供应商更改组 sap固定资产号码范围 SAP顾问 SAP顾问进行时 SAP顾问那些事 SAP管理 SAP核心模块 SAP后台配置 sap后台配置原因代码 SAP环境配置 sap获取系统时间 SAP基本安装 sap基于mysql安装 SAP技巧 SAP技巧集 SAP技术 SAP技术端 SAP技术文档 SAP技术小知识 SAP技术总结 SAP加解密 SAP加密 SAP架构 SAP-架构 sap假脱机打印机设置 SAP监控 SAP监控常用TCODE sap脚本运行 SAP教程 SAP接口 SAP接口 证书和密钥 SAP接口编程 SAP接口常见问题处理 SAP接口开发 SAP接口数据库 SAP接口相关设置 SAP解密 SAP界面设置 SAP经验 SAP开发 SAP-开发 sap开发需要java吗 sap开发语言 sap可以指定应用服务器 SAP客户数据 SAP客户数据导出 sap客户信贷 sap客户主数据bapi SAP-跨模块知识 SAP零售 SAP零售行业 SAP密码过期设置 sap模糊搜索闪退 SAP模块 SAP模块知识 sap内部顾问 sap内部运维 sap培训 SAP培训机构 SAP配置 SAP批量打开工单 SAP批量导出客户 SAP批量导出客户数据 SAP批量修改 sap期初导资产代码 sap清账使用反记账 SAP请求传输 SAP取历史库存(可查询期初期末库存和指定日期之库存) SAP权限管理 sap权限激活 SAP认证 SAP如何发布webservice SAP入门 SAP软件 SAP删除物料 SAP上云 sap生产工单报工 SAP实施 SAP实施攻略 SAP实施知识 SAP使用技巧 sap事务代码 sap事务代码如何收藏 SAP视频 SAP视频教程 SAP视图 SAP视图批量维护 SAP视图维护 SAP数据表 SAP数据导入导出 SAP数据分析 SAP-数据库 sap税码配置 SAP索引不存在 SAP通用技能 sap外币重估流程图 SAP维护 SAP-未分类 sap未分摊差异怎么处理 sap文化 SAP文章 SAP问题处理记录 sap无法正常启动服务器配置文件 SAP物料classification SAP物料类型 SAP物料删除 SAP物料视图批量维护 SAP物料视图维护 SAP物料特性值 SAP物料主数据 SAP稀有模块 sap系统 SAP--系统 sap系统ftp服务器下文件 SAP系统-MM模块 sap系统搭建教程 sap系统登录时没有服务器 SAP系统管理 SAP系统界面 SAP系统配置 sap系统前台数据与后台表之间 SAP系统研究 sap系统中的batch sap相关知识 SAP项目 sap项目部署到服务器 SAP-项目经验 SAP项目实施 SAP-项目实施随笔小计 SAP项目问题 sap消息服务器错误 SAP--消息号 SAP消息监控器 SAP销售订单邮件 sap销售发货的流程 sap销售凭证流mysql表 sap销售维护 SAP销售员维护 SAP小问题 SAP写入mysql SAP心得 SAP新产品系统 SAP修改已经释放了的请求号 sap虚拟机 多个服务器 sap虚拟机作为服务器 SAP选择屏幕 SAP选择屏幕开发 SAP学习 SAP业务 SAP异常处理 SAP银企直连 SAP银企直联 SAP银行账户管理(BAM) sap应用服务器超载 SAP邮件发送 SAP邮件记录 SAP邮件记录查询 SAP云平台 SAP运维 SAP-运维记录 SAP杂谈 SAP-杂谈 SAP杂项 SAP在采购和销售中的税务处理-增值税 sap增加事务代码权限 SAP增强 SAP战报 SAP战略中的机器学习 SAP知多少 SAP知识点 SAP制造集成和智能 SAP智能云ERP SAP中CK11N成本估算 sap中re凭证是什么意思 SAP中s_p99_41000062查询物料价格数据库表 SAP中报表清单导出的常用方法 SAP中的client SAP中的贷项凭证、借项凭证 SAP中的移动类型 SAP中方会计凭证解决方案 sap中国 sap中文使用手册 模块指南 SAP中销项税MWSI和MWST有什么区别? SAP中执行没有权限的事务 SAP中自动登出 SAP转储订单(STO) SAP咨询公司 SAP资讯 sap字段及描述底表 sap自带samples sap自动化 SAP自习室 SAP组连接 SAP最大用户数设置 sara SAST SAT SBO开发 SCA scala SCC4 Schema schema增强 scipy scm SCP SCP Cockpit scpi Screen SCRIPTFORM scripting Tracker SD sd bapi SD Module SDI SD常用表 SD模块 SD销售 se09 SE11索引 SE16N SE16和SE16N修改后台表数据方法 SE37 SE38 se91 SE93 Search search help security segw SELECT Select Screens select sql Selenium SEN SER01 Serial  Numbers SERVER Serverless service servlet Set SET Parameter setting SFW5 ShaderGraph sharepoint Sharepoint Or Online shell SLD SLT SM02 sm36 SM37 SM50 SM59 smartbi问题 Smartform smartforms SNOR SNP BLUEFIELD SNP 中国数据转型公司 SNUM SOA soamanager soap SoapUI 接口测试 socket SOD Software Development Notes Sort and Filter Sotap Source Scan spa Hana SPAD Spartacus标准开发 Spartacus二次开发 SPC SPED SPOOL打印 spring Spring Boot SpringBoot SPRO spss打开oracle SQL SQL server SQL Trace sqlite Sqlmap使用教程 sql-sap SQLSERVER SQLSERVER内部研究 SqlSugar sql笔记 SQL语法 sqoop SR2 sRFC srm SSCRFIELDS ssh SSIS ssl SSL证书 ST05 ST12 START STE stm32 STO Stock Type stocktransfer Stopwatch StorageLocationControl StorageType StorageUnitType StorLocControl streamsets string SU20 SU21 SU24 Submission SUBMIT sudoku SUM Suport SUSE SUSE 11 SP4 SUSE Linux SU号码 SXI_MONITOR SXMB_MONI SXMSPMAST Sybase Sybase迁移数据到Oracle Sybase数据库迁移数据到Oracle SYSAUX Sysbase system System_failure s云服务器 网站群服 T184L T681 table TABLE FUNCTION Tableau Tabstrip TCode T-Code tcp/ip TCP/UDP Socket TCPH TCP客户端显示服务器图片 TDSQL-C TeamViewer Tech 专栏 TechArt Teradata Test Automation test-tools Textbox TH_POPUP TiDB TikTok tim发文件服务器拒绝 TITLE TM TMS TODO tomcat tomcat报错 ToPrintControl Tough tp5部署虚拟机服务器 tp5服务器信息 tp5网站 服务器部署 tp5项目链接服务器数据库端口888 TR TR LIST Trace Transact-SQL transformer tree control tRFC trigger TryHackMe typescript T公司 T库存 u3d微信小游戏 u8信息服务器 UB UB STO ubuntu UD udp UD配置 uefi ugui ui UI5 Uibot Uipath UI开发 UI控件 UI自动化 unicode unity Unity 100个实用技能 Unity UGUI Unity3D Unity开发 Unity日常开发小功能 Unity微信小游戏 unity项目部署到服务器上 unity游戏开发 Unity坐标转换 unix Url URP user Userid usual UUID ux U盘 U盘文件拷贝到服务器 VALUE VARIANT VariantBOM vasp计算脚本放在服务器的位置 vb.net VBA VBA开发专栏 VBFA v-bind vbs Vendor CoA VendorCOA VendorRebate Verilog-HDL veth vhm在服务器上创建虚拟机 v-html VIEW vim visual studio visualstudio vite VKM3 VKM4 VL02N VL04 VL10B VL31N VL32N VMware VN VOFM v-on VS Code vscode v-show Vue vue.js vue2 Vue3 基础相关 vue项目如何放到服务器上 VulnHub渗透测试 WA01 WA21 WBS WCF WCN WDA WDA的配置 wdb WE20 WeAutomate Web web app Web Dynpro web gui Web IDE Web Service WebDispather WEBGUI WEBI webm webrtc WebService WEBSOCKET webvervice webview web安全 Web安全攻防 web渗透工具 WF 4.0 while Wifi热点java win10服务器系统数据库 win7系统创建ftp服务器地址 win7系统数据库服务器 Window windows windows服务 windows服务器版本系列 windows系统部署git服务器 Windows系统电脑操作 winform wireshark wlan WM WMS WM仓库管理 WM层面盘点 WM模块 WM配置 WM移动类型 Work Work Flow workflow wpf wps WR60 WRMO wsdl xaf xml xp系统怎么上传到ftp服务器 XS HANA XS Job xsdbool yara规则 yqv001-navigation Y企业信息化集成 Zabbix ZIP zk zookeeper zypper in 安装下载不了 阿里云 阿明观察 埃森哲 X SAP:智慧转型高手论剑 安鸾靶场 安全 安全分析 安全工具 安全架构 安全手册 安全与测试 安阳虚拟服务器 安装 安装报错 安装服务器系统数据库服务器 安装数据库服务器需要的文件 安装完数据库服务器为空 安卓 安卓服务器文件 案例 案卓盒子建立文件服务器 靶机 百度 办公自动化 包含服务器数据库的聊天系统 保护交货计划 保留空格 报表 报表优化 报错 报工 贝叶斯 备份及容灾 备份文件到内网服务器 被合并的公司 笔记 笔记本通过服务器提升性能 币别转换 编程 编程技术 编程世界 编程语言 编程语言排名 编辑器 编辑器转换 变更物料类型 变化 变式物料 标题 标准 标准成本历史清单 标准价 标准价和移动平均价 标准解决方案 表白网站怎么上传到服务器 表关系 表维护生成器 博弈论 补丁 补货监控 不常用 不能从服务器上获取视频文件格式 不同系统可以用一个数据库服务器吗 布局 部署 部署网页到华为云服务器 部署系统时访问服务器 财务报表 财务报表版本 财务管理 财务会计 财务科目导入 财务凭证行项目 财务增强 财务账期 采购 采购订单 采购订单和内部订单对应关系清单 采购订单价格与发票价格差异 采购订单审批 采购订单收货和订单收货区别 采购订单修改触发重新审批 采购订单增强 采购订单状态标准查询配置 采购附加费 采购附加数据 采购合同与采购计划协议关联性 采购价格 采购凭证模板 采购申请 采购审批 采购审批过程 采购收货及发票校验记录清单 采购退货 采购退货操作 采购退货测试 采购退货流程 采购退货业务 采购退货移动类型 采购信息记录 采购组 踩坑 踩坑日记 菜根发展 菜鸟日记 菜鸟之家 参数文件 参与MRP 仓库 苍穹ERP 操作符 操作系统 测绘程序 测试 测试工程师 测试工具 测试环境 策略组 层级查询 查看ftp服务器里的文件 查看服务器上文件命令 查询分析器 查询服务器系统类型有哪些 查找代码段 查找增强点 差异 差异分析 产品 产品成本估算 产品成本核算号 产品创新 产品经理 产品驱动增长 产品运营 常见端口 常见问题 常用bapi 常用sql 常用函数 常用数据类型 常用问题收集 常用自建函数 超自动化 成本对象 成本分割 成本估价历史清单 成本估算 成本估算的取价逻辑 成本核算表计算间接费用 成本核算结构 成本核算中BOM和工艺路线 成本收集器 成本要素 成本要素不可更改 成本中心标准报表 成本中心实际/计划/差异报表 成都最稳定的dns服务器地址 程序/PROGRAM 程序导出 程序人生 程序人生 ABAPer 程序人生和职场发展 程序设计 程序下载 程序员 程序员职业发展 持久类 持续集成 冲销扣料 初级成本要素 初阶 初学 初学者 处理外向交货单 触发器 传媒 传输 传输层 传输请求 传输日期 串口通信 创建服务器共享文件夹 创建物料主数据时的视图状态 创新 创新案例 创新战略 垂直居中 磁盘管理虚拟磁盘服务器 次级成本要素 从u盘引导进入linux6 存储 错误处理 错误解决 达梦 打印 打印次数 打印机 大厂面试 大庆服务器维修 大数据 大数据分析 大数据工程师 大数据可视化 大小写 大型服务器安装什么系统 代码规范 代码片段 代码在哪用到了 带格式的邮件附件 带你走进SAP项目 单片机 单片机系列 单位 单文件 单元测试 弹出框问题 弹性计算 导出电子表格问题 导出内表数据至Excel文件中 导出期末或指定日期库存 导入 导入license 导入数据库显示服务器发生意外 倒冲 到期发票清单VF04功能 登陆语言 登录oa系统输入服务器地址 登录日志怎么实现 低代码 低功耗文件服务器 地球 递归 第三方 第三期间 第一个ABAP程序 点击ftp服务器的文件弹出登录界面 电话 电商 调试 调试器 调用sap接口 调用接口 调用子屏幕修主屏幕 调优 调制与编码策略 鼎信诺显示连接服务器失败 订单 定价 定价过程 定价例程 定价值 定时采用ajax方式获得数据库 定时器 定时任务 定时同步文件到ftp服务器 定义 定义详解 动态安全库存 动态获取字段名 动态类 动态属性和事件绑定 冻结功能 冻结库存 冻结库存转库 读取文件内表数据 端口 队列 队列末尾 对象 对象不支持属性或方法dbzz.html 多扣料冲销 多流 多人共用 不能访问目录 多送或者少送 多线程 多引擎数据库管理系统 多源异构数据汇聚平台 多重科目分配 俄罗斯报表 二代增强 二级标题-003-Pacemaker 发票处理系统 发票冻结原因 发票冻结原因及解除冻结 发票小金额差异 发票自动化 翻译 反冲 反记账 反记账数据转换 返工 泛微OA调用SAPwebservice详解 泛微OA开发 方便小函数 方格子无盘服务器怎么用 访问后台接口 非技术区 非技术文章 非限制库存 分包后续调整 分布式 分类 分类账 分配表 分配分摊 分三个屏幕的OOALV 分析云 分享学习 服务 服务类采购订单的收货审批确认 服务器 服务器 文件类型 服务器 稳定 重要性 服务器1g内存装什么系统 服务器cpu只显示一个核 服务器host文件目录 服务器raid1做系统 服务器vos系统怎么装 服务器安全证书登陆失败怎么办 服务器安装系统sles系统 服务器安装系统如何选择网关 服务器安卓系统安装教程 服务器被攻击 文件被删除 服务器比对数据库差异文件 服务器标识信息 服务器部署的参数文档 服务器操作系统套什么定额 服务器操作系统用什么好 服务器操作系统与数据库 服务器查看操作系统类型 服务器查看数据库日志文件 服务器查文件 服务器出生点配置文件 服务器传送过来的是什么信息 服务器搭建网站方案500字 服务器大内存系统吗 服务器的ftp数据库信息 服务器的参数配置文件 服务器的地址信息 服务器的共享文件地址 服务器的系统文件怎么恢复出厂设置密码 服务器登录需要信息吗 服务器定时任务系统 服务器读取不了文件 服务器放文件 服务器故障修复费用需要摊销吗 服务器光纤存储系统 服务器接入协议是什么 服务器快照能代替网站备份吗 服务器扩容文档说明 服务器链接数据库配置文件 服务器两个网站公用一个数据库 服务器默认文档 服务器内存扩展板位置 服务器内存条的种类文档 服务器内存性能好 服务器内存在哪个位置 服务器内核文件在哪 服务器迁移操作系统 服务器迁移需要哪些操作系统 服务器如何查看文件个数据库文件夹 服务器如何分多个文件 服务器设计虚拟内存 服务器设置上传文件大小 服务器适合安装深度系统deepin 服务器数据库查看版本信息 服务器数据库查看版本信息失败 服务器数据库的文件读取数据库 服务器数据库系统 服务器数据库协议 服务器数据库用什么系统 服务器数据系统 服务器网站关联数据库 服务器微端位置 服务器维护 吸尘器 服务器维护费入什么科目 服务器文件地址 服务器无盘镜像导入 服务器物理机部署 服务器物理内存只增不降 服务器物理组成 服务器系统安全方案 服务器系统安装ansys 服务器系统安装oracle数据库 服务器系统安装报价 服务器系统版本选择 服务器系统方案 服务器系统和数据库的用处 服务器系统架构讲解 服务器系统盘50g什么意思 服务器系统盘大文件检测指令 服务器系统盘分多少 服务器系统数据库安装 服务器系统性能灯 服务器系统有多大 服务器系统与数据库 服务器系统怎么恢复出厂设置 服务器修改mime类型 服务器修改密码规则 服务器虚拟化与企业私有云 服务器虚拟机的c盘怎么加 服务器选择系统版本 服务器与本地文件共享 服务器怎么清除日志文件 服务器只读团体字信息 服务器中文档存储在哪 服务器主板坏了怎么维修 服务器主板维修电子书 服务器装系统快吗 服务器装系统无显示屏 服务器租赁文档 服装信息化 浮点运算 福建工程学院计算机网络技术期末考试试卷 辅助线框 付款 付款流程 付款条款 付款信息 负号前置 负库存的相关设定 复合角色 复制创建采购申请 复制控制 复制文件到服务器 内容不足 概念整理 感悟 高级退货管理 高阶 高可用架构 高斯坐标 高性能服务器一体机 高性能有限元计算服务器 个人经历 个人开发 个税系统代理服务器参数是什么 个性化定制 给标准报表添加字段 给一个oracle账号密码是什么 更改成本要素类别 更改物料类型 更新服务器数据库文件位置 工厂 工厂管理 工厂内库存转移 工厂日历 工具 工具集锦 工具类 工具使用 工具使用指南 工具手册 工具系列 工业软件 工艺路线 工资发放和结算 工资计提 工作 工作笔记 工作量法 工作流程自动化 工作流自动化解决方案 工作杂记 工作总结 公式计算 公司财务系统html 公司代码货币 公司服务器可以查询员工哪些信息 公司间STO 公司间STO‘ 公司间过账 公有云-华为 功能 功能测试 功能开发说明书 供应链 供应链管理 供应商 供应商采购冻结 供应商评估 供应商清单输出 供应商子范围 沟通能力 购买云服务器配置项目 估价容差测试 固定点算术 固定资产 固定资产会计 固定资产折旧 固定资产折旧码 顾问之路 挂微群发软件需要什么服务器信 关闭 关系模型 关于R/3 关于赛锐信息 关于信用管理--信用更新 管理 管理数据库 广播 消息 没有服务器 归档 规格说明书 国产器件 国产软件 国产数据库 国科大学习 国内服务器内存缓冲芯片 国外服务器显示数据库 哈希算法 海康4200服务器进不去系统 海口服务器系统租用 海纳百川 含税价 邯郸虚拟服务器 函数 函数/FUNCTION 函数技巧 函数模块 函数式编程 好书推荐 合作案例 合作伙伴 和车神哥一起学 核心主数据 黑盒测试 黑名单 恨ta就教ta  SAP 红蓝攻防篇 后端 后端开发 后鸿沟时代 后台Job 后台表 后台导出表数据 后台服务器 后台开发 后台作业 胡思乱想 湖仓一体 互联网-开源框架 华为 华为2012服务器系统安装教程 华为hana服务器型号齐全 华为服务器gpu芯片 华为服务器raid1装系统 华为服务器安装2012系统怎么分区 华为服务器安装nas系统 华为服务器扩容内存进不去系统 华为服务器修改root密码 华为无线局域网 华为云 华为云服务器更换操作系统 华为云服务器还需要确定位置吗 华为云服务器系统备份 华为云服务器自己维护吗 华为怎么安装服务器系统版本 环境搭建 缓存 汇率维护 汇率转换 汇总 会计 会计分录 会计基础资料 会计科目 会计科目表 会计科目删除 会计凭证批量导出 会计凭证清账 会计凭证替代 会计凭证中的注释项目 会用到的 绘图 绘图工具 惠普服务器G8系列做raid 活动 伙伴功能 货币过期 货币类型 货币停用 货源清单 获取窗体下的所有控件 获取汇率 机器人流程自动化 机器学习 鸡肋 积累 基本单位 基本配置 基础 基础模块 基础入门 基于收货的发票校验配置过程 基准日期 集成 集团货币 集中采购 己建立BOM清单 计划策略 计划策略40 计划订单 计划时界应用 计划时界应用测试 计划数量小于收货或发票数量 计划协议 计划行类别 计划行类别中请求/装配 计划行统计清单 计量单位 计入物料成本 计算步骤 计算机 计算机毕业设计 计算机基础 计算机基础知识 计算机科学分成什么模块 计算机体系 计算机图书 计算机网络 计算机网络 王道 计算机网络rip路由表题目 计算机网络理论概述 计算机网络原理(谢希仁第八版) 计算机网络远程管理作业答案 计算机维护 计算机信息管理自考-04741计算机网络原理 计算机自学考试 记录问题 记账冻结 记账码 技能 技巧 技术 技术分享 技术干货 技术交流 技术类 技术沙龙 技术渗透 技术文档 技术总结 寄售 寄售交货 寄售结算规则 寄售模式 加密 加密算法 加前导零 加速器 价格修改历史 架构 架构设计 架设企业文件服务器 假期日历 监控 监控服务器系统备份 监控服务器系统密码忘了怎么办 监控平台 监控事件 监控系统 监控系统里服务器 监控系统是否要服务器 减值准备 检验点 检验计划 检验类型 检验类型89 检验批 检验批系统状态 简单窗体实现 简单的数据库管理系统 用什么云服务器 简述客户 服务器系统的组成 建议组件分配到BOM 渐变色UI描边 将服务器上数据库复制到本地文件 将已有项目转移到云服务器 交互 交货单 交货计划固定 交货计划期间保护 角色 角色继承 角色设计 教程 教育电商 阶梯价格 接管日期 接口 接口测试 接口方式 接口问题处理 接口-银企直连 结算会计年度 截取年月日在hana中怎么写 解决方案 界面 借贷 金丹期 金蝶 金蝶 系统服务器繁忙 金蝶K3 金蝶二次开发好跳槽吗 金蝶服务器维护 金蝶云星空操作手册 金蝶中间件部署报栈溢出 金额转换 金税接口 仅在总账中过账 仅装配 仅组件 进口采购 进入文档服务器不能输入密码 进销存 进销存报表 进销存系统怎么部署到自己服务器 经历 经验 经验分享 经验总结 精诚MES 精诚智慧工厂 精选 境外服务器稳定 镜像 玖章算术 就是玩儿 矩阵 聚合函数 聚集函数 开发 开发笔记 开发工具 开发管理报表 开发环境 开发平台 开发语言 开发者 开发知识点 开源 开源ERP 开源-JDK-镜像 开源系列谈 开源项目 看板 考试 考试复习 考研 科技 科技公司 科目行项目不显示 可配置物料 客供料 客户 客户冻结 客户端往服务器写文件 客户端修改opc服务器的数据 客户服务 客户-服务器数据库系统举例 客户服务器系统的特点是 客户关系处理能力 客户关系管理 客户贸易伙伴 客户信贷管理解析 客户主数据 课程 课程笔记 课堂笔记 空调控制系统节点服务器 空间管路 口碑效应 库存地点MRP 库存地点权限控制 库存管理 库存决定 库存批次 库存需求天数关系 库龄 跨公司STO 跨国跨公司间转储 块设备驱动 快捷 快捷键 快手服务器协议 快速定制 框架 鲲鹏服务器系统重装 扩充存储地点 扩展 扩展知识 来也科技 蓝桥杯 蓝牙 蓝牙A2dp 浪点服务器芯片 乐鑫 类型强转 理解 历史库存sap 利润表 利用云服务器传递信息 连接 链表 良仓太炎共创 两步法拣配 料主数据中的屏幕字段 列表 列存索引 列存引擎 零基础快速学习 ABAP 零散知识 零售 零售行业 零碎(凑数)的算法[题] 零停机 流程自动化 流水号 流水码 流星的程序集 漏洞预警 录屏 录像机显示服务器 乱码 论文 论文阅读笔记 蚂蚁无线管理器服务器 买个服务器来挂协议 买了一个服务器修改密码 漫谈计算机网络 贸易伙伴的应用 没有MANDT字段 没有中间凭证冲销 媒体 每日摸鱼新闻 门店视图 门店主数据 免费流量获取 免关税 面试 面向对象编程 面向对象方法 敏捷 敏捷开发 命名规范 模板语法 模块 模块测试 莫队 莫队算法 目标跟踪 内表 内表类型 内表字段 内部订单 内部订单清单 内部订单删除问题 内部订单月结差异 内存管理 内存数据库 内存图片 内核 内核驱动 内核驱动开发记录 内嵌Excel 内容服务 内容服务平台 内容服务软件 内容库 内外码转换 内网 内网渗透 内向交货单 那个网站的服务器不限制内容 能不能用pe安装服务器系统安装系统 能力建设 能源 年结 爬虫 排行榜 排序算法 盘点 盘点流程 培训 配额协议 配置 配置SAP服务器外网登陆以及网络故障解决示例 配置笔记 配置高性能文件服务器方案 批次 批次拆分 批次管理 批次号 批次确定 批次特定单位 批次特性 批导程序模板 批导模板下载 批量采购冻结 批量导出表数据 批量更改会计凭证文本 批量维护 批量用户账户锁定 平行记账 凭证冲销的种类和处理逻辑 凭证打印 凭证流 凭证状态 凭证状态S 屏幕(Dialog)开发 屏幕SCREEN字段属性 屏幕程序 屏幕设计 破坏式创新 破解 期初库存金额 期初资产数据导入 期刊阅读 期末不挂科 期末复习 期末库存金额 其他 其他应付款-代扣代缴 其他知识点 奇技淫巧 麒麟服务器数据库协议 企业/办公/职场 企业安全 企业服务器文件管理 企业管理软件 企业级应用 企业解决方案 企业内部控制 企业内容管理 企业软件 企业微信 企业文件服务器备份 企业系统 企业信息化 企业信息化前沿 企业资源计划 启用WEBGUI服务 迁移驾驶舱 前端 前端基础练手小项目 前端架构 前端开发 前端开发相关 前端框架 前后端 前台操作 嵌入式 嵌入式开发 嵌入式学习--STM32 嵌入式硬件 清软英泰plm服务器安装文档 清帐 清账 清账凭证 请求 请求传输再还原 请求号 区块链 区块链技术 区域菜单 驱动开发 取价逻辑 取消审批 取样策略 取值相关 去前导零 全角半角转换 全球最大sap hana系统建立在以下哪个厂商的服务器产品上 全球最大的采购服务平台 权限 权限对象 权限管理 权限合规检查系统 权限控制 権限 缺料提醒及警报 热点开启 流程 人工智能 日常ABAP开发记录 日常Bug 日常工作 日常记录 日常学习工作经验分享 日常知识分享 日记 日历 日期 日期函数 容器 容器服务 容灾 如何安装华为服务器系统软件 如何把项目部署到内网服务器 如何传输本地文件到服务器 如何从服务器上更新文件 如何导出序时账 如何读取服务器文件数据 如何复制服务器数据库文件大小 如何将CRM系统上传到服务器 如何将hana数据同步到oracle 如何设置sap生产订单自动关闭 如何统计输出条目数量 如何修改服务器root密码 如何知道有哪些物料存在BOM 入后在服务器修改数据库 入库 入门 入侵一个网站的服务器拿数据 入行SAP咨询 入职甲方 软件 软件安全 软件部署 软件测试 软件测试知识 软件程序 软件工程 软件教程视频集合 软件开发 软件生态 软件下载 软件显示未找到服务器 软考 软实力 软硬件运维 赛锐信息 三代增强 扫描代码 删除 删除记录 商城小程序买哪种服务器 商品主数据 商务智能 商业软件 商业智能 上传 上传附件出错 上传图片 上传文件到云服务器存储路径 上架策略B 上架策略C 上架策略P 上线 上云 设备维修 设计模式 设计与维护类 设置参数缺省值 社保管理系统连接不上服务器 社区活动 深度学习 深度优先 深澜系统服务器架构 审计导出表数据 审计序时账 审批策略 审批代码 渗透 渗透笔记 渗透测试 渗透测试自学日志之基础原理篇 渗透工具之信息收集 升级 生产版本 生产版本排序规则 生产版本选择规则 生产版本选择逻辑 生产版本选择顺序 生产版本优先顺序 生产成本收集 生产排程 生产系统服务器主机名怎么看 生活 生活感悟 什么情况使用一次性供应商及客户 什么是BAPI 什么是序时账 时间比较 时间对象 时序数据库 实施 实施SAP 实施项目 实时集成变式 实时库存 实体服务器怎么配置文件 实习 实习生 实战SAP程序开发 使用感受 使用决策 事务代码 事务代码LX04 事务代码WRCR 事务技术名称的显示与隐藏 事务码/TCODE 视觉语言导航 视频 视频处理 视频监控选择服务器的配置文件 视图 收货冲销 收货处理 手动加载ICU库 手机主服务器怎么配置文件 售后管理 输入历史记录 暑假复习 树查询 树莓派 数独 数据安全 数据仓库 数据仓库学习分享 数据从hana倒回Oracle的方法 数据导入 数据导入和处理 数据分析 数据分析 + 机器学习 数据分页 数据服务器 操作系统 数据服务器什么系统软件 数据服务器文件夹 数据服务器与文件服务器 数据格式 数据湖 数据结构 数据结构与算法 数据科学入门 数据可视化 数据库 数据库备份到文件服务器 数据库表字段 数据库操作 数据库的文件服务器配置 数据库服务器部署文档 数据库服务器网页 数据库服务器系统 数据库服务器系统崩溃 数据库服务器系统的 研发 数据库服务器系统软件 数据库服务器压缩文件 数据库管理与维护 数据库规划、部署 数据库和服务器什么协议 数据库和服务器系统怎么安装 数据库技术 数据库架构 数据库监控 数据库监控软件 数据库开发 数据库文件共享服务器配置 数据库系统概论 数据库系统原理 数据库系统怎么与软件连接到服务器 数据库与服务器通讯协议 数据库最新排名 数据类型 数据链路层 数据浏览器的字段名称显示 数据迁移 数据迁移驾驶舱 数据迁移完整性检查 数据挖掘 数据治理 数据中台 数据中心IDC架构及容灾与备份 数据重置 数据字典 数学建模篇 数字化 数字化管理 数字化转型 数字货币 数字业务整合 双计量单位 双路服务器只显示一半内存 双碳 双网文件服务器 水晶报表 税改 税率 税友报税软件让修改服务器地址 私有云虚拟化服务器群 思爱普 思科里服务器的dns配置文件 死锁 四代增强 四元数 搜索帮助 搜索引擎 搜索引擎营销 速食 算法 随便看看 随机方向 随机数 损益表 所见即所得的打印功能 锁定 锁定事务代码 抬头文本被强制清空 探测服务器操作系统版本 特殊库存 特殊移动标记 特性 腾讯云 提升工作效率的工具 题解 替代 替代/校验/BTE 天正服务器不显示 添加列到指定位置 条件 条件表 条件类型 条码系统 跳槽 跳过代码 贴花 通过SQVI增加表格字段 通信协议 同步 同方服务器系统安装 统驭科目理解 透明表 图论 图像处理 吐槽 外币评估 外币评估记账 外部采购 外部断点 外贸管理软件 外贸软件 外向交货单 外协加工 外语能力 完美汽配管理系统v12服务器 完整的采购订单业务信息凭证流 玩转STM32 万彩录屏服务器不稳定 网吧无盘用华为服务器 网卡 网卡驱动 网络 网络安全 网络安全学习 网络存储服务器的系统 网络管理定时备份服务器网站文件 网络接口 网络配置 网络通信 网络拓扑仿真模拟 网络文件服务器有哪些 网络协议 网络协议栈 网络设备 网络规划 网络工具开发 网络营销 网页 服务器 数据库 网页如何从服务器获取数据 网页与服务器数据库 网易数帆精彩活动 网站服务器存储数据库吗 网站服务器没有安装数据库 网站服务器没有数据库备份 网站服务器与系统部署策略 网站跨域访问服务器数据库 网站上传到服务器需要上传数据库 网站数据库断连重启服务器 网站虚拟服务器1核1g速度 网站需要数据库服务器吗 网站与数据库不在同一服务器 网站云服务器需要数据库吗 往来余额结转 往年购置资产 微前端 微软 微软azure 微信 微信小程序 为服务器安装操作系统的流程图解 为什么文件上传不了服务器上 为资产分类定义折旧范围 维护视图 维护思路 委托加工 委托租赁云服务器协议 委外 委外加工 委外加工采购流程里副产品的收货 委外库存 委外销售订单库存 未能找到使用主机名称的服务器 未能注册模块 未清项管理 文本编辑器 文本表 文档管理 文档管理软件 文档协作 文档资料 文华软件登录显示请选择服务器 文件存储服务器 方案 文件服务器 华为 文件服务器 内存需求 文件服务器 内存需求大么 文件服务器报码表xls 文件服务器存储 文件服务器放在哪里 文件服务器和nas存储 文件服务器和数据库的区别 文件服务器可以存储的文件类型有 文件服务器内存 文件服务器内存要大吗 文件服务器网盘 文件服务器为何存不了大文件 文件服务器帐号切换 文件服务器属于固定资产吗 文件共享服务器所需虚拟机资源 文件名带中文上传ftp服务器变乱码 文件虚拟服务器 文件一般存在数据库还是服务器 问答 问题 问题处理 问题记录 问题解决 问题总结 我的SAP系统开发里程碑 我的问题 无代码 无代码开发 无法输入事务代码 无盘服务器工作流程 无盘服务器内存多大好 无盘服务器配置20台 无线监控设置smtp服务器 无值记账 物定工厂物料状态 物联网 物料 物料编号 物料编码 物料编码更改 物料变式 物料单位更改 物料分类账 物料管理 物料价格清单 物料库存/需求及供应天 物料凭证 物料凭证类型和交易/事件类型 物料帐 物料账 物料账期 物料主数据 物料主数据视图 物料主数据视图维护状态 物料组 物料组的分配规则 物流 习题 系统/网络/运维 系统安全 系统安装 系统服务器常见出厂密码有哪些 系统集成 系统架构 系统开发 系统未配置文件服务器是啥意思 系统相关 系统云端服务器 系统怎么访问数据库服务器 系统中的缺料情况及控制 下架策略A 下架策略M 下拉框 下载 下载程序 先后顺序 先进的数据库服务器操作系统 先进生产力工具大全 现金管理 现金流量表 线段树 线性规划 响应函数 向上取整 向下取整 项目 项目表 项目部署在服务器上的形式 项目管理 项目迁移 项目前端 项目实施经验贴 项目实战 消耗冲销 消息服务器待办事项数据库 消息控制采购订单 销售 销售(SD)凭证流 销售订单 销售订单冻结 销售订单库存 销售订单项目类别 销售订单信用冻结 销售订单中的条件类型 销售发货冻结 销售发货可用性检查 销售交货 销售开票冻结 销售税 销售项目开票 销售员 小白 小白的SAP问题积累 小程序 小程序云服务器磁盘怎么分区 小丁的blog 小记 小结 小项目(新手可做) 小型服务器的操作系统 小型企业网络存储服务器系统方案 效率 协议 心得感悟 新程序员 新基建 新建表维护程序SM30 新收入准则 新手时期 新闻 新语法 新增漏洞报告 新增移动类型科目确定配置 新总帐 薪酬核算 薪酬计提和发放 信贷 信息安全 信息安全顶会论文导读 信息化 信息化建设 信息记录 信息收集 信用额度 信用管理 行业 行业客户信息 行业趋势 性能测试 性能优化 修改,F4帮助,添加按钮 修改Q系统代码 修改表数据 修改服务器端的访问模式 修改服务器网络 修改服务器信息使密钥不过期 修改记录 修改交货单 修改历史 修改数据库安装的服务器 系统时间 修改物料组 虚拟服务器需要网关吗 虚拟服务器英文翻译 虚拟服务器资源 虚拟服务器资源配置 虚拟服务器最大磁盘2TB 虚拟化 虚拟机 虚拟机迁移后服务器无法启动 虚拟机如何做服务器系统 需求分析 需求类型 需要访问其他服务器信息吗 序列号 序列号管理 序列号清单 序时账导出方法 序时账核对 选型 选择屏幕 选择屏幕打开文件路径 学术前沿 学习 学习ABAP笔记 学习笔记 学习方法 学习人生 学习问题 学校三级项目 循环 压力测试 压力测试 闪存 亚马逊 亚马逊云科技 研发管理 研发效能 业财一体化 业务 业务处理 业务范围 业务分析 业务功能 业务顾问 业务顾问的小需求 业务伙伴 业务价值 一般总账科目数据转换 一次性供应商及客户 一次性供应商及客户应用经验 一个服务器 定时从各个系统取数据 一键还原服务器系统 一台服务器能存放几个系统 一台服务器如何部署多个项目 一套适合 SAP UI5 开发人员循序渐进的学习教程 医药行业 移动开发 移动类型 移动类型101/102 移动类型325 移动类型343 移动类型配置 移动平均价 异步Function 异常 异速联客户端未获取到服务器信息 音频编码解码 音视频 音视频开发 银企直连 银企直连接口 银企直联 银行 银行账户管理 隐式增强 印度 印资企业 应付职工薪酬 应收应付 应用设计 应用性能监控 英一 英语 硬件服务器搭建系统步骤 用户 用户定义的消息搜索配置 用友 优化 由于质量原因而冻结 邮件发送 邮件服务器及相关配置 邮件合并居中,框线 邮件预警 游戏 游戏服务器修改其他玩家数据 游戏开发 游戏引擎 有没有便宜一点的网站服务器 有限元模拟 余额不平 与SAP集成相关 语言 语言概览 语音 预留 预算管理 预制凭证 原创 原创项目 原力计划 源码 源码分析 月结 阅读分享 云 文件 服务器 文件怎么恢复出厂设置密码 云ERP 云安全 云备份 云财经服务器维护 云存储系统服务器版安装 云打印 云端 云服务 云服务器 云服务器 ftp上传文件大小 云服务器 选择什么系统版本 云服务器 重做系统软件 云服务器1和1g装什么系统好 云服务器cpu系列 云服务器ecs销售渠道 云服务器ubuntu修改密码 云服务器安装其他版本系统 云服务器部署mqtt协议通信 云服务器部署tomcat文件修改 云服务器磁盘怎么安装系统 云服务器存放位置 云服务器搭建推流系统 云服务器可以存放文件吗 云服务器免费suse系统 云服务器哪种系统好用 云服务器如何修改ssh密码是什么 云服务器软件文件管理 云服务器数据库密码修改zoc 云服务器网络配置信息查询 云服务器维护安全管理制度 云服务器物理部署位置 云服务器系统类别怎么选 云服务器系统租赁费用 云服务器修改ssh密码 云服务器需要装系统吗 云服务器怎么存文件大小 云服务器怎么多人进去编辑文档 云服务器怎么设置数据库文件 云服务器转租赁协议 云基础架构 云计算 云计算/大数据 云解决方案 云排产 云平台 云文档管理 云文档管理系统 云原生 云运维&&云架构 运算符 运维 运维开发 运维实施 运维系统 服务器监控 运维相关 运行效率 杂货铺 杂记 杂谈 杂项 再次冲销 在服务器删除的文件 恢复出厂设置密码 在服务器上建一个文件夹 在建工程 在建工程期初数据 在没有配置的dns服务器响应之后名称 在制品 怎么看系统服务器类型 怎么修改存储在服务器的数据 怎么修改服务器php版本信息 怎么在服务器上备份数据库文件在哪里 怎么在服务器上复制网站 怎么找到服务器的文档 怎样读取服务器上的数据库文件 怎样修改美国的服务器节点 增长策略 增长黑客 增强 增删改查 增值税 增值税调整 掌握物料库存,需求及供应情况 账号 账期设置 账期未开 折旧记账数据不在BSEG 正确使用一次性供应商及客户 正则表达式 证书 知识分享 知识管理 知识库 知识图谱 直线折旧法 职场 职场和发展 职业 职业发展 只存放文件的服务器 指纹识别 指纹字典 指针 制造 制造商物料 质量部门 质量管理 质量信息记录 质量证书 智慧企业 智能开发 智能运维 智能制造IT规划 智能制造执行系统 中国本地化内容 中间件 中阶 中维监控显示无法连接服务器失败怎么办 中文名称的文件传不到ftp服务器 中小企业 中小型网站服务器搭建方案 中转 重复打印 重复制造 重置期初数据 重置业务数据 重置主数据 重置资产会计数据 主检验特性 主批次 主数据 主数据导入 注册机 注解 注塑行业ERP 注意事项 转换Lookup功能 转义字符 转载 装服务器得时候选择系统版本 状态栏 咨询 资产 资产负债表 资产会计 资产接管 资产年初切换上线 资产折旧 资金 资料 资讯 子屏幕 字典 字段符号 字符操作 字符串 字符串拆分 字符串前导0 字节跳动 自动补货 自动创建交货单 自动登录SAPGUI 自动化 自动化测试 自动化工具 自动清账 自动邮件 自考 自然语言处理 自学成才 综合 综合资源 总结 总账 总账科目 总账行项目中凭证缺失 总账余额结转 租赁mt4虚拟服务器 组件 组织架构 组织结构 最大限制 最佳业务实践 最具性价比的方式 作业返冲 作业价格计算 坐标反算