You are on page 1of 8

*/******************************************************************/

*/* */
*/* Utility ABAP to Download / Upload a layout set. */
*/* Note that in release 3.0D SAPSCRIPT will */
*/* hopefully be replaced by something much better !!! */
*/* */
*/* This ABAP is needed as the transport system doesn't seem */
*/* to handle layout sets very well. Besides I think the */
*/* correction and transport system is a load of */
*/* dogsbreath anyway. */
*/* */
*/* The following tables are loaded / unloaded on to disk. */
*/* */
*/* Header table */
*/* Lines - note this table contains several entries */
*/* for each entry in the header table. The */
*/* field INDX in table D ensures that on restore */
*/* the relevant entries are kept together */
*/* */
*/* Please note the following restrictions : */
*/* */
*/* A layout set may be COPIED from any client but this */
*/* program will only RESTORE / COPY it back into the client */
*/* you are logged on to */
*/* */
*/* Only the layout set in the ORIGINAL language will be copied. */
*/* If the language change causes problems logon with the */
*/* language of the layout set you want to upload. */
*/* */
*/* This program will only handle 1 layout set per execution. */
*/* I might make a generic front end which would allow */
*/* a bunch of layout sets to be handled together (e.g Z*) */
*/* if I have time. (in theory easy just build a table */
*/* containing the layout set names, loop round it and call */
*/* this program with the appropriate parameters. */
*/* Because DOS will only allow file names of up to 8 chars*/
*/* you cannot normally use the same name as the layout set*/
*/* as this can have up to 16 chars. */
*/* The dos data set name entered in as a parameter will */
*/* have .LLL appended to it. E.G if the data set entered */
*/* is INV01 then the file written to disk will be */
*/* called INV01.LLL */
*/* */
*/* Jim Hawthorne - PC Utilities */
*/* */
*/******************************************************************/

PROGRAM ZZJIMH08 MESSAGE-ID TD.

PARAMETERS : FORMNAME LIKE STXH-TDFORM "source layout set


OBLIGATORY,
QUELMAND LIKE STXH-MANDT DEFAULT SY-MANDT, "Client
ZIELFORM LIKE STXH-TDFORM, "newname
FUNCTION(1) TYPE C, "Up / Download
DSNAME(30) TYPE C, "Dos data set name
PATH(48) TYPE C "Dos path
OBLIGATORY DEFAULT 'C:\TEMP\'.

TABLES: T100. "Mensajes


DATA: BEGIN OF X.
INCLUDE STRUCTURE THEAD.
DATA: END OF X.
DATA: BEGIN OF Y.
INCLUDE STRUCTURE TLINE.
DATA: END OF Y.
DATA: BEGIN OF D OCCURS 50,
TYPE(1) TYPE C,
INDX(3) TYPE C,
TXT(400) TYPE C,
END OF D.
DATA: BEGIN OF SRC_HEADER OCCURS 0. "Table of the forms to be copied
INCLUDE STRUCTURE THEAD.
DATA: END OF SRC_HEADER.
DATA: BEGIN OF HEADER.
INCLUDE STRUCTURE THEAD.
DATA: END OF HEADER.
DATA: BEGIN OF LINES OCCURS 0.
INCLUDE STRUCTURE TLINE.
DATA: END OF LINES.
DATA: ENTRIES LIKE SY-INDEX,
TEXTNAME LIKE THEAD-TDNAME, "Nombre del texto
MASTERFORM LIKE THEAD-TDNAME, "Nombre del texto
LNAME LIKE THEAD-TDFORM, "Nombre del formulario
MASTERLANGUAGE LIKE THEAD-TDSPRAS. "Clave de idioma
DATA:
TYPE(3) TYPE C, "File type - default ASCII
FILESIZE(8), "File size (MS-DOS)
I(3) TYPE C. "Work counter.

DATA: MSGTEXT(255).
DATA: PCFILE(128) TYPE C.
IF DSNAME IS INITIAL.
DSNAME = FORMNAME.
ENDIF.
WRITE PATH TO PCFILE(48).
WRITE DSNAME TO PCFILE+48(30).
WRITE '.LLL' TO PCFILE+78(4).
CONDENSE PCFILE NO-GAPS.
START-OF-SELECTION.
PERFORM CHECK_PARAMETER.
CASE FUNCTION.
WHEN 'D'.
PERFORM COLLECT_OBJECTS. "Collate
PERFORM COPY_OBJECTS. "collect into tables
PERFORM DOWNLOAD_TO_PC. "download
WRITE: / 'Layout set', FORMNAME,'has been downloaded to',
PCFILE(40),'from client ',QUELMAND.
WHEN 'U'.
PERFORM UPLOAD_FROM_PC. "upload
PERFORM BUILD_SRC. "de - collate from tables
PERFORM RESTORE_OBJECTS. "restore / insert
WRITE: / 'Layout set', ZIELFORM, 'has been restored from',
PCFILE(40), 'original name', LNAME.
WHEN OTHERS.
WRITE: / 'Invalid function - must be U(pload) or D(ownload)'.
STOP.
ENDCASE.
*/******************************************************************/
*/* */
*/* Check parameters Source Layout Set */
*/* Source client (default logged on client)*/
*/* Function (U= Upload D=Download) */
*/* Name for uploaded layout set */
*/* Dos data set name (note that */
*/* DOS file names are of format XXXXXXXX (8 long no file type) */
*/* whereas layout sets can be up to 16 chars long.) */
*/* This program automatically appends .LLL to the DOS filename */
*/* so if you change the type you will get an ERROR !! */
*/* */
*/* On upload the original source layout name is only used if */
*/* the target layout set name is blank. The program will */
*/* list out the original name the layout set was copied from.*/
*/* */
*/******************************************************************/

