6

[FSCM Credit Management]: Update S/4 BP Role – SAP... - SAP Community

 1 month ago
source link: https://community.sap.com/t5/supply-chain-management-blogs-by-sap/fscm-credit-management-update-s-4-bp-role-sap-credit-management-ukm000/ba-p/13577971
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

INTRODUCTION:

T-Code FD32 is deprecated in the S/4 HANA system, but there are many BDCs written in old client systems. Now, UKMBP_CMS is the table that needs to be updated.

Challenge: There is only one standard FM that does it UKM_DB_UKMBP_CMS_EXECUTE but this FM is doing direct updates into the table without any error handling as well as writing DML on the table and is not released for customer.

In this blog post, we will cover the class-methods:
  • CL_UKM_BUPA_FACTORY          ( Partner )
  • CL_UKM_BUSINESS_PARTNER ( Partner Credit Profile )
  • CL_UKM_ACCOUNT                     ( Partner Credit Segment )
to handle the requirement.

MAIN CONTENT:

  1. Declare a final local class for data & method.
    ************************************************************************
    *                Class Declarations
    ************************************************************************
    CLASS lcl_fi_ukm000_update DEFINITION FINAL.
    **  INTERFACES
      PUBLIC SECTION.
    Constants:     lc_error            TYPE c VALUE 'E',
                   lc_success          TYPE c VALUE 'S'.
    
    **data:
        DATA:lo_facade       TYPE REF TO cl_ukm_facade,
             lo_partner      TYPE REF TO cl_ukm_business_partner,
             lo_bupa_factory TYPE REF TO cl_ukm_bupa_factory,
    
    	lt_tpz22          TYPE SORTED TABLE OF tpz22 WITH NON-UNIQUE KEY ranking,
              lt_final          TYPE STANDARD TABLE OF ty_s_final, “ Final table structure
               lt_bapiret        TYPE SORTED TABLE OF bapiret2 WITH NON-UNIQUE KEY type number,
               lt_bapiret2       TYPE bapiret2_t,
               lt_bapiret_record TYPE SORTED TABLE OF bapiret2 WITH NON-UNIQUE KEY type number,
               lt_bapiret_total  TYPE bapiret2_t.
    
        METHODS:
    	maintain_bp_credit_details,
    	update_credit_profile_segment,
          	update_external_credit_info,
          	update_additional_adj_info,
          	update_identification.
         ENDCLASS.
    ​
  2. Update the Final table and then at End-of-selection call the main method MAINTAIN_BP_CREDIT_DETAILS.
  3. Declare implementation of class-methods,
    CLASS lcl_fi_ukm000_update IMPLEMENTATION.
    
    *&---------------------------------------------------------------------*
    *&        Maintain BP - SAP CREDIT MANAGEMENT Details
    *&---------------------------------------------------------------------*
      METHOD maintain_bp_credit_details.
    DATA:  lt_output     TYPE SORTED TABLE OF ty_s_final WITH NON-UNIQUE KEY primary_key COMPONENTS kunnr
                                                         WITH NON-UNIQUE SORTED KEY type_key COMPONENTS  type ,
               ls_bupa_error TYPE mds_ctrls_error.
    
        CLEAR: lt_bapiret_record[], lt_bapiret_total[], lt_output[].
        lt_output[] = lt_final[].
    
    "*********here customer is BP only, make sure to ALPHA = IN if needed earlier**************
        LOOP AT lt_output[] INTO ls_final USING KEY type_key WHERE type IS INITIAL.
          CLEAR: ls_bupa_error, ls_bupa_error-messages[].
          "____________________ Lock BP___________________
          DATA(lo_bupa) = NEW cl_im_mds_bupa_lock( ).
          lo_bupa->if_ex_bupa_lock~lock(
            EXPORTING
              iv_partner      = ls_final-kunnr  
            CHANGING
              cs_error        = ls_bupa_error ).
    
          IF ls_bupa_error-is_error IS INITIAL.
            " Process Updating the Data
            "__________________________"
            update_credit_profile_segment( ).
            update_external_credit_info( ).
            update_additional_adj_info( ).
            update_identification( ).
    
            IF line_exists( lt_bapiret_record[ type = lc_error ] ).
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
              " Remove manually added success messages.
              DELETE lt_bapiret_record[] WHERE parameter = ls_final-kunnr AND type = lc_success.
            ELSE.
              lo_bupa_factory->save_all( i_upd_task = abap_false ). "For Factory methods
    
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'               "For API Methods
                EXPORTING
                  wait = abap_true.
            ENDIF.
            "____________________Unlock BP____________________
            lo_bupa->if_ex_bupa_lock~unlock(
            EXPORTING
              iv_partner      = ls_final-kunnr
            CHANGING
              cs_error        = ls_bupa_error ).
          ELSE.
            lt_bapiret_record[] =  VALUE #( FOR ls_bapiret IN ls_bupa_error-messages
                                      ( parameter  = |{ ls_final-kunnr }|
                                        type       = ls_bapiret-type
                                        message    = ls_bapiret-message
                                      )
                                    ) .
          ENDIF.
          APPEND LINES OF lt_bapiret_record[] TO lt_bapiret_total[].
          CLEAR: lt_bapiret_record[].
        ENDLOOP.
        display_data( ). " Display Final ALV table
      ENDMETHOD.
    
    *&---------------------------------------------------------------------*
    *&        Update Credit Profile within Role UKM000 - SAP CREDIT MANAGEMENT
    *&        Update Credit Segment at Header Level
    *&---------------------------------------------------------------------*
      METHOD    update_credit_profile_segment.
        DATA: lo_account       TYPE REF TO cl_ukm_account,
              ls_bp_credit_sgm TYPE ukm_s_bp_cms_sgm,
              ls_ukm_s_bp_cms  TYPE ukm_s_bp_cms.
        CONSTANTS: lc_std TYPE ukm_limit_rule VALUE 'STANDARD'.
    
        "set & fetch Parent data
        lo_facade = cl_ukm_facade=>create( i_activity = cl_ukm_cnst_eventing=>bp_maintenance ).
        lo_bupa_factory = lo_facade->get_bupa_factory( ).
        lo_partner = lo_bupa_factory->get_business_partner( ls_final-kunnr ).
    
        " Fetch & update credit profile data
        lo_partner->get_bp_cms(
                     IMPORTING
                     es_bp_cms = ls_ukm_s_bp_cms
                     ).
        ls_ukm_s_bp_cms-limit_rule = lc_std.
        ls_ukm_s_bp_cms-risk_class = ls_final-cre_risk.
        ls_ukm_s_bp_cms-own_rating = ls_final-db_paydex_score. " Credit score.
        ls_ukm_s_bp_cms-rating_chg_date = sy-datum.
        ls_ukm_s_bp_cms-rating_val_date = sy-datum + 1. " plus 1 days
        lo_partner->set_bp_cms(
                     EXPORTING
                      is_bp_cms = ls_ukm_s_bp_cms
                      ).
    
        "Fetch & update credit segment data
        lo_account = lo_bupa_factory->get_credit_account(
                      i_partner         = ls_final-kunnr
                      i_credit_sgmnt    = CONV ukm_credit_sgmnt( ls_final-kkber ) ).
    
        lo_account->get_bp_cms_sgm(
                    IMPORTING
                      es_bp_cms_sgm = ls_bp_credit_sgm ).
    
        ls_bp_credit_sgm-x_limit_zero = abap_false.
        ls_bp_credit_sgm-credit_limit = ls_final-cred_lim.
        ls_bp_credit_sgm-limit_chg_date = sy-datum.
        ls_bp_credit_sgm-req_date  = ls_final-ref_date.
    
        lo_account->set_bp_cms_sgm(
                    EXPORTING
                      is_bp_cms_sgm = ls_bp_credit_sgm
                      ).
    
        APPEND VALUE #(  parameter  = |{ ls_final-kunnr }|
                         type       = lc_success
                         message    = |{ ls_final-kunnr } { TEXT-019 }|
                         message_v1 = TEXT-019
                       ) TO lt_bapiret_record[].
      ENDMETHOD.
    *&---------------------------------------------------------------------*
    *&        Update BP External Credit Info - Credit Profile - UKM000 – 
    *& this is independent of Partner class instance.
    *&---------------------------------------------------------------------*
      METHOD    update_external_credit_info.
        DATA: lt_bp1012  TYPE STANDARD TABLE OF bp1012,
              lt_message TYPE tty_xo_message,
              lv_guid    TYPE bu_partner_guid.
    
        CLEAR: lt_bapiret[], lt_bapiret2[].
    
        DATA(lv_score) = CONV bp_grade_rank( ls_final-tot_score ).
        SHIFT lv_score LEFT DELETING LEADING space.
    
        " date range should be beyond date_to & date_from.
        lt_bp1012 = VALUE #( ( grade_method = lc_grade_method_dnb  "'DNB'
                               grade        = VALUE #( lt_tpz22[ ranking = lv_score ]-grade OPTIONAL )  "ls_final-dbrating
                               flg_permit   = abap_true
                               text         = ls_final-cust_group
                               date_when    = sy-datum
                               date_from    = sy-datum
                               date_to      = cl_reca_date=>add_to_date( id_years = 1 id_date  = sy-datum )
                            ) ).
    
        lt_message[] = fsbp_api_adapter=>execute_mo_specific_add( " will add new record - use change for changing
                          i_partner         = ls_final-kunnr
                          i_partnerguid     = lv_guid
                          i_table_name      = if_fsbp_const_xo_objects=>mo_bp1012
                          i_check_authority = abap_false
                          i_data_new        = lt_bp1012[]
                                                                  ).
        IF lt_message[] IS NOT INITIAL.
          lt_bapiret[] =  VALUE #( FOR ls_bapiret IN lt_message[]
                                    ( parameter  = |{ ls_final-kunnr }|
                                      type       = ls_bapiret-type
                                      message    = ls_bapiret-message
                                    )
                                  ) .
          INSERT LINES OF lt_bapiret[] INTO TABLE lt_bapiret_record[]. " for sorted table - append dont work
        ENDIF.
        IF NOT line_exists( lt_bapiret[ type = lc_error ] ).
          APPEND VALUE #( parameter  = |{ ls_final-kunnr }|
                           type       = lc_success
                           message    = |{ ls_final-kunnr } { TEXT-020 }|
                           message_v1 = TEXT-020
                       ) TO lt_bapiret_record[].
        ENDIF.
    
      ENDMETHOD.
    *&---------------------------------------------------------------------*
    *&        Update BP Additional Adjustment - Credit Profile - UKM000
    *& this is independent of Partner class instance.
    *&---------------------------------------------------------------------*
      METHOD    update_additional_adj_info.
        DATA: lt_bp3100  TYPE STANDARD TABLE OF bp3100,
              lt_message TYPE tty_xo_message,
              lv_guid    TYPE bu_partner_guid..
        CONSTANTS: lc_addtype_50   TYPE bp_addtype VALUE 50,
                   lc_data_type_01 TYPE bp_data_type VALUE 01.
        CLEAR: lt_bapiret[], lt_bapiret2[].
    
        " _____________Have to Add the Required Record _______________
        lt_bp3100[] = VALUE #( ( partner   = ls_final-kunnr
                                 addtype   = lc_addtype_50        "50
                                 data_type = lc_data_type_01      "01
                                 amnt      = CONV bp_amnt( ls_final-dbtrade_ref_amt )
                                 addate    = sy-datum
                                 datefr    = sy-datum
                                 dateto    = sy-datum
                                 text      = ls_final-kraus
                             ) ).
        lt_message[] = fsbp_api_adapter=>execute_mo_specific_add(
                          i_partner         = ls_final-kunnr
                          i_partnerguid     = lv_guid
                          i_table_name      = if_fsbp_const_xo_objects=>mo_bp3100
                          i_check_authority = abap_false
                          i_data_new        = lt_bp3100[]
                                                              ).
        IF lt_message[]  IS NOT INITIAL.
          lt_bapiret[] =  VALUE #( FOR ls_bapiret IN lt_message[]
                                    ( parameter  = |{ ls_final-kunnr }|
                                      type       = ls_bapiret-type
                                      message    = ls_bapiret-message
                                    )
                                  ) .
          INSERT LINES OF lt_bapiret[] INTO TABLE lt_bapiret_record[]. " for sorted table - append dont work
        ENDIF.
        IF NOT line_exists( lt_bapiret[ type = lc_error ] ).
          APPEND VALUE #( parameter  = |{ ls_final-kunnr }|
                          type       = lc_success
                          message    = |{ ls_final-kunnr } { TEXT-021 }|
                          message_v1 = TEXT-021
                         )  TO lt_bapiret_record[].
        ENDIF.
    
      ENDMETHOD.
    *&---------------------------------------------------------------------*
    *&        Update BP Identification - Credit Profile - UKM000 or General
    *&        This information is Generic irrespective of ROLE in BP
    *&---------------------------------------------------------------------*
      METHOD    update_identification.
        "IDENTIFICATION
        DATA: lt_bapiret2 TYPE bapiret2_t,
              ls_id_upd   TYPE bapibus1006_identification.
        CONSTANTS: lc_idcat_bup001 TYPE bu_id_category VALUE 'BUP001'.
    
        CLEAR: lt_bapiret[], lt_bapiret2[].
    
        ls_id_upd = VALUE #( idinstitute     = ls_final-cust_group
                             identrydate     = sy-datum
                             idvalidfromdate = sy-datum
                             idvalidtodate   = cl_reca_date=>add_to_date( id_years = 1 id_date  = sy-datum )
                            ).
        lo_partner->save_but0id(
           EXPORTING
             i_id_type              = lc_idcat_bup001
             i_id_number            = CONV bu_id_number( ls_final-kraus )
             i_identification       = ls_id_upd
           IMPORTING
             et_return              = lt_bapiret2 )
             .
        IF lt_bapiret2[] IS NOT INITIAL.
          lt_bapiret[] =  VALUE #( FOR ls_bapiret IN lt_bapiret2[]
                                    ( parameter  = |{ ls_final-kunnr }|
                                      type       = ls_bapiret-type
                                      message    = ls_bapiret-message
                                    )
                                  ) .
          INSERT LINES OF lt_bapiret[] INTO TABLE lt_bapiret_record[]. " for sorted table - append dont work
        ENDIF.
        IF NOT line_exists( lt_bapiret[ type = lc_error ] ).
          APPEND VALUE #( parameter  = |{ ls_final-kunnr }|
                          type       = lc_success
                          message    = |{ ls_final-kunnr } { TEXT-022 }|
                          message_v1 = TEXT-022
                          ) TO lt_bapiret_record[].
        ENDIF.
    
      ENDMETHOD.
    ENDCLASS.
    ​

    Here DISPLAY_ALV is not declared as you can declare the factory ALV method on your own to display the Final table or LT_BAPIRET_TOTAL. Handle success & error text as per your requirement.

    Rest, you can trigger SAVE_ALL( I_UPD_TASK = ABAP_TRUE ) " X to handle the update and Fiori front-end update.

    Reference links:

    Comparison for SAP S/4HANA Basic Credit Management and Advanced Credit Management
    Topic page:

    ABAP Topic: https://community.sap.com/topics/abap,

    Do give your comments and feedback.
    Follow for more: Robin Thakral

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK