04-05-2006 7:40 AM
Guys,
I want to download the programs from application server into one folder.If there is any program please help on this.
If there is any attachment please mail to this id.
mailid:k_v_kumar@keane.com
regards,
vijay
04-05-2006 7:44 AM
go to se80
type the program name and click display
now goto utilities>moreutilities> upload/download--> download
specify the folder name and click save.
regards,
Kinshuk
04-05-2006 7:44 AM
go to se80
type the program name and click display
now goto utilities>moreutilities> upload/download--> download
specify the folder name and click save.
regards,
Kinshuk
04-05-2006 7:49 AM
hi Vijay,
In <b>AL11</b> TRANSACTION and follow this path <b>SYSTEM->LIST->SAVE->LOCAL FILE/OFFICE FOLD</b>ERS...
hope this helps.
Regards,
Kalyani
04-05-2006 7:53 AM
I want to download all programs which are all in application server.
Using above method we can download only one program.
regards,
vijay
04-05-2006 7:57 AM
hi vijay,
use the below program.
In the program name just type Z* or Y* to download customer programs.It is working perfectly for me.Hope you too can enjoy..The beauty is this program will also get downloaded...Enjoy!!!!!
----
Report: ZKBPROGS *
----
Function : Up/Download ABAP reports complete with texts *
----
Change Log : *
July 5, 1999 *
- Combined existing programs that did the upload and download into*
- one program. *
- Changed format that the reports are saved in to be compatible *
with Wolfgang Morgenthaler's upload/download program(YSTRASN00 *
at www.antarcon.de). Major differences between this program and*
Wolfgang's are:
- this program does not update TRDIR with the *
TRDIR entries that are in the program uploaded. Instead, *
current users stats are used. *
- this program allows selection of reports from a list or *
a single report can be tuped in and uploaded *
- this program also updates TADIR so that a development class*
is assigned to the program *
- this program checks to see if the program already has a *
TRDIR entry, and if it does, warns the user *
- this program will save/restore the program documenation too*
*
*
*
----
REPORT ZKBPROGS
NO STANDARD PAGE HEADING
LINE-SIZE 255.
----
Declare Database Objects *
----
tables:
DOKIL,
TRDIR.
----
Constants*
CONSTANTS:
MC_TRDIR_IDENTIFIER(72) TYPE C VALUE '%&%& RDIR',
MC_REPORT_IDENTIFIER(72) TYPE C VALUE '%&%& REPO',
MC_TEXT_IDENTIFIER(72) TYPE C VALUE '%&%& TEXP',
MC_THEAD_IDENTIFIER(72) TYPE C VALUE '%&%& HEAD',
MC_DOC_IDENTIFIER(72) TYPE C VALUE '%&%& DOKL',
MC_TRDIR_SHORT(4) TYPE C VALUE 'RDIR',
MC_REPORT_SHORT(4) TYPE C VALUE 'REPO',
MC_TEXT_SHORT(4) TYPE C VALUE 'TEXP',
MC_THEAD_SHORT(4) TYPE C VALUE 'HEAD',
MC_DOC_SHORT(4) TYPE C VALUE 'DOKP'.
----
----
Declare Module level data structures *
----
DATA: BEGIN OF MTAB_PROGRAM_SOURCE OCCURS 0,
LINE(72) TYPE C,
END OF MTAB_PROGRAM_SOURCE.
DATA: MTAB_PROGRAM_TRDIR LIKE TRDIR OCCURS 0 WITH HEADER LINE.
DATA: MTAB_PROGRAM_TEXTS LIKE TEXTPOOL OCCURS 0 WITH HEADER LINE.
DATA: MSTR_THEAD LIKE THEAD.
DATA: BEGIN OF MTAB_PROGRAM_FILE OCCURS 0,
LINE(275) TYPE C,
END OF MTAB_PROGRAM_FILE.
DATA: BEGIN OF MTAB_DIRECTORY OCCURS 0,
NAME LIKE TRDIR-NAME,
DESC(72) TYPE C,
SAVENAME LIKE RLGRAP-FILENAME,
END OF MTAB_DIRECTORY.
DATA: BEGIN OF MTAB_PROGRAM_DOCUMENTATION OCCURS 0,
LINE(255) TYPE C,
END OF MTAB_PROGRAM_DOCUMENTATION.
----
Selection Screen *
----
*-- Options for upload/download of programs
SELECTION-SCREEN BEGIN OF BLOCK FRM_OPTIONS WITH FRAME TITLE TEXT-UDL.
PARAMETERS:
RB_DOWN RADIOBUTTON GROUP UDL DEFAULT 'X'. " Download reports
SELECTION-SCREEN BEGIN OF BLOCK FRM_TRDIR WITH FRAME TITLE TEXT-DIR.
SELECT-OPTIONS:
S_NAME FOR TRDIR-NAME, " Program Name
S_SUBC FOR TRDIR-SUBC " Program Type
DEFAULT 'F' OPTION EQ SIGN E," Exclude Functions by default
S_CNAM FOR TRDIR-CNAM " Created by
DEFAULT SY-UNAME,
S_UNAM FOR TRDIR-UNAM, " Last Changed by
S_CDAT FOR TRDIR-CDAT, " Creation date
S_UDAT FOR TRDIR-UDAT. " Last update date
SELECTION-SCREEN END OF BLOCK FRM_TRDIR.
*-- Options for uploading programs
PARAMETERS:
RB_UP RADIOBUTTON GROUP UDL. " Upload reports
SELECTION-SCREEN BEGIN OF BLOCK FRM_UPLOAD WITH FRAME TITLE TEXT-UPL.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(29) TEXT-SNG.
PARAMETERS:
RB_FILE RADIOBUTTON GROUP HOW DEFAULT 'X'.
SELECTION-SCREEN COMMENT 33(42) TEXT-FNA.
SELECTION-SCREEN END OF LINE.
PARAMETERS:
RB_LIST RADIOBUTTON GROUP HOW.
SELECTION-SCREEN END OF BLOCK FRM_UPLOAD.
SELECTION-SCREEN END OF BLOCK FRM_OPTIONS.
*-- Options for up/downloading programs
SELECTION-SCREEN BEGIN OF BLOCK FRM_FILEN WITH FRAME TITLE TEXT-FIL.
PARAMETERS:
RB_DOS RADIOBUTTON GROUP FIL DEFAULT 'X', " Save to local
RB_UNIX RADIOBUTTON GROUP FIL, " Save to UNIX
P_PATH LIKE RLGRAP-FILENAME " Path to save files to
DEFAULT 'c:\temp\'.
SELECTION-SCREEN END OF BLOCK FRM_FILEN.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME-LOW.
CALL FUNCTION 'F4_PROGRAM'
EXPORTING
OBJECT = S_NAME-LOW
SUPPRESS_SELECTION = 'X'
IMPORTING
RESULT = S_NAME-LOW
EXCEPTIONS
OTHERS = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME-HIGH.
CALL FUNCTION 'F4_PROGRAM'
EXPORTING
OBJECT = S_NAME-HIGH
SUPPRESS_SELECTION = 'X'
IMPORTING
RESULT = S_NAME-HIGH
EXCEPTIONS
OTHERS = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_UNAM-LOW.
PERFORM GET_NAME USING 'S_UNAM-LOW'
CHANGING S_UNAM-LOW.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_UNAM-HIGH.
PERFORM GET_NAME USING 'S_UNAM-HIGH'
CHANGING S_UNAM-HIGH.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CNAM-LOW.
PERFORM GET_NAME USING 'S_CNAM-LOW'
CHANGING S_CNAM-LOW.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CNAM-HIGH.
PERFORM GET_NAME USING 'S_CNAM-HIGH'
CHANGING S_CNAM-HIGH.
TOP-OF-PAGE.
IF RB_LIST = 'X'.
FORMAT COLOR COL_HEADING.
NEW-LINE.
WRITE: AT 3 TEXT-H01,
AT 15 TEXT-H03.
FORMAT COLOR OFF.
ENDIF.
AT LINE-SELECTION.
CHECK RB_LIST = 'X'. " only do in list mode
READ LINE SY-CUROW FIELD VALUE MTAB_DIRECTORY-SAVENAME.
*-- Read file into an internal table
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_PROGRAM_FILE
USING MTAB_DIRECTORY-SAVENAME.
*-- Split table into TADIR entry, report lines, and report text
PERFORM SPLIT_INCOMING_FILE TABLES MTAB_PROGRAM_FILE
MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
CHANGING TRDIR
MSTR_THEAD.
*-- Save all of the data
PERFORM INSERT_NEW_REPORT TABLES MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
USING TRDIR
MSTR_THEAD.
----
Start of processing *
----
START-OF-SELECTION.
FORMAT COLOR COL_NORMAL.
IF RB_DOWN = 'X'.
PERFORM DOWNLOAD_REPORTS.
ELSEIF RB_UP = 'X'.
PERFORM UPLOAD_REPORTS.
ENDIF.
END-OF-SELECTION.
IF RB_DOWN = 'X'.
CONCATENATE P_PATH
'directory.txt'
INTO P_PATH.
PERFORM SAVE_TABLE_TO_FILE TABLES MTAB_DIRECTORY
USING P_PATH.
ENDIF.
----
FORM UPLOAD_REPORTS *
----
FORM UPLOAD_REPORTS.
*-- Can upload a reports entered in selection criteria or
*-- select from a list. List can be from index.txt in same directory
*-- (created by the download) or by reading the first line of each file
*-- in the directory.
IF RB_FILE = 'X'. " Upload single program from a file
*-- Read file into an internal table
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_PROGRAM_FILE
USING P_PATH.
*-- Split table into TADIR entry, report lines, and report text
PERFORM SPLIT_INCOMING_FILE TABLES MTAB_PROGRAM_FILE
MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
CHANGING TRDIR
MSTR_THEAD.
*-- Save all of the data
PERFORM INSERT_NEW_REPORT TABLES MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
USING TRDIR
MSTR_THEAD.
ELSEIF RB_LIST = 'X'. " Show list for user to choose from
*-- get list of report names/descriptions from directory text
CONCATENATE P_PATH
'directory.txt'
INTO P_PATH.
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_DIRECTORY
USING P_PATH.
SORT MTAB_DIRECTORY.
*-- Write out list of report names/descriptions
LOOP AT MTAB_DIRECTORY.
WRITE:
/ MTAB_DIRECTORY-NAME UNDER TEXT-H01,
MTAB_DIRECTORY-DESC UNDER TEXT-H03,
MTAB_DIRECTORY-SAVENAME.
ENDLOOP.
*-- Process user selections for reports to upload.
ENDIF.
ENDFORM. " upload_reports
----
FORM DOWNLOAD_REPORTS *
----
From the user selections, get all programs that meet the *
criteria, and save them in ftab_program_directory. *
Also save the report to disk. *
----
FORM DOWNLOAD_REPORTS.
DATA:
LC_FULL_FILENAME LIKE RLGRAP-FILENAME.
*-- The table is put into an internal table because the program will
*-- abend if multiple transfers to a dataset occur within a SELECT/
*-- ENDSELCT (tested on 3.1H)
SELECT * FROM TRDIR
INTO TABLE MTAB_PROGRAM_TRDIR
WHERE NAME IN S_NAME
AND SUBC IN S_SUBC
AND CNAM IN S_CNAM
AND UNAM IN S_UNAM
AND CDAT IN S_CDAT
AND UDAT IN S_UDAT.
LOOP AT MTAB_PROGRAM_TRDIR.
*-- Clear out text and source code tables
CLEAR:
MTAB_PROGRAM_FILE,
MTAB_PROGRAM_SOURCE,
MTAB_PROGRAM_TEXTS,
MTAB_PROGRAM_DOCUMENTATION.
REFRESH:
MTAB_PROGRAM_FILE,
MTAB_PROGRAM_SOURCE,
MTAB_PROGRAM_TEXTS,
MTAB_PROGRAM_DOCUMENTATION.
*-- Get the report
READ REPORT MTAB_PROGRAM_TRDIR-NAME INTO MTAB_PROGRAM_SOURCE.
*-- Get the text for the report
READ TEXTPOOL MTAB_PROGRAM_TRDIR-NAME INTO MTAB_PROGRAM_TEXTS.
*-- Get the documentation for the report
CLEAR DOKIL.
SELECT * UP TO 1 ROWS FROM DOKIL
WHERE ID = 'RE'
AND OBJECT = MTAB_PROGRAM_TRDIR-NAME
AND LANGU = SY-LANGU
AND TYP = 'E'
ORDER BY VERSION DESCENDING.
ENDSELECT.
*-- Documentation exists for this object
IF SY-SUBRC = 0.
CALL FUNCTION 'DOCU_READ'
EXPORTING
ID = DOKIL-ID
LANGU = DOKIL-LANGU
OBJECT = DOKIL-OBJECT
TYP = DOKIL-TYP
VERSION = DOKIL-VERSION
IMPORTING
HEAD = MSTR_THEAD
TABLES
LINE = MTAB_PROGRAM_DOCUMENTATION
EXCEPTIONS
OTHERS = 1.
ENDIF.
*-- Put the report code and texts into a single file
*-- Put the identifier line in so that the start of the TRDIR line
*-- is marked
CONCATENATE MC_TRDIR_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the TRDIR line
MTAB_PROGRAM_FILE-LINE = MTAB_PROGRAM_TRDIR.
APPEND MTAB_PROGRAM_FILE.
*-- Put the identifier line in so that the start of the report code
*-- is marked
CONCATENATE MC_REPORT_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report code
LOOP AT MTAB_PROGRAM_SOURCE.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_SOURCE.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Put the identifier line in so that the start of the report text
*-- is marked
CONCATENATE MC_TEXT_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report texts
LOOP AT MTAB_PROGRAM_TEXTS.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_TEXTS.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Put the identifier line in so that the start of the THEAD record
*-- is marked
CONCATENATE MC_THEAD_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
MTAB_PROGRAM_FILE = MSTR_THEAD.
APPEND MTAB_PROGRAM_FILE.
*-- Put the identifier line in so that the start of the report
*-- documentation is marked
CONCATENATE MC_DOC_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report documentation
LOOP AT MTAB_PROGRAM_DOCUMENTATION.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_DOCUMENTATION.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Make the fully pathed filename that report will be saved to
CONCATENATE P_PATH
MTAB_PROGRAM_TRDIR-NAME
'.txt'
INTO LC_FULL_FILENAME.
PERFORM SAVE_TABLE_TO_FILE TABLES MTAB_PROGRAM_FILE
USING LC_FULL_FILENAME.
*-- Write out message with Program Name/Description
READ TABLE MTAB_PROGRAM_TEXTS WITH KEY ID = 'R'.
IF SY-SUBRC = 0.
MTAB_DIRECTORY-NAME = MTAB_PROGRAM_TRDIR-NAME.
MTAB_DIRECTORY-DESC = MTAB_PROGRAM_TEXTS-ENTRY.
MTAB_DIRECTORY-SAVENAME = LC_FULL_FILENAME.
APPEND MTAB_DIRECTORY.
WRITE: / MTAB_PROGRAM_TRDIR-NAME,
MTAB_PROGRAM_TEXTS-ENTRY(65) COLOR COL_HEADING.
ELSE.
MTAB_DIRECTORY-NAME = MTAB_PROGRAM_TRDIR-NAME.
MTAB_DIRECTORY-DESC = 'No description available'.
MTAB_DIRECTORY-SAVENAME = LC_FULL_FILENAME.
APPEND MTAB_DIRECTORY.
WRITE: / MTAB_PROGRAM_TRDIR-NAME.
ENDIF.
ENDLOOP.
ENDFORM. " BUILD_PROGRAM_DIRECTORY
----
FORM SAVE_TABLE_TO_FILE *
----
........ *
----
--> FTAB_TABLE *
--> F_FILENAME *
----
FORM SAVE_TABLE_TO_FILE TABLES FTAB_TABLE
USING F_FILENAME.
IF RB_DOS = 'X'. " Save file to presentation server
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = F_FILENAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = FTAB_TABLE
EXCEPTIONS
OTHERS = 4.
IF SY-SUBRC NE 0.
WRITE: / 'Error opening dataset' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ELSE. " Save file to application server
OPEN DATASET F_FILENAME FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC = 0.
LOOP AT FTAB_TABLE.
TRANSFER FTAB_TABLE TO F_FILENAME.
IF SY-SUBRC NE 0.
WRITE: / 'Error writing record to file;' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ENDLOOP.
ELSE.
WRITE: / 'Error opening dataset' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ENDIF. " End RB_DOS
ENDFORM. " SAVE_PROGRAM
----
FORM READ_REPORT_FROM_DISK *
----
Read report into internal table. Can read from local or *
remote computer *
----
FORM READ_REPORT_FROM_DISK TABLES FTAB_TABLE
USING F_FILENAME.
DATA:
LC_MESSAGE(128) TYPE C.
CLEAR FTAB_TABLE.
REFRESH FTAB_TABLE.
IF RB_DOS = 'X'.
TRANSLATE F_FILENAME USING '/\'. " correct slash for Dos PC file
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = F_FILENAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = FTAB_TABLE
EXCEPTIONS
CONVERSION_ERROR = 1
FILE_OPEN_ERROR = 2
FILE_READ_ERROR = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
IF SY-SUBRC >< 0.
WRITE: / 'Error reading file from local PC' COLOR COL_NEGATIVE.
ENDIF.
ELSEIF RB_UNIX = 'X'.
TRANSLATE F_FILENAME USING '\/'. " correct slash for unix
OPEN DATASET F_FILENAME FOR INPUT MESSAGE LC_MESSAGE IN TEXT MODE.
IF SY-SUBRC = 0.
DO.
READ DATASET F_FILENAME INTO FTAB_TABLE.
IF SY-SUBRC = 0.
APPEND FTAB_TABLE.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET F_FILENAME.
ELSE.
WRITE: / 'Error reading file from remote computer'
COLOR COL_NEGATIVE,
/ LC_MESSAGE,
/ F_FILENAME.
SY-SUBRC = 4.
ENDIF.
ENDIF.
ENDFORM. " READ_REPORT_FROM_DISK
----
FORM SPLIT_INCOMING_FILE *
----
........ *
----
--> FTAB_PROGRAM_FILE *
--> FTAB_PROGRAM_SOURCE *
--> ` *
--> FTAB_PROGRAM_TEXTS *
----
FORM SPLIT_INCOMING_FILE TABLES FTAB_PROGRAM_FILE
STRUCTURE MTAB_PROGRAM_FILE
FTAB_PROGRAM_SOURCE
STRUCTURE MTAB_PROGRAM_SOURCE
FTAB_PROGRAM_TEXTS
STRUCTURE MTAB_PROGRAM_TEXTS
FTAB_PROGRAM_DOCUMENTATION
STRUCTURE MTAB_PROGRAM_DOCUMENTATION
CHANGING FSTR_TRDIR
FSTR_THEAD.
DATA:
LC_DATATYPE(4) TYPE C, " Type of data, REPO, TEXP, RDIR
LC_PROGRAM_FILE LIKE MTAB_PROGRAM_FILE.
LOOP AT FTAB_PROGRAM_FILE.
LC_PROGRAM_FILE = FTAB_PROGRAM_FILE.
CASE LC_PROGRAM_FILE(9).
WHEN MC_TRDIR_IDENTIFIER.
LC_DATATYPE = MC_TRDIR_SHORT.
WHEN MC_REPORT_IDENTIFIER.
LC_DATATYPE = MC_REPORT_SHORT.
WHEN MC_TEXT_IDENTIFIER.
LC_DATATYPE = MC_TEXT_SHORT.
WHEN MC_DOC_IDENTIFIER.
LC_DATATYPE = MC_DOC_SHORT.
WHEN MC_THEAD_IDENTIFIER.
LC_DATATYPE = MC_THEAD_SHORT.
WHEN OTHERS. " Actual contents of report, trdir, or text
CASE LC_DATATYPE.
WHEN MC_TRDIR_SHORT.
FSTR_TRDIR = FTAB_PROGRAM_FILE.
WHEN MC_REPORT_SHORT.
FTAB_PROGRAM_SOURCE = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_SOURCE.
WHEN MC_TEXT_SHORT.
FTAB_PROGRAM_TEXTS = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_TEXTS.
WHEN MC_THEAD_SHORT.
FSTR_THEAD = FTAB_PROGRAM_FILE.
WHEN MC_DOC_SHORT.
FTAB_PROGRAM_DOCUMENTATION = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_DOCUMENTATION.
ENDCASE.
ENDCASE.
ENDLOOP.
ENDFORM. " SPLIT_INCOMING_FILE
----
FORM INSERT_NEW_REPORT*
----
........ *
----
--> FTAB_PROGRAM_SOURCE *
--> FTAB_PROGRAM_TEXTS *
--> F_TRDIR *
----
FORM INSERT_NEW_REPORT TABLES FTAB_PROGRAM_SOURCE
STRUCTURE MTAB_PROGRAM_SOURCE
FTAB_PROGRAM_TEXTS
STRUCTURE MTAB_PROGRAM_TEXTS
FTAB_PROGRAM_DOCUMENTATION
STRUCTURE MTAB_PROGRAM_DOCUMENTATION
USING FSTR_TRDIR LIKE TRDIR
FSTR_THEAD LIKE MSTR_THEAD.
DATA:
LC_OBJ_NAME LIKE E071-OBJ_NAME,
LC_LINE2(40) TYPE C,
LC_ANSWER(1) TYPE C.
*-- read trdir to see if the report already exists, if it does, prompt
*-- user to overwrite or abort.
SELECT SINGLE * FROM TRDIR WHERE NAME = FSTR_TRDIR-NAME.
IF SY-SUBRC = 0. " Already exists
CONCATENATE 'want to overwrite report'
FSTR_TRDIR-NAME
INTO LC_LINE2 SEPARATED BY SPACE.
CONCATENATE LC_LINE2
'?'
INTO LC_LINE2.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
DEFAULTOPTION = 'N'
TEXTLINE1 = 'The selected report already exists, do you'
TEXTLINE2 = LC_LINE2
TITEL = 'Report already exists'
CANCEL_DISPLAY = SPACE
IMPORTING
ANSWER = LC_ANSWER
EXCEPTIONS
OTHERS = 1.
ELSE.
LC_ANSWER = 'J'.
ENDIF.
IF LC_ANSWER = 'J'.
*-- Create the TADIR entry. (TRDIR entry created by INSERT REPORT)
LC_OBJ_NAME = TRDIR-NAME.
CALL FUNCTION 'TR_TADIR_POPUP_ENTRY_E071'
EXPORTING
WI_E071_PGMID = 'R3TR'
WI_E071_OBJECT = 'PROG'
WI_E071_OBJ_NAME = LC_OBJ_NAME
WI_TADIR_DEVCLASS = '$TMP'
EXCEPTIONS
EXIT = 3
OTHERS = 4.
IF SY-SUBRC = 0.
*-- Create Report
INSERT REPORT FSTR_TRDIR-NAME FROM FTAB_PROGRAM_SOURCE.
*-- Create Texts
INSERT TEXTPOOL FSTR_TRDIR-NAME FROM FTAB_PROGRAM_TEXTS
LANGUAGE SY-LANGU.
*-- Save Documentation
CALL FUNCTION 'DOCU_UPDATE'
EXPORTING
HEAD = FSTR_THEAD
STATE = 'A'
TYP = 'E'
VERSION = '1'
TABLES
LINE = FTAB_PROGRAM_DOCUMENTATION
EXCEPTIONS
OTHERS = 1.
ELSE.
WRITE: / 'Error updating the TADIR entry' COLOR COL_NEGATIVE,
'Program' COLOR COL_NEGATIVE INTENSIFIED OFF,
FSTR_TRDIR-NAME, 'was not loaded into SAP.'
COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDIF.
ELSE.
WRITE: / FSTR_TRDIR-NAME COLOR COL_NEGATIVE,
'was not uploaded into SAP. Action cancelled by user'
COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDIF.
ENDFORM. " INSERT_NEW_REPORT
----
FORM GET_NAME *
----
........ *
----
--> VALUE(F_FIELD) *
--> F_NAME *
----
FORM GET_NAME USING VALUE(F_FIELD)
CHANGING F_NAME.
DATA: LTAB_FIELDS LIKE DYNPREAD OCCURS 0 WITH HEADER LINE,
LC_PROG LIKE D020S-PROG,
LC_DNUM LIKE D020S-DNUM.
TRANSLATE F_FIELD TO UPPER CASE.
refresh ltab_fields.
LTAB_FIELDS-FIELDNAME = F_FIELD.
append ltab_fields.
LC_PROG = SY-REPID .
LC_DNUM = SY-DYNNR .
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = LC_PROG
DYNUMB = LC_DNUM
TABLES
dynpfields = ltab_fields
EXCEPTIONS
OTHERS = 01.
read table ltab_fields index 1.
IF SY-SUBRC EQ 0.
F_NAME = LTAB_FIELDS-FIELDVALUE.
refresh ltab_fields.
ENDIF.
CALL FUNCTION 'F4_USER'
EXPORTING
OBJECT = F_NAME
IMPORTING
RESULT = F_NAME.
ENDFORM. " GET_NAME
Cheers,
Abdul Hakim
04-05-2006 8:12 AM
Abdul,
Thanks for your immediate response.
This program is correct what i expected.
This is working in 4.6c but not in 4.7.
If you have another program please help on this.
It would be great appreciable to provide us.
regards,
vijay
04-05-2006 8:15 AM
hi vijay,
i have not tested this program in 4.7 since i m working on 46c.Will modify this logic and update you..
Cheers,
Abdul Hakim
04-05-2006 8:18 AM
hi vijay,
i think this will work on 4.7.
May i know what message ur getting while executing the report..
Cheers,
Abdul Hakim
04-05-2006 7:59 AM
Hi,
once you are in display mode of program follow the path utilities>moreutilities> upload/download--> download from menu and download the program in specific file format in a pre defined folder at your hard drive.
Regards
Pragya
04-05-2006 10:12 AM
Abdul,
I am getting these errors in 4.7 versio.
Error 1:
"MTAB_PROGRAM_FILE" and "MTAB_PROGRAM_TEXTS" are not mutually convertible. In Unicode systems, "MTAB_PROGRAM_FILE " must have the same structure layout (fragment view) as"MTAB_PROGRAM_TEXTS", regardless of the length of the Unicode character.
error 2:
"FTAB_PROGRAM_TEXTS" and "FTAB_PROGRAM_FILE" are not mutually convertible. In Unicode systems, "FTAB_PROGRAM_TEXTS " must have the same structure layout (fragment view) as"FTAB_PROGRAM_FILE", regardless of the length of the Unicode character.
regards,
vijay
04-05-2006 10:36 AM
HI Vijay,
the following program works on 47..
[code]
REPORT ZDOWN.
$$================================================================$$
Direct download ver 4.12.
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 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
Allows a user to download ABAPs, 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.
Compatible with R/3 versions 3 and 4.
$$----
$$
AUTHORS : E.Mellodew & John Davies-Hale
PROGRAM HISTORY
---------------
1.0 Original program created
2.0 Modified selection texts so they are now stored within
the actual abap program.
Added functionality to download text elements and selection
texts for any downloaded online programs.
Added functionality to download message classes.
Added functionality to download screens.
2.1 Fixed program names being truncated when downloading
programs on version 4 systems.
3.0 New version - allows you to download files in HTML format as
well as text format.
3.1 Added the ability to download nested include programs.
3.2 Added the ability to download custom dictionary structures
referenced within programs.
Added the option to include/exclude local private objects.
Fixed problem with HTML documents not displaying correctly
within Netscape Communicator.
3.21 Added domain name texts to HTML dictionary structure download.
Fixed issue whereby field symbols displayed incorrectly within
HTML documents.
4.00 Re-structured program.
Increased scope of options on parameter screen
Created user friendly screen showing downloads
Allows user to download function modules
Program is now fully recursive and allows downloading of
includes within includes/functions
and functions within functions/includes.
4.02 Added ability to download module pools
Added 'key' flag to dictionary downloads
4.03 Screen 1000's can now be downloaded if they belong to a
module pool and are not a parameter screen
4.10 Added ability to download function module documentation
4.11 Problem with some documentation not being downloaded fixed
*
Limitations
SAP does not have the provision to create sub-folders at present.
Messages are not downloaded for nested includes
----
----
TABLES - DATABASES
----
TABLES: RS38M, TADIR, TRDIR, DD01T, "REPOSRC,
TRDIRE, T100, TLIBV,
DD02L, DD03L, DD04T, V_FDIR, TFDIR, TFTIT, D010INC, DD02T.
*----
TYPES
*----
*----- Text element structure
TYPES: T_TEXTTAB LIKE TEXTPOOL.
*--- Message classes
TYPES: BEGIN OF T_MESSAGES,
MSGID LIKE TRDIRE-MSGID,
MSGNR LIKE T100-MSGNR,
TEXT LIKE T100-TEXT,
END OF T_MESSAGES.
*--- screen flow.
TYPES: BEGIN OF T_SCREEN_FLOW,
SCREEN LIKE D020S-DNUM,
CODE LIKE D022S-LINE,
END OF T_SCREEN_FLOW.
*--- Data dictionary objects - tables, structures.
TYPES: BEGIN OF T_DICT_STRUCT,
TABNAME LIKE DD03L-TABNAME,
TABTEXT LIKE DD02T-DDTEXT,
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 T_DICT_STRUCT.
*--- Function Modules
TYPES: BEGIN OF T_FUNCTIONS,
FUNCNAME LIKE TFDIR-FUNCNAME,
INCLUDE LIKE TFDIR-INCLUDE,
PNAME LIKE TFDIR-PNAME,
STEXT LIKE TFTIT-STEXT,
END OF T_FUNCTIONS.
*--- Include program names
TYPES: BEGIN OF T_INCLUDES,
PROG LIKE TRDIR-NAME,
TEXT(255),
END OF T_INCLUDES.
*----- ABAP program list
TYPES: BEGIN OF T_PROGRAMMES,
DEVCLASS LIKE TADIR-DEVCLASS,
PROG LIKE TRDIR-NAME,
TEXT(255),
SUBC(1) TYPE C,
FUNCTIONS TYPE T_FUNCTIONS OCCURS 0,
END OF T_PROGRAMMES.
----
DATA - INTERNAL TABLES
----
*---- Program texts - declaration only not used
DATA: I_TEXTTAB TYPE T_TEXTTAB OCCURS 0 WITH HEADER LINE.
DATA: I_MESSAGES TYPE T_MESSAGES OCCURS 0 WITH HEADER LINE.
DATA: I_SCREEN_FLOW TYPE T_SCREEN_FLOW.
*----- Program content for text download
DATA: BEGIN OF CONTENT OCCURS 0,
LINE(255),
END OF CONTENT.
*--- Programme texts.
DATA: I_PROGRAMME_TEXTS TYPE T_TEXTTAB OCCURS 0 WITH HEADER LINE.
*--- dictionary object
DATA: I_DICTIONARY TYPE T_DICT_STRUCT OCCURS 0 WITH HEADER LINE.
*--- Allows HTML routines to create an HTML without the table name on
each line.
DATA: BEGIN OF I_DICT_MINUS_TABNAME OCCURS 0,
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 I_DICT_MINUS_TABNAME.
*--- Table names of customer tables, used for searching for tables
DATA: BEGIN OF TABLE_NAMES OCCURS 0,
TABNAME LIKE I_DICTIONARY-TABNAME,
TABTEXT LIKE DD02T-DDTEXT,
END OF TABLE_NAMES.
*--- Function Modules.
DATA: I_FUNCTIONS TYPE T_FUNCTIONS OCCURS 0 WITH HEADER LINE.
DATA: I_FUNCTIONS_2 TYPE T_FUNCTIONS OCCURS 0 WITH HEADER LINE.
*--- Customer function names, used for searching for functions
DATA: BEGIN OF FUNCTION_NAMES OCCURS 0,
FUNCNAME LIKE I_FUNCTIONS-FUNCNAME,
END OF FUNCTION_NAMES.
DATA: BEGIN OF I_PROGRAMMES OCCURS 0,
DEVCLASS LIKE TADIR-DEVCLASS,
PROG LIKE TRDIR-NAME,
TEXT(255),
SUBC(1) TYPE C,
MESSAGES TYPE T_MESSAGES OCCURS 0,
TEXT_ELEMENTS TYPE T_TEXTTAB OCCURS 0,
SELECTION_TEXTS TYPE T_TEXTTAB OCCURS 0,
SCREEN_FLOW TYPE T_SCREEN_FLOW OCCURS 0,
INCLUDES TYPE T_INCLUDES OCCURS 0,
FUNCTIONS TYPE T_FUNCTIONS OCCURS 0,
DICT_STRUCT TYPE T_DICT_STRUCT OCCURS 0,
END OF I_PROGRAMMES.
*--- Names of function modules used within programmes
data: i_prog_includes type t_includes occurs 0 with header line.
*--- Includes to download
DATA: I_INCLUDES LIKE I_PROGRAMMES OCCURS 0 WITH HEADER LINE.
*--- Tree display structure.
DATA: I_NODE LIKE SNODETEXT OCCURS 0 WITH HEADER LINE.
*--- Temp table of downloaded objects.
DATA: BEGIN OF I_DOWNLOADED OCCURS 0,
OBJECT(30),
END OF I_DOWNLOADED.
----
DATA - WORKING FIELDS
----
DATA: FOOTER_MESSAGE LIKE CONTENT-LINE.
DATA: MESS(100).
DATA: TEMP_FUNC_NAME LIKE I_FUNCTIONS-FUNCNAME.
DATA: FORCED_EXIT TYPE I VALUE 0.
DATA: START_TIME LIKE SY-UZEIT.
DATA: RUN_TIME LIKE SY-UZEIT.
DATA: RUN_TIME_CHAR(8).
RANGES: S_PROG FOR TRDIR-NAME.
RANGES: S_DEV FOR TADIR-DEVCLASS.
RANGES: S_AUTH FOR USR02-BNAME.
RANGES: S_TABLE FOR DD02L-TABNAME.
RANGES: S_FNAME FOR TFDIR-FUNCNAME.
RANGES: S_FGROUP FOR ENLFDIR-AREA.
*----
CONSTANTS
*----
CONSTANTS: C_TABLES(6) VALUE 'TABLES'.
CONSTANTS: C_LIKE(4) VALUE 'LIKE'.
CONSTANTS: C_TYPE(4) VALUE 'TYPE'.
CONSTANTS: C_STRUCTURE(9) VALUE 'STRUCTURE'.
CONSTANTS: C_COMMA(1) VALUE ','.
CONSTANTS: C_PERIOD(1) VALUE '.'.
CONSTANTS: C_VERSION_NO(4) VALUE '4.12'.
*----
SELECTION SCREEN
*----
*--- Author
SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME TITLE T_B1.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 5(23) T_AUTH.
PARAMETERS: P_AUTH LIKE USR02-BNAME.
selection-screen end of line.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 5(36) T_PMOD.
parameters: p_mod as checkbox.
selection-screen end of line.
SELECTION-SCREEN: END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T_B2.
*--- Tables
selection-screen begin of line.
PARAMETERS: R_TABLE RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(20) T_RTABLE.
selection-screen end of line.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(18) T_PTABLE.
PARAMETERS: P_TABLE LIKE DD02L-TABNAME.
SELECTION-SCREEN END OF LINE.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 10(69) T_TNOTE.
selection-screen end of line.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 14(61) T_TNOTE1.
selection-screen end of line.
*--- Function Modules
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R_FUNC RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(30) T_RFUNC.
selection-screen end of line.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 10(18) T_PFNAME.
PARAMETERS: P_FNAME LIKE TFDIR-FUNCNAME.
selection-screen end of line.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 10(18) T_FGROUP.
PARAMETERS: P_FGROUP LIKE ENLFDIR-AREA.
selection-screen end of line.
*--- Programs / Includes
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R_PROG RADIOBUTTON GROUP R1.
SELECTION-SCREEN COMMENT 5(18) T_RPROG.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(18) T_RPNAME.
PARAMETERS: P_PROG LIKE TRDIR-NAME MEMORY ID RID.
SELECTION-SCREEN END OF LINE.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 10(18) T_SDEV.
PARAMETERS: P_DEV LIKE TADIR-DEVCLASS.
selection-screen end of line.
*--- Local objects
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(27) T_$TMP.
PARAMETERS: P_$TMP AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK B2.
*----- Additional things to download.
SELECTION-SCREEN: BEGIN OF BLOCK B3 WITH FRAME TITLE T_B3.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) T_PTEXT.
PARAMETERS: P_TEXT AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) T_PMES.
PARAMETERS: P_MES AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) T_PINC.
PARAMETERS: P_INC AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 40(20) T_RECU.
PARAMETERS: P_RECI AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 1(30) T_PFUNC.
PARAMETERS: P_FUNC AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 40(20) T_RECF.
PARAMETERS: P_RECF AS CHECKBOX DEFAULT 'X'.
selection-screen end of line.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) T_DOC.
PARAMETERS: P_DOC AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
selection-screen begin of line.
SELECTION-SCREEN COMMENT 1(30) T_PSCR.
PARAMETERS: P_SCR AS CHECKBOX.
selection-screen end of line.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) T_PDICT.
PARAMETERS: P_DICT AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK B3.
*----- File details
SELECTION-SCREEN: BEGIN OF BLOCK B4 WITH FRAME TITLE T_B4.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) T_PHTML.
PARAMETERS: P_HTML RADIOBUTTON GROUP G1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 30(20) T_PHEXT.
PARAMETERS: P_HEX(4) TYPE C DEFAULT 'Html' LOWER CASE.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) T_PTXT.
PARAMETERS: P_TXT RADIOBUTTON GROUP G1.
SELECTION-SCREEN COMMENT 30(20) T_PEXT.
PARAMETERS: P_TEX(4) TYPE C DEFAULT 'Txt' LOWER CASE.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) T_PPATH.
PARAMETERS: P_PATH LIKE RLGRAP-FILENAME
OBLIGATORY DEFAULT 'C:\temp'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK B4.
*----
INITIALIZATION
*----
INITIALIZATION.
*--- parameter screen texts.
T_B1 = 'Author (Optional)'.
T_B2 = 'Objects to download'.
T_B3 = 'Additional downloads'.
T_B4 = 'Download parameters'.
T_AUTH = 'Author name'.
T_PMOD = 'Include programs modified by author'.
T_RTABLE = 'Tables'.
T_PTABLE = 'Table name'.
T_TNOTE = 'Please note: tables are stored under the username of'.
T_TNOTE1 = ' the last person who modified them.'.
T_RFUNC = 'Function modules'.
T_PFNAME = 'Function name'.
T_FGROUP = 'Function group'.
T_RPROG = 'Programs'.
T_RPNAME = 'Program name'.
T_SDEV = 'Development class'.
T_PTXT = 'Text document'.
T_PHTML = 'HTML document'.
T_PTEXT = 'Text elements'.
T_PINC = 'Include programs'.
T_RECU = 'Recursive search'.
T_PHEXT = 'File extension'.
T_PEXT = 'File extension'.
T_PPATH = 'File path'.
T_PMES = 'Message classes'.
T_PFUNC = 'Function modules'.
T_DOC = 'Function module documentation'.
T_RECF = 'Recursive search'.
T_PSCR = 'Screens'.
T_PDICT = 'Dictionary structures'.
T_$TMP = 'Include local objects'.
CONCATENATE 'Extracted by Direct download v' C_VERSION_NO
' 1998-2000.' INTO FOOTER_MESSAGE.
*----
START-OF-SELECTION.
*----
START-OF-SELECTION.
PERFORM CHECK_COMBO_BOXES.
PERFORM FILL_RANGES.
START_TIME = SY-UZEIT.
TRANSLATE P_HEX TO LOWER CASE.
TRANSLATE P_TEX TO LOWER CASE.
*--- Main program flow.
CASE 'X'.
*--- Select tables
WHEN R_TABLE.
PERFORM RETRIEVE_TABLES TABLES I_DICTIONARY
TABLE_NAMES
S_TABLE.
WHEN R_FUNC.
*--- Select function modules
PERFORM RETRIEVE_FUNCTIONS TABLES S_FNAME
S_FGROUP
I_PROGRAMMES
I_FUNCTIONS
USING 1.
LOOP AT I_FUNCTIONS.
PERFORM FUNC_INCLUDE_NAME USING I_FUNCTIONS-PNAME
I_FUNCTIONS-INCLUDE
TEMP_FUNC_NAME
0.
PERFORM FIND_INCLUDE_PROGRAMS USING TEMP_FUNC_NAME.
PERFORM FIND_CUSTOM_FUNCTIONS TABLES I_FUNCTIONS
USING TEMP_FUNC_NAME.
ENDLOOP.
SORT I_PROG_INCLUDES ASCENDING BY PROG.
DELETE ADJACENT DUPLICATES FROM I_PROG_INCLUDES COMPARING PROG.
perform retrieve_functions tables s_fname
s_fgroup
I_FUNCTIONS
I_FUNCTIONS_2
USING 0.
I_FUNCTIONS[] = I_FUNCTIONS_2[].
*--- Select programs
WHEN R_PROG.
MESS = 'Processing please wait...'.
PERFORM DISPLAY_STATUS USING MESS 0.
PERFORM RETRIEVE_PROGRAMS TABLES I_PROGRAMMES
S_PROG
S_DEV
S_AUTH.
ENDCASE.
*----
END-OF-SELECTION
*----
END-OF-SELECTION.
IF FORCED_EXIT = 0.
CASE 'X'.
WHEN R_TABLE.
IF NOT ( I_DICTIONARY[] IS INITIAL ).
PERFORM DOWNLOAD_DD_STRUCTURES TABLES I_DICTIONARY
USING P_PATH.
PERFORM FILL_TREE_NODE_TABLES TABLES I_DICTIONARY.
ENDIF.
WHEN R_FUNC.
IF NOT ( I_FUNCTIONS[] IS INITIAL ).
PERFORM DOWNLOAD_FUNCTIONS TABLES I_FUNCTIONS
USING P_PATH.
PERFORM FILL_TREE_NODE_FUNCTIONS TABLES I_FUNCTIONS.
ENDIF.
WHEN R_PROG.
IF NOT ( I_PROGRAMMES[] IS INITIAL ).
PERFORM DOWNLOAD_PROGRAMS TABLES I_PROGRAMMES
USING P_PATH.
PERFORM FILL_TREE_NODE_PROGRAMS TABLES I_PROGRAMMES.
ENDIF.
ENDCASE.
IF NOT ( I_NODE[] IS INITIAL ).
PERFORM DISPLAY_TREE TABLES I_NODE.
ELSE.
MESS = 'No items found matching selection criteria'.
PERFORM DISPLAY_STATUS USING MESS 2.
ENDIF.
ENDIF.
*--- Name parameters
SET PARAMETER ID 'RID' FIELD P_PROG.
SET PARAMETER ID 'DOB' FIELD P_TABLE.
SET PARAMETER ID 'DVC' FIELD P_DEV.
SET PARAMETER ID 'LIB' FIELD P_FNAME.
************************************************************************
****************************SUBROUTINES*******************************
************************************************************************
*----
CHECK_COMBO_BOXES...
*----
FORM CHECK_COMBO_BOXES.
IF P_AUTH IS INITIAL.
CASE 'X'.
WHEN R_TABLE.
IF P_TABLE IS INITIAL.
MESS = 'You must enter a table name or author'.
ENDIF.
WHEN R_FUNC.
IF ( P_FNAME IS INITIAL AND P_FGROUP IS INITIAL ).
CONCATENATE 'You must enter a function name,'
'function group or author'
INTO MESS SEPARATED BY SPACE.
ENDIF.
WHEN R_PROG.
IF P_PROG IS INITIAL.
CONCATENATE 'You must enter a program name'
'development class or author'
INTO MESS SEPARATED BY SPACE.
ENDIF.
ENDCASE.
ELSE.
IF R_FUNC = 'X'.
IF ( ( P_AUTH <> '' ) AND
( ( P_FNAME <> '' ) OR ( P_FGROUP <> '' ) ) ).
CONCATENATE 'You cannnot enter an author as well as'
'a func name or func group'
INTO MESS SEPARATED BY SPACE.
ENDIF.
ENDIF.
ENDIF.
IF NOT MESS IS INITIAL.
PERFORM DISPLAY_STATUS USING MESS 3.
FORCED_EXIT = 1.
STOP.
ENDIF.
ENDFORM. " CHECK_COMBO_BOXES
*----
FILL_RANGES... for selection routines
*----
FORM FILL_RANGES.
if not p_auth is initial.
s_auth-sign = 'I'.
s_auth-option = 'EQ'.
s_auth-low = p_auth.
append s_auth.
endif.
IF NOT P_TABLE IS INITIAL.
S_TABLE-SIGN = 'I'.
S_TABLE-OPTION = 'EQ'.
S_TABLE-LOW = P_TABLE.
APPEND S_TABLE.
endif.
IF NOT P_FNAME IS INITIAL.
S_FNAME-SIGN = 'I'.
S_FNAME-OPTION = 'EQ'.
S_FNAME-LOW = P_FNAME.
APPEND S_FNAME.
endif.
IF NOT P_FGROUP IS INITIAL.
S_FGROUP-SIGN = 'I'.
S_FGROUP-OPTION = 'EQ'.
S_FGROUP-LOW = P_FGROUP.
APPEND S_FGROUP.
endif.
IF NOT P_PROG IS INITIAL.
S_PROG-SIGN = 'I'.
S_PROG-OPTION = 'EQ'.
S_PROG-LOW = P_PROG.
APPEND S_PROG.
ENDIF.
IF NOT P_DEV IS INITIAL.
S_DEV-SIGN = 'I'.
S_DEV-OPTION = 'EQ'.
S_DEV-LOW = P_DEV.
APPEND S_DEV.
ENDIF.
IF P_$TMP IS INITIAL.
S_DEV-SIGN = 'E'.
S_DEV-OPTION = 'EQ'.
S_DEV-LOW = '$TMP'.
APPEND S_DEV.
ENDIF.
ENDFORM.
*----
FIND_TABLES... Search for tables in dictionary
*----
FORM RETRIEVE_TABLES TABLES I_DICTIONARY STRUCTURE I_DICTIONARY
TABLE_NAMES STRUCTURE TABLE_NAMES
RANGE_TABLE STRUCTURE S_TABLE.
SELECT TABNAME FROM DD02L
INTO TABLE_NAMES-TABNAME
WHERE TABNAME IN RANGE_TABLE
AND AS4USER IN S_AUTH.
SELECT SINGLE DDTEXT FROM DD02T
INTO TABLE_NAMES-TABTEXT
WHERE TABNAME = TABLE_NAMES-TABNAME
AND DDLANGUAGE = SY-LANGU.
APPEND TABLE_NAMES.
ENDSELECT.
IF NOT ( TABLE_NAMES[] IS INITIAL ).
PERFORM FIND_TABLE_DEFINITION TABLES I_DICTIONARY
TABLE_NAMES.
ENDIF.
ENDFORM.
*----
find_table_definition... from sap database.
*----
FORM FIND_TABLE_DEFINITION TABLES I_DICT STRUCTURE I_DICTIONARY
TABLENAMES STRUCTURE TABLE_NAMES.
DATA gotstate LIKE dcobjif-gotstate.
DATA dd02v_wa LIKE dd02v.
DATA dd09l_wa LIKE dd09l.
DATA: DEFINITION LIKE DD03P OCCURS 0 WITH HEADER LINE.
LOOP AT TABLENAMES.
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
NAME = TABLENAMES-TABNAME
STATE = 'A'
LANGU = 'E'
IMPORTING
GOTSTATE = GOTSTATE
DD02V_WA = DD02V_WA
DD09L_WA = DD09L_WA
TABLES
DD03P_TAB = DEFINITION
EXCEPTIONS
ILLEGAL_INPUT = 1
OTHERS = 2.
IF SY-SUBRC = 0 AND GOTSTATE = 'A'.
LOOP AT DEFINITION.
MOVE-CORRESPONDING DEFINITION TO I_DICT.
MOVE TABLE_NAMES-TABTEXT TO I_DICT-TABTEXT.
APPEND I_DICT.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDFORM.
*----
RETRIEVE_FUNCTIONS... Retrieve function modules from SAP DB
*----
FORM RETRIEVE_FUNCTIONS TABLES S_FNAME STRUCTURE S_FNAME
S_FGROUP STRUCTURE S_FGROUP
FUNC_NAMES STRUCTURE I_FUNCTIONS
FOUND_FUNC STRUCTURE I_FUNCTIONS
USING MAIN_SCAN.
RANGES: SEL_FNAME FOR TFDIR-FUNCNAME.
RANGES: SEL_FGROUP FOR ENLFDIR-AREA.
SEL_FNAME[] = S_FNAME[].
SEL_FGROUP[] = S_FGROUP[].
IF MAIN_SCAN = 1.
IF NOT P_AUTH IS INITIAL.
*--- select all function groups by author
SELECT AREA FROM TLIBV INTO SEL_FGROUP-LOW
WHERE UNAME = P_AUTH.
SEL_FGROUP-SIGN = 'I'.
SEL_FGROUP-OPTION = 'EQ'.
APPEND SEL_FGROUP.
ENDSELECT.
ENDIF.
*--- Select by function name and/or function group.
SELECT * FROM V_FDIR
WHERE FUNCNAME IN SEL_FNAME
AND AREA IN SEL_FGROUP
AND GENERATED = ''.
SELECT SINGLE FUNCNAME
PNAME
INCLUDE FROM TFDIR
INTO (FOUND_FUNC-FUNCNAME,
FOUND_FUNC-PNAME,
FOUND_FUNC-INCLUDE)
WHERE FUNCNAME = V_FDIR-FUNCNAME.
SELECT SINGLE STEXT FROM TFTIT
INTO FOUND_FUNC-STEXT
WHERE SPRAS = SY-LANGU
AND FUNCNAME = V_FDIR-FUNCNAME.
APPEND I_FUNCTIONS.
ENDSELECT.
ELSE.
LOOP AT FUNC_NAMES.
SELECT SINGLE FUNCNAME
PNAME
INCLUDE FROM TFDIR
INTO (FOUND_FUNC-FUNCNAME,
FOUND_FUNC-PNAME,
FOUND_FUNC-INCLUDE)
WHERE FUNCNAME = FUNC_NAMES-FUNCNAME.
SELECT SINGLE STEXT FROM TFTIT
INTO FOUND_FUNC-STEXT
WHERE SPRAS = SY-LANGU
AND FUNCNAME = FUNC_NAMES-FUNCNAME.
APPEND FOUND_FUNC.
ENDLOOP.
ENDIF.
ENDFORM.
*----
RETRIEVE_PROGRAMS... find programs and sub objects from SAP DB
*----
FORM RETRIEVE_PROGRAMS TABLES I_PROG STRUCTURE I_PROGRAMMES
SEL_PROG STRUCTURE S_PROG
SEL_DEV STRUCTURE S_DEV
SEL_AUTH STRUCTURE S_AUTH.
DATA: COUNTER TYPE I VALUE 1.
DATA: WA_INCLUDES TYPE T_INCLUDES.
*----- Select by name, development class and author
IF P_MOD IS INITIAL.
SELECT PROGNAME SUBC FROM REPOSRC
INTO (I_PROG-PROG,
I_PROG-SUBC)
WHERE PROGNAME IN SEL_PROG
AND DEVCLASS IN SEL_DEV
AND CNAM IN SEL_AUTH.
AND ( SUBC = '1'
OR SUBC = 'M' ).
APPEND I_PROG.
ENDSELECT.
ELSE.
SELECT PROGNAME SUBC FROM REPOSRC
INTO (I_PROG-PROG,
I_PROG-SUBC)
WHERE PROGNAME IN SEL_PROG
AND DEVCLASS IN SEL_DEV
AND SUBC = '1'
AND ( CNAM IN SEL_AUTH
OR UNAM IN SEL_AUTH ).
APPEND I_PROG.
ENDSELECT.
ENDIF.
*----- Find extra items
LOOP AT I_PROG.
PERFORM FIND_PROGRAM_NAME USING I_PROG-PROG
CHANGING I_PROG-TEXT.
IF P_TEXT = 'X'.
PERFORM FIND_PROGRAM_TEXTS TABLES I_PROG.
ENDIF.
IF P_MES = 'X'.
PERFORM FIND_MESSAGES TABLES I_PROG USING I_PROG-PROG.
ENDIF.
IF P_SCR = 'X'.
PERFORM FIND_SCREEN_FLOW TABLES I_PROG USING I_PROG-PROG.
ENDIF.
if p_dict = 'X'.
perform find_custom_dict_structures tables i_prog
table_names
using i_prog-prog.
endif.
if p_func = 'X'.
PERFORM FIND_CUSTOM_FUNCTIONS TABLES FUNCTION_NAMES
USING I_PROG-PROG.
endif.
IF P_INC = 'X'.
PERFORM FIND_INCLUDE_PROGRAMS USING I_PROG-PROG.
PERFORM SORT_INCLUDES TABLES I_PROG.
*--- find all relevant data for the includes table.
IF NOT ( I_INCLUDES[] IS INITIAL ).
LOOP AT I_PROG-INCLUDES INTO WA_INCLUDES.
IF P_DICT = 'X'.
PERFORM FIND_CUSTOM_DICT_STRUCTURES TABLES I_PROG
TABLE_NAMES
USING WA_INCLUDES-PROG.
ENDIF.
IF P_FUNC = 'X'.
PERFORM FIND_CUSTOM_FUNCTIONS TABLES FUNCTION_NAMES
USING WA_INCLUDES-PROG.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
PERFORM SORT_DICT_STRUCTURES TABLES I_PROG TABLE_NAMES.
PERFORM SORT_FUNCTIONS TABLES I_PROG FUNCTION_NAMES.
MODIFY I_PROG INDEX COUNTER.
COUNTER = COUNTER + 1.
ENDLOOP.
ENDFORM.
*----
FIND_PROGRAM_NAME... find programme name
*----
FORM FIND_PROGRAM_NAME USING PROGramme_name
CHANGING programme_TEXT.
READ TEXTPOOL PROGRAMME_NAME INTO I_PROGRAMME_TEXTS LANGUAGE SY-LANGU.
READ TABLE I_PROGRAMME_TEXTS WITH KEY 'R'.
IF SY-SUBRC EQ 0.
PROGRAMME_TEXT = I_PROGRAMME_TEXTS-ENTRY.
DELETE I_PROGRAMME_TEXTS INDEX SY-TABIX.
ENDIF.
ENDFORM. " FIND_PROGRAMME_NAME
*----
FIND_PROGRAM_TEXTS... Messages and text elements
*----
FORM FIND_PROGRAM_TEXTS TABLES I_PROG STRUCTURE I_PROGRAMMES.
DATA: TEMP_SELECTION TYPE T_TEXTTAB.
*--- selection texts.
LOOP AT I_PROGRAMME_TEXTS WHERE ID = 'S'.
APPEND I_PROGRAMME_TEXTS TO I_PROG-SELECTION_TEXTS.
DELETE I_PROGRAMME_TEXTS INDEX SY-TABIX.
ENDLOOP.
*--- Text elements.
LOOP AT I_PROGRAMME_TEXTS WHERE ID = 'I'.
APPEND I_PROGRAMME_TEXTS TO I_PROG-TEXT_ELEMENTS.
ENDLOOP.
ENDFORM.
*----
FIND_MESSAGES... finds all program messages including dynamically
called messages - providing they have been
declared on one complete line.
*----
FORM FIND_MESSAGES TABLES I_PROG STRUCTURE I_PROGRAMMES
USING PROGNAME.
*--- lines for main program
DATA: I_REPORT_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
*-- Separate working area for internal table
DATA: WA_MESSAGES TYPE T_MESSAGES.
DATA: msgid LIKE trdire-msgid.
DATA: HEAD LIKE I_REPORT_LINES-LINE.
DATA: TAIL LIKE I_REPORT_LINES-LINE.
DATA: headlength TYPE i VALUE 0.
DATA: TAILLENGTH TYPE I VALUE 0.
*--- Read the program contents into memory
READ REPORT PROGNAME INTO I_REPORT_LINES.
*--- Read the report content looking for message calls.
LOOP AT I_REPORT_LINES.
TRANSLATE I_REPORT_LINES TO UPPER CASE.
IF NOT ( I_REPORT_LINES IS INITIAL ) AND I_REPORT_LINES(1) <> '*'.
Find the main message definition.
IF I_REPORT_LINES CS 'MESSAGE-ID'.
SHIFT I_REPORT_LINES LEFT DELETING LEADING SPACE.
SPLIT I_REPORT_LINES AT 'MESSAGE-ID' INTO HEAD TAIL.
SPLIT TAIL AT '.' INTO HEAD TAIL.
SHIFT HEAD LEFT DELETING LEADING SPACE.
MSGID = HEAD.
ELSE.
There are three different ways of calling a message to display
this routine looks for all three of them and strips the message
class and number out of the code
IF I_REPORT_LINES CS 'MESSAGE'.
SHIFT I_REPORT_LINES-LINE UP TO 'MESSAGE'.
IF I_REPORT_LINES-LINE CS '('.
SPLIT I_REPORT_LINES-LINE AT '(' INTO HEAD TAIL.
HEADLENGTH = STRLEN( HEAD ).
HEADLENGTH = HEADLENGTH - 3.
WA_MESSAGES-MSGNR = HEAD+HEADLENGTH(3).
SPLIT TAIL AT ')' INTO HEAD TAIL.
WA_MESSAGES-MSGID = HEAD.
ELSEIF I_REPORT_LINES-LINE CS 'ID'.
SHIFT I_REPORT_LINES UP TO 'ID'.
SPLIT I_REPORT_LINES AT SPACE INTO HEAD TAIL.
SHIFT TAIL LEFT DELETING LEADING SPACE.
HEAD = TAIL.
SPLIT HEAD AT SPACE INTO HEAD TAIL.
WA_MESSAGES-MSGID = HEAD.
SPLIT TAIL AT 'NUMBER' INTO HEAD TAIL.
SHIFT TAIL LEFT DELETING LEADING SPACE.
TAILLENGTH = STRLEN( TAIL ).
IF TAILLENGTH = 3.
WA_MESSAGES-MSGNR = TAIL+0(3).
ELSE.
CONTINUE.
ENDIF.
ELSE.
*--- use message class from main program
SPLIT I_REPORT_LINES-LINE AT SPACE INTO HEAD TAIL.
SHIFT TAIL LEFT DELETING LEADING SPACE.
WA_MESSAGES-MSGID = MSGID.
WA_MESSAGES-MSGNR = TAIL+1(3).
ENDIF.
APPEND WA_MESSAGES TO I_PROG-MESSAGES.
CLEAR WA_MESSAGES.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
*--- Sort the messages and delete multiple occurrences from the
internal table.
SORT I_PROG-MESSAGES ASCENDING BY MSGID MSGNR.
DELETE I_PROG-MESSAGES WHERE MSGID(1) <> 'Y'
AND MSGID(1) <> 'Z'.
DELETE ADJACENT DUPLICATES FROM I_PROG-MESSAGES.
DELETE I_PROG-MESSAGES WHERE MSGID IS INITIAL.
DELETE I_PROG-MESSAGES WHERE MSGNR IS INITIAL.
DELETE I_PROG-MESSAGES WHERE MSGNR CN '0123456789'.
LOOP AT I_PROG-MESSAGES INTO WA_MESSAGES.
SELECT SINGLE TEXT FROM T100 INTO WA_MESSAGES-TEXT
WHERE SPRSL = SY-LANGU
AND ARBGB = WA_MESSAGES-MSGID
AND MSGNR = WA_MESSAGES-MSGNR.
MODIFY I_PROG-MESSAGES FROM WA_MESSAGES INDEX SY-TABIX.
ENDLOOP.
ENDFORM.
*----
FIND_SCREEN_FLOW...
*----
FORM FIND_SCREEN_FLOW TABLES I_PROG STRUCTURE I_PROGRAMMES
USING PROGNAME.
DATA: FLOW TYPE T_SCREEN_FLOW OCCURS 0 WITH HEADER LINE.
call function 'DYNPRO_PROCESSINGLOGIC'
exporting
REP_NAME = PROGNAME
tables
SCR_LOGIC = FLOW.
SORT FLOW ASCENDING BY SCREEN.
DELETE ADJACENT DUPLICATES FROM FLOW COMPARING SCREEN.
IF I_PROG-SUBC <> 'M'.
DELETE FLOW WHERE SCREEN = '1000'.
ENDIF.
LOOP AT FLOW.
APPEND FLOW TO I_PROG-SCREEN_FLOW.
ENDLOOP.
ENDFORM. " FIND_SCREEN_FLOW
*----
FIND_INCLUDE_PROGRAMS... Search each program for INCLUDE programs
*----
FORM FIND_INCLUDE_PROGRAMS USING VALUE(PROGRAM).
DATA: FIP_PROG(255),
TAIL(255).
*--- Lines for include
DATA: I_INC_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
*----- Read ABAP
READ REPORT PROGRAM INTO I_INC_LINES.
*----- Examine each line of ABAP
LOOP AT I_INC_LINES.
*--- find include programs.
IF I_INC_LINES(1) = '*' OR I_INC_LINES IS INITIAL.
CONTINUE.
ENDIF.
TRANSLATE I_INC_LINES-LINE TO UPPER CASE.
SHIFT I_INC_LINES-LINE UP TO 'INCLUDE'.
IF ( I_INC_LINES-LINE(9) EQ 'INCLUDE Z' ) OR
( I_INC_LINES-LINE(9) EQ 'INCLUDE Y' )
AND I_INC_LINES-LINE+8(9) NE SPACE
AND SY-TABIX <> 1.
FIP_PROG = I_INC_LINES-LINE+8(64).
SPLIT FIP_PROG AT '.' INTO FIP_PROG TAIL.
Append program name to list of include programs
SELECT SINGLE * FROM TRDIR WHERE NAME EQ FIP_PROG.
CHECK SY-SUBRC EQ 0.
I_PROG_INCLUDES-PROG = FIP_PROG.
APPEND I_PROG_INCLUDES.
*--- Recursively look for other includes.
IF P_RECI = 'X'.
PERFORM FIND_INCLUDE_PROGRAMS USING FIP_PROG.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FIND_INCLUDE_PROGRAMS
*----
SORT_INCLUDES.. Remove any duplicates from include table.
*----
FORM SORT_INCLUDES TABLES I_PROG STRUCTURE I_PROGRAMMES.
SORT I_PROG_INCLUDES.
DELETE ADJACENT DUPLICATES FROM I_PROG_INCLUDES COMPARING PROG.
LOOP AT I_PROG_INCLUDES.
PERFORM FIND_PROGRAM_NAME USING I_PROG_INCLUDES-PROG
CHANGING I_PROG_INCLUDES-TEXT.
MODIFY I_PROG_INCLUDES.
MOVE-CORRESPONDING I_PROG_INCLUDES TO I_INCLUDES.
APPEND I_INCLUDES.
ENDLOOP.
APPEND LINES OF I_PROG_INCLUDES TO I_PROG-INCLUDES.
CLEAR I_PROG_INCLUDES. REFRESH I_PROG_INCLUDES.
ENDFORM.
*----
FIND_CUSTOM_DICT_STRUCTURES... Look for any dictionary objects
not created by SAP
*----
FORM FIND_CUSTOM_DICT_STRUCTURES TABLES I_PROG STRUCTURE I_PROGRAMMES
TABLE_NAMES
STRUCTURE TABLE_NAMES
USING VALUE(PROGRAM).
DATA I_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
DATA: HEAD(76).
DATA: TAIL(76).
DATA: LINETYPE(9).
DATA: END_OF_LINE TYPE I VALUE 1.
*--- read abap
READ REPORT PROGRAM INTO I_LINES.
LOOP AT I_LINES.
*--- find custom tables.
IF I_LINES-LINE(1) = '*' OR I_LINES IS INITIAL.
CONTINUE.
ENDIF.
TRANSLATE I_LINES-LINE TO UPPER CASE.
Determine the linetype.
IF END_OF_LINE = 1.
SHIFT I_LINES-LINE UP TO C_TABLES.
IF SY-SUBRC = 0.
LINETYPE = C_TABLES.
ELSE.
SHIFT I_LINES-LINE UP TO C_LIKE.
IF SY-SUBRC = 0.
LINETYPE = C_TYPE.
ELSE.
SHIFT I_LINES-LINE UP TO C_TYPE.
IF SY-SUBRC = 0.
LINETYPE = C_TYPE.
ELSE.
SHIFT I_LINES-LINE UP TO C_STRUCTURE.
IF SY-SUBRC = 0.
LINETYPE = C_STRUCTURE.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE.
LINETYPE = C_COMMA.
ENDIF.
Work on the appropriate linetype
CASE LINETYPE.
WHEN C_TABLES.
SHIFT I_LINES-LINE UP TO SPACE.
PERFORM FIND_TABLES_ON_ONE_LINE TABLES TABLE_NAMES
USING I_LINES-LINE END_OF_LINE.
WHEN C_COMMA.
PERFORM FIND_TABLES_ON_NEW_LINE TABLES TABLE_NAMES
USING I_LINES-LINE END_OF_LINE.
WHEN C_LIKE OR C_TYPE OR C_STRUCTURE.
SHIFT I_LINES-LINE UP TO SPACE.
SHIFT I_LINES-LINE LEFT DELETING LEADING SPACE.
IF I_LINES-LINE(1) = 'Y' OR I_LINES-LINE(1) = 'Z'.
IF I_LINES-LINE CS C_COMMA.
SPLIT I_LINES-LINE AT C_COMMA INTO HEAD TAIL.
IF I_LINES-LINE CS '-'.
SPLIT HEAD AT '-' INTO HEAD TAIL.
ENDIF.
IF I_LINES-LINE CS 'OCCURS'.
SPLIT I_LINES-LINE AT SPACE INTO HEAD TAIL.
ENDIF.
ELSE.
IF I_LINES-LINE CS C_PERIOD.
SPLIT I_LINES-LINE AT C_PERIOD INTO HEAD TAIL.
IF I_LINES-LINE CS '-'.
SPLIT HEAD AT '-' INTO HEAD TAIL.
ENDIF.
IF I_LINES-LINE CS 'OCCURS'.
SPLIT I_LINES-LINE AT SPACE INTO HEAD TAIL.
ENDIF.
ELSE.
SPLIT I_LINES-LINE AT SPACE INTO HEAD TAIL.
ENDIF.
ENDIF.
TABLE_NAMES-TABNAME = HEAD.
APPEND TABLE_NAMES.
endif.
ENDCASE.
ENDLOOP.
ENDFORM.
*----
SORT_DICT_STRUCTURES... don't allow muliples in prog structure
*----
FORM SORT_DICT_STRUCTURES TABLES I_PROG STRUCTURE I_PROGRAMMES
TAB_NAMES STRUCTURE TABLE_NAMES.
DATA: WA_DICT_STRUCT TYPE T_DICT_STRUCT.
SORT TAB_NAMES ASCENDING BY TABNAME.
DELETE ADJACENT DUPLICATES FROM TAB_NAMES.
IF NOT TAB_NAMES[] IS INITIAL.
LOOP AT TABLE_NAMES.
MOVE-CORRESPONDING TABLE_NAMES TO WA_DICT_STRUCT.
APPEND WA_DICT_STRUCT TO I_PROG-DICT_STRUCT.
ENDLOOP.
CLEAR TAB_NAMES. REFRESH TAB_NAMES.
ENDIF.
ENDFORM.
*----
FIND_TABLES_ON_NEW_LINE... Find custom tables declared with a
tables statement but have extended onto
multiple lines.
*----
FORM FIND_TABLES_ON_NEW_LINE TABLES CUST_TABLES STRUCTURE TABLE_nameS
USING LINE EOL.
DATA: TEMP_LINE(100).
DATA: HEAD(76).
DATA: TAIL(76).
DATA: STRLENGTH TYPE I VALUE 0.
TEMP_LINE = LINE.
SHIFT TEMP_LINE LEFT DELETING LEADING SPACE.
IF TEMP_LINE(1) = 'Y' OR TEMP_LINE(1) = 'Z'.
IF TEMP_LINE CS C_COMMA.
SPLIT TEMP_LINE AT ',' INTO HEAD TAIL.
TABLE_NAMES-TABNAME = HEAD.
APPEND TABLE_NAMES.
SHIFT TAIL LEFT BY 1 PLACES.
PERFORM FIND_TABLES_ON_NEW_LINE TABLES TABLE_NAMES
USING TAIL EOL.
ELSE.
SPLIT TEMP_LINE AT '.' INTO HEAD TAIL.
EOL = 1.
TABLE_NAMES-TABNAME = HEAD.
APPEND TABLE_NAMES.
ENDIF.
ELSE.
STRLENGTH = STRLEN( TEMP_LINE ).
IF STRLENGTH > 0.
IF TEMP_LINE CS C_COMMA.
SHIFT TEMP_LINE UP TO SPACE.
PERFORM FIND_TABLES_ON_NEW_LINE TABLES TABLE_NAMES
USING TEMP_LINE EOL.
ELSE.
IF TEMP_LINE(1) = '"'.
EOL = 0.
ELSE.
EOL = 1.
ENDIF.
ENDIF.
ELSE.
EOL = 0.
ENDIF.
ENDIF.
ENDFORM.
*----
FIND_TABLES_ON_ONE_LINE... Find custom tables declared with a table
statement whereby the tables are declare
on one line
*----
FORM FIND_TABLES_ON_ONE_LINE TABLES CUST_TABLES STRUCTURE TABLE_nameS
USING LINE EOL.
DATA: TEMP_LINE(100).
DATA: HEAD(76).
DATA: TAIL(76).
DATA: STRLENGTH TYPE I VALUE 0.
TEMP_LINE = LINE.
SHIFT TEMP_LINE LEFT DELETING LEADING SPACE.
IF TEMP_LINE(1) = 'Y' OR TEMP_LINE(1) = 'Z'.
IF TEMP_LINE CS C_COMMA.
SPLIT TEMP_LINE AT ',' INTO HEAD TAIL.
TABLE_NAMES-TABNAME = HEAD.
APPEND TABLE_NAMES.
SHIFT TAIL LEFT BY 1 PLACES.
PERFORM FIND_TABLES_ON_ONE_LINE TABLES TABLE_NAMES
USING TAIL EOL.
ELSE.
SPLIT TEMP_LINE AT '.' INTO HEAD TAIL.
EOL = 1.
TABLE_NAMES-TABNAME = HEAD.
APPEND TABLE_NAMES.
ENDIF.
ELSE.
STRLENGTH = STRLEN( TEMP_LINE ).
IF STRLENGTH > 0.
SHIFT TEMP_LINE UP TO SPACE.
PERFORM FIND_TABLES_ON_ONE_LINE TABLES TABLE_NAMES
USING TEMP_LINE EOL.
ELSE.
EOL = 0.
ENDIF.
ENDIF.
ENDFORM.
*----
FIND_CUSTOM_FUNCTIONS... Look for any functions not created by SAP
*----
FORM FIND_CUSTOM_FUNCTIONS TABLES I_FUNC_NAMES STRUCTURE FUNCTION_NAMES
USING VALUE(PROGRAM).
DATA I_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
DATA: HEAD(76).
DATA: TAIL(76).
DATA: I_RECURSIVE_FUNC LIKE I_FUNCTIONS OCCURS 0 WITH HEADER LINE.
DATA: I_FOUND_RECURSIVE LIKE I_FUNCTIONS OCCURS 0 WITH HEADER LINE.
DATA: REC_FUNC_NAME LIKE TRDIR-NAME.
*--- read abap
READ REPORT PROGRAM INTO I_LINES.
LOOP AT I_LINES.
*--- find custom tables.
IF I_LINES-LINE(1) = '*' OR I_LINES IS INITIAL.
CONTINUE.
ENDIF.
TRANSLATE I_LINES-LINE TO UPPER CASE.
IF I_LINES-LINE CS 'CALL FUNCTION'.
SHIFT I_LINES-LINE UP TO 'FUNCTION'.
SHIFT I_LINES-LINE UP TO SPACE.
SHIFT I_LINES-LINE LEFT DELETING LEADING SPACE.
SHIFT I_LINES-LINE LEFT DELETING LEADING ''''.
SPLIT I_LINES-LINE AT '''' INTO HEAD TAIL.
IF HEAD(1) = 'Y' OR HEAD(1) = 'Z'.
I_FUNC_NAMES-FUNCNAME = HEAD.
APPEND I_FUNC_NAMES TO I_RECURSIVE_FUNC.
READ TABLE I_FUNC_NAMES WITH KEY FUNCNAME = HEAD.
IF SY-SUBRC <> 0.
APPEND I_FUNC_NAMES.
IF P_RECF = 'X'.
PERFORM RETRIEVE_FUNCTIONS TABLES S_FNAME
S_FGROUP
I_RECURSIVE_FUNC
I_FOUND_RECURSIVE
USING 0.
READ TABLE I_FOUND_RECURSIVE INDEX 1.
PERFORM FUNC_INCLUDE_NAME USING I_FOUND_RECURSIVE-PNAME
I_FOUND_RECURSIVE-INCLUDE
REC_FUNC_NAME
0.
PERFORM FIND_INCLUDE_PROGRAMS USING REC_FUNC_NAME.
PERFORM FIND_CUSTOM_FUNCTIONS TABLES I_FUNC_NAMES
USING REC_FUNC_NAME.
ENDIF.
CLEAR I_FOUND_RECURSIVE. REFRESH I_FOUND_RECURSIVE.
CLEAR I_RECURSIVE_FUNC. REFRESH I_RECURSIVE_FUNC.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*----
FUNC_INCLUDE_NAME...
*----
FORM FUNC_INCLUDE_NAME USING VALUE(PROG_NAME)
VALUE(INCLUDE_NO)
INTERNAL_NAME
VALUE(WANT_TOP).
DATA: INC_NUMBER(4).
CONCATENATE '%U' INCLUDE_NO INTO INC_NUMBER.
IF WANT_TOP = 0.
SELECT SINGLE INCLUDE FROM D010INC INTO INTERNAL_NAME
WHERE MASTER = PROG_NAME
AND INCLUDE LIKE INC_NUMBER.
ELSE.
SELECT SINGLE INCLUDE FROM D010INC INTO INTERNAL_NAME
WHERE MASTER = PROG_NAME
AND ( INCLUDE LIKE '%TOP'
OR ( INCLUDE LIKE INC_NUMBER
AND INCLUDE NOT LIKE '%$%' ) ).
ENDIF.
ENDFORM.
*----
SORT_FUNCTIONS... don't allow duplicates in prog structure.
*----
FORM SORT_FUNCTIONS TABLES I_PROG STRUCTURE I_PROGRAMMES
I_FUNC_NAMES STRUCTURE FUNCTION_NAMES.
DATA: WA_FUNC_STRUCT TYPE T_FUNCTIONS.
SORT I_FUNC_NAMES ASCENDING BY FUNCNAME.
DELETE ADJACENT DUPLICATES FROM I_FUNC_NAMES.
IF NOT I_FUNC_NAMES[] IS INITIAL.
LOOP AT I_FUNC_NAMES.
MOVE-CORRESPONDING I_FUNC_NAMES TO WA_FUNC_STRUCT.
APPEND WA_FUNC_STRUCT TO I_PROG-FUNCTIONS.
ENDLOOP.
CLEAR I_FUNC_NAMES. REFRESH I_FUNC_NAMES.
ENDIF.
ENDFORM.
*----
DISPLAY_STATUS...
*----
FORM DISPLAY_STATUS USING MESSAGE DELAY.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = MESSAGE
EXCEPTIONS
OTHERS = 1.
IF DELAY > 0.
call function 'RZL_SLEEP'
exporting
SECONDS = DELAY
exceptions
argument_error = 1
others = 2.
ENDIF.
ENDFORM. " DISPLAY_STATUS
************************************************************************
***********************HTML ROUTINES**********************************
************************************************************************
*----
CONVERT_DD_TO_HTML... Convert text description to HTML
*----
FORM CONVERT_DD_TO_HTML TABLES I_DICT STRUCTURE I_DICT_MINUS_TABNAME
I_DICT_HTML STRUCTURE W3HTML.
DATA: COLUMN_CAPTIONS LIKE W3HEAD OCCURS 0 WITH HEADER LINE.
DATA ROW_ATTRIBUTES LIKE W3FIELDS OCCURS 0 WITH HEADER LINE.
DATA: W_BORDER LIKE W3HTML.
W_BORDER-LINE = 'BORDER=1'.
PERFORM SET_COLUMN_HEADERS TABLES COLUMN_CAPTIONS.
PERFORM SET_ROW_ATTRIBUTES TABLES ROW_ATTRIBUTES.
CALL FUNCTION 'WWW_ITAB_TO_HTML'
EXPORTING
TABLE_ATTRIBUTES = W_BORDER
ALL_FIELDS = 'X'
TABLES
HTML = I_DICT_HTML
FIELDS = ROW_ATTRIBUTES
ROW_HEADER = COLUMN_CAPTIONS
ITABLE = I_DICT.
PERFORM RE_FORMAT_HTML TABLES I_DICT_HTML.
ENDFORM.
*----
SET_COLUMN_HEADERS... For DD structures converted to HTML
*----
FORM SET_COLUMN_HEADERS TABLES COLUMN_CAPTIONS STRUCTURE W3HEAD.
DATA FIELD_NO LIKE W3HEAD-NR VALUE 1.
DATA TEXT LIKE W3HEAD-TEXT VALUE 'Field name'.
DO 8 TIMES. "number of fields in structure i_dictionary.
CALL FUNCTION 'WWW_ITAB_TO_HTML_HEADERS'
EXPORTING
FIELD_NR = FIELD_NO
TEXT = TEXT
FGCOLOR = '#FFFF00'
BGCOLOR = '#000000'
TABLES
HEADER = COLUMN_CAPTIONS.
FIELD_NO = FIELD_NO + 1.
CASE FIELD_NO.
WHEN 2. TEXT = 'Position'.
WHEN 3. TEXT = 'Key'.
WHEN 4. TEXT = 'Data element'.
WHEN 5. TEXT = 'Domain'.
WHEN 6. TEXT = 'Datatype'.
WHEN 7. TEXT = 'Length'.
WHEN 8. TEXT = 'Domain text'.
ENDCASE.
ENDDO.
ENDFORM.
*----
SET_ROW_ATTRIBUTES... For DD structures converted to HTML
*----
FORM SET_ROW_ATTRIBUTES TABLES ROW_ATTRIBUTES STRUCTURE W3FIELDS.
DATA FIELD_NO LIKE W3FIELDS-NR VALUE 1.
DO 8 TIMES. "number of fields in structure i_dict.
CALL FUNCTION 'WWW_ITAB_TO_HTML_LAYOUT'
EXPORTING
FIELD_NR = FIELD_NO
SIZE = '1'
FGCOLOR = 'green'
FONT = '"Arial"'
TABLES
FIELDS = ROW_ATTRIBUTES.
FIELD_NO = FIELD_NO + 1.
ENDDO.
ENDFORM.
*----
RE_FORMAT_HTML... Splits table lines at EOL marker an places line on
a new line.
*----
FORM RE_FORMAT_HTML TABLES HTML_TABLE STRUCTURE W3HTML.
DATA: NEW_HTML LIKE W3HTML OCCURS 0 WITH HEADER LINE.
DATA: HEAD LIKE W3HTML.
DATA TAIL(510).
CONSTANTS: CR(2) TYPE X VALUE '0D0A'.
LOOP AT HTML_TABLE.
CONCATENATE TAIL HTML_TABLE INTO TAIL.
IF HTML_TABLE CS CR.
WHILE tail CS cr.
SPLIT tail AT cr INTO head tail.
APPEND HEAD TO NEW_HTML.
ENDWHILE.
ELSE.
APPEND HTML_TABLE TO NEW_HTML.
ENDIF.
ENDLOOP.
*
APPEND tail TO new_html.
*
HTML_TABLE[] = NEW_HTML[].
*
ENDFORM.
*----
BUILD_HTML_TABLE... Builds an HTML table based upon a text table
Replaces signs '<>' with HTML versions.
*----
FORM CONVERT_TABLE_TO_HTML TABLES CONTENTS STRUCTURE CONTENT
USING VALUE(PROGRAM_NAME).
DATA: HTML_TABLE LIKE W3HTML OCCURS 0 WITH HEADER LINE.
DATA: LISTING_NAME(100) VALUE 'Program listing for:'.
CONSTANTS: BR(4) VALUE '<br>'.
CONSTANTS: CR(4) VALUE '<cr>'.
CONSTANTS: HR(4) VALUE '<hr>'.
CONSTANTS: LT(4) VALUE '<'.
CONSTANTS: GT(4) VALUE '>'.
HTML_TABLE = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">'.
APPEND HTML_TABLE.
HTML_TABLE = '<html>'.
APPEND HTML_TABLE.
HTML_TABLE = '<head>'.
APPEND HTML_TABLE.
CONCATENATE '<title>' PROGRAM_NAME '</title>' INTO HTML_TABLE.
APPEND HTML_TABLE.
HTML_TABLE = '</head>'.
APPEND HTML_TABLE.
HTML_TABLE = '<body bgcolor=#FFFF4b>'.
APPEND HTML_TABLE.
CONCATENATE LISTING_NAME PROGRAM_NAME INTO LISTING_NAME
SEPARATED BY SPACE.
CONCATENATE '<font size=3 face = "Arial" color=#000000><b>'
LISTING_NAME '</b></font>' INTO HTML_TABLE.
APPEND HTML_TABLE.
HTML_TABLE = HR.
APPEND HTML_TABLE.
HTML_TABLE = '<font size=2 face = "Sans Serif">'.
APPEND HTML_TABLE.
HTML_TABLE = '<pre width=100>'.
APPEND HTML_TABLE.
LOOP AT CONTENTS.
IF NOT ( CONTENTS IS INITIAL ).
WHILE ( CONTENTS CS '<' OR CONTENTS CS '>' ).
REPLACE '<' WITH LT INTO CONTENTS.
REPLACE '>' WITH GT INTO CONTENTS.
ENDWHILE.
CONCATENATE CONTENTS CR INTO HTML_TABLE.
ELSE.
HTML_TABLE = BR.
ENDIF.
APPEND HTML_TABLE.
ENDLOOP.
HTML_TABLE = '</pre>'.
APPEND HTML_TABLE.
HTML_TABLE = HR.
APPEND HTML_TABLE.
CONCATENATE FOOTER_MESSAGE BR INTO HTML_TABLE.
APPEND HTML_TABLE.
HTML_TABLE = '</body>'.
APPEND HTML_TABLE.
HTML_TABLE = '</html>'.
APPEND HTML_TABLE.
CONTENTS[] = HTML_TABLE[].
ENDFORM.
************************************************************************
********************DOWNLOAD ROUTINES*********************************
************************************************************************
*----
DOWNLOAD_DD_STRUCTURES... download database objects to file
*----
FORM DOWNLOAD_DD_STRUCTURES TABLES I_DICT STRUCTURE I_DICTIONARY
USING VALUE(PATHNAME).
DATA: FILENAME LIKE RLGRAP-FILENAME.
DATA: I_DICT_HTML LIKE W3HTML OCCURS 0 WITH HEADER LINE.
LOOP AT I_DICT.
MOVE-CORRESPONDING I_DICT TO I_DICT_MINUS_TABNAME.
APPEND I_DICT_MINUS_TABNAME.
AT END OF TABNAME.
CONCATENATE 'Converting table' I_DICT-TABNAME 'to html'
INTO MESS SEPARATED BY SPACE.
PERFORM DISPLAY_STATUS USING MESS 0.
TRANSLATE I_DICT-TABNAME TO LOWER CASE.
TRANSLATE P_HEX TO LOWER CASE.
CONCATENATE PATHNAME '\' 'Dictionary-'
I_DICT-TABNAME '.'
P_HEX INTO FILENAME.
PERFORM CONVERT_DD_TO_HTML TABLES I_DICT_MINUS_TABNAME
i_dict_html.
PERFORM WS_DOWNLOAD TABLES I_DICT_HTML
USING FILENAME.
CLEAR I_DICT_HTML. REFRESH I_DICT_HTML.
CLEAR I_DICT_MINUS_TABNAME. REFRESH I_DICT_MINUS_TABNAME.
ENDAT.
ENDLOOP.
ENDFORM.
*----
DOWNLOAD_FUNCTIONS... Download function modules to file.
*----
FORM DOWNLOAD_FUNCTIONS TABLES I_FUNC STRUCTURE I_FUNCTIONS
USING VALUE(P_PATH).
DATA: INC_NUMBER(4).
DATA: FILE_EXT(4).
DATA: FUNC_PATH LIKE RLGRAP-FILENAME.
DATA: HTML_NAME(110).
DATA: BEGIN OF I_LOC_INCLUDES OCCURS 0,
INCLUDE LIKE D010INC-INCLUDE,
END OF I_LOC_INCLUDES.
LOOP AT I_FUNC.
CLEAR I_LOC_INCLUDES. REFRESH I_LOC_INCLUDES.
*--- Function module
PERFORM FUNC_INCLUDE_NAME USING I_FUNC-PNAME
I_FUNC-INCLUDE
I_LOC_INCLUDES-INCLUDE
0.
APPEND I_LOC_INCLUDES.
*--- Global declarations
perform func_include_name using i_func-pname
i_func-include
I_LOC_INCLUDES-INCLUDE
1.
append i_loc_includes.
LOOP AT I_LOC_INCLUDES.
READ REPORT I_LOC_INCLUDES-INCLUDE INTO CONTENT.
TRANSLATE I_FUNCTIONS-STEXT TO LOWER CASE.
*--- Create filename and convert contents to HTML if applicable
IF P_HTML = 'X'.
IF I_LOC_INCLUDES-INCLUDE CS 'TOP'.
CONCATENATE 'Global-' I_FUNC-FUNCNAME
INTO HTML_NAME SEPARATED BY SPACE.
ELSE.
HTML_NAME = I_FUNC-FUNCNAME.
ENDIF.
PERFORM CONVERT_TABLE_TO_HTML TABLES CONTENT
USING HTML_NAME.
FILE_EXT = P_HEX.
ELSE.
FILE_EXT = P_TEX.
ENDIF.
IF I_LOC_INCLUDES-INCLUDE CS 'TOP'.
CONCATENATE P_PATH '\Global-' I_FUNC-FUNCNAME '.'
FILE_EXT
INTO FUNC_PATH.
ELSE.
CONCATENATE P_PATH '\' I_FUNC-FUNCNAME '.' FILE_EXT
INTO FUNC_PATH.
ENDIF.
TRANSLATE FUNC_PATH TO LOWER CASE.
PERFORM WS_DOWNLOAD TABLES CONTENT
USING FUNC_PATH.
CLEAR CONTENT. REFRESH CONTENT.
ENDLOOP.
IF P_DOC = 'X'.
PERFORM DOWNLOAD_FUNC_DOCUMENTATION USING I_FUNC-FUNCNAME
I_FUNC-STEXT.
ENDIF.
ENDLOOP.
LOOP AT I_PROG_INCLUDES.
PERFORM READ_MAIN_CODE_AND_DOWNLOAD TABLES I_TEXTTAB
I_TEXTTAB
I_MESSAGES
USING I_PROG_INCLUDES-PROG.
endloop.
ENDFORM.
*----
DOWNLOAD_FUNCTION_DOCUMENTATION...
*----
FORM DOWNLOAD_FUNC_DOCUMENTATION USING FUNCTION_NAME
DESCRIPTION.
DATA: I_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
DATA: I_SCRIPT_LINES LIKE TLINE OCCURS 0 WITH HEADER LINE.
DATA: HTML_PAGE_NAME(100).
DATA: DOC_PATH LIKE RLGRAP-FILENAME.
DATA: OBJECT LIKE DOKHL-OBJECT.
MOVE FUNCTION_NAME TO OBJECT.
CALL FUNCTION 'DOCU_GET'
EXPORTING
ID = 'FU'
LANGU = SY-LANGU
OBJECT = OBJECT
TYP = 'T'
VERSION_ACTIVE_OR_LAST = 'L'
TABLES
LINE = I_SCRIPT_LINES
EXCEPTIONS
NO_DOCU_ON_SCREEN = 1
NO_DOCU_SELF_DEF = 2
NO_DOCU_TEMP = 3
RET_CODE = 4
OTHERS = 5.
IF SY-SUBRC = 0 AND NOT ( I_SCRIPT_LINES[] IS INITIAL ).
APPEND 'SHORT TEXT' TO I_LINES.
APPEND DESCRIPTION TO I_LINES.
APPEND SPACE TO I_LINES.
LOOP AT I_SCRIPT_LINES.
MOVE I_SCRIPT_LINES-TDLINE TO I_LINES-LINE.
WHILE I_LINES-LINE CP '&' OR I_LINES-LINE CP '&'.
REPLACE '&' WITH '' INTO I_LINES-LINE.
ENDWHILE.
APPEND I_LINES.
ENDLOOP.
CONCATENATE 'Documentation -' FUNCTION_NAME
INTO HTML_PAGE_NAME SEPARATED BY SPACE.
PERFORM CONVERT_TABLE_TO_HTML TABLES I_LINES
USING HTML_PAGE_NAME.
CONCATENATE P_PATH '\Docs-' FUNCTION_NAME '.'
P_HEX
INTO DOC_PATH.
TRANSLATE DOC_PATH TO LOWER CASE.
PERFORM WS_DOWNLOAD TABLES I_LINES
USING DOC_PATH.
ENDIF.
ENDFORM.
*----
DOWNLOAD_PROGRAMS..
*----
FORM DOWNLOAD_PROGRAMS TABLES I_PROG STRUCTURE I_PROGRAMMES
USING VALUE(P_PATH).
DATA: WA_DICT_STRUCT LIKE I_DICTIONARY.
DATA: I_LOC_TAB_NAMES LIKE TABLE_NAMES OCCURS 0 WITH HEADER LINE.
DATA: I_LOC_DICT TYPE T_DICT_STRUCT OCCURS 0 WITH HEADER LINE.
DATA: WA_INCLUDES TYPE T_INCLUDES.
DATA: I_LOC_FUNCTIONS TYPE T_FUNCTIONS OCCURS 0 WITH HEADER LINE.
DATA: WA_FUNCTIONS TYPE T_FUNCTIONS.
SORT I_PROG ASCENDING BY PROG.
DELETE ADJACENT DUPLICATES FROM I_PROG COMPARING PROG.
LOOP AT I_PROG.
*-- Download screens.
PERFORM DOWNLOAD_SCREENS TABLES I_PROG-SCREEN_FLOW
USING I_PROG-PROG.
*-- Download dictionary objects
LOOP AT I_PROG-DICT_STRUCT INTO WA_DICT_STRUCT.
MOVE WA_DICT_STRUCT-TABNAME TO I_LOC_TAB_NAMES-TABNAME.
APPEND I_LOC_TAB_NAMES.
ENDLOOP.
*--- Temporary stops multiple objects with the same name being
downloaded to the same directory.
LOOP AT I_LOC_TAB_NAMES.
SORT I_DOWNLOADED ASCENDING BY OBJECT.
READ TABLE I_DOWNLOADED WITH KEY OBJECT = I_LOC_TAB_NAMES-TABNAME.
IF SY-SUBRC = 0.
DELETE I_LOC_TAB_NAMES.
ENDIF.
ENDLOOP.
IF NOT ( I_LOC_TAB_NAMES[] IS INITIAL ).
PERFORM FIND_TABLE_DEFINITION TABLES I_LOC_DICT
I_LOC_TAB_NAMES.
PERFORM DOWNLOAD_DD_STRUCTURES TABLES I_LOC_DICT
USING P_PATH.
ENDIF.
*--- Temporary
LOOP AT I_LOC_TAB_NAMES.
APPEND I_LOC_TAB_NAMES TO I_DOWNLOADED.
ENDLOOP.
*-- Download function modules
*--- Temporary stops multiple objects with the same name being
downloaded to the same directory.
LOOP AT I_PROG-FUNCTIONS INTO WA_FUNCTIONS.
SORT I_DOWNLOADED ASCENDING BY OBJECT.
READ TABLE I_DOWNLOADED WITH KEY
OBJECT = WA_FUNCTIONS-FUNCNAME.
if sy-subrc = 0.
DELETE I_PROG-FUNCTIONS.
endif.
endloop.
IF NOT ( I_PROG-FUNCTIONS[] IS INITIAL ).
PERFORM RETRIEVE_FUNCTIONS TABLES S_FNAME
S_FGROUP
I_PROG-FUNCTIONS
I_LOC_FUNCTIONS
USING 0.
PERFORM DOWNLOAD_FUNCTIONS TABLES I_LOC_FUNCTIONS
USING P_PATH.
ENDIF.
*--- Temporary
LOOP AT I_LOC_FUNCTIONS.
MOVE I_LOC_FUNCTIONS-FUNCNAME TO I_DOWNLOADED.
APPEND I_DOWNLOADED.
ENDLOOP.
*-- Download includes
LOOP AT I_PROG-INCLUDES INTO WA_INCLUDES.
PERFORM READ_MAIN_CODE_AND_DOWNLOAD TABLES I_TEXTTAB
I_TEXTTAB
I_MESSAGES
USING WA_INCLUDES-PROG.
ENDLOOP.
*-- Main program
PERFORM READ_MAIN_CODE_AND_DOWNLOAD TABLES I_PROG-TEXT_ELEMENTS
I_PROG-SELECTION_TEXTS
I_PROG-MESSAGES
USING I_PROG-PROG.
CLEAR CONTENT. REFRESH CONTENT.
CLEAR I_LOC_DICT. REFRESH I_LOC_DICT.
CLEAR I_LOC_TAB_NAMES. REFRESH I_LOC_TAB_NAMES.
CLEAR I_LOC_FUNCTIONS. REFRESH I_LOC_FUNCTIONS.
ENDLOOP.
ENDFORM.
*----
FIND_MAIN_CODE_AND_DOWNLOAD...
*----
FORM READ_MAIN_CODE_AND_DOWNLOAD TABLES
TEXT_ELEMENTS STRUCTURE I_TEXTTAB
SELECTION_TEXTS STRUCTURE I_TEXTTAB
MESSAGES STRUCTURE I_MESSAGES
USING PROGNAME.
DATA: I_LINES LIKE CONTENT OCCURS 0 WITH HEADER LINE.
DATA: W_FILENAME LIKE RLGRAP-FILENAME.
READ REPORT PROGNAME INTO I_LINES.
*-- download text elements and selection texts for main program
PERFORM APPEND_TEXT_ELEMENTS TABLES TEXT_ELEMENTS
SELECTION_TEXTS
i_lines.
*-- download messages classes for main program.
PERFORM APPEND_MESSAGES_TO_FILE TABLES MESSAGES I_LINES.
IF ( P_TXT = 'X' ) OR ( PROGNAME = SY-CPROG ).
IF PROGNAME = SY-CPROG.
CONCATENATE P_PATH '\' 'Direct download v' C_VERSION_NO '.' P_TEX
INTO W_FILENAME.
ELSE.
CONCATENATE P_PATH '\' PROGNAME '.' P_TEX INTO W_FILENAME.
ENDIF.
TRANSLATE W_FILENAME TO LOWER CASE.
PERFORM WS_DOWNLOAD TABLES I_LINES USING W_FILENAME.
ELSE.
PERFORM CONVERT_TABLE_TO_HTML TABLES I_LINES
USING PROGNAME.
CONCATENATE P_PATH '\' PROGNAME '.' P_HEX INTO W_FILENAME.
TRANSLATE W_FILENAME TO LOWER CASE.
PERFORM WS_DOWNLOAD TABLES I_LINES USING W_FILENAME.
ENDIF.
ENDFORM.
*----
APPEND_TEXTS_TO_FILE...
*----
FORM APPEND_TEXT_ELEMENTS TABLES TEXT_ELEMENTS STRUCTURE I_TEXTTAB
SELECTION_TEXTS STRUCTURE I_TEXTTAB
I_LINES STRUCTURE CONTENT.
DATA: W_LINES TYPE I VALUE 0.
DESCRIBE TABLE TEXT_ELEMENTS LINES W_LINES.
IF W_LINES > 0.
DO 3 TIMES.
I_LINES-LINE = ''.
APPEND I_LINES.
ENDDO.
I_LINES-LINE = '*Text elements'.
APPEND I_LINES.
I_LINES-LINE = '*----
'.
APPEND I_LINES.
LOOP AT TEXT_ELEMENTS.
I_LINES-LINE+0(2) = '* '.
I_LINES-LINE+2(74) = TEXT_ELEMENTS.
APPEND I_LINES.
ENDLOOP.
ENDIF.
DESCRIBE TABLE SELECTION_TEXTS LINES W_LINES.
IF W_LINES > 0.
DO 3 TIMES.
I_LINES-LINE = ''.
APPEND I_LINES.
ENDDO.
I_LINES-LINE = '*Selection texts'.
APPEND I_LINES.
I_LINES-LINE = '*----
'.
APPEND I_LINES.
LOOP AT SELECTION_TEXTS.
I_LINES-LINE+0(1) = '*'.
I_LINES-LINE+1(75) = SELECTION_TEXTS.
APPEND I_LINES.
ENDLOOP.
ENDIF.
ENDFORM.
*----
APPEND_MESSAGES_TO_FILE
*----
FORM APPEND_MESSAGES_TO_FILE TABLES MESSAGES STRUCTURE I_MESSAGES
I_LINES STRUCTURE CONTENT.
DATA: W_LINES TYPE I VALUE 0,
PREV_MSGID LIKE MESSAGES-MSGID.
DESCRIBE TABLE MESSAGES LINES W_LINES.
IF W_LINES > 0.
DO 2 TIMES.
I_LINES-LINE = ''.
APPEND I_LINES.
ENDDO.
I_LINES-LINE = '*Messages'.
APPEND I_LINES.
I_LINES-LINE = '*----
'.
APPEND I_LINES.
LOOP AT MESSAGES.
IF ( MESSAGES-MSGID <> PREV_MSGID ).
CONCATENATE '*' 'Message class:' MESSAGES-MSGID
INTO I_LINES-LINE SEPARATED BY SPACE.
PREV_MSGID = MESSAGES-MSGID.
APPEND I_LINES.
ENDIF.
CONCATENATE '*' MESSAGES-MSGNR MESSAGES-TEXT INTO I_LINES-LINE
SEPARATED BY SPACE.
APPEND I_LINES.
ENDLOOP.
ENDIF.
ENDFORM. " APPEND_MESSAGES_TO_FILE
*----
DOWNLOAD_SCREENS...
*----
FORM DOWNLOAD_SCREENS TABLES SCREEN_FLOW STRUCTURE I_SCREEN_FLOW
USING VALUE(PROGNAME).
DATA: HEADER LIKE D020S.
DATA: FIELDS LIKE D021S OCCURS 0 WITH HEADER LINE.
DATA: FLOW LIKE D022S OCCURS 0 WITH HEADER LINE.
DATA: W_FILENAME LIKE RLGRAP-FILENAME.
LOOP AT SCREEN_FLOW.
CLEAR HEADER.
CLEAR FIELDS[].
CLEAR FLOW[].
CALL FUNCTION 'RS_IMPORT_DYNPRO'
EXPORTING
DYLANG = SY-LANGU
DYNAME = PROGNAME
DYNUMB = SCREEN_FLOW-SCREEN
IMPORTING
HEADER = HEADER
TABLES
FTAB = FIELDS
PLTAB = FLOW.
CONCATENATE PROGNAME 'screen' SCREEN_FLOW-SCREEN
INTO W_FILENAME SEPARATED BY SPACE.
CONCATENATE P_PATH '\' W_FILENAME '.txt' INTO W_FILENAME.
CALL FUNCTION 'RS_DYNPRO_DOWNLOAD'
EXPORTING
HEADER = HEADER
DESCRIPT = ''
FILE = W_FILENAME
TABLES
FIELDS = FIELDS
FLOWLOGIC = FLOW.
ENDLOOP.
ENDFORM.
*----
WS_DOWNLOAD... Write an internal table to file
*----
FORM WS_DOWNLOAD TABLES I_DOWNLOAD
USING FILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FILENAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = I_DOWNLOAD.
ENDFORM.
************************************************************************
*************************DISPLAY ROUTINES*****************************
************************************************************************
*----
FILL_TREE_NODE_PROGRAMS
*----
FORM FILL_TREE_NODE_PROGRAMS TABLES I_PROG STRUCTURE I_PROGRAMMES.
DATA: W_PROG TYPE T_PROGRAMMES.
DATA: W_NODE LIKE SNODETEXT.
DATA: WA_SCREENS TYPE T_SCREEN_FLOW.
DATA: WA_MESSAGES TYPE T_MESSAGES.
DATA: WA_INCLUDES TYPE T_INCLUDES.
DATA: WA_DICT_STRUCT TYPE T_DICT_STRUCT.
DATA: WA_FUNC_STRUCT TYPE T_FUNCTIONS.
DATA: STRLENGTH TYPE I.
DATA: TEXT(255).
DATA: W_LINES(4) TYPE C.
DESCRIBE TABLE I_PROG LINES W_LINES.
IF W_LINES = 1.
CONCATENATE W_LINES 'programs downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ELSE.
CONCATENATE W_LINES 'programs downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ENDIF.
run_time = sy-uzeit - start_time.
write run_time to run_time_char.
concatenate w_node-text2 '- runtime' run_time_char into w_node-text2
separated by space.
*--- Include header display record.
w_node-tlevel = '1'.
W_NODE-TLENGTH2 = 45.
W_NODE-TCOLOR2 = 1.
append w_node to i_node.
LOOP AT I_PROG.
*--- Main programs.
w_node-tlevel = '2'.
CONCATENATE 'Program -' I_PROG-TEXT INTO TEXT SEPARATED BY SPACE.
W_NODE-TEXT2 = I_PROG-PROG.
Description
STRLENGTH = STRLEN( TEXT ).
W_NODE-TLENGTH3 = STRLENGTH.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = TEXT.
write 'Main Program' to w_node-text3.
APPEND W_NODE TO I_NODE.
*--- Screens.
LOOP AT I_PROG-SCREEN_FLOW INTO WA_SCREENS.
W_NODE-TLEVEL = '3'.
W_NODE-TEXT2 = WA_SCREENS-SCREEN.
W_NODE-TLENGTH3 = 6.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Screen'.
APPEND W_NODE TO I_NODE.
ENDLOOP.
*--- Message Classes.
LOOP AT I_PROG-MESSAGES INTO WA_MESSAGES.
AT NEW MSGID.
W_NODE-TLEVEL = '3'.
W_NODE-TEXT2 = WA_MESSAGES-MSGID.
W_NODE-TLENGTH3 = 14.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Message class'.
APPEND W_NODE TO I_NODE.
ENDAT.
ENDLOOP.
*--- Includes
LOOP AT I_PROG-INCLUDES INTO WA_INCLUDES.
w_node-tlevel = '3'.
W_NODE-TEXT2 = WA_INCLUDES-PROG.
W_NODE-TLENGTH3 = 8.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Include'.
APPEND W_NODE TO I_NODE.
ENDLOOP.
*--- Dictionary structures
LOOP AT I_PROG-DICT_STRUCT INTO WA_DICT_STRUCT.
w_node-tlevel = '3'.
W_NODE-TEXT2 = WA_DICT_STRUCT-TABNAME.
W_NODE-TLENGTH3 = 17.
w_node-tcolor3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Dictionary object'.
append w_node to i_node.
endloop.
*--- Function Modules
LOOP AT I_PROG-FUNCTIONS INTO WA_FUNC_STRUCT.
w_node-tlevel = '3'.
W_NODE-TEXT2 = WA_FUNC_STRUCT-FUNCNAME.
w_node-tlength3 = 17.
w_node-tcolor3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Function Module'.
append w_node to i_node.
endloop.
ENDLOOP.
ENDFORM. " FILL_TREE_NODE
*----
FILL_TREE_NODE_TABLES...
*----
FORM FILL_TREE_NODE_TABLES TABLES I_DICT STRUCTURE I_DICTIONARY.
DATA: W_LINES(4) TYPE C VALUE '0'.
DATA: W_NODE LIKE SNODETEXT.
DATA: WA_DICT_STRUCT TYPE T_DICT_STRUCT.
LOOP AT I_DICT.
AT NEW TABNAME.
W_LINES = W_LINES + 1.
ENDAT.
ENDLOOP.
IF W_LINES = 1.
CONCATENATE W_LINES 'table downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ELSE.
CONCATENATE W_LINES 'tables downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ENDIF.
run_time = sy-uzeit - start_time.
write run_time to run_time_char.
concatenate w_node-text2 '- runtime' run_time_char into w_node-text2
separated by space.
*--- include header display record.
w_node-tlevel = '1'.
W_NODE-TLENGTH2 = 45.
w_node-tcolor2 = 1.
append w_node to i_node.
LOOP AT I_DICT.
MOVE-CORRESPONDING I_DICT TO WA_DICT_STRUCT.
AT NEW TABNAME.
W_NODE-TLEVEL = '2'.
W_NODE-TEXT2 = WA_DICT_STRUCT-TABNAME.
W_NODE-TLENGTH3 = 60.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = WA_DICT_STRUCT-TABTEXT.
APPEND W_NODE TO I_NODE.
ENDAT.
ENDLOOP.
ENDFORM.
*----
FILL_TREE_NODE_FUNCTIONS...
*----
FORM FILL_TREE_NODE_FUNCTIONS TABLES I_FUNC STRUCTURE I_FUNCTIONS.
DATA: W_LINES(4) TYPE C VALUE '0'.
DATA: W_NODE LIKE SNODETEXT.
DESCRIBE TABLE I_FUNC LINES W_LINES.
IF W_LINES = 1.
CONCATENATE W_LINES 'function downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ELSE.
CONCATENATE W_LINES 'functions downloaded' INTO W_NODE-TEXT2
SEPARATED BY SPACE.
ENDIF.
RUN_TIME = SY-UZEIT - START_TIME.
WRITE RUN_TIME TO RUN_TIME_CHAR.
CONCATENATE W_NODE-TEXT2 '- runtime' RUN_TIME_CHAR INTO W_NODE-TEXT2
SEPARATED BY SPACE.
*--- include header display record.
w_node-tlevel = '1'.
W_NODE-TLENGTH2 = 45.
w_node-tcolor2 = 1.
append w_node to i_node.
SORT I_FUNC ASCENDING BY FUNCNAME.
LOOP AT I_FUNC.
W_NODE-TLEVEL = '2'.
W_NODE-TEXT2 = I_FUNC-FUNCNAME.
W_NODE-TLENGTH3 = 74.
W_NODE-TCOLOR3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = I_FUNC-STEXT.
APPEND W_NODE TO I_NODE.
ENDLOOP.
LOOP AT I_PROG_INCLUDES.
W_NODE-TLEVEL = '2'.
W_NODE-TEXT2 = I_PROG_INCLUDES-PROG.
w_node-tlength3 = 74.
w_node-tcolor3 = 4.
W_NODE-TPOS3 = 60.
W_NODE-TEXT3 = 'Include'.
append w_node to i_node.
ENDLOOP.
ENDFORM.
*----
DISPLAY_TREE...
*----
FORM DISPLAY_TREE TABLES I_NODES STRUCTURE SNODETEXT.
DATA: W_NODE LIKE SNODETEXT.
build up the tree from the internal table node
CALL FUNCTION 'RS_TREE_CONSTRUCT'
TABLES
NODETAB = I_NODE
EXCEPTIONS
TREE_FAILURE = 1
ID_NOT_FOUND = 2
WRONG_RELATIONSHIP = 3
OTHERS = 4.
get the first index and expand the whole tree
READ TABLE I_NODE INTO W_NODE INDEX 1.
CALL FUNCTION 'RS_TREE_EXPAND'
EXPORTING
NODE_ID = W_NODE-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. " DISPLAY_TREE
*----
TOP_OF_PAGE... for tree display routines.
*----
FORM TOP_OF_PAGE.
ENDFORM.
[/code]
Regards,
Suresh Datti
04-05-2006 11:20 AM
Suresh,
I am getting error message as 'Error when opening the download file'.
default path is coming from program as c:\temp
regards,
vijay
04-05-2006 11:30 AM
HI,
check..
http://sap.ittoolbox.com/code/archives.asp?d=1623&a=s&i=10
Also chek this one:
http://sap.ittoolbox.com/code/archives.asp?d=3333&a=s&i=10
http://www.sap-img.com/abap/download-and-upload-your-abap-program.htm
http://www.members.tripod.com/abap4/Upload_and_Download_ABAP_Source_Code.html
http://www.geocities.com/rmtiwari/Resources/Utilities/WebViewer.html
Regards
vijay
04-05-2006 1:40 PM
Hi Vijay,
On the selection screen of the report, give the location where you want to store for the parameter 'File path' ( instead of c:\temp)
Regards,
Suresh Datti
04-05-2006 1:50 PM
Vijay,
Do you mean you want to download every R/3 program on your system?
02-15-2007 10:41 AM
hello
i've seen this post only now and i've tried the program for ver 4.7 and it worked fine.My question is how can i upload those files and screens on another PC