Function calls for adding a standard project sub-structure in SAP Project System
Introduction
Last week I have created a blog post with some information on which function modules should be called in order to create a completely new operative project structure in SAP project system based on a standard project structure or on another operative structure (Function calls for standard project structure copy in SAP Project System).
It turns out that SAP offers another function module in the same function group of function module “CJWB_PROJECT_COPY” that allows the insertion of an entire substructure below and already existent operative WBS element. This function module is “CJWB_SUBTREE_COPY”.
The function calls necessary for successfully accomplish the standard project sub-structure insertion are almost the same as the ones necessary to successfully accomplish the standard project copy. The main difference is that in the first case it is necessary to read the operative project to which the new sub-structure should be added. This is accomplished with function module “CJDW_SELECT_BASIC_DATA”.
Code Samples
Just as in last week’s blog post below are two sample codes for adding a standard project sub-structure. The first is a simple code for cases in which network headers are not necessary while the latter is a more complex code for cases in which network headers are necessary. The second code sample also contains some lines for manipulating WBS element data (project responsible and applicant number) for demonstration purposes.
The sample are based on the calls performed in standard transaction CJ20N (include LCNPB_MF38).
Sample 1: Simple project sub-structure without network headers
CALL FUNCTION 'CJDW_SELECT_BASIC_DATA'
EXPORTING
project = <-- operative project definition to which the standard project sub-structure will be added
EXCEPTIONS
entry_element_not_found = 1
missing_parameter = 2
project_not_found = 3
project_inact = 4
error_message = 98
OTHERS = 99.
CALL FUNCTION 'CJWB_PROJECT_INIT_EXTERN_CALL'
EXPORTING
i_method = 'INITIALIZE'
i_aktyp = 'V'
i_entry_pronr = <-- operative WBS element below which the standard project sub-structure should be added
EXCEPTIONS
not_found = 1
OTHERS = 2.
CALL FUNCTION 'CJWB_SUBTREE_COPY'
EXPORTING
pspnr_source = <-- top standard WBS element of the standard project sub-structure to be added
pspnr_target = <-- operative WBS element below which the standard project sub-structure should be added
direction = '1'
type_of_element = 'S'
EXCEPTIONS
wrong_call = 1
OTHERS = 2.
CALL FUNCTION 'CJDW_GET_NEW_NUMBERS'.
CALL FUNCTION 'CJDT_GET_NEW_NUMBERS'.
Sample 2: Project sub-structure with network headers and some data manipulation
REPORT zaddsubstr.
DATA: lt_cjdi TYPE TABLE OF rcj_markl.
DATA: lt_rcj_kopnr TYPE TABLE OF rcj_kopnr.
DATA: ls_cjdi LIKE LINE OF lt_cjdi.
DATA: ls_proj LIKE proj.
DATA: ls_prps LIKE prps.
DATA: ls_tc10 LIKE tc10.
DATA: ls_tcn41 LIKE tcn41.
DATA: l_pspid TYPE ps_pspid.
DATA: l_psphi TYPE ps_psphi.
DATA: l_pspnr_top TYPE prps-pspnr.
DATA: l_old_tcode LIKE sy-tcode.
DATA: l_ntw_found TYPE c LENGTH 1.
CONSTANTS: c_tcode TYPE tcode VALUE 'CJ20N'.
CONSTANTS: c_vorgabe TYPE caufvd-plart VALUE '1'.
CONSTANTS: c_direction TYPE c LENGTH 1 VALUE '1'.
CONSTANTS: c_meth_init TYPE fcode VALUE 'INITIALIZE'.
CONSTANTS: c_type_elem TYPE selkz VALUE 'S'.
CONSTANTS: c_aplid TYPE c LENGTH 1 VALUE 'G'.
CONSTANTS: c_change TYPE c LENGTH 1 VALUE 'V'.
CONSTANTS: c_asterisk TYPE c LENGTH 1 VALUE '*'.
CONSTANTS: c_plus TYPE c LENGTH 1 VALUE '+'.
CONSTANTS: c_meth_tmex TYPE fcode VALUE 'TMEX'.
CONSTANTS: c_vernr TYPE ps_vernr VALUE 99.
CONSTANTS: c_astnr TYPE ps_astnr VALUE 99.
* Source and Target Project Definitions
* Here the source is the standard WBS element to be added to the existing structure and the target is the operative WBS element below which a new sub structure should be added
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME.
PARAMETERS: p_spspnr TYPE prpss-pspnr OBLIGATORY.
PARAMETERS: p_tpspnr TYPE prps-pspnr OBLIGATORY.
SELECTION-SCREEN END OF BLOCK a.
* Select data from target WBS Element
SELECT SINGLE psphi
INTO l_psphi
FROM prps
WHERE pspnr = p_tpspnr.
SELECT SINGLE pspid
FROM proj
INTO l_pspid
WHERE pspnr = l_psphi.
CALL FUNCTION 'CJDW_SELECT_BASIC_DATA'
EXPORTING
enqueue = abap_true
project = l_pspid
EXCEPTIONS
entry_element_not_found = 1
missing_parameter = 2
project_not_found = 3
project_inact = 4
error_message = 98
OTHERS = 99.
CALL FUNCTION 'CJWB_PROJECT_INIT_EXTERN_CALL'
EXPORTING
i_method = c_meth_init
i_aktyp = c_change
i_entry_pronr = p_tpspnr
EXCEPTIONS
not_found = 1
OTHERS = 2.
CALL FUNCTION 'CJWB_SUBTREE_COPY'
EXPORTING
pspnr_source = p_spspnr
pspnr_target = p_tpspnr
direction = c_direction
type_of_element = c_type_elem
IMPORTING
ex_first_element = l_pspnr_top
TABLES
newnumbers = lt_rcj_kopnr
dialtab_exp = lt_cjdi
EXCEPTIONS
wrong_call = 1
OTHERS = 2.
* Only for demonstration purposes in lines from 83 to 109 the person responsible and the applicant number are changed in each new WBS element of the structure.
LOOP AT lt_cjdi INTO ls_cjdi.
CLEAR ls_prps.
CALL FUNCTION 'CJDW_PRPS_GET'
EXPORTING
index = ls_cjdi-index
IMPORTING
e_prps = ls_prps
EXCEPTIONS
cancel = 1
not_found = 2
OTHERS = 3.
IF sy-subrc = 0.
IF ls_prps-objnr(2) = 'TM'.
ls_prps-vernr = c_vernr.
ls_prps-astnr = c_astnr.
CALL FUNCTION 'CJDW_PRPS_MODIFY'
EXPORTING
beakz = c_change
index = ls_cjdi-index
i_prps = ls_prps
EXCEPTIONS
not_found = 1
posnr = 2
OTHERS = 3.
ENDIF.
ENDIF.
ENDLOOP.
* Prepare call of 'CJDT_CREATE_ACT_FOR_NEW_PRJ'
CALL FUNCTION 'CJDW_GLOBAL_VALUES'
IMPORTING
v_proj = ls_proj.
CALL FUNCTION 'CO_TA_TCN41_READ'
EXPORTING
plnaw = 'N'
profidnetz = ls_proj-vprof
IMPORTING
tcn41_exp = ls_tcn41
EXCEPTIONS
not_found = 01.
* The two lines of code below might also look strange at first, but they are also necessary because in includes LCJTRFJ8 and LCJTRFI2
* somewhere inside function 'CJTR_CALL_FROM_EXTERN' the system selects some default values from some tables based on the transaction code.
l_old_tcode = sy-tcode.
sy-tcode = c_tcode.
CALL FUNCTION 'CJTR_CALL_FROM_EXTERN'
EXPORTING
aplid = c_aplid
fcode_imp = space
proj_imp = ls_proj
trtyp_imp = c_change
top_imp = 1
TABLES
cjdi_imp = lt_cjdi
EXCEPTIONS
no_existing_psp = 1
no_pprofil = 2
OTHERS = 3.
SELECT SINGLE *
INTO ls_tc10
FROM tc10
WHERE tcode = c_tcode.
* Again a strange but necessary line of code. In include LCOKOF1S somewhere inside function 'CJDT_CREATE_ACT_FOR_NEW_PRJ' the system
* selects the default value for the order category from table t490 based on the transaction code. It would also be a possibility to
* create a new entry in the aforementioned table with the transaction code in context (i.e. tcode of the current program)
sy-tcode = c_tcode.
* Function for adding network objects to the previously created project structure
CALL FUNCTION 'CJDT_CREATE_ACT_FOR_NEW_PRJ'
EXPORTING
tc10wa = ls_tc10
tcn41_imp = ls_tcn41
proj_imp = ls_proj
sched_param = space
flg_new_prj = space
EXCEPTIONS
no_entries = 1
OTHERS = 2.
IF sy-subrc = 0.
l_ntw_found = abap_true.
CALL FUNCTION 'CO_IT_SET_FLG_ITAB_NEW'.
PERFORM dtab_create_complete(saplcjtr).
ENDIF.
CALL FUNCTION 'CNEV_05_COPY_EVOP'
EXPORTING
i_kokrs = ls_proj-vkokr.
CALL FUNCTION 'CO_BT_PROJKN_DET'
EXPORTING
projn_pa = space
projn_tv = space.
CALL FUNCTION 'NW_EX_SET_NETSTUFE_MAX_PROJECT'
EXPORTING
i_profidproj = ls_proj-profl
EXCEPTIONS
project_profile_does_not_exist = 1
network_profile_does_not_exist = 2
OTHERS = 3.
* Call network scheduling if network exists
IF l_ntw_found = abap_true.
CALL FUNCTION 'CJWB_PROJECT_INIT_EXTERN_CALL'
EXPORTING
i_method = c_meth_tmex
i_object = c_plus
i_view_object = c_asterisk
i_sub_view = space
i_aktyp = c_change
i_pronr = l_pspnr_top
EXCEPTIONS
not_found = 1
OTHERS = 2.
ENDIF.
* Check if any required field is still empty. This function module is optional could result in disruptive pop-ups
CALL FUNCTION 'CJWB_CHECK_BEFORE_COMMIT'
EXCEPTIONS
cancel = 1.
* Prepare commit of WBS element dates table (PRTE)
CALL FUNCTION 'CJTR_POST_DATES'
EXCEPTIONS
sched_wrong = 1
check_top_down = 2
OTHERS = 3.
* Prepare commit of network data if network exists
IF l_ntw_found = abap_true.
CALL FUNCTION 'CO_BT_PROJKN_DET'
EXPORTING
projn_pa = c_vorgabe
projn_tv = space.
CALL FUNCTION 'CO_ZV_ORDER_POST'
EXPORTING
commit_flag = abap_false
ext_flg = abap_true
trans_typ = c_change
no_dialog = abap_true
EXCEPTIONS
update_reject = 1
budget_reject = 2
OTHERS = 3.
ENDIF.
* Substitute internal numbers
CALL FUNCTION 'CJDW_GET_NEW_NUMBERS'.
CALL FUNCTION 'CJDT_GET_NEW_NUMBERS'.
COMMIT WORK.
sy-tcode = l_old_tcode.
END-OF-SELECTION.