copying queries between infosets
DESCRIPTION
Copying Queries Between InfoSetsTRANSCRIPT
-
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 1
Copying Queries Between InfoSets
Applies to:
SAP BW 3.5, SAP BI 7.0 etc. For more information, visit the EDW homepage.
Summary
This paper gives a detailed understanding and how to copy queries between Infosets. The document guides to understand the issue with existing functionality of RSZC transaction code to copy Infoset queries and explain to overcome the issue with new custom defined transaction code to copy queries between infosets.
Author: Lenin Kumar Vutla
Company: Deloitte Consulting
Created on: 16 March 2011
Author Bio
Lenin Kumar Vutla is currently working in Deloitte Consulting India Pvt. Ltd. He is working on SAP BW/BI from last 8 years.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 2
Table of Contents
Introduction ......................................................................................................................................................... 3
Scenario .............................................................................................................................................................. 3
Step 1: Creating Custom Program .................................................................................................................. 3
Step 2: Settings for Text Elements ................................................................................................................. 5
Step 3: Creating ZRSZC Custom Transaction Code ...................................................................................... 6
Step 4: Results ................................................................................................................................................ 7
Source Query (0CLM_IS02_Q001): ................................................................................................................ 9
Target Query (ZCLM_IS02_Q0001): .............................................................................................................. 9
Source Code: ................................................................................................................................................ 10
Related Content ................................................................................................................................................ 40
Disclaimer and Liability Notice .......................................................................................................................... 41
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 3
Introduction
RSZC SAP transaction code help us to copy all query components like Queries, Filters, Restricted Key Figures, Calculated Key Figures and Structures from one InfoCube to another InfoCube or one Multi-provider to another Multi-provider. To copy queries between these Infoproviders, both source and target Infoproviders must have same structure including technical names of Info objects.
But in the case of InfoSets it is not possible to copy queries between two infosets however they have same structure. It is because the technical names of Infobjects inside the Infoset will be defined by system while creation. Due to this reason when we create any infoset with copy of another infoset, both original and copied infoset will have different technical names for the infoobjects inside. In that case we cant copy the queries from original infoset to copied infoset.
To overcome this issue we have created custom transaction code with name ZRSZC by providing functionality to this transaction code through Z program to facilitate infosets by allow them to copy of queries.
Scenario
To demonstrate the functionality and usage of ZRSZC transaction code to copy queries between InfoSets we took the scenario from FSCM (Financial Supply Chain Management) Business Content Infoset (0CLM_IS02) and created copy Z infoset (ZCLM_IS02).
ZRSZC Functionality:
Please follow the steps below to understand the use of ZRSZC in BW system.
Step 1: Creating Custom Program
To provide functionality for ZRSZC transaction code we need to create custom Z program from SE38 ABAP editor. In our scenario we have created the program with name ZRSZC.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 4
Please see the Source code for the above program under Source code section. Once program created save and activate.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 5
Step 2: Settings for Text Elements
To display user defined text elements at input selection screen after program execution, we need to define text elements for all entries defined in the program.
Follow the below steps to define text elements for the program output screens.
Go to the program editor window in SE38 and select Text Symbols option from Goto menu as shown below.
Enter the below entries in Text Symbols tab.
After that enter the below entries in Selection Texts Tab
001 Select InfoProvider
002 Select Queries
003 Copying of Query Components Between InfoSets
004 Select Component
005 Log
G_P_IC1 Source InfoSet
G_P_IC2 Target InfoSet
P_CKF Calculated Key Figures
P_REP Queries
P_RKF Restricted Key Figures
P_SOB Filter
P_STR Structures
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 6
Step 3: Creating ZRSZC Custom Transaction Code
To call and execute ZRSZC custom program through transaction code we need to create new Z transaction code with name ZRSZC. The following steps to be followed to create ZRSZC transaction code.
Go to SE93 transaction code to create custom transaction code.
Type ZRSZC and press Create button as shown below
Then it will display another screen shown below and enter all given parameters(including the program name(ZRSZC) we created ) with required check options.
After entering required parameters press Save button to save the transaction code.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 7
Step 4: Results
To see the results we have to follow the below instructions.
Open new SAP screen and enter ZRSZC transaction code in the command text box as shown below.
Once you run the above transaction code it will execute the assigned ABAP program at back-end and will display the below input selection screen.
Enter the source and target infosets and select Queries option to copy all queries from source InfoSet (0CLM_IS02) to target InfoSet (ZCLM_IS02) and press the Execute button.
After execution it will display the below screen with all queries list from the source InfoSet. Select required queries you want to copy from the list and press Transfer Selections button. In our case we selection all queries.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 8
Now we need to give copied queries technical names as shown below including CKF, Selections and RKF etc., By default system will assign same technical names of source InfoSet by adding suffix with _1. We can rename them with our own naming convention.
Once all queries successfully copied, below screen will display with confirmation log.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 9
Source Query (0CLM_IS02_Q001):
Target Query (ZCLM_IS02_Q0001):
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 10
Source Code:
*&---------------------------------------------------------------------*
*& Report ZRSZC
*&
*&---------------------------------------------------------------------*
*& Copying of Query Components between InfoSets
*&
*&---------------------------------------------------------------------*
REPORT ZRSZC message-id r9.
type-pools:
rs, "BW global
rrms, "message server
rsz, "Qry definition global
rzx0, "Qry RFC interface
rzd1. "Qry definition database
include .
tables: sscrfields. "needed for custom status
* need info about cubetype of target cube/ODS globally
data:
g_target_cubetype type rsd_cubetype.
data : I_DEFTP TYPE RZD1_DEFTP .
FIELD-SYMBOLS:
TYPE rzd1_s_compdir_compic,
TYPE rzx0_s_uid_server_x,
TYPE rsd_s_dta.
DATA:
l_t_eltuid TYPE rsz_t_uid,
l_t_comp_rename TYPE rzd1_t_comp_rename,
l_s_msg TYPE rs_s_msg,
* l_title TYPE string,
l_subrc LIKE sy-subrc,
l_is_compliant TYPE rs_bool,
l_t_msg TYPE rs_t_msg,
l_th_complist TYPE rzd1_th_compdir_compic,
l_t_popup_in TYPE rso_t_object_f4_list,
l_t_popup_out TYPE rso_t_object_f4_list,
l_s_popup TYPE rso_s_object_f4_list,
l_t_uid_server TYPE rzx0_t_uid_server_x,
l_th_uid_server_all TYPE rzx0_th_uid_server_x,
l_t_dta TYPE rsd_t_dta.
SELECTION-SCREEN BEGIN OF BLOCK ip WITH FRAME TITLE text-001.
PARAMETERS g_p_ic1 LIKE v_compdir_compic-infocube OBLIGATORY. "value check
PARAMETERS g_p_ic2 LIKE v_compdir_compic-infocube OBLIGATORY. "value check
SELECTION-SCREEN END OF BLOCK ip.
SELECTION-SCREEN BEGIN OF BLOCK deftp WITH FRAME TITLE text-004.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 11
PARAMETERS p_rep TYPE rs_bool RADIOBUTTON GROUP comp.
PARAMETERS p_sob TYPE rs_bool RADIOBUTTON GROUP comp.
PARAMETERS p_str TYPE rs_bool RADIOBUTTON GROUP comp.
PARAMETERS p_rkf TYPE rs_bool RADIOBUTTON GROUP comp.
PARAMETERS p_ckf TYPE rs_bool RADIOBUTTON GROUP comp.
SELECTION-SCREEN END OF BLOCK deftp.
IF P_REP IS NOT INITIAL.
I_DEFTP = 'REP'.
ELSEIF P_SOB IS NOT INITIAL.
I_DEFTP = 'SOB'.
ELSEIF P_STR IS NOT INITIAL.
I_DEFTP = 'STR'.
ELSEIF P_RKF IS NOT INITIAL.
I_DEFTP = 'RKF'.
ELSEIF P_CKF IS NOT INITIAL.
I_DEFTP = 'CKF'.
ENDIF.
* Get InfoArea for source and target
CALL METHOD cl_rsd_dta=>get_all
EXPORTING
i_objvers = rs_c_objvers-active
IMPORTING
e_t_dta = l_t_dta.
READ TABLE l_t_dta
ASSIGNING
WITH KEY infoprov = g_p_ic1.
IF sy-subrc = 0.
ELSE.
* Source InfoProvider is not available
MESSAGE a001 WITH g_p_ic1.
EXIT.
ENDIF.
* Check the existence and authorization for thr target IP
READ TABLE l_t_dta
ASSIGNING
WITH KEY infoprov = g_p_ic2.
IF sy-subrc = 0.
ELSE.
* Target InfoProvider is not available
MESSAGE a001 WITH g_p_ic2.
EXIT.
ENDIF.
* check if taget infocube is compatible
PERFORM check_infocube_compliance
USING
g_p_ic1
g_p_ic2
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 12
CHANGING
l_subrc
l_is_compliant
l_t_msg.
* show messages if failed
IF l_subrc 0 OR l_is_compliant = rs_c_false.
PERFORM msg_to_protocol
USING 'R9'
'E'
'145'
g_p_ic2
space
space
space
CHANGING l_s_msg.
INSERT l_s_msg INTO TABLE l_t_msg.
CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP'
EXPORTING
i_t_msg = l_t_msg
i_txt = text-001. "Check of IC compatibilit
EXIT.
ENDIF.
* get all queries of source infocube
CALL FUNCTION 'RSZ_DB_COMP_LIST_GET'
EXPORTING
i_by_infocube = g_p_ic1
i_deftp = i_deftp
IMPORTING
e_th_complist = l_th_complist.
* check queries do exist
IF l_th_complist[] IS INITIAL.
MESSAGE i156 WITH g_p_ic1.
EXIT.
ENDIF.
* convert list to popup structure
LOOP AT l_th_complist
ASSIGNING .
* Check authorization to read DEFTPs from the Source
CALL FUNCTION 'RSSB_AUTHORITY_COMP_CHECK'
EXPORTING
i_infoarea = space
i_infocube = space
i_comptype = -deftp
i_compid = -compid
i_owner = -owner
i_actvt = '03'
EXCEPTIONS
user_not_authorized = 1
OTHERS = 2.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 13
IF sy-subrc 0.
CALL FUNCTION 'RSSB_AUTHORITY_COMP_CHECK'
EXPORTING
i_infoarea = space
i_infocube = space
i_comptype = -deftp
i_compid = -compid
i_owner = -owner
i_actvt = '02'
EXCEPTIONS
user_not_authorized = 1
OTHERS = 2.
IF sy-subrc 0.
DELETE l_th_complist WHERE compid = -compid.
CONTINUE.
ENDIF.
ENDIF.
* Get corresponding ICON
CASE -deftp.
WHEN rzd1_c_deftp-report.
l_s_popup-icon = icon_biw_report.
WHEN rzd1_c_deftp-structure.
l_s_popup-icon = icon_biw_ref_structure.
WHEN rzd1_c_deftp-selection.
l_s_popup-icon = icon_selection.
WHEN rzd1_c_deftp-calkeyfig.
l_s_popup-icon = icon_biw_formula.
WHEN rzd1_c_deftp-sel_object.
l_s_popup-icon = icon_ranking.
ENDCASE.
l_s_popup-objnm = -compid.
l_s_popup-txtlg = -txtlg.
l_s_popup-guid = -compuid.
INSERT l_s_popup INTO TABLE l_t_popup_in.
ENDLOOP.
* send selection popup
CALL FUNCTION 'RSO_F4_OBJECTS'
EXPORTING
i_t_object_f4_list = l_t_popup_in
i_title = text-004
i_read_only = rs_c_false
IMPORTING
e_t_object_f4_list = l_t_popup_out
EXCEPTIONS
cancel = 1
OTHERS = 2.
* Cancelled by the user
IF sy-subrc = 1.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 14
MESSAGE a021.
EXIT.
ELSEIF sy-subrc > 1.
RAISE inherited_error.
ENDIF.
* Nothing is selected
IF l_t_popup_out IS INITIAL.
MESSAGE i027.
* send selection popup once again
CALL FUNCTION 'RSO_F4_OBJECTS'
EXPORTING
i_t_object_f4_list = l_t_popup_in
i_title = text-004
i_read_only = rs_c_false
IMPORTING
e_t_object_f4_list = l_t_popup_out
EXCEPTIONS
cancel = 1
OTHERS = 2.
ENDIF.
* Cancelled by the user
IF sy-subrc = 1.
MESSAGE a021.
EXIT.
ELSEIF sy-subrc > 1.
RAISE inherited_error.
ENDIF.
* If nothing is still selected --> exit
IF l_t_popup_out IS INITIAL.
MESSAGE a027.
EXIT.
ENDIF.
* New renaming popup. Prepare elements table.
LOOP AT l_t_popup_out
INTO l_s_popup.
APPEND l_s_popup-guid TO l_t_eltuid.
ENDLOOP.
PERFORM rename_by_user
USING
g_p_ic1
g_p_ic2
l_t_eltuid
i_deftp
CHANGING
l_t_comp_rename
l_th_uid_server_all
l_subrc
l_t_msg.
IF l_subrc = 0.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 15
LOOP AT l_t_popup_out
INTO l_s_popup.
l_t_uid_server = l_th_uid_server_all.
CALL FUNCTION 'RSZ_I_COPY_QRY_TO_CUBE_SINGLE'
EXPORTING
i_source_compuid = l_s_popup-guid
i_source_infocube = g_p_ic1
i_t_comp_rename = l_t_comp_rename
i_target_infocube = g_p_ic2
i_check_compliance = rs_c_false
i_deftp = -deftp
IMPORTING
e_t_msg = l_t_msg
CHANGING
c_t_uid_server = l_t_uid_server
EXCEPTIONS
no_authority = 1
no_source_infocube_found = 2
infocube_check_failed = 3
error_in_compliance_check = 4
infocubes_not_compliant = 5
OTHERS = 6.
IF sy-subrc 0.
EXIT.
ENDIF.
LOOP AT l_t_uid_server
ASSIGNING .
READ TABLE l_th_uid_server_all
WITH TABLE KEY virtual = -virtual
TRANSPORTING NO FIELDS.
IF sy-subrc 0.
INSERT INTO TABLE l_th_uid_server_all.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDIF.
* show messages
CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP'
EXPORTING
i_t_msg = l_t_msg
i_txt = text-005
i_one_msg_direct = rs_c_false.
DATA : LT_RSZELTXREF TYPE TABLE OF RSZELTXREF,
LT1 TYPE TABLE OF RSZELTXREF,
LT2 TYPE TABLE OF RSZELTXREF,
LT_RSZSELECT TYPE TABLE OF RSZSELECT,
WA_RSZSELECT TYPE RSZSELECT,
lt_rszrange type table of rszrange,
wa_rszrange type rszrange,
lt_rszcalc type table of rszcalc,
wa_rszcalc type rszcalc,
STRL TYPE STRING,
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 16
LEN TYPE I,
LT_RSZCOMPIC TYPE TABLE OF RSZCOMPIC,
WA_RSZCOMPIC TYPE RSZCOMPIC.
DATA : STR TYPE STRING.
SELECT * FROM RSZELTXREF
INTO TABLE LT_RSZELTXREF
WHERE INFOCUBE = g_p_ic2.
*BREAK-POINT.
LT1[] = LT_RSZELTXREF[].
LT2[] = LT_RSZELTXREF[].
SORT LT1 BY SELTUID.
DELETE ADJACENT DUPLICATES FROM LT1 COMPARING SELTUID.
SORT LT2 BY TELTUID.
DELETE ADJACENT DUPLICATES FROM LT2 COMPARING TELTUID.
MOVE G_P_IC1 TO STRL.
LEN = STRLEN( STRL ).
IF LT1[] IS NOT INITIAL.
SELECT * FROM RSZSELECT
INTO TABLE LT_RSZSELECT
FOR ALL ENTRIES IN LT1
WHERE ELTUID = LT1-SELTUID.
LOOP AT LT_RSZSELECT INTO WA_RSZSELECT.
* IF WA_RSZSELECT-IOBJNM CS g_p_ic1.
IF WA_RSZSELECT-IOBJNM+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZSELECT-IOBJNM+1(29) INTO STR.
move WA_RSZSELECT-IOBJNM to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZselect
SET IOBJNM = STR
WHERE ELTUID = WA_RSZSELECT-ELTUID
and iobjnm = WA_RSZSELECT-IOBJNM
AND OBJVERS = WA_RSZSELECT-OBJVERS.
ENDIF.
ENDLOOP.
ENDIF.
clear : lt_rszselect[].
IF LT2[] IS NOT INITIAL.
SELECT * FROM RSZSELECT
INTO TABLE LT_RSZSELECT
FOR ALL ENTRIES IN LT2
WHERE ELTUID = LT2-TELTUID.
LOOP AT LT_RSZSELECT INTO WA_RSZSELECT.
* IF WA_RSZSELECT-IOBJNM CS g_p_ic1.
IF WA_RSZSELECT-IOBJNM+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZSELECT-IOBJNM+1(29) INTO STR.
move WA_RSZSELECT-IOBJNM to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 17
UPDATE RSZselect
SET IOBJNM = STR
WHERE ELTUID = WA_RSZSELECT-ELTUID
and iobjnm = WA_RSZSELECT-IOBJNM
AND OBJVERS = WA_RSZSELECT-OBJVERS.
ENDIF.
ENDLOOP.
ENDIF.
IF LT1[] IS NOT INITIAL.
SELECT * FROM RSZrange
INTO TABLE LT_RSZrange
FOR ALL ENTRIES IN LT1
WHERE ELTUID = LT1-SELTUID.
LOOP AT LT_RSZrange INTO WA_RSZrange.
* IF WA_RSZrange-IOBJNM CS g_p_ic1.
IF WA_RSZRANGE-IOBJNM+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-IOBJNM+1(29) INTO STR.
move WA_RSZrange-IOBJNM to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET IOBJNM = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
ENDIF.
* IF WA_RSZrange-LOW CS g_p_ic1.
IF WA_RSZRANGE-LOW+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-LOW+1(59) INTO STR.
move WA_RSZrange-low to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET LOW = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
ENDIF.
* IF WA_RSZrange-HIGH CS g_p_ic1.
IF WA_RSZRANGE-HIGH+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-HIGH+1(59) INTO STR.
move WA_RSZrange-high to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET HIGH = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 18
ENDIF.
ENDLOOP.
endif.
clear : lt_rszrange[].
IF LT2[] IS NOT INITIAL.
SELECT * FROM RSZRANGE
INTO TABLE LT_RSZRANGE
FOR ALL ENTRIES IN LT2
WHERE ELTUID = LT2-TELTUID.
LOOP AT LT_RSZrange INTO WA_RSZrange.
* IF WA_RSZrange-IOBJNM CS g_p_ic1.
IF WA_RSZRANGE-IOBJNM+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-IOBJNM+1(29) INTO STR.
move WA_RSZrange-IOBJNM to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET IOBJNM = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
ENDIF.
*IF WA_RSZrange-LOW CS g_p_ic1.
IF WA_RSZRANGE-LOW+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-LOW+1(59) INTO STR.
move WA_RSZrange-low to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET LOW = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
ENDIF.
* IF WA_RSZrange-HIGH CS g_p_ic1.
IF WA_RSZRANGE-HIGH+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZrange-HIGH+1(59) INTO STR.
move WA_RSZrange-high to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZrange
SET HIGH = STR
WHERE ELTUID = WA_RSZrange-ELTUID
and iobjnm = WA_RSZrange-IOBJNM
AND OBJVERS = WA_RSZrange-OBJVERS.
ENDIF.
ENDLOOP.
ENDIF.
*IF LT1[] IS NOT INITIAL .
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 19
IF I_DEFTP = 'CKF' or I_DEFTP = 'REP'.
SELECT * FROM RSZCOMPIC
INTO TABLE LT_RSZCOMPIC
WHERE INFOCUBE = G_P_IC2.
IF LT_RSZCOMPIC[] IS NOT INITIAL.
SELECT * FROM RSZCALC
INTO TABLE LT_RSZCALC
FOR ALL ENTRIES IN LT_RSZCOMPIC
WHERE ELTUID = LT_RSZCOMPIC-COMPUID.
ENDIF.
LOOP AT LT_RSZCALC INTO WA_RSZCALC.
* IF WA_RSZCALC-OPER1 CS g_p_ic1.
IF WA_RSZCALC-OPER1+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZCALC-OPER1+1(31) INTO STR.
move WA_RSZcalc-oper1 to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZCALC
SET OPER1 = STR
WHERE ELTUID = WA_RSZCALC-ELTUID
and STEPNR = WA_RSZCALC-STEPNR
AND OBJVERS = WA_RSZCALC-OBJVERS.
ENDIF.
*IF WA_RSZCALC-OPER2 CS g_p_ic1.
IF WA_RSZCALC-OPER2+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZCALC-OPER2+1(31) INTO STR.
move WA_RSZcalc-oper2 to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZCALC
SET OPER2 = STR
WHERE ELTUID = WA_RSZCALC-ELTUID
and STEPNR = WA_RSZCALC-STEPNR
AND OBJVERS = WA_RSZCALC-OBJVERS.
ENDIF.
*IF WA_RSZCALC-AGGRCHA CS g_p_ic1.
IF WA_RSZCALC-AGGRCHA+0(LEN) = g_p_ic1.
CLEAR : STR.
* CONCATENATE 'Z' WA_RSZCALC-AGGRCHA+1(29) INTO STR.
move WA_RSZcalc-aggrcha to str.
replace all occurrences of g_p_ic1 in str with g_p_ic2.
UPDATE RSZCALC
SET AGGRCHA = STR
WHERE ELTUID = WA_RSZCALC-ELTUID
and STEPNR = WA_RSZCALC-STEPNR
AND OBJVERS = WA_RSZCALC-OBJVERS.
ENDIF.
ENDLOOP.
ENDIF.
*----------------------------------------------------------------------*
***INCLUDE LRZIMPACTF01 .
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 20
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form MSG_TO_PROTOCOL
*&---------------------------------------------------------------------*
* add messages to transport protocol
*----------------------------------------------------------------------*
* --> I_ID message id
* --> I_TYPE message type
* --> I_NUMB message number
* --> I_PAR1 parameter 1
* --> I_PAR2 parameter 2
* --> I_PAR3 parameter 3
* --> I_PAR4 parameter 4
*
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 21
'A'.
c_s_msg-probclass = '1'. "very important
ENDCASE.
ENDFORM. " SET_DETLEVEL_PROBCLASS
*&---------------------------------------------------------------------*
*& Form check_infocube_compliance
*&---------------------------------------------------------------------*
* check if all infoObject of source are in target
*----------------------------------------------------------------------*
FORM check_infocube_compliance
USING i_source_infocube TYPE rsd_infocube
i_target_infocube TYPE rsd_infocube
CHANGING l_subrc LIKE sy-subrc
e_is_compliant TYPE rs_bool
c_t_msg TYPE rs_t_msg.
FIELD-SYMBOLS:
TYPE rsd_s_cob_pro.
DATA:
l_with_atr_nav TYPE rs_bool,
l_s_msg TYPE rs_s_msg,
l_t_source_cob_pro TYPE rsd_t_cob_pro,
l_t_target_cob_pro TYPE rsd_t_cob_pro,
l_th_target_cob_pro TYPE rsd_th_cob_pro.
e_is_compliant = rs_c_true.
* check is weaker if target is ODS object
IF g_target_cubetype = rsd_c_cubetype-ods_ic.
l_with_atr_nav = rs_c_false.
ELSE.
l_with_atr_nav = rs_c_true.
ENDIF.
* get all infoobjects of source infocube
CALL FUNCTION 'RSD_COB_PRO_ALL_GET'
EXPORTING
i_infocube = i_source_infocube
i_with_atr_nav = l_with_atr_nav
i_with_meta_iobj = rs_c_true
IMPORTING
e_t_cob_pro = l_t_source_cob_pro
EXCEPTIONS
infocube_not_found = 1
error_reading_infocatalog = 2
illegal_input = 3.
IF sy-subrc 0.
l_subrc = sy-subrc.
PERFORM msg_to_protocol
USING 'R9'
'E'
'144'
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 22
i_source_infocube
space
space
space
CHANGING l_s_msg.
INSERT l_s_msg INTO TABLE c_t_msg.
EXIT.
ENDIF.
* get all infoobjects of target infocube
CALL FUNCTION 'RSD_COB_PRO_ALL_GET'
EXPORTING
i_infocube = i_target_infocube
i_with_atr_nav = rs_c_true
i_with_meta_iobj = rs_c_true
IMPORTING
e_t_cob_pro = l_t_target_cob_pro
EXCEPTIONS
infocube_not_found = 1
error_reading_infocatalog = 2
illegal_input = 3.
IF sy-subrc 0.
l_subrc = sy-subrc.
PERFORM msg_to_protocol
USING 'R9'
'E'
'144'
i_target_infocube
space
space
space
CHANGING l_s_msg.
INSERT l_s_msg INTO TABLE c_t_msg.
EXIT.
ENDIF.
* check if all infoobjects of source infocube are contained in
* target infocube
l_th_target_cob_pro = l_t_target_cob_pro.
LOOP AT l_t_source_cob_pro
ASSIGNING
WHERE chasel rsd_c_chasl-not_allowed
AND iobjnm '0REQUID'
AND iobjnm '0INFOPROV'.
*CAUTION! Need to check set of queries in the future.
READ TABLE l_th_target_cob_pro
WITH KEY infoprov = i_target_infocube
FIELDNM = -FIELDNM
TRANSPORTING NO FIELDS.
IF sy-subrc 0.
* infoobject is missing
e_is_compliant = rs_c_false.
PERFORM msg_to_protocol
USING 'R9'
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 23
'E'
'147'
i_target_infocube
-iobjnm
space
space
CHANGING l_s_msg.
INSERT l_s_msg INTO TABLE c_t_msg.
ENDIF.
ENDLOOP.
ENDFORM. " check_infocube_compliance
*&---------------------------------------------------------------------*
*& Form copy_query_to_infocube
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM copy_query_to_infocube
USING
i_source_compuid TYPE rsz_uid
i_t_comp_rename TYPE rzd1_t_comp_rename
i_target_infocube TYPE rsd_infocube
i_deftp TYPE rzd1_deftp
CHANGING
c_subrc LIKE sy-subrc
c_t_msg TYPE rs_t_msg
c_t_uid_server TYPE rzx0_t_uid_server_x.
DATA:
l_target_compid TYPE rszcompdir-compid,
l_t_uid_server TYPE rzx0_t_uid_server,
l_s_uid_server TYPE rzx0_s_uid_server_x,
l_s_msg TYPE rs_s_msg,
l_s_compdir TYPE rzx0_s_compdir,
l_s_eltdir TYPE rzx0_s_eltdir,
l_s_elttxt TYPE rzx0_s_elttxt,
l_t_eltdir TYPE rzx0_t_eltdir,
l_t_eltprop TYPE rzx0_t_eltprop,
l_t_eltprio TYPE rzx0_t_eltprio,
l_t_eltattr TYPE rzx0_t_eltattr,
l_t_eltxref TYPE rzx0_t_eltxref,
l_t_compdir TYPE rzx0_t_compdir,
l_t_compic TYPE rzx0_t_compic,
l_t_select TYPE rzx0_t_select,
l_t_range TYPE rzx0_t_range,
l_t_calc TYPE rzx0_t_calc,
l_t_elttxt TYPE rzx0_t_elttxt,
l_t_cell TYPE rzx0_t_cel.
DATA:
l_t_comp_rename TYPE rzd1_t_comp_rename,
l_s_comp_rename TYPE rzd1_s_comp_rename.
FIELD-SYMBOLS:
TYPE rzd1_s_comp_rename,
TYPE rzx0_s_eltdir,
TYPE rzx0_s_compdir,
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 24
TYPE rzx0_s_compic.
* get the tables of source query and its components
CALL FUNCTION 'RSZ_X_COMPONENT_GET'
EXPORTING
i_compuid = i_source_compuid
i_template_type = i_deftp
i_language = '*'
i_use_buffer = 'A'
i_designtime_call = rs_c_false
IMPORTING
e_subrc = c_subrc
TABLES
c_t_eltdir = l_t_eltdir
c_t_eltprop = l_t_eltprop
c_t_eltprio = l_t_eltprio
c_t_eltattr = l_t_eltattr
c_t_eltxref = l_t_eltxref
c_t_compdir = l_t_compdir
c_t_compic = l_t_compic
c_t_select = l_t_select
c_t_range = l_t_range
c_t_calc = l_t_calc
c_t_elttxt = l_t_elttxt
c_t_cell = l_t_cell.
IF c_subrc 0.
* get and convert messages from msg server
PERFORM get_messages
CHANGING
c_t_msg.
EXIT.
ENDIF.
* modify COMPIDs to new values: Query name is given
* all other names must be generated
PERFORM rename_components
USING
i_source_compuid
i_target_infocube
l_t_eltdir
c_t_uid_server
CHANGING
l_target_compid
l_t_compdir
l_t_compic
c_subrc
c_t_msg.
LOOP AT l_t_compdir
ASSIGNING .
READ TABLE i_t_comp_rename
ASSIGNING
WITH KEY compuid = -compuid.
IF sy-subrc = 0.
-compid = -compid_new.
ENDIF.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 25
ENDLOOP.
* Setting the target InfoProvider
LOOP AT l_t_compic
ASSIGNING .
-infocube = i_target_infocube.
ENDLOOP.
IF c_subrc = 0.
* save tables under the new name (COMPID)
* copy_mode = true leads to replacement of all ELTUIDs
l_t_uid_server[] = c_t_uid_server[].
CALL FUNCTION 'RSZ_X_COMPONENT_SET'
EXPORTING
i_compuid = i_source_compuid
* I_OBJVERS = 'A'
i_copy_mode = rs_c_true
i_language = '*'
IMPORTING
* E_GENUNIID =
e_subrc = c_subrc
TABLES
c_t_eltdir = l_t_eltdir
c_t_eltprop = l_t_eltprop
c_t_eltprio = l_t_eltprio
c_t_eltattr = l_t_eltattr
c_t_eltxref = l_t_eltxref
c_t_compdir = l_t_compdir
c_t_compic = l_t_compic
c_t_select = l_t_select
c_t_range = l_t_range
c_t_calc = l_t_calc
c_t_elttxt = l_t_elttxt
c_t_cell = l_t_cell
c_t_uid_server = l_t_uid_server.
c_t_uid_server[] = l_t_uid_server[].
* fill tech name
LOOP AT l_t_compdir
INTO l_s_compdir.
* update tech name
l_s_uid_server-compid = l_s_compdir-compid.
MODIFY c_t_uid_server FROM l_s_uid_server TRANSPORTING compid
WHERE virtual = l_s_compdir-compuid.
ENDLOOP.
ENDIF.
IF c_subrc 0.
* get and convert messages from msg server
PERFORM get_messages
CHANGING
c_t_msg.
EXIT.
ELSE.
* Add all copied components to the protocol
LOOP AT l_t_compdir
ASSIGNING .
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 26
READ TABLE l_t_eltdir
ASSIGNING
WITH KEY eltuid = -compuid.
IF sy-subrc = 0 AND -deftp NE rzd1_c_deftp-variable.
PERFORM msg_to_protocol
USING 'R9'
'S'
'202'
-compid
-deftp
i_target_infocube
space
CHANGING l_s_msg.
APPEND l_s_msg TO c_t_msg.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " copy_query_to_info
*&---------------------------------------------------------------------*
*& Form rename_components
*&---------------------------------------------------------------------*
* remodelled with J19K003184
*----------------------------------------------------------------------*
FORM rename_components
USING
i_source_compuid TYPE rsz_uid
i_target_infocube TYPE rsd_infocube
i_t_eltdir TYPE rzx0_t_eltdir
i_t_uid_server TYPE rzx0_t_uid_server_x
CHANGING
c_target_compid TYPE rszcompid
c_t_compdir TYPE rzx0_t_compdir
c_t_compic TYPE rzx0_t_compic
c_subrc LIKE sy-subrc
c_t_msg TYPE rs_t_msg.
CONSTANTS:
c_number(10) TYPE c VALUE '0123456789',
c_customer_prefix(1) TYPE c VALUE 'Z'.
DATA:
l_s_uid_server TYPE rzx0_s_uid_server_x,
l_t_compdir_rename TYPE rzx0_t_compdir,
l_s_eltdir TYPE rzx0_s_eltdir,
l_subrc LIKE sy-subrc,
l_comp_not_found TYPE rs_bool,
* l_suffix(2) TYPE c,
l_sys_type TYPE rs_systp,
l_s_compic TYPE rzx0_s_compic,
l_s_compdir TYPE rzx0_s_compdir,
* l_Len type i,
* l_next_suffix type i,
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 27
l_retry TYPE rs_bool,
l_pos TYPE i,
l_maxlen TYPE i,
l_trunk TYPE rszcompdir-compid.
* determine technicallength of compid.
DESCRIBE FIELD l_s_compdir-compid LENGTH l_maxlen IN CHARACTER MODE.
* get system type
CALL FUNCTION 'RRSV_SYSTYPE_GET'
IMPORTING
sys_type = l_sys_type.
* backup component table
l_t_compdir_rename = c_t_compdir.
* remove variables
LOOP AT i_t_eltdir
INTO l_s_eltdir
WHERE reusable = rs_c_true
AND deftp = rzd1_c_deftp-variable.
DELETE l_t_compdir_rename WHERE compuid = l_s_eltdir-eltuid.
ENDLOOP.
* rename reuseable components in case of mass copy
LOOP AT i_t_uid_server
INTO l_s_uid_server.
* update tech name
l_s_compdir-compid = l_s_uid_server-compid.
MODIFY c_t_compdir FROM l_s_compdir TRANSPORTING compid
WHERE compuid = l_s_uid_server-virtual.
* update infocube
MOVE-CORRESPONDING l_s_compdir TO l_s_compic.
l_s_compic-infocube = i_target_infocube.
MODIFY c_t_compic FROM l_s_compic TRANSPORTING infocube
WHERE compuid = l_s_uid_server-virtual.
DELETE l_t_compdir_rename WHERE compuid = l_s_uid_server-virtual.
ENDLOOP.
* rename the rest
LOOP AT l_t_compdir_rename
INTO l_s_compdir.
IF l_s_compdir-compuid = i_source_compuid AND
NOT c_target_compid IS INITIAL.
l_s_compdir-compid = c_target_compid.
ELSE.
l_pos = sy-tabix.
* extract a suffix if present
DATA l_index TYPE i.
PERFORM extract_suffix
USING l_s_compdir-compid
CHANGING
l_trunk
l_index.
l_retry = rs_c_true.
* loop is broken by exit (if found).
WHILE l_retry = rs_c_true.
* l_retry = rs_c_false.
* next attempt for unique name.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 28
PERFORM generate_next_unique_name
USING l_maxlen
CHANGING l_index
l_trunk
l_s_compdir-compid.
* Enforce proper namespace
IF l_sys_type = rs_sys_cus AND
l_s_compdir-compid(1) CO c_number.
l_s_compdir-compid(1) = c_customer_prefix.
ENDIF.
* it happened that % signs were stored in tch names of CKFs
REPLACE '%' WITH '_' INTO l_s_compdir-compid.
REPLACE '-' WITH '_' INTO l_s_compdir-compid.
CALL FUNCTION 'RSZ_X_COMPONENT_EXIST'
EXPORTING
i_compid = l_s_compdir-compid
* I_OBJVERS = 'A'
* I_COMPUID =
i_check_name = rs_c_true
IMPORTING
e_subrc = l_subrc
e_component_not_found = l_comp_not_found.
IF l_comp_not_found = rs_c_false.
* continue
ELSEIF l_subrc 0 AND l_subrc 1 AND l_subrc 6.
"l_subrc = 0: Component not found
"l_subrc = 1: Component not found
"l_subrc = 6: Reserved name create sap
* get and convert messages from msg server
PERFORM get_messages
CHANGING
c_t_msg.
* if we get here, we are in trouble, no need to check for existence.
c_subrc = l_subrc.
EXIT.
ELSE.
* verify that compid is unique among the already generated entries
* (in c_t_compdir[1...(l_pos-1)] [but we test all] ).
READ TABLE c_t_compdir WITH KEY compid = l_s_compdir-
compid TRANSPORTING NO FIELDS.
IF ( sy-subrc 0 ).
EXIT. " the compid is unique!
ENDIF.
ENDIF.
* ENDDO.
ENDWHILE.
IF l_s_compdir-compuid = i_source_compuid.
c_target_compid = l_s_compdir-compid.
ENDIF.
ENDIF.
* update tech name
MODIFY c_t_compdir FROM l_s_compdir TRANSPORTING compid
WHERE compuid = l_s_compdir-compuid.
* update infocube
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 29
MOVE-CORRESPONDING l_s_compdir TO l_s_compic.
l_s_compic-infocube = i_target_infocube.
MODIFY c_t_compic FROM l_s_compic TRANSPORTING infocube
WHERE compuid = l_s_compdir-compuid.
ENDLOOP.
ENDFORM. " rename_components
*&--------------------------------------------------------------------*
*& Form extract_suffix
*&--------------------------------------------------------------------*
* J19K003184
* given an string ( c-field ).
* XXXXXXX_DDDD where D are digits, this
* form returns c_trunk = XXXXXXX (wo underscore)
* and c_index = DDDD as integer
* for DDDD-Sequence < 6 digits.
* otherwise C_trunk = input and
* c_index = 0.
*---------------------------------------------------------------------*
* -->I_NAME text
* -->C_TRUNK text
* -->C_INDEX text
*---------------------------------------------------------------------*
FORM extract_suffix
USING
i_name LIKE rszcompdir-compid
CHANGING c_trunk TYPE rszcompdir-compid
c_index TYPE i.
DATA:
c_number(10) TYPE c VALUE '0123456789',
l_len TYPE i,
l_fulllen TYPE i,
l_nonlynum(8) TYPE n,
l_hasnumber TYPE c VALUE ' '.
c_trunk = i_name.
c_index = 0.
IF i_name CS '_'.
* in this case the target may already contain a number
l_fulllen = STRLEN( i_name ) .
l_len = l_fulllen - 1.
IF ( l_len > 1 ).
* we start at the end and try to get the old number
WHILE i_name+l_len(1) CO c_number.
l_len = l_len - 1.
l_hasnumber = 'X'.
ENDWHILE.
DATA l_numsuffixlen TYPE i.
l_numsuffixlen = l_fulllen - l_len.
IF ( l_hasnumber = 'X' AND l_len > 1 AND l_numsuffixlen < 7 ).
" do not treat numeric sequences with more than 6 characters
" as integer
IF ( i_name+l_len(1) = '_' ).
" as good as it gets:
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 30
c_trunk = i_name(l_len). " string prior _
l_len = l_len + 1.
l_nonlynum = i_name+l_len(*). " the DDD sequence.
c_index = l_nonlynum.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "extract_suffix
*&--------------------------------------------------------------------*
*& Form generate_next_unique_name
*&--------------------------------------------------------------------*
* J19K003184
*---------------------------------------------------------------------*
* -->I_MAXLEN text
* -->C_INDEX text
* -->C_TRUNK text
* -->C_NEXTNAME text
* strategy: append _1 _2,..... _999999999
* (if strlen is exceeded, we start to gobble up previous chars:
* Example for string len c(5)
* AA_1 <
* AA_9 <
* AA_10<
*...
* AA_91
* AA_92
* AA_99
* A_100
* A_101
*---------------------------------------------------------------------*
FORM generate_next_unique_name
USING i_maxlen TYPE i " max length of char
CHANGING c_index TYPE i
c_trunk TYPE rszcompdir-compid
c_nextname TYPE rszcompdir-compid.
* optimization potential (carry t_pos along ).
* todo: extract l_index if wanted from suffix and reduce
DATA l_tpos TYPE i. " target position
DATA l_nlen TYPE i. " length of numerical string.
DATA l_cbuf(8) TYPE c.
DATA l_ctrunk TYPE rszcompdir-compid.
DATA l_trunklen TYPE i.
l_trunklen = STRLEN( c_trunk ).
l_tpos = l_trunklen + 1. " 1 for '_'
c_index = c_index + 1.
"this is brute force, but people may enter XX9999999999_999999 for fun.
IF c_index > 999999 .
c_index = 1.
ENDIF.
WRITE c_index TO l_cbuf LEFT-JUSTIFIED NO-GROUPING.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 31
l_nlen = STRLEN( l_cbuf ).
l_tpos = STRLEN( c_trunk ).
" if _number does not fit into string,
" we shorten c_trunk.
DATA l_fit TYPE i.
l_fit = i_maxlen - l_nlen - 1.
IF ( l_fit < l_tpos ).
c_trunk = c_trunk(l_fit).
l_tpos = l_fit.
ENDIF.
CONCATENATE c_trunk '_' l_cbuf INTO c_nextname.
ENDFORM. "generate_next_unique_name
*&---------------------------------------------------------------------*
*& Form get_messages
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_messages
CHANGING
c_t_msg TYPE rs_t_msg.
DATA:
l_s_msg TYPE rs_s_msg,
l_t_rrms_mesg TYPE rrms_t_mesg,
l_s_rrms_mesg TYPE rrms_s_mesg.
CALL FUNCTION 'RRMS_MESSAGES_OUTPUT'
* EXPORTING
* I_HANDLE =
* I_NO_LAST_CALLS =
IMPORTING
e_t_mesg = l_t_rrms_mesg.
* E_MAX_SEVERITY =
* EXCEPTIONS
* INVALID_HANDLE = 1
* OTHERS = 2
LOOP AT l_t_rrms_mesg
INTO l_s_rrms_mesg.
l_s_msg-msgty = l_s_rrms_mesg-msgty.
l_s_msg-msgid = l_s_rrms_mesg-arbgb.
l_s_msg-msgno = l_s_rrms_mesg-txtnr.
l_s_msg-msgv1 = l_s_rrms_mesg-msgv1.
l_s_msg-msgv2 = l_s_rrms_mesg-msgv2.
l_s_msg-msgv3 = l_s_rrms_mesg-msgv3.
l_s_msg-msgv4 = l_s_rrms_mesg-msgv4.
APPEND l_s_msg TO c_t_msg.
ENDLOOP.
ENDFORM. " get_messages
*&---------------------------------------------------------------------*
*& Form set_selection_screen_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 32
FORM set_selection_screen_status.
DATA:
l_t_exclude TYPE STANDARD TABLE OF rsexfcode.
* this call sets the custom status 'COPY' to the selection screen
* we needed to have a docu button
CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
EXPORTING
p_status = 'COPY'
* P_PROGRAM = ' '
TABLES
p_exclude = l_t_exclude.
ENDFORM. " set_selection_screen_status
*&---------------------------------------------------------------------*
*& Form process_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM process_user_command.
CASE sscrfields-ucomm.
WHEN 'CRET'.
* native selection screen command
WHEN 'CCAN'.
* native selection screen command
WHEN 'INFO'.
* show documentation
CALL FUNCTION 'POPUP_DISPLAY_TEXT'
EXPORTING
* LANGUAGE = SY-LANGU
popup_title = text-003
* START_COLUMN = 10
* START_ROW = 3
text_object = 'RS_COPY_QUERIES'
* HELP_MODAL = 'X'
* IMPORTING
* CANCELLED =
EXCEPTIONS
text_not_found = 0
OTHERS = 0.
* INFO is a user command "on exit" in order to skip field checks
* however we need to go back to the screen therefore...
SET SCREEN sy-dynnr.
LEAVE SCREEN.
ENDCASE.
ENDFORM. " process_user_command
*&---------------------------------------------------------------------*
*& Form launch_cube_f4
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 33
FORM launch_cube_f4
CHANGING
c_infocube TYPE rsd_infocube.
TYPES: BEGIN OF lt_ip,
infoprov TYPE rsinfoprov,
icon TYPE icon_d,
txtlg TYPE rs_txtlg,
END OF lt_ip.
DATA:
l_t_dta TYPE rsd_t_dta,
l_icon TYPE rsd_icon_stat,
l_icon_id TYPE i.
DATA: l_s_ip TYPE lt_ip.
DATA: l_t_ip TYPE lt_ip OCCURS 0.
DATA: l_s_retval LIKE ddshretval.
DATA: l_t_retval LIKE ddshretval OCCURS 0.
FIELD-SYMBOLS:
TYPE rsd_s_dta.
CALL METHOD cl_rsd_dta=>get_all
EXPORTING
i_objvers = rs_c_objvers-active
IMPORTING
e_t_dta = l_t_dta.
LOOP AT l_t_dta
ASSIGNING .
* Determine Icons
CALL METHOD cl_rsd_dta=>get_icon
EXPORTING
i_tlogo = -tlogo
IMPORTING
e_icon = l_icon.
CALL FUNCTION 'RSAH_ICON_GET_INDEX'
EXPORTING
i_icon_name = l_icon
IMPORTING
e_icon_index = l_icon_id.
* Authorization check for DISPLAY at least
* CREATE authorization for the target IP is checked later
CALL FUNCTION 'RSSB_AUTHORITY_COMP_CHECK'
EXPORTING
i_infoarea = -infoarea
i_infocube = -infoprov
i_comptype = space
i_compid = space
i_owner = space
i_actvt = '03'
EXCEPTIONS
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 34
user_not_authorized = 1
OTHERS = 2.
IF sy-subrc 0.
* If no DISPLAY check for CHANGE
CALL FUNCTION 'RSSB_AUTHORITY_COMP_CHECK'
EXPORTING
i_infoarea = -infoarea
i_infocube = -infoprov
i_comptype = space
i_compid = space
i_owner = space
i_actvt = '02'
EXCEPTIONS
user_not_authorized = 1
OTHERS = 2.
IF sy-subrc 0.
* If no DISPLAY or CHANGE authorization --> delete from list
DELETE TABLE l_t_dta FROM .
CONTINUE.
ENDIF.
ENDIF.
l_s_ip-infoprov = -infoprov.
l_s_ip-txtlg = -txtlg.
l_s_ip-icon = l_icon.
APPEND l_s_ip TO l_t_ip.
CLEAR l_s_ip.
ENDLOOP.
SORT l_t_ip BY infoprov.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'INFOPROV'
window_title = text-001
value = '*'
value_org = 'S'
* multiple_choice = ' '
display = rs_c_false
TABLES
value_tab = l_t_ip
return_tab = l_t_retval
EXCEPTIONS
OTHERS = 3.
READ TABLE l_t_retval INTO l_s_retval INDEX 1.
IF sy-subrc EQ 0.
c_infocube = l_s_retval-fieldval.
ENDIF.
*** Old F4 part
* DATA:
* l_t_cubetype TYPE rsd_t_cubetype,
* l_s_cubetype TYPE rsd_s_cubetype.
*
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 35
* l_s_cubetype-cubetype = rsd_c_cubetype-basic_ic.
* APPEND l_s_cubetype TO l_t_cubetype.
* l_s_cubetype-cubetype = rsd_c_cubetype-multi_ic.
* APPEND l_s_cubetype TO l_t_cubetype.
* l_s_cubetype-cubetype = rsd_c_cubetype-ods_ic.
* APPEND l_s_cubetype TO l_t_cubetype.
* l_s_cubetype-cubetype = rsd_c_cubetype-remote_ic.
* APPEND l_s_cubetype TO l_t_cubetype.
*
* CALL FUNCTION 'RSD_CUBE_F4'
* EXPORTING
* i_t_cubetype = l_t_cubetype
* IMPORTING
* e_cubetype = g_target_cubetype
* CHANGING
* c_infocube = c_infocube.
ENDFORM. " launch_cube_f4
*&---------------------------------------------------------------------*
*& Form rename_suggest
*&---------------------------------------------------------------------*
FORM rename_suggest
CHANGING
c_t_comp_rename TYPE rzd1_t_comp_rename
c_subrc LIKE sy-subrc
c_t_msg TYPE rs_t_msg.
CONSTANTS:
c_number(10) TYPE c VALUE '0123456789',
c_customer_prefix(1) TYPE c VALUE 'Z'.
FIELD-SYMBOLS:
TYPE rzd1_s_comp_rename.
DATA:
l_sys_type TYPE rs_systp,
l_maxlen TYPE i,
l_index TYPE i,
l_trunk TYPE rszcompdir-compid,
l_pos TYPE i,
l_subrc TYPE sy-subrc,
l_comp_not_found TYPE rs_bool,
l_compid_new TYPE rszcompdir-compid.
* Determine technical length of compid.
DESCRIBE FIELD -compid_old LENGTH l_maxlen IN CHARACTER MODE.
* Get system type
CALL FUNCTION 'RRSV_SYSTYPE_GET'
IMPORTING
sys_type = l_sys_type.
* Find new name for suggustion
LOOP AT c_t_comp_rename
ASSIGNING .
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 36
l_compid_new = -compid_old.
l_pos = sy-tabix.
* Extract a suffix if present
PERFORM extract_suffix
USING l_compid_new
CHANGING
l_trunk
l_index.
* Loop is broken by exit (if found).
WHILE 1 = 1.
* Next attempt for unique name.
PERFORM generate_next_unique_name
USING l_maxlen
CHANGING l_index
l_trunk
l_compid_new.
* Enforce proper namespace
IF l_sys_type = rs_sys_cus AND
l_compid_new(1) CO c_number.
l_compid_new(1) = c_customer_prefix.
ENDIF.
* It happened that % signs were stored in tch names of CKFs
* MP30B30 Some queries contain more than 1 sign...
* Here are MORE cases to add.....
REPLACE ALL OCCURRENCES OF '%' IN l_compid_new WITH '_'.
REPLACE ALL OCCURRENCES OF '-' IN l_compid_new WITH '_'.
CALL FUNCTION 'RSZ_X_COMPONENT_EXIST'
EXPORTING
i_compid = l_compid_new
i_check_name = rs_c_true
IMPORTING
e_subrc = l_subrc
e_component_not_found = l_comp_not_found.
IF l_comp_not_found = rs_c_false.
* continue
ELSEIF l_subrc 0 AND l_subrc 1 AND l_subrc 6.
"l_subrc = 0: Component not found
"l_subrc = 1: Component not found
"l_subrc = 6: Reserved name create sap
* Get and convert messages from msg server
PERFORM get_messages
CHANGING
c_t_msg.
* If we get here, we are in trouble, no need to check for existence.
c_subrc = l_subrc.
EXIT.
ELSE.
* Verify that compid is unique among the already generated entries
* (in c_t_compdir[1...(l_pos-1)] [but we test all] ).
READ TABLE c_t_comp_rename WITH KEY compid_new = l_compid_new TRANSPORTING NO
FIELDS.
IF ( sy-subrc 0 ).
EXIT. " the compid is unique!
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 37
ENDIF.
ENDIF.
ENDWHILE.
-compid_new = l_compid_new.
ENDLOOP.
ENDFORM. " rename_suggest
*&--------------------------------------------------------------------*
*& Form RENAME_BY_USER
*&--------------------------------------------------------------------*
*& - new renaming procedure
*&---------------------------------------------------------------------*
FORM rename_by_user
USING
i_source_infoprovider TYPE rsd_infocube
i_target_infoprovider TYPE rsd_infocube
i_t_eltuid TYPE rsz_t_uid
i_deftp TYPE rzd1_deftp
CHANGING
e_t_comp_rename TYPE rzd1_t_comp_rename
e_th_uid_server_all TYPE rzx0_th_uid_server_x
c_subrc TYPE sy-subrc
c_t_msg TYPE rs_t_msg.
DATA:
l_ts_eltxref TYPE rzd1_ts_eltxref,
l_th_ref_list TYPE rzd1_th_ref_list,
l_s_ref_list TYPE rzd1_s_ref_list,
l_th_eltxref TYPE rzd1_th_eltxref,
l_th_cmp_join TYPE rzd1_th_cmp_join,
l_s_cmp_join TYPE rzd1_s_cmp_join,
l_s_comp_rename TYPE rzd1_s_comp_rename,
l_s_uid_server TYPE rzx0_s_uid_server_x,
l_t_eltuid TYPE rsz_t_uid,
l_deftp TYPE rzd1_deftp. "1254898
FIELD-SYMBOLS:
TYPE rzd1_s_comp_rename.
* we resolve the given UID list
CALL FUNCTION 'RSZ_DB_FULL_XREF_GET'
EXPORTING
i_objvers = rs_c_objvers-active
i_by_infocube = i_source_infoprovider
IMPORTING
e_ts_eltxref = l_ts_eltxref.
* do the resolving
PERFORM rsz_resolve_eltxref(sapfrsz1)
USING
i_t_eltuid
l_ts_eltxref
CHANGING
l_th_eltxref
l_th_ref_list.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 38
* Select all components
SELECT * FROM v_cmp_join
INTO TABLE l_th_cmp_join
FOR ALL ENTRIES IN l_th_ref_list
WHERE compuid = l_th_ref_list-uid
AND objvers = rs_c_objvers-active.
* We need here to return the DEFTP = SEL for RKF which
* was changed for AUTHORITY check
IF i_deftp = rzd1_c_deftp-restkeyfig. "1254898
l_deftp = rzd1_c_deftp-selection. "1254898
ENDIF. "1254898
* Start filling table for renaming
LOOP AT l_th_cmp_join
INTO l_s_cmp_join.
IF i_source_infoprovider = i_target_infoprovider AND
* l_s_cmp_join-deftp rzd1_c_deftp-report.
l_s_cmp_join-deftp l_deftp. "1254898
* in this case we copy only queries, get rid of all components
* because this is not possible, we enter all uid's of all components
* and their dependent elements as already copied with same uid
l_s_uid_server-virtual = l_s_cmp_join-compuid.
l_s_uid_server-actual = l_s_cmp_join-compuid.
l_s_uid_server-compid = l_s_cmp_join-compid.
READ TABLE e_th_uid_server_all
WITH TABLE KEY virtual = l_s_uid_server-virtual
TRANSPORTING NO FIELDS.
IF sy-subrc 0.
INSERT l_s_uid_server INTO TABLE e_th_uid_server_all.
ENDIF.
* find also all dependents
CLEAR: l_th_eltxref, l_th_ref_list, l_t_eltuid.
APPEND l_s_cmp_join-compuid TO l_t_eltuid.
* l_s_comp_rename-compuid = l_s_cmp_join-compuid.
* l_s_comp_rename-compid_old = l_s_cmp_join-compid.
* l_s_comp_rename-deftp = l_s_cmp_join-deftp.
* l_s_comp_rename-infocube = i_target_infoprovider.
* APPEND l_s_comp_rename TO e_t_comp_rename.
PERFORM rsz_resolve_eltxref(sapfrsz1)
USING
l_t_eltuid
l_ts_eltxref
CHANGING
l_th_eltxref
l_th_ref_list.
LOOP AT l_th_ref_list
INTO l_s_ref_list.
CLEAR: l_s_uid_server.
l_s_uid_server-virtual = l_s_ref_list-uid.
l_s_uid_server-actual = l_s_ref_list-uid.
READ TABLE e_th_uid_server_all
WITH TABLE KEY virtual = l_s_uid_server-virtual
TRANSPORTING NO FIELDS.
IF sy-subrc 0.
INSERT l_s_uid_server INTO TABLE e_th_uid_server_all.
ENDIF.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 39
ENDLOOP.
ELSE.
l_s_comp_rename-compuid = l_s_cmp_join-compuid.
l_s_comp_rename-compid_old = l_s_cmp_join-compid.
l_s_comp_rename-deftp = l_s_cmp_join-deftp.
l_s_comp_rename-infocube = i_target_infoprovider.
APPEND l_s_comp_rename TO e_t_comp_rename.
ENDIF.
ENDLOOP.
* suggest new names for components
PERFORM rename_suggest
CHANGING
e_t_comp_rename
c_subrc
c_t_msg.
* Call dialog for renaming
CALL FUNCTION 'RSZ_P_DB_COMP_RENAME_AS_POPUP'
CHANGING
c_t_comp_rename = e_t_comp_rename
EXCEPTIONS
cancelled = 1.
c_subrc = sy-subrc. IF c_subrc > 0.
* MESSAGE a021.
EXIT.
ENDIF.
ENDFORM. "RENAME_BY_USER
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 40
Related Content
For more information, visit the Business Intelligence Home Page
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 41
Disclaimer and Liability Notice
This document may discuss sample coding or other information that does not include SAP official interfaces and therefore is not supported by SAP. Changes made based on this information are not supported and can be overwritten during an upgrade.
SAP will not be held liable for any damages caused by using or misusing the information, code or methods suggested in this document, and anyone using these methods does so at his/her own risk.
SAP offers no guarantees and assumes no responsibility or liability of any type with respect to the content of this technical article or code sample, including any liability resulting from incompatibility between the content within this document and the materials and services offered by SAP. You agree that you will not hold, or seek to hold, SAP responsible or liable with respect to the content of this document.
-
Copying Queries Between InfoSets
SAP COMMUNITY NETWORK SDN - sdn.sap.com | BPX - bpx.sap.com | BOC - boc.sap.com | UAC - uac.sap.com
2011 SAP AG 42