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
- Call CL_USMD_MODEL_EXT=>GET_INSTANCE for model 'BP'.
- Read the change request entities with READ_CHAR_VALUE using USMD0_CS_FLD-CREQUEST.
- Find the BP_HEADER record with
USMD_SEQNR= '1' and store the partner number. - Create a data reference for BP_VENGEN with i_struct = 'KATTR'.
- Read BP_VENGEN using the partner and BP_HEADER selection.
- Extract KTOKK from the returned BP_VENGEN structure.
- If KTOKK is initial, fall back to SELECT SINGLE KTOKK FROM LFA1 WHERE LIFNR = lv_partner.
- 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
| Object | Purpose |
|---|---|
LFA1 | Fallback source for vendor account group KTOKK when BP_VENGEN does not provide a value. |
KNA1 | Fallback 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?