Read import buffer of a system and delete or import
REPORT ZTPIMPDL MESSAGE-ID 38 NO STANDARD PAGE HEADING.
************************************************************************
* Change request overview - Import to systems in TPPARAM *
************************************************************************
* Author *
* Tomas Gustafsson - Implema AB *
* Description *
* This is only a template. No support is given for this function!!! *
* *
* The program reads the import buffer of a selected system and *
* import or deletes (depends on selected radio-button) *
* selected change requests from buffer *
************************************************************************
*----------------------------------------------------------------------*
* Ver Date Who What *
*----------------------------------------------------------------------*
* 002 19980605 Tomas.G Support for hostname longer than 8 char *
* 003 *
*----------------------------------------------------------------------*
* Result from os call in table form.
DATA: OS_RESULT LIKE BTCXPM OCCURS 0 WITH HEADER LINE.
* Internal tables for requests.
DATA: BEGIN OF I_E070 OCCURS 0, "Table containing read requests
TRKORR LIKE E070-TRKORR,
END OF I_E070.
DATA: BEGIN OF I_SEL_E070 OCCURS 0, "Table containing selected requests
TRKORR LIKE E070-TRKORR,
SELECT_LINE_KEEP, "Line selected or not (' '/'X')
SELECT_LINE_EXIST, "Line selected or not (' '/'X')
SELECT_LINE_FORCE, "Line selected or not (' '/'X')
* select_line_cli000, "Line selected or not (' '/'X')
END OF I_SEL_E070.
DATA: SELECT_LINE, "Line selected or not (' '/'X')
SELECT_LINE_KEEP, "Line selected or not (' '/'X')
SELECT_LINE_EXIST, "Line selected or not (' '/'X')
SELECT_LINE_FORCE, "Line selected or not (' '/'X')
* select_line_cli000, "Line selected or not (' '/'X')
OS_CALL_STATUS LIKE BTCXP3-EXITSTAT. "Status from os call
DATA: KORR_HEAD(14) VALUE 'Change Request',
* cli_head(10) value 'to client ',
KEEP_HEAD(14) VALUE 'Keep in buffer',
EXIST_HEAD(12) VALUE 'Import again',
FORCE_HEAD(12) VALUE 'Force import',
UMODE_STRING(10),
CLIENT_STRING(10).
DATA W_PAGE(2).
DATA TP_PARAMETER LIKE SXPGCOLIST-PARAMETERS. "parameters sent to tp
DATA: BEGIN OF VERSION_INFO OCCURS 0, "002
LINE(80), "002
END OF VERSION_INFO. "002
DATA: TARGET_SYSTEM LIKE BTCXP1-RECEIVER.
SELECTION-SCREEN: BEGIN OF BLOCK SYS WITH FRAME.
PARAMETERS: SYSTEM LIKE SY-SYSID DEFAULT SY-SYSID.
SELECTION-SCREEN: END OF BLOCK SYS.
SELECTION-SCREEN: BEGIN OF BLOCK TP WITH FRAME.
PARAMETERS: IMPORT RADIOBUTTON GROUP WHAT DEFAULT 'X',
TAR_CLI LIKE SY-MANDT DEFAULT SY-MANDT.
SELECTION-SCREEN: SKIP.
PARAMETERS: DELETE RADIOBUTTON GROUP WHAT.
SELECTION-SCREEN: END OF BLOCK TP.
INCLUDE . "In order to print symbols
AT SELECTION-SCREEN ON TAR_CLI.
IF TAR_CLI EQ '000'.
MESSAGE E016(38) WITH 'This program does not allow import to client'
'000'.
ENDIF.
TOP-OF-PAGE.
PERFORM WRITE_PAGE_HEADER.
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM WRITE_PAGE_HEADER.
START-OF-SELECTION.
* Check Authorization (Should be equal to SPAM)
AUTHORITY-CHECK OBJECT 'S_TRANSPRT'
ID 'TTYPE' FIELD 'UPGR' "Upgrade/Installation
ID 'ACTVT' FIELD '60'. "Import
IF SY-SUBRC NE 0.
MESSAGE E016 WITH 'You are not authorized to run this program'.
ENDIF.
W_PAGE = '08'.
* Read hostname (SY-HOST only support up to 8 char.) "002
CALL 'SAPCORE' ID 'ID' FIELD 'VERSION' "002
ID 'TABLE' FIELD VERSION_INFO-*SYS*. "002
READ TABLE VERSION_INFO INDEX 8. "002
TARGET_SYSTEM = VERSION_INFO-LINE+21(20). "002
* Check that import is only performed into current system
IF SYSTEM NE SY-SYSID AND IMPORT EQ 'X'.
FORMAT INTENSIFIED ON.
WRITE: / 'You selected to import to a different system ',
'(' NO-GAP, SYSTEM NO-GAP, ')' NO-GAP,
/ ' then the current one' ,
'(' NO-GAP, SY-SYSID NO-GAP, ')' NO-GAP,
/ 'There MIGHT be problems to IMPORT to another system',
/ 'Delete from import buffer can be used without problems'.
FORMAT INTENSIFIED OFF.
SKIP.
ENDIF.
* Read the import buffer of wanted system.
PERFORM READ_TP_BUFFER.
* ensure that entries where selected.
READ TABLE I_E070 INDEX 1.
IF SY-SUBRC NE 0.
FORMAT INTENSIFIED ON.
WRITE: / 'No entries found in import buffer for system',
SYSTEM.
FORMAT INTENSIFIED OFF.
STOP.
ENDIF.
SORT I_E070.
LOOP AT I_E070.
IF IMPORT EQ 'X'.
PERFORM WRITE_IMPORT_LINE.
ELSE.
PERFORM WRITE_DELETE_LINE.
ENDIF.
ENDLOOP.
IF IMPORT EQ 'X'.
ULINE /(61).
ELSE.
ULINE /(20).
ENDIF.
* Write information about which function key to press once more
SKIP.
PERFORM INFO_F8.
AT PF08.
* Check that user press F8 at proper screen
CHECK SY-LSIND = 1.
REFRESH I_SEL_E070.
W_PAGE = '20'.
* Read all lines of list and check if line where selected.
DO.
MOVE SPACE TO: I_E070-TRKORR,
* select_line_cli000,
SELECT_LINE_KEEP,
SELECT_LINE_EXIST,
SELECT_LINE_FORCE,
SELECT_LINE.
READ LINE SY-INDEX FIELD VALUE SELECT_LINE
* select_line_cli000
SELECT_LINE_KEEP
SELECT_LINE_EXIST
SELECT_LINE_FORCE
I_E070-TRKORR.
* Avoid endless loop
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
* Filter unselected lines
CHECK SELECT_LINE = 'X'.
* Change request found ?
IF I_E070-TRKORR NE SPACE.
I_SEL_E070-TRKORR = I_E070-TRKORR.
* i_sel_e070-select_line_cli000 = select_line_cli000.
I_SEL_E070-SELECT_LINE_KEEP = SELECT_LINE_KEEP.
I_SEL_E070-SELECT_LINE_EXIST = SELECT_LINE_EXIST.
I_SEL_E070-SELECT_LINE_FORCE = SELECT_LINE_FORCE.
APPEND I_SEL_E070.
ENDIF.
ENDDO.
* Avoid "empty headings"
READ TABLE I_SEL_E070 INDEX 1.
IF SY-SUBRC NE 0.
MESSAGE S016(38) WITH 'No lines selected.' 'Please try again'.
STOP.
ENDIF.
LOOP AT I_SEL_E070.
IF IMPORT EQ 'X'.
PERFORM WRITE_IMPORT_LINE_2.
ELSE.
PERFORM WRITE_DELETE_LINE_2.
ENDIF.
ENDLOOP.
IF IMPORT EQ 'X'.
ULINE /(61).
ELSE.
ULINE /(20).
ENDIF.
* Write information about which function key to press
SKIP 2.
PERFORM INFO_F20.
AT PF20.
* Check that user press F20 at proper screen
CHECK SY-LSIND = 2.
W_PAGE = '00'.
* perform selected action for each change request.
LOOP AT I_SEL_E070.
CLEAR TP_PARAMETER.
IF IMPORT EQ 'X'.
* Unconditional modes
UMODE_STRING = 'u'.
* Keep change request in buffer after import
IF I_SEL_E070-SELECT_LINE_KEEP EQ 'X'.
UMODE_STRING+1(1) = '0'.
ENDIF.
* Import even if change request already exists
IF I_SEL_E070-SELECT_LINE_EXIST EQ 'X'.
UMODE_STRING+2(1) = '1'.
ENDIF.
* Overwrite originals AND ignore table class limit
IF I_SEL_E070-SELECT_LINE_FORCE EQ 'X'.
UMODE_STRING+3(2) = '28'.
ENDIF.
CONDENSE UMODE_STRING NO-GAPS.
IF UMODE_STRING+1(1) EQ SPACE.
UMODE_STRING = SPACE.
ENDIF.
* Current client or client 000
CLIENT_STRING = 'client='.
* if i_sel_e070-select_line_cli000 eq 'X'.
CLIENT_STRING+7(3) = TAR_CLI.
* else.
* client_string+7(3) = sy-mandt.
* endif.
* create import parameter
CONCATENATE 'import'
I_SEL_E070-TRKORR
SYSTEM
CLIENT_STRING
UMODE_STRING
INTO TP_PARAMETER SEPARATED BY ' '.
CONDENSE TP_PARAMETER.
ELSE.
* Easier then import, isn't it ??
CONCATENATE 'delfrombuffer'
I_SEL_E070-TRKORR
SYSTEM
INTO TP_PARAMETER SEPARATED BY ' '.
CONDENSE TP_PARAMETER.
ENDIF.
FORMAT INTENSIFIED ON.
WRITE: / 'tp', (40) TP_PARAMETER.
FORMAT INTENSIFIED OFF.
PERFORM CALL_TP.
IF OS_CALL_STATUS EQ 'E'.
FORMAT INTENSIFIED ON.
LOOP AT OS_RESULT. WRITE: / OS_RESULT-MESSAGE. ENDLOOP.
FORMAT INTENSIFIED OFF.
ELSE.
LOOP AT OS_RESULT. WRITE: / OS_RESULT-MESSAGE. ENDLOOP.
ENDIF.
SKIP.
ENDLOOP.
*----------------------------------------------------------------------*
* FORM CALL_TP *
*----------------------------------------------------------------------*
* Call program tp via operating system *
*----------------------------------------------------------------------*
* --> tp_parameter * the parameter for tp. E g "showbuffer C11" *
* <-- os_call_status * returned os-call status O=Ok E=Error *
* <-- os_result * internal table with output from call *
*----------------------------------------------------------------------*
FORM CALL_TP.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
COMMANDNAME = 'ZTP'
ADDITIONAL_PARAMETERS = TP_PARAMETER
TARGETSYSTEM = TARGET_SYSTEM "002
IMPORTING
STATUS = OS_CALL_STATUS
TABLES
EXEC_PROTOCOL = OS_RESULT
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.
ENDFORM.
*----------------------------------------------------------------------*
* FORM READ_TP_BUFFER *
*----------------------------------------------------------------------*
* Read change requests from tp buffer *
*----------------------------------------------------------------------*
* <-- i_e070 * Internal table with change requests from buffer *
*----------------------------------------------------------------------*
FORM READ_TP_BUFFER.
DATA: TEXTLINE(255),
TEMP1(52),
FILENAME(64).
* find path of buffer-directory and create full path to buffer
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'DIR_TRANS'
ID 'VALUE' FIELD TEMP1.
IF TEMP1 EQ SPACE.
FILENAME = '/usr/sap/trans/buffer/'.
ELSE.
IF TEMP1 CA '/'.
CONCATENATE TEMP1 '/buffer/' SYSTEM INTO FILENAME.
CONDENSE FILENAME NO-GAPS.
ELSE.
CONCATENATE TEMP1 '\buffer\' SYSTEM INTO FILENAME.
CONDENSE FILENAME NO-GAPS.
ENDIF.
ENDIF.
REFRESH I_E070.
OPEN DATASET FILENAME IN TEXT MODE FOR INPUT.
DO.
READ DATASET FILENAME INTO TEXTLINE.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
CHECK TEXTLINE(1) NE '#'.
IF TEXTLINE(10) NE SPACE.
MOVE TEXTLINE(10) TO I_E070-TRKORR.
CONDENSE I_E070-TRKORR.
APPEND I_E070.
ENDIF.
ENDDO.
CLOSE DATASET FILENAME.
* Check if any change requests where found
READ TABLE I_E070 INDEX 1.
IF SY-SUBRC NE 0.
WRITE: / 'No change requests found for system', SYSTEM.
STOP.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM READ_TP_BUFFER *
*----------------------------------------------------------------------*
* Read the import buffer for selected system *
*----------------------------------------------------------------------*
* <-- i_e070 * Internal table with change requests from buffer *
*----------------------------------------------------------------------*
FORM OLD_READ_TP_BUFFER.
* Read local buffer
CONCATENATE 'showbuffer'
SYSTEM
INTO TP_PARAMETER SEPARATED BY ' '.
CONDENSE TP_PARAMETER.
PERFORM CALL_TP.
IF OS_CALL_STATUS EQ 'E'.
FORMAT INTENSIFIED ON.
ULINE.
WRITE: / 'read buffer failed'.
ULINE.
LOOP AT OS_RESULT. WRITE: / OS_RESULT-MESSAGE. ENDLOOP.
FORMAT INTENSIFIED OFF.
STOP.
ELSE.
REFRESH I_E070.
LOOP AT OS_RESULT.
IF OS_RESULT-MESSAGE+2(10) CA '0123456789' AND
OS_RESULT-MESSAGE(2) EQ SPACE.
I_E070-TRKORR = OS_RESULT-MESSAGE+2(10).
COLLECT I_E070.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM INFO_F8 *
*----------------------------------------------------------------------*
* Tell user to use F8 to continue *
*----------------------------------------------------------------------*
FORM INFO_F8.
FORMAT INTENSIFIED ON.
WRITE: / SYM_RIGHT_HAND AS SYMBOL,
5 'Press F8 to continue',
27 SYM_LEFT_HAND AS SYMBOL.
FORMAT INTENSIFIED OFF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM INFO_F20 *
*----------------------------------------------------------------------*
* Tell user to use F20 to continue *
*----------------------------------------------------------------------*
FORM INFO_F20.
FORMAT INTENSIFIED ON.
WRITE: / SYM_RIGHT_HAND AS SYMBOL,
5 'Press F20 (shift+F8) to continue',
40 SYM_LEFT_HAND AS SYMBOL.
FORMAT INTENSIFIED OFF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_IMPORT_HEAD *
*----------------------------------------------------------------------*
* Write header for import selection (first screen). *
*----------------------------------------------------------------------*
FORM WRITE_IMPORT_HEAD.
ULINE /(61).
WRITE: / SY-VLINE,
5 SY-VLINE NO-GAP,
KORR_HEAD NO-GAP,
SY-VLINE NO-GAP,
* cli_head no-gap,
* tar_cli(3) no-gap,
* sy-vline no-gap,
KEEP_HEAD NO-GAP,
SY-VLINE NO-GAP,
EXIST_HEAD NO-GAP,
SY-VLINE NO-GAP,
FORCE_HEAD NO-GAP,
SY-VLINE NO-GAP.
ULINE /(61).
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_IMPORT_LINE *
*----------------------------------------------------------------------*
* Write a line for import selection (first screen). *
*----------------------------------------------------------------------*
FORM WRITE_IMPORT_LINE.
WRITE: / SY-VLINE,
SELECT_LINE AS CHECKBOX,
SY-VLINE,
8 I_E070-TRKORR,
* 20 sy-vline,
* 28 select_line_cli000 as checkbox,
* 34 sy-vline,
* 41 select_line_keep as checkbox,
* 49 sy-vline,
* 56 select_line_exist as checkbox,
* 62 sy-vline,
* 68 select_line_force as checkbox,
* 75 sy-vline.
20 SY-VLINE,
27 SELECT_LINE_KEEP AS CHECKBOX,
35 SY-VLINE,
42 SELECT_LINE_EXIST AS CHECKBOX,
48 SY-VLINE,
54 SELECT_LINE_FORCE AS CHECKBOX,
61 SY-VLINE.
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_IMPORT_LINE_2 *
*----------------------------------------------------------------------*
* Write a line for import selection (second screen). *
*----------------------------------------------------------------------*
FORM WRITE_IMPORT_LINE_2.
WRITE: / SY-VLINE,
5 SY-VLINE,
8 I_SEL_E070-TRKORR,
* 20 sy-vline,
* 28 i_sel_e070-select_line_cli000 as checkbox input off,
* 34 sy-vline,
* 41 i_sel_e070-select_line_keep as checkbox input off,
* 49 sy-vline,
* 56 i_sel_e070-select_line_exist as checkbox input off,
* 62 sy-vline,
* 68 i_sel_e070-select_line_force as checkbox input off,
* 75 sy-vline.
20 SY-VLINE,
27 I_SEL_E070-SELECT_LINE_KEEP AS CHECKBOX INPUT OFF,
35 SY-VLINE,
42 I_SEL_E070-SELECT_LINE_EXIST AS CHECKBOX INPUT OFF,
48 SY-VLINE,
54 I_SEL_E070-SELECT_LINE_FORCE AS CHECKBOX INPUT OFF,
61 SY-VLINE.
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_DELETE_HEAD *
*----------------------------------------------------------------------*
* Write header for delete selection (first screen). *
*----------------------------------------------------------------------*
FORM WRITE_DELETE_HEAD.
ULINE /(20).
WRITE: / SY-VLINE,
5 SY-VLINE NO-GAP,
KORR_HEAD NO-GAP,
SY-VLINE NO-GAP.
ULINE /(20).
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_DELETE_LINE *
*----------------------------------------------------------------------*
* Write a line for delete selection (first screen). *
*----------------------------------------------------------------------*
FORM WRITE_DELETE_LINE.
WRITE: / SY-VLINE,
SELECT_LINE AS CHECKBOX,
SY-VLINE,
8 I_E070-TRKORR,
20 SY-VLINE.
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_DELETE_LINE_2 *
*----------------------------------------------------------------------*
* Write a line for delete selection (second screen). *
*----------------------------------------------------------------------*
FORM WRITE_DELETE_LINE_2.
WRITE: / SY-VLINE,
5 SY-VLINE,
8 I_SEL_E070-TRKORR,
20 SY-VLINE.
ENDFORM.
*----------------------------------------------------------------------*
* FORM WRITE_PAGE_HEADER *
*----------------------------------------------------------------------*
* Write header lines for selected/"to be selected" data. *
*----------------------------------------------------------------------*
FORM WRITE_PAGE_HEADER.
IF IMPORT EQ 'X'.
WRITE: / 'Import' COLOR COL_TOTAL,
'objects to system',
SYSTEM COLOR COL_TOTAL,
'client',
TAR_CLI COLOR COL_TOTAL.
ELSE.
WRITE: / 'Delete' COLOR COL_TOTAL,
'objects in buffer of system',
SYSTEM COLOR COL_TOTAL.
ENDIF.
ULINE.
CASE W_PAGE.
WHEN '08'.
* Write information about which function key to press
SKIP.
PERFORM INFO_F8.
SKIP.
* List available change requests.
SKIP.
ULINE.
WRITE: / 'Please select change request(s)'.
WHEN '20'.
* Write information about which function key to press
SKIP.
PERFORM INFO_F20.
* Write selected change request(s)
SKIP 2.
WRITE: / 'The following change request(s) where selected'.
ENDCASE.
SKIP.
IF IMPORT EQ 'X'.
PERFORM WRITE_IMPORT_HEAD.
ELSE.
PERFORM WRITE_DELETE_HEAD.
ENDIF.
ENDFORM.
*** End of ZTPIMPDL ***