SAP MDG · UTILITIES

How does SAP MDG determine the BP customer/vendor account group from a change request, and how can I implement the same logic in ABAP?

Use model extension class CL_USMD_MODEL_EXT with model 'BP' to read the change request entity list from USMD0_CS_FLD-CREQUEST, get the BP_HEADER partner from sequence 1, then read BP_VENGEN for KTOKK and BP_CUSGEN for KTOKD. If the value is not filled in the BP entity, fall back to LFA1-KTOKK or KNA1-KTOKD.

Use model extension class CL_USMD_MODEL_EXT with model 'BP' to read the change request entity list from USMD0_CS_FLD-CREQUEST, get the BP_HEADER partner from sequence 1, then read BP_VENGEN for KTOKK and BP_CUSGEN for KTOKD. If the value is not filled in the BP entity, fall back to LFA1-KTOKK or KNA1-KTOKD.

This ABAP pattern uses the MDG BP model ('BP') to read the change request entity set, find the BP_HEADER partner, and then read the corresponding BP_VENGEN and BP_CUSGEN data for the account group fields. If the MDG entity values are not available, the code falls back to the classic tables LFA1 and KNA1. Below is the implementation flow and a copyable ABAP example based on the retrieved source.

Process flow

  1. Call CL_USMD_MODEL_EXT=>GET_INSTANCE for model 'BP'.
  2. Read the change request entities with READ_CHAR_VALUE using USMD0_CS_FLD-CREQUEST.
  3. Find the BP_HEADER record with USMD_SEQNR = '1' and store the partner number.
  4. Create a data reference for BP_VENGEN with i_struct = 'KATTR'.
  5. Read BP_VENGEN using the partner and BP_HEADER selection.
  6. Extract KTOKK from the returned BP_VENGEN structure.
  7. If KTOKK is initial, fall back to SELECT SINGLE KTOKK FROM LFA1 WHERE LIFNR = lv_partner.
  8. Create a data reference for BP_CUSGEN with i_struct = 'KATTR'.","Read BP_CUSGEN using the partner and BP_HEADER selection.","Extract KTOKD from the returned BP_CUSGEN structure.","If KTOKD is initial, fall back to SELECT SINGLE KTOKD FROM K

Referenced tables

ObjectPurpose
LFA1Fallback source for vendor account group KTOKK when BP_VENGEN does not provide a value.
KNA1Fallback source for customer account group KTOKD when BP_CUSGEN does not provide a value.

ILLUSTRATIVE ABAP SAMPLE

Source ABAP example

Exact relevant implementation excerpt from the knowledge document.

