SAP MDG · CONSOLIDATION
How can CL_MDC_DATA_BP be enhanced to support custom Business Partner consolidation tables in SAP MDG?
Example Code: Consolidation Custom Table BP Customer Supplier
This document describes two custom SAP MDG Business Partner consolidation classes:
SAP MDG Consolidation – Custom BP Data and Model Classes
Scope
This document describes two custom SAP MDG Business Partner consolidation classes:
1. ZCL_MDC_DATA_BP – data-layer extension for custom BP consolidation objects. 2. ZCL_MDC_MODEL_BP – model-layer extension for reading, mapping, validating, and saving custom BP data.
The source has been cleaned so that comments contain only functional information. Personal names, project/change-history metadata, transport references, and defect identifiers have been removed.
Technical note: DDIC fields and framework attributes namedCLIENT,MANDT,active_client_field, orclient_fieldare retained because they are executable technical elements of the implementation, not documentary references to an implementation customer.
1. Class ZCL_MDC_DATA_BP
1.1 Purpose
ZCL_MDC_DATA_BP extends SAP standard class CL_MDC_DATA_BP to provide data-layer metadata and active-record handling for custom Business Partner consolidation objects.
The class primarily supports:
- Custom supplier tax-classification data. - Custom address-remark data. - Custom duplicate-detection data. - Mapping between active tables, source tables, process tables, key structures, attribute structures, and DDIC table types.
1.2 Inheritance
- Superclass: CL_MDC_DATA_BP - Redefined interface: IF_MDC_DATA
The standard superclass behavior is retained as the fallback for objects that are not explicitly handled by the custom class.
1.3 Main Methods
IF_MDC_DATA~APPEND_ACTIVE_RECORDS
Appends active-area records for source keys participating in the consolidation process.
Current explicit routing:
- ZMDG_T_IDPLBPTAX → APPEND_SUPPLIER_DATA - ZMDG_T_ADRT → APPEND_ADDRESS_DATA - Other objects → standard superclass implementation
APPEND_ZNPSCDUP_DATA
Reads duplicate-related active data by Business Partner number and appends corresponding records to the generic MDC record buffer.
The method joins:
- BUT000 - ZMDG_BP_ZNPSCDUP
using PARTNER, and maps the Business Partner number to SOURCE_ID.
Implementation note: the method is defined and implemented, but the current APPEND_ACTIVE_RECORDS method does not contain an explicit ZMDG_BP_ZNPSCDUP branch calling it.
IF_MDC_DATA~ATTRIBUTE_STRUCTURE_NAME
Returns the custom attribute structure associated with a custom consolidation object.
Custom mappings include:
- ZMDG_T_IDPLBPTAX → ZMDC_ZMDG_T_IDPLBPTAX_ATTRIBUT - ZMDG_BP_ZNPSCDUP → ZMDC_ZMDG_BP_ZNPSCDUP_ATTR
IF_MDC_DATA~KEY_STRUCTURE_NAME
Returns the corresponding DDIC key structure.
Custom mappings include:
- ZMDG_T_IDPLBPTAX → ZMDC_ZMDG_T_IDPLBPTAX_KEY - ZMDG_BP_ZNPSCDUP → ZMDC_ZMDG_BP_ZNPSCDUP_KEY
IF_MDC_DATA~TABLE_NAME_BY_TYPE
Defines source/process persistence tables and key-field metadata for custom MDC objects.
For ZMDG_T_IDPLBPTAX:
- Source table: ZZMDG_T_IDPL_SRC - Process table: ZZMDG_T_IDPL_PRC - Source identifier: LIFNR
For ZMDG_BP_ZNPSCDUP:
- Source table: ZMDG_BP_DUP_SRC - Process table: ZMDG_BP_DUP_PRC - Source identifier: PARTNER
IF_MDC_DATA~TABLE_TYPE_NAME_BY_TYPE
Provides the DDIC table-type names corresponding to source and process tables.
1.4 Functional Flow
Source Keys
|
v
IF_MDC_DATA~APPEND_ACTIVE_RECORDS
|
+-- Tax Classification --> APPEND_SUPPLIER_DATA
|
+-- Address Remarks -----> APPEND_ADDRESS_DATA
|
+-- Other Objects -------> Standard CL_MDC_DATA_BPThe metadata methods independently resolve the DDIC structures and persistence objects required by the MDC framework.
1.5 Complete Cleaned Code – ZCL_MDC_DATA_BP
CLASS zcl_mdc_data_bp DEFINITION
PUBLIC
INHERITING FROM cl_mdc_data_bp
CREATE PUBLIC.
PUBLIC SECTION.
METHODS if_mdc_data~append_active_records
REDEFINITION.
METHODS if_mdc_data~attribute_structure_name
REDEFINITION.
METHODS if_mdc_data~key_structure_name
REDEFINITION.
METHODS if_mdc_data~table_name_by_type
REDEFINITION.
METHODS if_mdc_data~table_type_name_by_type
REDEFINITION.
PROTECTED SECTION.
METHODS append_znpscdup_data
IMPORTING
!it_bp_source_keys TYPE tt_bp_source_keys.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_mdc_data_bp IMPLEMENTATION.
METHOD append_znpscdup_data.
FIELD-SYMBOLS <fss_records> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fss_znpscdup> TYPE zmdc_tt_zmdg_bp_znpscdup_prc.
ASSIGN me->records->* TO <fss_records>.
IF <fss_records> IS ASSIGNED.
SELECT a~partner AS source_id,
b~*
APPENDING CORRESPONDING FIELDS OF TABLE @<fss_records>
FROM but000 AS a
INNER JOIN zmdg_bp_znpscdup AS b
ON b~partner = a~partner
FOR ALL ENTRIES IN @it_bp_source_keys
WHERE a~partner = @it_bp_source_keys-source_id.
ENDIF.
ASSIGN me->records->* TO <fss_znpscdup>.
ENDMETHOD.
METHOD if_mdc_data~append_active_records.
DATA lt_bp_source_keys TYPE tt_bp_source_keys.
CHECK me->process_relevant = abap_true.
CHECK it_source_keys IS NOT INITIAL.
lt_bp_source_keys = CONV #( it_source_keys ).
CASE me->table_name.
WHEN 'ZMDG_T_IDPLBPTAX'.
me->append_supplier_data( lt_bp_source_keys ).
WHEN 'ZMDG_T_ADRT'.
me->append_address_data( lt_bp_source_keys ).
WHEN OTHERS.
super->if_mdc_data~append_active_records( it_source_keys ).
ENDCASE.
ENDMETHOD.
METHOD if_mdc_data~attribute_structure_name.
CALL METHOD super->if_mdc_data~attribute_structure_name
EXPORTING
iv_name_prefixing = iv_name_prefixing
RECEIVING
rv_structure_name = rv_structure_name.
CASE me->table_name.
WHEN 'ZMDG_T_IDPLBPTAX'.
rv_structure_name = 'ZMDC_ZMDG_T_IDPLBPTAX_ATTRIBUT'.
WHEN 'ZMDG_BP_ZNPSCDUP'.
rv_structure_name = 'ZMDC_ZMDG_BP_ZNPSCDUP_ATTR'.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
METHOD if_mdc_data~key_structure_name.
CALL METHOD super->if_mdc_data~key_structure_name
EXPORTING
iv_name_prefixing = iv_name_prefixing
RECEIVING
rv_structure_name = rv_structure_name.
CASE me->table_name.
WHEN 'ZMDG_T_IDPLBPTAX'.
rv_structure_name = 'ZMDC_ZMDG_T_IDPLBPTAX_KEY'.
WHEN 'ZMDG_BP_ZNPSCDUP'.
rv_structure_name = 'ZMDC_ZMDG_BP_ZNPSCDUP_KEY'.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
METHOD if_mdc_data~table_name_by_type.
CALL METHOD super->if_mdc_data~table_name_by_type
EXPORTING
iv_type = iv_type
RECEIVING
rv_table_name = rv_table_name.
CASE me->table_name.
WHEN 'ZMDG_T_IDPLBPTAX'.
me->active_client_field = 'MANDT'.
me->client_field = 'CLIENT'.
me->source_id_field = 'LIFNR'.
CASE iv_type.
WHEN if_mdc_data=>gc_type-source.
rv_table_name = 'ZZMDG_T_IDPL_SRC'.
WHEN if_mdc_data=>gc_type-process.
rv_table_name = 'ZZMDG_T_IDPL_PRC'.
ENDCASE.
WHEN 'ZMDG_BP_ZNPSCDUP'.
me->active_client_field = 'CLIENT'.
me->client_field = 'CLIENT'.
me->source_id_field = 'PARTNER'.
CASE iv_type.
WHEN if_mdc_data=>gc_type-source.
rv_table_name = 'ZMDG_BP_DUP_SRC'.
WHEN if_mdc_data=>gc_type-process.
rv_table_name = 'ZMDG_BP_DUP_PRC'.
ENDCASE.
ENDCASE.
ENDMETHOD.
METHOD if_mdc_data~table_type_name_by_type.
CALL METHOD super->if_mdc_data~table_type_name_by_type
EXPORTING
iv_type = iv_type
RECEIVING
rv_table_type_name = rv_table_type_name.
CASE me->table_name.
WHEN 'ZMDG_T_IDPLBPTAX'.
CASE iv_type.
WHEN if_mdc_data=>gc_type-source.
rv_table_type_name = 'ZMDC_TT_ZZMDG_T_IDPL_SRC'.
WHEN if_mdc_data=>gc_type-process.
rv_table_type_name = 'ZMDC_TT_ZZMDG_T_IDPL_PRC'.
ENDCASE.
WHEN 'ZMDG_BP_ZNPSCDUP'.
CASE iv_type.
WHEN if_mdc_data=>gc_type-source.
rv_table_type_name = 'ZMDC_TT_ZMDG_BP_ZNPSCDUP_SRC'.
WHEN if_mdc_data=>gc_type-process.
rv_table_type_name = 'ZMDC_TT_ZMDG_BP_ZNPSCDUP_PRC'.
ENDCASE.
ENDCASE.
ENDMETHOD.
ENDCLASS.
2. Class ZCL_MDC_MODEL_BP
2.1 Purpose
ZCL_MDC_MODEL_BP extends SAP standard class CL_MDC_MODEL_BP and adds model-level handling for custom Business Partner consolidation data.
The class performs five main responsibilities:
1. Reads custom process data into model references. 2. Exposes MDC data objects to the model. 3. Maps custom consolidation data into the CVI external API structure. 4. Performs configurable processing before standard model validation. 5. Saves custom active-area data after Business Partner activation.
2.2 Inheritance
- Superclass: CL_MDC_MODEL_BP - Redefined interface method: IF_MDC_MODEL~CHECK
The class also redefines several protected framework methods used by BP consolidation processing.
2.3 Main Data References
The model keeps process-data references for:
- ZMDG_T_IDPLBPTAX - ZMDG_T_ADRT - BUT020 - ZMDG_BP_ZNPSCDUP
These references are populated by READ_ALL_DATA and subsequently consumed during API mapping and active-data persistence.
2.4 Main Methods
EXPOSE_DATA_OBJECT
Calls the standard model implementation first.
For custom objects that are managed explicitly by this class, dynamic member exposure is bypassed. Other data objects continue through the generic superclass-compatible dynamic member assignment.
IF_MDC_MODEL~CHECK
Performs a configurable VIES-check decision before delegating to the SAP standard model check.
Functional sequence:
1. Determine the current master-data-change process type. 2. Check configuration in ZMDG_C_UTILITY. 3. If the process type is configured to skip VIES validation, call BUPA_SKIP_VIES_CHECK. 4. Execute the standard CL_MDC_MODEL_BP validation.
The standard model check remains the primary validation routine.
READ_ALL_DATA
Executes the standard read and explicitly loads process data for:
- Supplier tax classification - Address remarks - BP address mapping - Duplicate-related custom data
MAP_EXTENSIONS_2API
Extends the CVI API payload generated by the superclass.
It handles three custom areas:
Supplier Tax Classification
- Filters process records for the current process key. - Matches supplier company-code data. - Maps validity dates and payment type. - Sets API insert/modify tasks. - Sets change indicators.
Communication Remarks
Maps address communication remarks using:
- Address number from custom remark data. - Address GUID relationship from BUT020. - CVI address communication nodes.
Supported communication types include:
- E-mail - Telephone - Fax
The method inserts or updates the first remark record and sets the corresponding DATAX indicators.
Duplicate-Related BP Extension
Maps custom duplicate data into the BP API extension structure.
Mapped values include:
- Master identifier - Duplicate flag - Additional duplicate-related indicators - Business Partner number
The API task is derived from the BP object task.
SAVE_BUSINESS_PARTNER_ACTIVE
Executes the standard BP active save and then synchronizes custom active data.
Its main responsibilities are:
- Optionally suppress BP replication for configured process types. - Collect successful CVI target records. - Resolve BP/vendor keys. - Read the current tax-classification database state. - Apply insert, update, delete, and modify semantics. - Call Z_MDG_UPDATE_TAX_TYPE. - Invoke SAVE_ZNPSCDUP_ACTIVE.
SAVE_ZNPSCDUP_ACTIVE
Synchronizes custom duplicate data to ZMDG_BP_ZNPSCDUP.
Functional sequence:
1. Collect successfully processed CVI BP records. 2. Read current duplicate data from the database. 3. Resolve the active Business Partner number. 4. Read process records for the current source ID. 5. Build the desired active-state records. 6. Merge new/changed records into the current state. 7. Call ZMDG_UPDATE_ZNPSCDUP with current and database states.
2.5 External Dependencies
The implementation directly depends on the following custom or SAP objects:
Custom Tables / Views / Structures
- ZMDG_T_IDPLBPTAX - ZMDG_T_ADRT - ZMDG_BP_ZNPSCDUP - ZMDG_BP_DUP_PRC - ZMDG_C_UTILITY - ZZMDG_T_IDPL_PRC - Custom MDC table types and CVI extension structures
SAP Objects
- BUT000 - BUT020 - C_MASTERDATACHANGEPROCESS - CL_MDC_MODEL_BP - CVI external BP structures - BUPA_NUMBERS_GET - BUPA_SKIP_VIES_CHECK
Custom Function Modules / Classes
- Z_MDG_UPDATE_TAX_TYPE - ZMDG_UPDATE_ZNPSCDUP - ZCL_MDG_REPL_CONTROL_FRMWORK
2.6 High-Level Processing Flow
READ_ALL_DATA
|
v
Custom process-data references
|
v
MAP_EXTENSIONS_2API
|
+--> Tax classification
+--> Communication remarks
+--> Duplicate extension
|
v
Standard / configurable validation
|
v
SAVE_BUSINESS_PARTNER_ACTIVE
|
+--> Standard BP activation
+--> Custom tax synchronization
+--> Duplicate-data synchronization2.7 Complete Cleaned Code – ZCL_MDC_MODEL_BP
class ZCL_MDC_MODEL_BP definition
public
inheriting from CL_MDC_MODEL_BP
create public .
public section.
methods IF_MDC_MODEL~CHECK
redefinition .
protected section.
data GR_ZMDG_T_IDPLBPTAX_PRC type ref to ZMDC_TT_ZZMDG_T_IDPL_PRC .
data GR_ZMDG_T_ADRT_PRC type ref to ZMDC_TT_ZZMDG_T_ADRT_PRC .
data GR_BUT020_PRC type ref to MDC_TT_BUT020_PRC .
data GR_ZMDG_BP_ZNPSCDUP_PRC type ref to ZMDC_TT_ZMDG_BP_ZNPSCDUP_PRC .
methods SAVE_ZNPSCDUP_ACTIVE .
methods EXPOSE_DATA_OBJECT
redefinition .
methods MAP_EXTENSIONS_2API
redefinition .
methods READ_ALL_DATA
redefinition .
methods SAVE_BUSINESS_PARTNER_ACTIVE
redefinition .
private section.
ENDCLASS.
CLASS ZCL_MDC_MODEL_BP IMPLEMENTATION.
METHOD expose_data_object.
* Content / Description / Remarks:
* Expose Data Object
* Title: CHECK
" 1. Determine whether VIES should be skipped based on config table
DATA(lv_skip_vies) = abap_false. " Default: Not to skip
" 2. Resolve the process template from the current process
SELECT SINGLE mdchgprocesstypeid
FROM c_masterdatachangeprocess
WHERE masterdatachangeprocess = @me->process_id
INTO @DATA(lv_process_type).
IF sy-subrc = 0.
SELECT SINGLE @abap_true
FROM zmdg_c_utility
WHERE data_model = 'BP'
AND req_type = 'VIES_CHECK'
AND req_id = 'SKIP_TEMPLATE'
AND low = @lv_process_type
INTO @DATA(lv_found).
IF sy-subrc = 0.
" Template found so skip the VIES Online Check
lv_skip_vies = abap_true.
ENDIF.
ENDIF.
" 3. Conditionally skip VIES
IF lv_skip_vies = abap_true.
CALL FUNCTION 'BUPA_SKIP_VIES_CHECK'
EXPORTING
iv_skip_vies_check = abap_true.
ENDIF.
" 4. Delegate to parent check (triggers VIES if not skipped)
TRY.
super->if_mdc_model~check( ).
CATCH cx_mdc_model. "#EC EMPTY_CATCH
ENDTRY.
ENDMETHOD.
METHOD map_extensions_2api.
* Content / Description / Remarks:
* Map BP Extensions to API
* Title: READ_ALL_DATA
CALL METHOD super->read_all_data
EXPORTING
it_source_keys = it_source_keys
iv_package_number = iv_package_number
iv_from_current_step = abap_false.
me->gr_zmdg_t_idplbptax_prc = CAST #( me->object( 'ZMDG_T_IDPLBPTAX' )->read( it_source_keys = it_source_keys iv_package_number = iv_package_number ) ).
me->gr_zmdg_t_adrt_prc = CAST #( me->object( 'ZMDG_T_ADRT' )->read( it_source_keys = it_source_keys iv_package_number = iv_package_number ) ).
me->gr_but020_prc = CAST #( me->object( 'BUT020' )->read( it_source_keys = it_source_keys iv_package_number = iv_package_number ) ).
me->gr_zmdg_bp_znpscdup_prc = CAST #( me->object( 'ZMDG_BP_ZNPSCDUP' )->read( it_source_keys = it_source_keys iv_package_number = iv_package_number ) ).
ENDMETHOD.
METHOD save_business_partner_active.
* Content / Description / Remarks:
* Save Business Partner to Active Area
* activation
* Title: SAVE_ZNPSCDUP_ACTIVE
DATA:
lt_cvi_ei_extern TYPE cvis_ei_extern_t,
lv_partner TYPE bu_partner,
lt_current_znpscdup TYPE TABLE OF zmdg_bp_znpscdup,
lt_db_znpscdup_all TYPE TABLE OF zmdg_bp_znpscdup,
lt_db_znpscdup TYPE TABLE OF zmdg_bp_znpscdup,
ls_znpscdup_data TYPE zmdg_bp_znpscdup,
lt_znpscdup_ins TYPE TABLE OF zmdg_bp_znpscdup,
lt_znpscdup_upd TYPE TABLE OF zmdg_bp_znpscdup,
lt_znpscdup_del TYPE TABLE OF zmdg_bp_znpscdup,
lt_znpscdup_mod TYPE TABLE OF zmdg_bp_znpscdup.
FIELD-SYMBOLS:
\<fss_cvi_extern> LIKE LINE OF mt_cvi_ei_extern,
\<fss_cvi_ext> TYPE cvis_ei_extern,
\<fss_bp_keys> LIKE LINE OF mt_bp_keys,
\<fss_znpscdup> TYPE zmdg_bp_dup_prc,
\<fss_znpscdup_data> TYPE zmdg_bp_znpscdup,
\<fss_znpscdup_db> TYPE zmdg_bp_znpscdup.
" Get CVI external data
LOOP AT me->mt_cvi_ei_extern ASSIGNING \<fss_cvi_extern> WHERE target = '1'.
APPEND \<fss_cvi_extern>-data TO lt_cvi_ei_extern.
ENDLOOP.
IF lt_cvi_ei_extern IS INITIAL.
RETURN.
ENDIF.
" Get existing ZNPSCDUP data from database
IF me->mt_bp_keys IS NOT INITIAL.
SELECT * FROM zmdg_bp_znpscdup
INTO TABLE lt_db_znpscdup_all
FOR ALL ENTRIES IN me->mt_bp_keys
WHERE partner = me->mt_bp_keys-partner.
ENDIF.
" Process each BP
LOOP AT lt_cvi_ei_extern ASSIGNING \<fss_cvi_ext>.
CLEAR:lt_znpscdup_mod, lv_partner.
READ TABLE me->mt_bp_keys ASSIGNING \<fss_bp_keys>
WITH KEY partner_guid = CONV bu_partner_guid( \<fss_cvi_ext>-partner-header-object_instance-bpartnerguid ).
CHECK sy-subrc = 0.
IF \<fss_bp_keys>-partner IS INITIAL.
CALL FUNCTION 'BUPA_NUMBERS_GET'
EXPORTING
iv_partner_guid = CONV bu_partner_guid( \<fss_cvi_ext>-partner-header-object_instance-bpartnerguid )
IMPORTING
ev_partner = lv_partner.
ELSE.
lv_partner = \<fss_bp_keys>-partner.
ENDIF.
" Get DB-state before update
MOVE-CORRESPONDING lt_db_znpscdup_all TO lt_db_znpscdup.
DELETE lt_db_znpscdup WHERE partner <> lv_partner.
" Get current process data for this BP
DATA(lt_znpscdup_prc) = VALUE zmdc_tt_zmdg_bp_znpscdup_prc( FOR ls_znps IN me->gr_zmdg_bp_znpscdup_prc->*
WHERE ( source_id = \<fss_bp_keys>-source_id ) ( ls_znps ) ).
" Build current data from process records
LOOP AT lt_znpscdup_prc ASSIGNING \<fss_znpscdup>.
APPEND VALUE #( client = sy-mandt
partner = lv_partner
zmastid = \<fss_znpscdup>-zmastid
zisdupflg = \<fss_znpscdup>-zisdupflg
zrisechon = \<fss_znpscdup>-zrisechon
zriseext = \<fss_znpscdup>-zriseext ) TO lt_znpscdup_mod.
ENDLOOP.
" Merge current and DB data
APPEND LINES OF lt_db_znpscdup TO lt_current_znpscdup.
" Apply modifications
LOOP AT lt_znpscdup_mod ASSIGNING \<fss_znpscdup_data>. "#EC CI_NESTED
READ TABLE lt_current_znpscdup WITH KEY partner = \<fss_znpscdup_data>-partner
zmastid = \<fss_znpscdup_data>-zmastid
ASSIGNING \<fss_znpscdup_db>.
IF sy-subrc = 0.
\<fss_znpscdup_db> = \<fss_znpscdup_data>.
ELSE.
INSERT \<fss_znpscdup_data> INTO TABLE lt_current_znpscdup.
ENDIF.
ENDLOOP.
ENDLOOP.
" Call function module to update database
IF lt_current_znpscdup IS NOT INITIAL OR lt_db_znpscdup IS NOT INITIAL.
CALL FUNCTION 'ZMDG_UPDATE_ZNPSCDUP'
EXPORTING
it_current_znpscdup = lt_current_znpscdup
it_database_znpscdup = lt_db_znpscdup_all
EXCEPTIONS
OTHERS = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.
Referenced tables
| Object | Purpose |
|---|---|
LT_DB_ZNPSCDUP_ALL | Open table LT_DB_ZNPSCDUP_ALL. |
LT_CURRENT_ZNPSCDUP | Open table LT_CURRENT_ZNPSCDUP. |
The remaining configuration, implementation details, and testing guidance continue from this answer more…
Related questions and keywords
Alternative questions
- What is the example code for extending CL_MDC_MODEL_BP to handle custom BP data during consolidation and activation?
- How can custom source tables, process tables, key structures, and attribute structures be mapped in an MDC data class?
- How can custom Business Partner fields and entities be mapped into the CVI API structure during MDG consolidation?
- How can custom BP data be read from the consolidation process and saved back to active custom tables after activation?
- Example code for CL_MDC_DATA_BP enhancement for custom consolidation entities
- Example code for CL_MDC_MODEL_BP enhancement in SAP MDG consolidation
Possible questions
- What is the example code for extending CL_MDC_MODEL_BP to handle custom BP data during consolidation and activation?
- How can custom source tables, process tables, key structures, and attribute structures be mapped in an MDC data class?
- How can custom Business Partner fields and entities be mapped into the CVI API structure during MDG consolidation?
- What configuration is required for Example Code: Consolidation Custom Table BP Customer Supplier?
- How can this SAP MDG scenario be tested?