Skip to Content
Technical Articles
Author's profile photo James Koefelda

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”


  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

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.