FORM CHECK_PARAMETER.
IF FORMNAME CA '*' AND ZIELFORM NE SPACE.
PERFORM WRITE_MESSAGE USING 'TD' '164' SPACE SPACE SPACE SPACE.
STOP.
ENDIF.
IF ZIELFORM EQ SPACE.
MOVE FORMNAME TO ZIELFORM.
ENDIF.
IF ZIELFORM NE SPACE.
PERFORM CHECK_NAME USING ZIELFORM.
ENDIF.
ENDFORM.

*/******************************************************************/
*/* */
*/* For Download read relevant data objects from the library */
*/* */
*/******************************************************************/

FORM COLLECT_OBJECTS.
TEXTNAME = FORMNAME.
TEXTNAME+16(1) = '*'.
CALL FUNCTION 'SELECT_TEXT'
EXPORTING
CLIENT = QUELMAND
DATABASE_ONLY = 'X'
ID = '*'
LANGUAGE = '*'
NAME = TEXTNAME
OBJECT = 'FORM'
IMPORTING
ENTRIES = ENTRIES
TABLES
SELECTIONS = SRC_HEADER
EXCEPTIONS
OTHERS = 01.
IF ENTRIES <= 0.
PERFORM WRITE_MESSAGE USING 'TD' '131'
FORMNAME '*' QUELMAND SPACE.
STOP.
ENDIF.
SORT SRC_HEADER BY TDNAME TDID.
LOOP AT SRC_HEADER.
IF SRC_HEADER-TDID = 'DEF'.
MASTERFORM = SRC_HEADER-TDNAME.
MASTERLANGUAGE = SRC_HEADER-TDSPRAS.
ENDIF.
IF SRC_HEADER-TDID = 'TXT'.
IF SRC_HEADER-TDNAME = MASTERFORM
AND SRC_HEADER-TDSPRAS <> MASTERLANGUAGE.
* delete src_header.
ENDIF.
ENDIF.
ENDLOOP.
D-INDX = 1.
LOOP AT SRC_HEADER.
MOVE 'S' TO D-TYPE.
MOVE-CORRESPONDING SRC_HEADER TO X.
MOVE X TO D-TXT.
APPEND D.
D-INDX = D-INDX + 1.
ENDLOOP.
ENDFORM.

*/******************************************************************/
*/* */
*/* Build source components ready for downloading. */
*/* */
************************************************************************

FORM BUILD_SRC.
LOOP AT D WHERE TYPE = 'S'.
MOVE D-TXT TO X.
MOVE-CORRESPONDING X TO SRC_HEADER.
APPEND SRC_HEADER.
ENDLOOP.
ENDFORM.

*/******************************************************************/
*/* */
*/* Restore layout set back into the library. */
*/* Format is Header, Header, Header, */
*/* for each header there exists a table LINES with a */
*/* variable nr of entries. Each header with iis associated */
*/* LINES table must be restored. */
*/* */
************************************************************************

FORM RESTORE_OBJECTS.
I = 1.
LOOP AT SRC_HEADER.
CASE SY-TABIX.
WHEN 1.
MOVE SRC_HEADER-TDNAME TO LNAME.
ENDCASE.
REFRESH LINES.
LOOP AT D WHERE TYPE EQ 'L'
AND INDX EQ I.
MOVE D-TXT TO Y.
MOVE-CORRESPONDING Y TO LINES.
APPEND LINES.
ENDLOOP.
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = QUELMAND
ID = SRC_HEADER-TDID
LANGUAGE = SRC_HEADER-TDSPRAS
NAME = SRC_HEADER-TDNAME
OBJECT = SRC_HEADER-TDOBJECT
IMPORTING
HEADER = HEADER
TABLES
LINES = LINES
EXCEPTIONS
ID = 01
LANGUAGE = 02
NAME = 03
NOT_FOUND = 04
OBJECT = 05
REFERENCE_CHECK = 06.

MOVE-CORRESPONDING SRC_HEADER TO HEADER.


