Technical Articles
[FSCM Credit Management]: Update S/4 BP Role – SAP Credit Management(UKM000) instead of ECC TCode “FD32”
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-method
- CL_UKM_BUSINESS_PARTNER
- CL_UKM_BUPA_FACTORY
to handle the requirement.
MAIN CONTENT:
- 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.
- Update the Final table and then at End-of-selection call the main method MAINTAIN_BP_CREDIT_DETAILS.
- 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.
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
Drop me comments, if you need the successful implementation of the FM UKM_DB_UKMBP_CMS_EXECUTE