Enterprise Resource Planning Blogs by SAP
Get insights and updates about cloud ERP and RISE with SAP, SAP S/4HANA and SAP S/4HANA Cloud, and more enterprise management capabilities with SAP blog posts.
cancel
Showing results for 
Search instead for 
Did you mean: 

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”







  1. Go to transaction SE11

  2. Create data element ZCTF_TOTAL

  3. Enter the Short Description: “Total Cost to Fulfill”

  4. Use Domain: WRTV7

  5. Enter the following information for Field Label

  6. Save and activate the data element.


 




5.2    Create the Custom Data Element for “Total Cost to Obtain”







  1. Go to transaction SE11

  2. Create data element ZCTO_TOTAL

  3. Enter the Short Description: “Total Cost to Obtain”

  4. Use Domain: WRTV7

  5. Enter the following information for Field Label

  6. Save and activate the data element.


 




5.3    Add the Custom Fields to a New Structure









    1. Go to transaction SE11

    2. Create a new structure name “ZPRC_ITEM_CUSTOM”

    3. Enter “Provider Contract: Custom fields added to item” as the description





  1. Add the two fields to the structure

  2. Set the “Reference table” and “Reference field” for the two fields

  3. 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

  1. Go to transaction SE11

  2. Enter table “DFKK_VT_I” and click display

  3. Scroll to the bottom of the table on double-click on the customizing include named “CI_DFKK_VT_I”

  4. Answer “Yes” when the system asks if you want to create the include

  5. Give the include a description, for example, “Append Structure for DFKK_VT_I (Items of Provider Contract)”

  6. Put the cursor in the first line of the table and the using the top menu select Edit -> Include -> Insert

  7. Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue

  8. 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

  1. Go to transaction SE11

  2. Enter structure “BAPI_TE_VT_I” and click display

  3. From the top menu select Goto-> Append Structure

  4. Enter a name for the new append structure, for example “ZBAPI_TE_VT_I”

  5. Enter a description for the new append structure, for example “Append Structure for BAPI_TE_VT_I”

  6. Put the cursor in the first line of the append structure and the using the top menu select Edit -> Include -> Insert

  7. Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue

  8. 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.

  1. Go to transaction SE11

  2. Enter structure “FKK_VT_I_DI” and click display

  3. Scroll to the bottom of the table on double-click on the customizing include named “CI_FKK_VT_I_DI”

  4. Answer “Yes” when the system asks if you want to create the include

  5. Give the include a description, for example, “Append Structure for CI_FKK_VT_I_DI”

  6. Add the two fields using the “Built-in Type” button

  7. Give the fields the following attributes

  8. 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

  1. Go to transaction SE11

  2. Enter structure “ZBAPI_BILLCONTR_I_CREATE” and click create

  3. Enter a description for the structure, for example “BAPI Structure for Contract Item Data (Attachment)”

  4. Put the cursor in the first line of the structure and the using the top menu select Edit -> Include -> Insert

  5. Enter “BAPI_BILLCONTR_I_CREATE” in the include field and click continue

  6. Put the cursor in the second line of the structure and the using the top menu select Edit -> Include -> Insert

  7. Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue

  8. Save and activate the structure.


 




5.8    Create a Function Group for the Custom Function







  1. Go to transaction SE80

  2. In the Repository Browser, select “Function Group” from the selection

  3. Enter the function group name “ZVKK_VT_BAPI” and hit the Enter key.

  4. Answer “Yes” when asked if you want to create the function group

  5. Enter a description for the function group, for example “CT: Create Provider Contract”

  6. Save and activate the function group.


 




5.9    Create the Custom Function to Call the Standard BAPI







  1. Go to transaction SE37

  2. In the Function Module field enter “Z_API_CTRACBILLCONTRACT_CREATE” and click Create

  3. Give the function module a description, for example “CT: Create Provider Contract”

  4. Using “BAPI_CTRACBILLCONTRACT_CREATE” as a reference, set the following Import parameters

  5. Set the following Export parameters

  6. Set the following Table parameters

  7. 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.



  8. Save the code

  9. In the code, find the statement “PERFORM f_get_timestamp CHANGING lv_timestamp.”

  10. Double-click on “f_get_timestamp”

  11. Answer “Yes” when asked if you want to create the routine

  12. Select a name for a new to include to contain the code

  13. 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.


  14. Save and activate the function module



 




5.10    Create the Report to Call the Custom Function







  1. Go to transaction SE38

  2. Create a program named “ZPRC_UPLOAD” with the following attributes

  3. 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.


  4. Save the code

  5. Double-click on the include name in the last line of the code

  6. Answer “Yes” when asked if you want to create the include

  7. 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.




  1. Save the code

  2. From the top menu select Goto -> Text Elements -> Selection Texts

  3. Enter the following selection texts

  4. Click on the Text Symbols tab

  5. Enter the following Text Symbols

  6. Save the texts and activate the report


 




5.11                     Test the Custom Function







  1. Modify the attached Excel spreadsheet with the required data

  2. Go to transaction SE38

  3. Enter program ZPRC_UPLOAD and click the Execute Button

  4. Click on the drop-down for the “File Name” field

  5. Select the locally saved Excel spreadsheet

  6. Click the Execute button

  7. 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

  1. Go to transaction SE80

  2. In the Repository Browser, select “Function Group” from the selection

  3. Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.

  4. Answer “Yes” when asked if you want to create the function group

  5. Enter a description for the function group, for example “BDT enhancements to Provider Contracts

  6. 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.

  1. Go to transaction SE80

  2. In the Repository Browser, select “Function Group” from the selection

  3. Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.

  4. Right-click on the screens folder and select “Create”

  5. Enter a screen number such as “1000”

  6. Enter a description such as “CtrItm: Costs”

  7. Select “Subscreen” for the screen type and click continue

  8. Open the screen layout, Select Dictionary /Program Fields and add the custom fields to the screen.


  9. Save the screen

  10. Click on the “Flow Logic” tab

  11. Create one PBO module and one PAI module.

  12. 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.

  13. 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.

  14. 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.

  1. Go to transaction SE80

  2. In the Repository Browser, select “Function Group” from the selection

  3. Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.

  4. Expand the “Includes” folder

  5. 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.


  6. Save the include

  7. Right click on the “Function Modules” folder and select “Create”

  8. Create a function, such as “Z_VKK_CAVT_PBO_ZVKK1000”

  9. Enter a description, such as “PBO 1000 Provider Contract – Costs”

  10. 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.


  11. 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.

  1. Go to transaction SE80

  2. In the Repository Browser, select “Function Group” from the selection

  3. Enter the function group name “ZVKK_BDT_PRC” and hit the Enter key.

  4. Right-click on the Function Modules folder and select “Create”

  5. Create a function, such as “Z_VKK_CAVT_PAI_ZVKK1000”

  6. Enter a description, such as “PAI 1000 Provider Contract – Costs”

  7. 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.


  8. 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.

  1. Go to transaction SE43

  2. Enter “BUPT” for the “Area Menu” and then click the display button

  3. Expand the “BDT General” node

  4. Expand the “Utilities” node

  5. Execute BDT Analyzer

  6. Enter “CAVT” for the “Application Object”

  7. Enter “VKK” for the “Application”

  8. Click the “Execute” button

  9. Expand the following nodes to reach the Field Group named “0150 – Header Data: Provider Contract”

  10. 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.

  11. Click the “New Entries” button

  12. Field groups within 700 – 799 are reserved for customers. So, enter the number 700 for the field group

  13. Enter a Description for the field group, such as “CtrItm: Total Costs”

  14. 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

  15. Save the field group

  16. Continue to click the “Back” button to reach the main screen of the BDT Analyzer


 