IF ZIELFORM NE SPACE AND FORMNAME NA '*'.
MOVE ZIELFORM(16) TO HEADER-TDNAME(16).
MOVE ZIELFORM(16) TO HEADER-TDFORM(16).
ENDIF.
IF HEADER-TDID = 'DEF'.
CALL FUNCTION 'SAPSCRIPT_CHANGE_OLANGUAGE'
EXPORTING
FORCED = 'X'
NAME = HEADER-TDNAME
OBJECT = HEADER-TDOBJECT
OLANGUAGE = HEADER-TDSPRAS
EXCEPTIONS
OTHERS = 01.
* perform write_message using 'TD' '180' header-tdname(16)
* header-tdspras
* space space.

ENDIF.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
CLIENT = SY-MANDT
HEADER = HEADER
SAVEMODE_DIRECT = 'X'
IMPORTING
NEWHEADER = HEADER
TABLES
LINES = LINES
EXCEPTIONS
OTHERS = 1.
* if header-tdid = 'DEF'.
* perform write_message using 'TD' '181' header-tdname(16)
* header-tdspras
* space space.
* else.
* perform write_message using 'TD' '182' header-tdname(16)
* header-tdspras
* space space.
* endif.

I = I + 1.
ENDLOOP.
CALL FUNCTION 'SAPSCRIPT_DELETE_LOAD'
EXPORTING
CLIENT = SY-MANDT
DELETE = 'X'
FORM = '*'
WRITE = SPACE.
ENDFORM.

*/******************************************************************/
*/* */
*/* collate objects into a dataset for downloading. */
*/* */
*/******************************************************************/

FORM COPY_OBJECTS.
D-INDX = 1.
LOOP AT SRC_HEADER.
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = QUELMAND
ID = SRC_HEADER-TDID
LANGUAGE = SRC_HEADER-TDSPRAS
NAME = SRC_HEADER-TDNAME
OBJECT = SRC_HEADER-TDOBJECT
IMPORTING
HEADER = HEADER
TABLES
LINES = LINES
EXCEPTIONS
ID = 01
LANGUAGE = 02
NAME = 03
NOT_FOUND = 04
OBJECT = 05
REFERENCE_CHECK = 06.
LOOP AT LINES.
MOVE 'L' TO D-TYPE.
MOVE-CORRESPONDING LINES TO Y.
MOVE Y TO D-TXT.
APPEND D.
ENDLOOP.
D-INDX = D-INDX + 1.
ENDLOOP.
ENDFORM.

*/*********************************************************************/
*/* */
*/* SAP Physical DOWNLOAD to PC function */
*/* */
*/*********************************************************************/

FORM DOWNLOAD_TO_PC.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = PCFILE
* FILETYPE = TYPE
BIN_FILESIZE = FILESIZE
IMPORTING
FILELENGTH = FILESIZE
TABLES
DATA_TAB = D.
ENDFORM.

*/*********************************************************************/
*/* */
*/* SAP Physical UPLOAD from PC function */
*/* */
*/*********************************************************************/

FORM UPLOAD_FROM_PC.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = PCFILE
* FILETYPE = TYPE
* BIN_FILESIZE = FILESIZE
IMPORTING
FILELENGTH = FILESIZE
TABLES
DATA_TAB = D.
ENDFORM.

*/*********************************************************************/
*/* */
*/* Issue a message */
*/* */
*/*********************************************************************/

FORM WRITE_MESSAGE USING MSG_AG MSG_NR V1 V2 V3 V4.

SELECT SINGLE * FROM T100 WHERE SPRSL = SY-LANGU


AND ARBGB = MSG_AG
AND MSGNR = MSG_NR.
IF SY-SUBRC = 0.
MSGTEXT = T100-TEXT.
ELSE.
MSGTEXT = '& & & &'.
ENDIF.
REPLACE '&' WITH V1 INTO MSGTEXT.
CONDENSE MSGTEXT.
REPLACE '&' WITH V2 INTO MSGTEXT.
CONDENSE MSGTEXT.
REPLACE '&' WITH V3 INTO MSGTEXT.
CONDENSE MSGTEXT.
REPLACE '&' WITH V4 INTO MSGTEXT.
CONDENSE MSGTEXT.
WRITE: / MSGTEXT.
ENDFORM.

FORM CHECK_NAME USING CNAME.


DATA:
LEN LIKE SY-FDPOS,
NAME(16).
FIELD-SYMBOLS: <NAME>.
NAME = CNAME.
LEN = STRLEN( NAME ).
IF LEN <= 0.
LEN = 1.
ENDIF.
ASSIGN NAME(LEN) TO <NAME>.
IF NAME(1) CN 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
PERFORM WRITE_MESSAGE USING 'TD' '118' NAME SPACE SPACE SPACE.
STOP.
ENDIF.
IF <NAME> CN 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'.
PERFORM WRITE_MESSAGE USING 'TD' '605' NAME SPACE SPACE SPACE.
STOP.
ENDIF.
ENDFORM.

You might also like