Technical Articles
Custom Data from FI-CA to RAR (Part II – Development Procedures)
Introduction
The purpose of this two part blog is to describe a solution that allows custom values to be populated on the provider contract and then transferred to SAP Revenue Accounting. The custom values can be populated using both the provider contract create transaction and the standard creation BAPI. The standard provider contract transactions are enhanced using the Business Data Toolset (BDT). Using event 8205, the custom values are transferred to Revenue Accounting as both main and condition items.
Part I provides an overview of the solution’s components.
Part II describes the technical steps required to build the solution.
5 Populating the Custom Values with Functions
5.1 Create the Custom Data Element for “Total Cost to Fulfill”
- Go to transaction SE11
- Create data element ZCTF_TOTAL
- Enter the Short Description: “Total Cost to Fulfill”
- Use Domain: WRTV7
- Enter the following information for Field Label
- Save and activate the data element.
5.2 Create the Custom Data Element for “Total Cost to Obtain”
- Go to transaction SE11
- Create data element ZCTO_TOTAL
- Enter the Short Description: “Total Cost to Obtain”
- Use Domain: WRTV7
- Enter the following information for Field Label
- Save and activate the data element.
5.3 Add the Custom Fields to a New Structure
-
- Go to transaction SE11
- Create a new structure name “ZPRC_ITEM_CUSTOM”
- Enter “Provider Contract: Custom fields added to item” as the description
- Add the two fields to the structure
- Set the “Reference table” and “Reference field” for the two fields
- Save and activate the structure.
5.4 Add the New Structure to the Provider Contract Table
This allows the custom fields to be saved with a provider contract
- Go to transaction SE11
- Enter table “DFKK_VT_I” and click display
- Scroll to the bottom of the table on double-click on the customizing include named “CI_DFKK_VT_I”
- Answer “Yes” when the system asks if you want to create the include
- Give the include a description, for example, “Append Structure for DFKK_VT_I (Items of Provider Contract)”
- Put the cursor in the first line of the table and the using the top menu select Edit -> Include -> Insert
- Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue
- Save and activate the customizing include.
5.5 Append the New Structure to the BAPI Extension Structure
This allows the custom fields to be passed in the EXTENSIONIN Table of the standard BAPI
- Go to transaction SE11
- Enter structure “BAPI_TE_VT_I” and click display
- From the top menu select Goto-> Append Structure
- Enter a name for the new append structure, for example “ZBAPI_TE_VT_I”
- Enter a description for the new append structure, for example “Append Structure for BAPI_TE_VT_I”
- Put the cursor in the first line of the append structure and the using the top menu select Edit -> Include -> Insert
- Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue
- Save and activate the append structure.
5.6 Add the New Fields to the Provider Contract Data Structure
This allows the custom fields to flow from the standard BAPI into the database. The fields cannot be added an include structure, because the fields must have a character data type.
- Go to transaction SE11
- Enter structure “FKK_VT_I_DI” and click display
- Scroll to the bottom of the table on double-click on the customizing include named “CI_FKK_VT_I_DI”
- Answer “Yes” when the system asks if you want to create the include
- Give the include a description, for example, “Append Structure for CI_FKK_VT_I_DI”
- Add the two fields using the “Built-in Type” button
- Give the fields the following attributes
- Save and activate the structure.
5.7 Create a New Structure for the Custom Function
This new structure will be used in the interface of the custom function, which will be created in the next few steps. This structure allows the custom fields to be passed with the contract line items
- Go to transaction SE11
- Enter structure “ZBAPI_BILLCONTR_I_CREATE” and click create
- Enter a description for the structure, for example “BAPI Structure for Contract Item Data (Attachment)”
- Put the cursor in the first line of the structure and the using the top menu select Edit -> Include -> Insert
- Enter “BAPI_BILLCONTR_I_CREATE” in the include field and click continue
- Put the cursor in the second line of the structure and the using the top menu select Edit -> Include -> Insert
- Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue
- Save and activate the structure.
5.8 Create a Function Group for the Custom Function
- Go to transaction SE80
- In the Repository Browser, select “Function Group” from the selection
- Enter the function group name “ZVKK_VT_BAPI” and hit the Enter key.
- Answer “Yes” when asked if you want to create the function group
- Enter a description for the function group, for example “CT: Create Provider Contract”
- Save and activate the function group.
5.9 Create the Custom Function to Call the Standard BAPI
- Go to transaction SE37
- In the Function Module field enter “Z_API_CTRACBILLCONTRACT_CREATE” and click Create
- Give the function module a description, for example “CT: Create Provider Contract”
- Using “BAPI_CTRACBILLCONTRACT_CREATE” as a reference, set the following Import parameters
- Set the following Export parameters
- Set the following Table parameters
- Add the following source code
"**************************************************************************************** " NAME: z_api_ctracbillcontract_create " DESCR: Simplified and enhanced version of BAPI_CTRABILLCONTRACT_CREATE " AUTHOR: James Koefelda - SAP America, inc " DATE: 5/21/2019 "**************************************************************************************** FUNCTION z_api_ctracbillcontract_create . *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(CONTRACTDATA) TYPE BAPI_BILLCONTR_H_CREATE *" VALUE(TESTRUN) TYPE BAPI_BILLCONTR_CONTROL-TESTRUN DEFAULT *" SPACE *" VALUE(WRITECHANGEDOCUMENTS) TYPE *" BAPI_BILLCONTR_CONTROL-WRITECHANGEDOCUMENTS DEFAULT 'X' *" EXPORTING *" VALUE(CONTRACT) TYPE BAPI_BILLCONTR_H_CREATE-CONTRACT *" TABLES *" ZCONTRACTITEMDATA STRUCTURE ZBAPI_BILLCONTR_I_CREATE *" RETURN STRUCTURE BAPIRET2 OPTIONAL *"---------------------------------------------------------------------- TYPES: BEGIN OF t_uuid, contractitemid TYPE vtpid_c_kk, uuid TYPE sysuuid_x16, END OF t_uuid. DATA: lv_timestamp TYPE tzntstmps, lv_uuid TYPE sysuuid_x16. DATA: ls_contractdatax TYPE bapi_billcontr_h_createx, lt_contractitemdata TYPE TABLE OF bapi_billcontr_i_create, lt_contractitemdatax TYPE TABLE OF bapi_billcontr_i_createx, lt_extensionin TYPE TABLE OF bapiparex, lt_uuid TYPE TABLE OF t_uuid. "**************************************************************************************** " Generate Timestamp for the Extension Table "**************************************************************************************** PERFORM f_get_timestamp CHANGING lv_timestamp. "**************************************************************************************** " Fill the CONTRACTDATAX Structure for all populated values in the contract header "**************************************************************************************** PERFORM f_set_contractdatax USING contractdata CHANGING ls_contractdatax. "**************************************************************************************** " Process Contract line items "**************************************************************************************** LOOP AT zcontractitemdata ASSIGNING FIELD-SYMBOL(<lfs_zcontractitemdata>). "Get and set UUID for contractitemparent IF <lfs_zcontractitemdata>-contractitemparentid IS NOT INITIAL. READ TABLE lt_uuid ASSIGNING FIELD-SYMBOL(<lfs_uuid>) WITH KEY contractitemid = <lfs_zcontractitemdata>-contractitemparentid. IF sy-subrc = 0. <lfs_zcontractitemdata>-contractitemparentid = <lfs_uuid>-uuid. ENDIF. ENDIF. "Get UUID PERFORM f_get_uuid CHANGING lv_uuid. "Save UUID in lt_uiid APPEND INITIAL LINE TO lt_uuid ASSIGNING <lfs_uuid>. <lfs_uuid>-contractitemid = <lfs_zcontractitemdata>-contractitemid. <lfs_uuid>-uuid = lv_uuid. "set UUID for contractitem <lfs_zcontractitemdata>-contractitemid = lv_uuid. " Fill EXTENSIONIN table for custom fields of each contract item APPEND INITIAL LINE TO lt_extensionin ASSIGNING FIELD-SYMBOL(<lfs_extensionin>). PERFORM f_set_extensionin USING <lfs_zcontractitemdata> lv_timestamp CHANGING <lfs_extensionin>. "'Remove' custom fields from contract item data APPEND INITIAL LINE TO lt_contractitemdata ASSIGNING FIELD-SYMBOL(<lfs_contractitemdata>). MOVE-CORRESPONDING <lfs_zcontractitemdata> TO <lfs_contractitemdata>. " Fill the CONTRACTITEMDATAX table for all populated values of each contract item " excludes custom fields APPEND INITIAL LINE TO lt_contractitemdatax ASSIGNING FIELD-SYMBOL(<lfs_contractitemdatax>). PERFORM f_set_contractitemdatax USING <lfs_contractitemdata> CHANGING <lfs_contractitemdatax>. ENDLOOP. "**************************************************************************************** " Call the BAPI to create the provider contract "**************************************************************************************** CALL FUNCTION 'BAPI_CTRACBILLCONTRACT_CREATE' EXPORTING contractdata = contractdata contractdatax = ls_contractdatax testrun = testrun writechangedocuments = writechangedocuments IMPORTING contract = contract TABLES contractitemdata = lt_contractitemdata contractitemdatax = lt_contractitemdatax return = return extensionin = lt_extensionin. IF contract IS NOT INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. ENDIF. ENDFUNCTION.
- Save the code
- In the code, find the statement “PERFORM f_get_timestamp CHANGING lv_timestamp.”
- Double-click on “f_get_timestamp”
- Answer “Yes” when asked if you want to create the routine
- Select a name for a new to include to contain the code
- Enter the following code into the new include
*----------------------------------------------------------------------* ***INCLUDE LZVKK_VT_BAPIF01. *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form F_DYNAMIC_FILL_X *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_PI_NAME_V text * -->P_PI_NAME_X text * -->P_PI_STRUC_V text * <--P_PC_STRUC_X text *----------------------------------------------------------------------* FORM f_dynamic_fill_x USING pi_name_v pi_name_x pi_struc_v CHANGING pc_struc_x. CONSTANTS: lc_typ_tab(1) TYPE c VALUE 'h', lc_typ_str(1) TYPE c VALUE 'v'. DATA: lo_structdescr_v TYPE REF TO cl_abap_structdescr, ls_component_v TYPE abap_compdescr. lo_structdescr_v ?= cl_abap_typedescr=>describe_by_name( pi_name_v ). LOOP AT lo_structdescr_v->components INTO ls_component_v. ASSIGN COMPONENT ls_component_v-name OF STRUCTURE pi_struc_v TO FIELD-SYMBOL(<lfs_field_v>). DESCRIBE FIELD <lfs_field_v> TYPE DATA(lv_type_v). CASE lv_type_v. WHEN lc_typ_tab. WHEN lc_typ_str. WHEN OTHERS. IF <lfs_field_v> IS NOT INITIAL. ASSIGN COMPONENT ls_component_v-name OF STRUCTURE pc_struc_x TO FIELD-SYMBOL(<lfs_field_x>). IF sy-subrc = 0 AND <lfs_field_x> IS ASSIGNED. <lfs_field_x> = abap_true. ENDIF. ENDIF. ENDCASE. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form F_SET_CONTRACTDATAX *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_CONTRACTDATA text * <--P_CONTRACTDATAX text *----------------------------------------------------------------------* FORM f_set_contractdatax USING pi_contractdata TYPE bapi_billcontr_h_create CHANGING pc_contractdatax TYPE bapi_billcontr_h_createx. PERFORM f_dynamic_fill_x USING 'BAPI_BILLCONTR_H_CREATE' 'BAPI_BILLCONTR_H_CREATEX' pi_contractdata CHANGING pc_contractdatax. ENDFORM. *&---------------------------------------------------------------------* *& Form F_SET_CONTRACTITEMDATAX *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_CONTRACTITEMDATA text * <--P_CONTRACTITEMDATAX text *----------------------------------------------------------------------* FORM f_set_contractitemdatax USING pi_contractitemdata TYPE bapi_billcontr_i_create CHANGING pc_contractitemdatax TYPE bapi_billcontr_i_createx. PERFORM f_dynamic_fill_x USING 'BAPI_BILLCONTR_I_CREATE' 'BAPI_BILLCONTR_I_CREATEX' pi_contractitemdata CHANGING pc_contractitemdatax. ENDFORM. *&---------------------------------------------------------------------* *& Form F_GET_TIMESTAMP *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_LV_TIMESTAMP text *----------------------------------------------------------------------* FORM f_get_timestamp CHANGING pc_timestamp TYPE tzntstmps. DATA: lv_timezone TYPE timezone. CALL FUNCTION 'GET_SYSTEM_TIMEZONE' IMPORTING timezone = lv_timezone. CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP' EXPORTING i_datlo = sy-datum i_timlo = sy-uzeit i_tzone = lv_timezone IMPORTING e_timestamp = pc_timestamp. ENDFORM. *&---------------------------------------------------------------------* *& Form F_SET_EXTENSIONIN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_<LFS_CONTRACTITEMDATA> text * -->P_LV_TIMESTAMP text * <--P_<LFS_EXTENSIONIN> text *----------------------------------------------------------------------* FORM f_set_extensionin USING pi_contractitemdata TYPE zbapi_billcontr_i_create pi_timestamp TYPE tzntstmps CHANGING pc_extensionin TYPE bapiparex. CONSTANTS: lc_ext_structure TYPE te_struc VALUE 'BAPI_TE_VT_I'. DATA: ls_bapi_te_vt_i TYPE bapi_te_vt_i, ls_extensionin TYPE bapiparex. ls_bapi_te_vt_i-contractitemid = pi_contractitemdata-contractitemid. ls_bapi_te_vt_i-valid_timestamp = pi_timestamp. ls_bapi_te_vt_i-zzctf_total = pi_contractitemdata-zzctf_total. ls_bapi_te_vt_i-zzcto_total = pi_contractitemdata-zzcto_total. ls_extensionin-structure = lc_ext_structure. cl_abap_container_utilities=>fill_container_c( EXPORTING im_value = ls_bapi_te_vt_i " structure of type ls_bapi_te_vt_i IMPORTING ex_container = ls_extensionin+30 " values 1-4 EXCEPTIONS illegal_parameter_type = 1 OTHERS = 2 ). pc_extensionin = ls_extensionin. ENDFORM. *&---------------------------------------------------------------------* *& Form F_GET_GUID *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_LV_GUID text *----------------------------------------------------------------------* FORM f_get_uuid CHANGING p_uuid TYPE sysuuid_x16. TRY. CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16 RECEIVING uuid = p_uuid. CATCH cx_uuid_error. ENDTRY. ENDFORM.
- Save and activate the function module
5.10 Create the Report to Call the Custom Function
- Go to transaction SE38
- Create a program named “ZPRC_UPLOAD” with the following attributes
- Add the following source code
*&---------------------------------------------------------------------* *& Report ZPRC_UPLOAD *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zprc_upload. “*********************************************************************** “*********************************************************************** “ Global Data declarations “*********************************************************************** “*********************************************************************** TYPE-POOLS: truxs. TYPES: BEGIN OF t_datatab, contract_hdr TYPE vtkey_kk, contract_ext TYPE vtalt_kk, partner TYPE gpart_kk, contract_description TYPE vtbez_kk, contract_start TYPE tstmp_c_kk, contract_end TYPE tstmp_c_kk, authoritygroup TYPE begru, comp_code TYPE bukrs, time_zone TYPE tizon_kk, contract_category TYPE vtcat_kk, contract_characteristic TYPE vtchr_kk, contract_status TYPE status_vt_kk. INCLUDE STRUCTURE zbapi_billcontr_i_create. TYPES: END OF t_datatab. TYPES: BEGIN OF t_uuid, contract TYPE vtkey_kk, contractitemid TYPE vtpid_c_kk, “ uuid TYPE sysuuid_x16, END OF t_uuid. DATA: lv_contract TYPE bapi_billcontr_h_create-contract, lv_uuid TYPE sysuuid_x16, lv_parent_uuid TYPE sysuuid_x16. DATA: ls_hdr TYPE bapi_billcontr_h_create, lt_itm TYPE ztt_bapi_billcontr_i_create, ls_item TYPE zbapi_billcontr_i_create, lt_ret TYPE TABLE OF bapiret2, lt_uuid TYPE TABLE OF t_uuid. DATA: lt_datatab TYPE STANDARD TABLE OF t_datatab, ls_datatab TYPE t_datatab, lt_raw TYPE truxs_t_text_data. “*********************************************************************** “*********************************************************************** “ Selection Screen “*********************************************************************** “*********************************************************************** SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME. PARAMETERS: p_file TYPE rlgrap-filename. PARAMETERS: p_head TYPE char01 DEFAULT ‘X’. SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME. PARAMETERS: p_test TYPE testrun. PARAMETERS: p_chgdoc TYPE writecd_kk DEFAULT ‘X’. SELECTION-SCREEN END OF BLOCK b2. “*********************************************************************** “*********************************************************************** “ At Selection Screen “*********************************************************************** “*********************************************************************** AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. CALL FUNCTION ‘F4_FILENAME’ EXPORTING field_name = ‘P_FILE’ IMPORTING file_name = p_file. “*********************************************************************** “*********************************************************************** “ Start of Selection “*********************************************************************** “*********************************************************************** START-OF-SELECTION. “ Convert Excel Data to SAP internal Table Data CALL FUNCTION ‘TEXT_CONVERT_XLS_TO_SAP’ EXPORTING * I_FIELD_SEPERATOR = i_line_header = p_head i_tab_raw_data = lt_raw “ WORK TABLE i_filename = p_file TABLES i_tab_converted_data = lt_datatab[] “ACTUAL DATA EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. “*********************************************************************** “*********************************************************************** * END-OF-SELECTION. “*********************************************************************** “*********************************************************************** END-OF-SELECTION. “*********************************************************************** * Process Excel Data and Create Provider Contracts “*********************************************************************** LOOP AT lt_datatab ASSIGNING FIELD-SYMBOL(<lfs_exdata>). “*************************************** “Fill Contract Header “*************************************** IF <lfs_exdata>-contract_hdr IS NOT INITIAL. “*************************************** “Create Provier Contract “*************************************** IF ls_hdr IS NOT INITIAL AND lt_itm[] IS NOT INITIAL. PERFORM f_create_contract USING ls_hdr p_test p_chgdoc lt_itm. ENDIF. “*************************************** “Start New Contract – Fill Header “*************************************** CLEAR: ls_hdr, ls_item. REFRESH: lt_itm. MOVE-CORRESPONDING <lfs_exdata> TO ls_hdr. ls_hdr-contract = <lfs_exdata>-contract_hdr. ENDIF. “*************************************** “Fill Contract Item “*************************************** CLEAR: ls_item. MOVE-CORRESPONDING <lfs_exdata> TO ls_item. “Validate Item & Header contract numbers match IF ls_item-contract <> ls_hdr-contract. SKIP 1. WRITE: / text-001 && ` ` && text-011 && ` ` && ls_item-contract && ` <> ` && ls_hdr-contract. WRITE: / text-002. CLEAR: ls_hdr. EXIT. ENDIF. “Validate and set parent uuid. IF ls_item-contractitemparentid IS NOT INITIAL. READ TABLE lt_uuid ASSIGNING FIELD-SYMBOL(<lfs_uuid>) WITH KEY contract = ls_hdr-contract contractitemid = ls_item-contractitemparentid. IF sy-subrc <> 0. SKIP 1. WRITE: / text-001 && ` ` && text-012 && ` ` && ls_item-contractitemparentid. WRITE: / text-002. CLEAR: ls_hdr. EXIT. ENDIF. “ ls_item-contractitemparentid = <lfs_uuid>-uuid. ENDIF. “Set uuid and save in lt_uuid. “PERFORM f_get_uuid CHANGING lv_uuid. APPEND INITIAL LINE TO lt_uuid ASSIGNING <lfs_uuid>. <lfs_uuid>-contract = ls_hdr-contract. <lfs_uuid>-contractitemid = ls_item-contractitemid. “<lfs_uuid>-uuid = lv_uuid. “Add contract item to LT_ITM CLEAR: ls_item-contract. “ls_item-contractitemid = lv_uuid. APPEND ls_item TO lt_itm. ENDLOOP. “*************************************** “Create Provier Contract "*************************************** IF ls_hdr IS NOT INITIAL AND lt_itm[] IS NOT INITIAL. PERFORM f_create_contract USING ls_hdr p_test p_chgdoc lt_itm. ENDIF. "*********************************************************************** "*********************************************************************** " Includes "*********************************************************************** "*********************************************************************** INCLUDE zprc_upload_f01.
- Save the code
- Double-click on the include name in the last line of the code
- Answer “Yes” when asked if you want to create the include
- Add the following code to the new include
*----------------------------------------------------------------------* ***INCLUDE ZPRC_UPLOAD_F. *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form F_GET_GUID *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_LV_GUID text *----------------------------------------------------------------------* FORM f_get_uuid CHANGING p_uuid TYPE sysuuid_x16. TRY. CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16 RECEIVING uuid = p_uuid. CATCH cx_uuid_error. ENDTRY. ENDFORM. *&---------------------------------------------------------------------* *& Form F_CREATE_CONTRACT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LS_CONTRACTDATA text * -->P_P_TEST text * -->P_P_CHGDOC text * -->P_LT_CONTRACTITEMDATA text *----------------------------------------------------------------------* FORM f_create_contract USING pi_hdr type bapi_billcontr_h_create pi_test type testrun pi_chgdoc type writecd_kk pi_itm type ZTT_BAPI_BILLCONTR_I_CREATE. DATA: lv_contract TYPE bapi_billcontr_h_create-contract, lt_ret TYPE TABLE OF bapiret2. clear: pi_hdr-contract. CALL FUNCTION 'Z_API_CTRACBILLCONTRACT_CREATE' EXPORTING contractdata = pi_hdr testrun = pi_test writechangedocuments = pi_chgdoc IMPORTING contract = lv_contract TABLES zcontractitemdata = pi_itm return = lt_ret. "*************************************** " List processing "*************************************** WRITE: / 'Contract = ', lv_contract. SKIP 1. LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>). WRITE: / <fs_ret>-message. ENDLOOP. ULINE. ENDFORM.
- Save the code
- From the top menu select Goto -> Text Elements -> Selection Texts
- Enter the following selection texts
- Click on the Text Symbols tab
- Enter the following Text Symbols
- Save the texts and activate the report
5.11 Test the Custom Function
- Modify the attached Excel spreadsheet with the required data
- Go to transaction SE38
- Enter program ZPRC_UPLOAD and click the Execute Button
- Click on the drop-down for the “File Name” field
- Select the locally saved Excel spreadsheet
- Click the Execute button
- Confirm the data using table DFKK_VT_I
6 Populating the Custom Values with Transactions.
You can refer to the BDT Developer Manual, in the reference section of this document, for the following steps.
6.1 Create the Function Group
This function group will hold the subscreen, PBO/PAI modules, and the PAI/PBO functions required to enhance the transaction
- Go to transaction SE80
- In the Repository Browser, select “Function Group” from the selection
- Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.
- Answer “Yes” when asked if you want to create the function group
- Enter a description for the function group, for example “BDT enhancements to Provider Contracts
- Save and activate the function group.
6.2 Create the Subscreen
This subscreen will hold the custom fields and will be added to the provider contract transactions.
- Go to transaction SE80
- In the Repository Browser, select “Function Group” from the selection
- Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.
- Right-click on the screens folder and select “Create”
- Enter a screen number such as “1000”
- Enter a description such as “CtrItm: Costs”
- Select “Subscreen” for the screen type and click continue
- Open the screen layout, Select Dictionary /Program Fields and add the custom fields to the screen.
- Save the screen
- Click on the “Flow Logic” tab
- Create one PBO module and one PAI module.
- In PBO module, call function module ‘BUS_PBO’. No other logic should be placed in the PBO module. Data extraction, field checks should be carried out in a separate function.
- In the PAI module call function module ‘BUS_PAI’. No other logic should be placed in the PAI module. Data extraction, field checks should be carried out in a separate function.
- Save and activate everything
6.3 Create the PBO Function
This PBO function will get the data for the currently selected contract item. It then takes the values for the custom fields and pushes them into the screen fields of the custom subscreen.
- Go to transaction SE80
- In the Repository Browser, select “Function Group” from the selection
- Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.
- Expand the “Includes” folder
- Open the “Top” include and enter the following tables statement
FUNCTION-POOL ZVKK_BDT_PRC. "MESSAGE-ID .. * INCLUDE LZVKK_BDT_PRCD... " Local class definition TABLES: dfkk_vt_i.
- Save the include
- Right click on the “Function Modules” folder and select “Create”
- Create a function, such as “Z_VKK_CAVT_PBO_ZVKK1000”
- Enter a description, such as “PBO 1000 Provider Contract – Costs”
- Enter the following code
FUNCTION z_vkk_cavt_pbo_zvkk1000. *"---------------------------------------------------------------------- *"*"Local Interface: *"---------------------------------------------------------------------- DATA: ls_vt_i TYPE dfkk_vt_i. CALL FUNCTION 'VKK_CAVT_DFKK_VT_I_GET' IMPORTING es_vt_i = ls_vt_i. dfkk_vt_i-zzctf_total = ls_vt_i-zzctf_total. dfkk_vt_i-zzcto_total = ls_vt_i-zzcto_total. ENDFUNCTION.
- Save and activate everything
6.4 Create the PAI Function
This PAI function will get the data for the currently selected contract item. It then takes the values that were entered on the screen and saves it back to the contract items in memory.
- Go to transaction SE80
- In the Repository Browser, select “Function Group” from the selection
- Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.
- Right-click on the Function Modules folder and select “Create”
- Create a function, such as “Z_VKK_CAVT_PAI_ZVKK1000”
- Enter a description, such as “PAI 1000 Provider Contract – Costs”
- Enter the following code
FUNCTION z_vkk_cavt_pai_zvkk1000. *"-------------------------------------------------------------------- *"*"Local Interface: *"-------------------------------------------------------------------- DATA: ls_vt_i TYPE dfkk_vt_i. CALL FUNCTION 'VKK_CAVT_DFKK_VT_I_GET' IMPORTING es_vt_i = ls_vt_i. ls_vt_i-zzctf_total = dfkk_vt_i-zzctf_total. ls_vt_i-zzcto_total = dfkk_vt_i-zzcto_total. CALL FUNCTION 'VKK_CAVT_DFKK_VT_I_COLLECT' EXPORTING i_subname = 'CI_DFKK_VT_I' i_vt_i = ls_vt_i. ENDFUNCTION.
- Save and activate everything
6.5 Configure BDT: Create a Field Group
The BDT configuration will allow the subscreen to be added to the standard provider contract transactions. You will add the subscreen to the “Contract Items: Overview II” tab.
- Go to transaction SE43
- Enter “BUPT” for the “Area Menu” and then click the display button
- Expand the “BDT General” node
- Expand the “Utilities” node
- Execute BDT Analyzer
- Enter “CAVT” for the “Application Object”
- Enter “VKK” for the “Application”
- Click the “Execute” button
- Expand the following nodes to reach the Field Group named “0150 – Header Data: Provider Contract”
- The custom fields will not actually be added to the “VLL150 – Contract Specification” section. However, access to an existing field group is required to create a new one. Select the “0150 – Header Data: Provider Contract” Field Group.
- Click the “New Entries” button
- Field groups within 700 – 799 are reserved for customers. So, enter the number 700 for the field group
- Enter a Description for the field group, such as “CtrItm: Total Costs”
- Enter “VKK_CAVT_EVENT_FMOD_ITEM” in the “FM for fld grouping” field. This is the standard function module used by all the field groups of this application
- Save the field group
- Continue to click the “Back” button to reach the main screen of the BDT Analyzer
6.6 Configure BDT: Create a View
- Under “Views” node, select the “VKK150 – Header Data: Provider Contract” View
- Click the “New Entries” button
- Enter a name for the view, such as ZVKK01
- Enter a description for the view, such as “CtrItm: Costs”
- Enter “VKK” for the Application
- Enter “0” for the Differentiation Type
- Enter “VKK500” for the Data Set. This is critical. The view will not be displayed if it is not assigned to an existing Data Set.
- Select “Entry View”
- Select “Dialog View”
- In the “Program Name” field, under Subscreen, enter the main program of the function group that was created in step 2.2.1 (e.g. SAPLZVKK_BDT_PRC)
- Enter the screen number that was created in step 2.2.2 (e.g. 1000)
- Under Function Module, in the “Before Output” field, enter the name of the PBO function that was created in step 2.2.3 (e.g. Z_VKK_CAVT_PBO_ZVKK1000)
- Under Function Module, in the “After Entry” field, enter the name of the PAI function that was created in step 2.2.4 (e.g. Z_VKK_CAVT_PAI_ZVKK1000)
- Under “Screen Configuration”, select “Data Screen”
- Check the entries against the following:
- Save the view
- Select the view that was just created and then on the left-hand side, under “Dialog Structure”, select “View -> Field Groups”
- Click the “New Entries” Button
- Enter the Field Group (e.g. 700)
- Save the view
- Continue to click the “Back” button to reach the main screen of the BDT Analyzer
6.7 Configure BDT: Create a Section
- Under “Sections” node, select the “VKK150 – Contract Specification” section
- Click the “New Entries” button
- Enter a name for the section, such as ZCVKK1
- Enter a description for the section, such as “CtrItm: Costs”
- Enter a Title for the section, such as “Cost”. This will be displayed in the transaction.
- Save the section
- Select the section that was just created and then on the left-hand side, under “Dialog Structure”, select “Section -> Views”
- Click the “New Entries” Button
- Enter “999991” for the Item
- Enter the view that was just created (e.g. ZVKK01)
- The view is now assigned to the section
- Click Save
- Continue to click the “Back” button to reach the main screen of the BDT Analyzer
6.8 Configure BDT: Assign the Section to an Existing Screen
- Under “Screens” node, select the “VKK500 – Contract Items: Overview II” screen
- On the left-hand side, select “Screen -> Sections”
- Click the “New Entries” button
- Enter an item number (e.g. 20001). The item number will determine where the subscreen is placed on the parent screen.
- Enter the section name (e.g. ZCVKK1)
- Click Save
- Continue to click the “Back” button to reach the main screen of the BDT Analyzer
6.9 Configure BDT: Confirm the Configuration
- Continue to click the “Back” button to reach the selection screen of the BDT Analyzer
- Execute the Analyzer with the same selections
- Expand the nodes underneath the “VKK500 – Contract Items: Overview II” screen
- The section, view, field group, and fields should now be shown in the hierarchy
6.10 Configure BDT: Generate Subscreen Containers
- Go to transaction SE43
- Enter “BUPT” for the “Area Menu” and then click the display button
- Expand the “BDT General” node
- Expand the “Utilities” node
- Execute “Generate Subscreen Container”
- Enter the following selections and click the Execute button
6.11 Test the Screen Enhancement
- Go to transactions FP_VT1, FP_VT2, and FP_VT3
- Confirm that the Fields are visible under “Contract Items: Overview II”
- Confirm that the values of the custom fields can be changed
- Save a changed provider contract and confirm that the values are updated in table DFKK_VT_I
7 Transferring the Custom Values into Revenue Accounting.
7.1 Append the Custom Fields to the Revenue Accounting – Main Item
To have access to the custom fields in event 8205, the fields must be appended to the Main Item in Revenue Accounting.
- Go to transaction SE11
- Enter table “DFKKRA_RAI_MI” and click “Display”
- Scroll to the bottom of the table on double-click on the customizing include named “CI_FKKRA_RAI_MI”
- Answer “Yes” when the system asks if you want to create the include
- Give the include a description, for example, “Customizing Include for DFKKRA_RAI_MI”
- Put the cursor in the first line of the table and the using the top menu select Edit -> Include -> Insert
- Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue
- Save and activate the customizing include.
7.2 Code Event 8205
- Go to transaction FQEVENT_8205
- Double-click on the “Installation-Specific Function Module”
- Enter the following code
FUNCTION zfkk_sample_8205. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(IT_RAI_MI) TYPE FKKRA_RAI_MI_TAB *" REFERENCE(IT_RAI_CO) TYPE FKKRA_RAI_CO_TAB *" REFERENCE(IS_VT_CHANGES) TYPE FKK_VT_CHANGES OPTIONAL *" REFERENCE(IX_SIMULATION) TYPE XFELD OPTIONAL *" EXPORTING *" REFERENCE(ET_RAI_MI) TYPE FKKRA_RAI_MI_TAB *" REFERENCE(ET_RAI_CO) TYPE FKKRA_RAI_CO_TAB *"---------------------------------------------------------------------- DATA: lt_rai_co TYPE fkkra_rai_co_tab, lwa_rai_co TYPE dfkkra_rai_co, lv_uuid TYPE sysuuid_x16. CALL FUNCTION 'FKK_RA_VT_PREDOC_MERGE_8205' EXPORTING it_rai_mi = it_rai_mi it_rai_co = it_rai_co is_vt_changes = is_vt_changes ix_simulation = ix_simulation IMPORTING et_rai_mi = et_rai_mi et_rai_co = et_rai_co. LOOP AT et_rai_co ASSIGNING FIELD-SYMBOL(<lfs_rai_co>). IF <lfs_rai_co>-condition_type = 'PR00'. lwa_rai_co = <lfs_rai_co>. "************************************************************************* " Add Conditions for "Total Cost to Fulfill" & "Total Cost to Obtain" "************************************************************************* READ TABLE et_rai_mi WITH KEY rai_id = <lfs_rai_co>-rai_id ASSIGNING FIELD-SYMBOL(<lfs_rai_mi>). IF sy-subrc = 0. IF <lfs_rai_mi>-zzctf_total is not INITIAL. " Total Cost to Fulfill PERFORM f_get_uuid CHANGING lv_uuid. lwa_rai_co-uuid = lv_uuid. lwa_rai_co-condition_type = 'VPRS'. lwa_rai_co-chind = 'I'. " lwa_rai_co-category = 'C'. lwa_rai_co-main_cond_type = abap_false. lwa_rai_co-betrw = <lfs_rai_mi>-zzctf_total . APPEND lwa_rai_co TO lt_rai_co. ENDIF. IF <lfs_rai_mi>-zzcto_total is not INITIAL. " Total Cost to Obtain PERFORM f_get_uuid CHANGING lv_uuid. lwa_rai_co-uuid = lv_uuid. lwa_rai_co-condition_type = 'COAC'. lwa_rai_co-chind = 'I'. " lwa_rai_co-category = 'C'. lwa_rai_co-main_cond_type = abap_false. lwa_rai_co-betrw = <lfs_rai_mi>-zzcto_total . APPEND lwa_rai_co TO lt_rai_co. ENDIF. ENDIF. CLEAR lwa_rai_co. ENDIF. ENDLOOP. IF <lfs_rai_co> IS ASSIGNED. UNASSIGN <lfs_rai_co>. ENDIF. IF lt_rai_co[] IS NOT INITIAL. APPEND LINES OF lt_rai_co TO et_rai_co. ENDIF. ENDFUNCTION. *&---------------------------------------------------------------------* *& Form F_GET_GUID *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_LV_GUID text *----------------------------------------------------------------------* FORM f_get_uuid CHANGING p_uuid TYPE sysuuid_x16. TRY. CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16 RECEIVING uuid = p_uuid. CATCH cx_uuid_error. ENDTRY. ENDFORM.
- Save and activate the function module
7.3 Test Event 8205
- Create a Provider Contract using the standard transaction or the report ZPRC_UPLOAD
- Confirm that the custom fields are populated in the main item using table DFKKRA_RAI_MI
- Confirm that conditions are created for each of the custom fields using table DFKKRA_RAI_CO