1METHOD get_account_group. 2 CONSTANTS: lc_model TYPE usmd_model VALUE 'BP'. 3 DATA: 4 lt_entities TYPE usmd_t_crequest_entity, 5 lo_model_ext TYPE REF TO if_usmd_model_ext, 6 lv_partner TYPE bu_partner, 7 lv_entity TYPE usmd_entity, 8 lv_entity_name TYPE usmd_fieldname, 9 lo_data TYPE REF TO data. 10 FIELD-SYMBOLS: <fs_t_vengen> TYPE ANY TABLE, 11 <fs_t_cusgen> TYPE ANY TABLE, 12 <lfs_value> TYPE any. 13 CALL METHOD cl_usmd_model_ext=>get_instance 14 EXPORTING 15 i_usmd_model = lc_model 16 IMPORTING 17 eo_instance = lo_model_ext. 18 IF lo_model_ext IS BOUND. 19 CALL METHOD lo_model_ext->read_char_value 20 EXPORTING 21 i_fieldname = usmd0_cs_fld-crequest 22 it_sel = VALUE usmd_ts_sel( ( sign = 'I' option = 'EQ' fieldname = usmd0_cs_fld-crequest low = iv_cr_number ) ) 23 IMPORTING 24 et_data = lt_entities. 25 LOOP AT lt_entities ASSIGNING FIELD-SYMBOL(<fs_entity>) 26 WHERE usmd_entity_obj = 'BP_HEADER' AND usmd_seqnr = '1'. "#EC CI_SORTSEQ 27 lv_partner = <fs_entity>-usmd_value. 28 ENDLOOP. 29 lv_entity = 'BP_VENGEN'. 30 lv_entity_name = lv_entity. 31 "GET data reference for bp_VENGEN 32 lo_model_ext->create_data_reference( 33 EXPORTING 34 i_fieldname = 'BP_VENGEN' " Field Name 35 i_struct = 'KATTR' " Structure 36 IMPORTING 37 er_data = lo_data 38 ). 39 ASSIGN lo_data->* TO <fs_t_vengen>. 40 IF <fs_t_vengen> IS ASSIGNED. 41 "get bp_centrl entity value 42 CALL METHOD lo_model_ext->read_char_value 43 EXPORTING 44 i_fieldname = lv_entity_name 45 it_sel = VALUE usmd_ts_sel( ( sign = 'I' option = 'EQ' fieldname = lv_entity low = lv_partner ) 46 ( sign = 'I' option = 'EQ' fieldname = 'BP_HEADER' low = lv_partner ) ) " Commented by Samar. 47 i_readmode = '4' 48 IMPORTING 49 et_data = <fs_t_vengen>. 50 IF <fs_t_vengen> IS INITIAL. 51 CALL METHOD lo_model_ext->read_char_value 52 EXPORTING 53 i_fieldname = lv_entity_name 54 it_sel = VALUE usmd_ts_sel( ( sign = 'I' option = 'EQ' fieldname = lv_entity low = lv_partner ) 55 ( sign = 'I' option = 'EQ' fieldname = 'BP_HEADER' low = lv_partner ) ) 56 IMPORTING 57 et_data = <fs_t_vengen>. 58 ENDIF. 59 IF <fs_t_vengen> IS NOT INITIAL. 60 LOOP AT <fs_t_vengen> ASSIGNING FIELD-SYMBOL(<fs_s_vengen>). 61 ASSIGN COMPONENT 'KTOKK' OF STRUCTURE <fs_s_vengen> TO <lfs_value>. 62 IF <lfs_value> IS ASSIGNED. 63 ev_ktokk = <lfs_value>. 64 UNASSIGN <lfs_value>. 65 ENDIF. 66 IF ev_ktokk IS INITIAL. 67 SELECT SINGLE ktokk FROM lfa1 INTO ev_ktokd WHERE lifnr = lv_partner. "#EC CI_SUBRC 68 ENDIF. 69 ENDLOOP. 70 ENDIF. 71 ENDIF. 72 lv_entity = 'BP_CUSGEN'. 73 lv_entity_name = lv_entity. 74 "GET data reference for bp_centrl 75 lo_model_ext->create_data_reference( 76 EXPORTING 77 i_fieldname = 'BP_CUSGEN' " Field Name 78 i_struct = 'KATTR' " Structure 79 IMPORTING 80 er_data = lo_data 81 ). 82 ASSIGN lo_data->* TO <fs_t_cusgen>. 83 IF <fs_t_cusgen> IS ASSIGNED. 84 "get bp_centrl entity value 85 CALL METHOD lo_model_ext->read_char_value 86 EXPORTING 87 i_fieldname = lv_entity_name 88 it_sel = VALUE usmd_ts_sel( ( sign = 'I' option = 'EQ' fieldname = lv_entity low = lv_partner ) 89 ( sign = 'I' option = 'EQ' fieldname = 'BP_HEADER' low = lv_partner ) ) 90 i_readmode = '4' 91 IMPORTING 92 et_data = <fs_t_cusgen>. 93 IF <fs_t_cusgen> IS INITIAL. 94 CALL METHOD lo_model_ext->read_char_value 95 EXPORTING 96 i_fieldname = lv_entity_name 97 it_sel = VALUE usmd_ts_sel( ( sign = 'I' option = 'EQ' fieldname = lv_entity low = lv_partner ) 98 ( sign = 'I' option = 'EQ' fieldname = 'BP_HEADER' low = lv_partner ) ) 99 IMPORTING 100 et_data = <fs_t_cusgen>. 101 ENDIF. 102 IF <fs_t_cusgen> IS NOT INITIAL. 103 LOOP AT <fs_t_cusgen> ASSIGNING FIELD-SYMBOL(<fs_s_cusgen>). 104 ASSIGN COMPONENT 'KTOKD' OF STRUCTURE <fs_s_cusgen> TO <lfs_value>. 105 IF <lfs_value> IS ASSIGNED. 106 ev_ktokd = <lfs_value>. 107 UNASSIGN <lfs_value>. 108 ENDIF. 109 IF ev_ktokd IS INITIAL. 110 SELECT SINGLE ktokd FROM kna1 INTO ev_ktokd WHERE kunnr = lv_partner. "#EC CI_SUBRC 111 ENDIF. 112 ENDLOOP. 113 ENDIF. 114 ENDIF. 115 116 ENDIF. 117ENDMETHOD.

The remaining configuration, implementation details, and testing guidance continue from this answer more…

Related questions and keywords

Alternative questions

  • How do I read BP_VENGEN and BP_CUSGEN from an MDG change request?
  • How can I derive KTOKK and KTOKD from a BP change request in MDG?
  • What is the ABAP pattern to get account group values from an MDG BP change request?

Possible questions

  • How do I read BP_VENGEN and BP_CUSGEN from a change request?
  • How can I derive KTOKK and KTOKD from a BP change request in MDG?
  • What is the ABAP pattern to get account group values from an MDG BP change request?
  • Which MDG model and entities are used for BP account group derivation?
  • What is the fallback logic if KTOKK or KTOKD is not found in the BP entities?

Keywords

SAP MDGBusiness PartnerBPaccount groupKTOKKKTOKDCL_USMD_MODEL_EXTread_char_valuecreate_data_referenceUSMD0_CS_FLD-CREQUESTBP_HEADERBP_VENGENBP_CUSGENLFA1KNA1