6.6    Configure BDT: Create a View







  1. Under “Views” node, select the “VKK150 – Header Data: Provider Contract” View

  2. Click the “New Entries” button

  3. Enter a name for the view, such as ZVKK01

  4. Enter a description for the view, such as “CtrItm: Costs”

  5. Enter “VKK” for the Application

  6. Enter “0” for the Differentiation Type

  7. 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.

  8. Select “Entry View”

  9. Select “Dialog View”

  10. 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)

  11. Enter the screen number that was created in step 2.2.2 (e.g. 1000)

  12. 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)

  13. 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)

  14. Under “Screen Configuration”, select “Data Screen”

  15. Check the entries against the following:

  16. Save the view

  17. Select the view that was just created and then on the left-hand side, under “Dialog Structure”, select “View -> Field Groups”

  18. Click the “New Entries” Button

  19. Enter the Field Group (e.g. 700)

  20. Save the view

  21. Continue to click the “Back” button to reach the main screen of the BDT Analyzer


 




6.7    Configure BDT: Create a Section







  1. Under “Sections” node, select the “VKK150 – Contract Specification” section

  2. Click the “New Entries” button

  3. Enter a name for the section, such as ZCVKK1

  4. Enter a description for the section, such as “CtrItm: Costs”

  5. Enter a Title for the section, such as “Cost”. This will be displayed in the transaction.

  6. Save the section

  7. Select the section that was just created and then on the left-hand side, under “Dialog Structure”, select “Section -> Views”

  8. Click the “New Entries” Button

  9. Enter “999991” for the Item

  10. Enter the view that was just created (e.g. ZVKK01)

  11. The view is now assigned to the section

  12. Click Save

  13. 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


 

  1. Under “Screens” node, select the “VKK500 – Contract Items: Overview II” screen

  2. On the left-hand side, select “Screen -> Sections”

  3. Click the “New Entries” button

  4. Enter an item number (e.g. 20001). The item number will determine where the subscreen is placed on the parent screen.

  5. Enter the section name (e.g. ZCVKK1)

  6. Click Save

  7. Continue to click the “Back” button to reach the main screen of the BDT Analyzer


 




6.9    Configure BDT: Confirm the Configuration







  1. Continue to click the “Back” button to reach the selection screen of the BDT Analyzer

  2. Execute the Analyzer with the same selections

  3. Expand the nodes underneath the “VKK500 – Contract Items: Overview II” screen

  4. The section, view, field group, and fields should now be shown in the hierarchy


 




6.10    Configure BDT: Generate Subscreen Containers







  1. Go to transaction SE43

  2. Enter “BUPT” for the “Area Menu” and then click the display button

  3. Expand the “BDT General” node

  4. Expand the “Utilities” node

  5. Execute “Generate Subscreen Container”

  6. Enter the following selections and click the Execute button


 




6.11    Test the Screen Enhancement







  1. Go to transactions FP_VT1, FP_VT2, and FP_VT3

  2. Confirm that the Fields are visible under “Contract Items: Overview II”

  3. Confirm that the values of the custom fields can be changed

  4. 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.

  1. Go to transaction SE11

  2. Enter table “DFKKRA_RAI_MI” and click “Display”

  3. Scroll to the bottom of the table on double-click on the customizing include named “CI_FKKRA_RAI_MI”

  4. Answer “Yes” when the system asks if you want to create the include

  5. Give the include a description, for example, “Customizing Include for DFKKRA_RAI_MI”

  6. Put the cursor in the first line of the table and the using the top menu select Edit -> Include -> Insert

  7. Enter “ZPRC_ITEM_CUSTOM” in the include field and click continue

  8. Save and activate the customizing include.


 




7.2    Code Event 8205







  1. Go to transaction FQEVENT_8205

  2. Double-click on the “Installation-Specific Function Module”

  3. 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.​


  4. Save and activate the function module


 




7.3    Test Event 8205







  1. Create a Provider Contract using the standard transaction or the report ZPRC_UPLOAD

  2. Confirm that the custom fields are populated in the main item using table DFKKRA_RAI_MI

  3. Confirm that conditions are created for each of the custom fields using table DFKKRA_RAI_CO