Technical Articles
How to replicate Location from SAP ERP to SAP Logistics Business Network
Introduction
In SAP ERP systems the location objects are not unified. Location information resides in individual data object such as Customer, Plant, Business Partner, Shipping Point, Vendor and many more. For SAP Logistics Business Network Global Track and Trace option , the location master data from S/4 can synchronised out of the box since the location object is unified and extraction of location data via web service in already delivered. However, in SAP ERP it is not case. If you still have a need to replicate location in SAP ERP, you may utilise the information mentioned in this blog to do so.
Location replication is achieved via SOAP webservice LocationBulkReplicateRequest_Out. This service is available in SAP ERP Since EHP7 onwards. By utilizing this interface and DRF replication framework, you can still replicate all necessary objects. In this blog we will provide information on location objects for below listed master data
- Plant
- Shipping Point
- Business Partner
- Vendor
- Customer
Replication Plant and Shipping Point
Plant and shipping point, the implementation of DRF already exists. You may follow the steps already documented in the configuration guide here https://help.sap.com/viewer/b4724b2f483e439782b60cab4407c25a/LBN/en-US/86120107c3004203a5ff0c79643199a9.html Within manage location section.
However, use below listed BO Type and Outbound implementation for respecitive objects
Plant:
- BO Type: 464
- Outbound Implementation: 464_L
Shipping Point:
- BO Type: DRF_0045
- Outbound Implementation: DRF_0045
Replication of Business Partner
To achieve Business Partner replication, additional ABAP development needs to be done. Below objects must be created to achieve it.
Structure
- ZDRF_S_BP_OUTBOUND
Table Type
- ZDRF_T_BP_OUTBOUND
Class:
- ZCL_BP_LOC_DRF_OUTBOUND
- ZCL_BP_LOC_DRF_EXPL_FILTER
Structure: ZDRF_S_BP_OUTBOUND
Table Type: ZDRF_T_BP_OUTBOUND
Creation of Classes
Go to transaction se24 and create a new class with name as mentioned above(You might use any name. But make sure you adjust name in the source code as well). Use the default options while creating the class. Switch the editor to “Source Code-Based” by clicking on the corresponding button in the tool bar. Copy below source code and paste it to the class source code based-editor.
Class: ZCL_BP_LOC_DRF_OUTBOUND
class ZCL_BP_LOC_DRF_OUTBOUND definition
public
final
create public .
public section.
interfaces IF_DRF_OUTBOUND .
PROTECTED SECTION.
TYPES:
BEGIN OF tys_bp_data,
partner TYPE bu_partner,
bu_langu TYPE bu_langu,
addrnumber TYPE ad_addrnum,
END OF tys_bp_data .
TYPES:
tt_bp_data TYPE STANDARD TABLE OF tys_bp_data .
TYPES:
BEGIN OF tys_bp_data_txt,
spras TYPE spras,
partner TYPE bu_partner,
vtext TYPE vtext,
END OF tys_bp_data_txt .
TYPES:
tt_bp_data_txt TYPE STANDARD TABLE OF tys_bp_data_txt .
TYPES:
BEGIN OF tys_partner,
partner TYPE bu_partner,
END OF tys_partner .
DATA mt_bp_address TYPE szadr_addr1_table .
DATA mt_bp_data TYPE tt_bp_data .
DATA mt_bp_data_txt TYPE tt_bp_data_txt .
DATA ms_runtime_parameter TYPE drf_s_runtime_parameter_ext .
DATA ms_loc_bulk_repl_req TYPE loc_bulk_replication_req .
CONSTANTS mc_t_drf_loc_outb TYPE string VALUE 'ZDRF_T_BP_OUTBOUND' ##NO_TEXT.
CONSTANTS mc_s_drf_loc_outbound TYPE string VALUE 'ZDRF_S_BP_OUTBOUND' ##NO_TEXT.
DATA mv_sender_bussystem_id TYPE sapplco_business_system_id .
DATA mv_receiver_bussystem_id TYPE sapplco_business_system_id .
private section.
methods FILL_MESSAGE_HEADER
exporting
!ES_MESSAGE_HEADER type SAPPLCO_BUS_DOC_MESSAGE_HEADER .
ENDCLASS.
CLASS ZCL_BP_LOC_DRF_OUTBOUND IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_BP_LOC_DRF_OUTBOUND->FILL_MESSAGE_HEADER
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_MESSAGE_HEADER TYPE SAPPLCO_BUS_DOC_MESSAGE_HEADER
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD FILL_MESSAGE_HEADER.
DATA:
lv_uuid TYPE char32,
lv_timestamp TYPE timestampl.
CLEAR es_message_header.
GET TIME STAMP FIELD lv_timestamp.
cl_gdt_conversion=>date_time_outbound(
EXPORTING
im_value_long = lv_timestamp
IMPORTING
ex_value = es_message_header-creation_date_time " Time Stamp According to ISO 8601
).
es_message_header-sender_business_system_id = mv_sender_bussystem_id.
es_message_header-recipient_business_system_id = mv_receiver_bussystem_id.
TRY.
lv_uuid = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error.
"Should never occur
ASSERT 1 = 0.
ENDTRY.
es_message_header-id-content = lv_uuid.
cl_gdt_conversion=>guid_outbound(
EXPORTING
im_guid_c = lv_uuid " GUID in Character Display
IMPORTING
ex_value = es_message_header-uuid-content " GUID / UUID in XML Display
).
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE DRF_T_BDCP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE MDG_CP_T_CP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<---] EV_SKIP_OBJECT TYPE ABAP_BOOL
* | [<-->] CR_RELEVANT_OBJECT TYPE REF TO DATA
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_PREPARE_DATA TYPE DATA
* | [<---] ER_PACKAGE_DATA TYPE DATA
* | [<---] ES_TASK_PARAM TYPE DRF_S_PARALLEL_TASK_PARAM
* | [<---] EV_ALL_TASKS_DONE TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ET_ADD_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [!CX!] CX_DRF_ENRICH_FILTER_PARAMETER
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~FINALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [--->] IT_ERRONEOUS_OBJECTS TYPE SORTED TABLE
* | [--->] IV_REPEATED_INITIAL_RUN TYPE BOOLE_D
* | [<---] EV_DELETE_CHANGE_POINTER TYPE BOOLE_D
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~FINALIZE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_BP_LOC_DRF_OUTBOUND=>IF_DRF_OUTBOUND~INITIALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_RUNTIME_PARAM TYPE DRF_S_RUNTIME_PARAMETER_EXT
* | [<---] EO_IF_DRF_OUTBOUND TYPE REF TO IF_DRF_OUTBOUND
* | [<---] ES_RUNTIME_PARAM_OUT_IMPL TYPE DRF_S_RUNTIME_PARAM_OUT_IMPL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~INITIALIZE.
**********************************************************************
* Initialization of the DRF Outbound Implementation for Location
* Replication
**********************************************************************
DATA: ls_runtime_parameter TYPE drf_s_runtime_param_out_impl,
lr_drf_loc_outbound TYPE REF TO zcl_bp_loc_drf_outbound.
**********************************************************************
* Initialize the exporting parameter
**********************************************************************
CLEAR: eo_if_drf_outbound,
es_runtime_param_out_impl.
**********************************************************************
* Create an instance of myself in order to remember the runtime
* parameters for all subsequent methods and pass it to the framework
**********************************************************************
TRY.
CREATE OBJECT lr_drf_loc_outbound.
CATCH cx_sy_create_object_error.
RETURN.
ENDTRY.
IF lr_drf_loc_outbound IS BOUND.
lr_drf_loc_outbound->ms_runtime_parameter = is_runtime_param.
ENDIF.
**********************************************************************
* Set own runtime parameter
**********************************************************************
ls_runtime_parameter-table_type_name = mc_t_drf_loc_outb.
es_runtime_param_out_impl = ls_runtime_parameter.
**********************************************************************
* Set Outbound Implementation
**********************************************************************
eo_if_drf_outbound = lr_drf_loc_outbound.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~MAP_DATA2MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_RELEVANT_OBJECT TYPE REF TO DATA
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~MAP_DATA2MESSAGE.
DATA:
lr_rel_obj TYPE REF TO zdrf_s_bp_outbound,
lv_timezone TYPE tznzone,
ls_loc_bulk TYPE sapplco_loc_blk_repl_req_msg,
ls_loc_repl_mess TYPE sapplco_loc_repl_req_msg,
lt_loc_repl_mess TYPE sapplco_loc_repl_req_msg_tab,
ls_loc_description TYPE sapplco_short_description,
lv_loc_form_name TYPE sapplco_languageindependent_me,
ls_loc_tel TYPE sapplco_telephone,
ls_loc_facs TYPE sapplco_facsimile,
ls_loc_email TYPE sapplco_nosc_email,
ls_loc_web TYPE sapplco_nosc_web,
ls_loc_address TYPE sapplco_nosc_address.
FIELD-SYMBOLS:
<ls_bp_addr1_data> TYPE addr1_data.
lr_rel_obj ?= ir_relevant_object.
* Fill Message Header for Bulk Service
fill_message_header(
IMPORTING
es_message_header = ls_loc_bulk-message_header ).
READ TABLE mt_bp_data ASSIGNING FIELD-SYMBOL(<ls_bp_data>)
WITH KEY partner = lr_rel_obj->partner.
IF sy-subrc NE 0.
RETURN.
ENDIF.
* Fill Message Header for Location Replication
fill_message_header(
IMPORTING
es_message_header = ls_loc_repl_mess-message_header ).
CONCATENATE 'BP_' <ls_bp_data>-partner INTO ls_loc_repl_mess-location-location_internal_id.
* Location Type Code for bpomer Location
ls_loc_repl_mess-location-location_type_code = '1021'.
**********************************************************************
* Address and Description
**********************************************************************
READ TABLE mt_bp_address ASSIGNING FIELD-SYMBOL(<ls_bp_addr_data>)
WITH KEY addrnumber = <ls_bp_data>-addrnumber.
IF sy-subrc <> 0.
* Error -> No Address found for the plant
ELSE.
LOOP AT <ls_bp_addr_data>-addr1_tab ASSIGNING FIELD-SYMBOL(<ls_bp_addr1>).
ASSIGN <ls_bp_addr1>-data TO <ls_bp_addr1_data>.
IF NOT ( <ls_bp_addr1_data>-date_from <= sy-datum AND
<ls_bp_addr1_data>-date_to >= sy-datum ).
* Not Valid Address
CONTINUE.
ENDIF.
* Description (NAME1 from Address is used as text) -> Here Description of Business Partner.
LOOP AT mt_bp_data_txt ASSIGNING FIELD-SYMBOL(<ls_bp_data_txt>) WHERE partner = <ls_bp_data>-partner.
CLEAR ls_loc_description.
ls_loc_description-language_code = <ls_bp_data_txt>-spras.
ls_loc_description-content = <ls_bp_data_txt>-vtext.
INSERT ls_loc_description INTO TABLE ls_loc_repl_mess-location-description.
ENDLOOP.
* Time Zone
IF <ls_bp_addr1_data>-time_zone IS NOT INITIAL.
ls_loc_repl_mess-location-time_zone_code = <ls_bp_addr1_data>-time_zone.
ELSE.
CALL FUNCTION 'TZON_LOCATION_TIMEZONE'
EXPORTING
if_country = <ls_bp_addr1_data>-country
if_region = <ls_bp_addr1_data>-region
IMPORTING
ef_timezone = lv_timezone
EXCEPTIONS
no_timezone_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR ls_loc_repl_mess-location-time_zone_code.
ELSE.
ls_loc_repl_mess-location-time_zone_code = lv_timezone.
ENDIF.
ENDIF.
**********************************************************************
* Organization formatted Name
**********************************************************************
ls_loc_address-organisation_form_of_address-code = <ls_bp_addr1_data>-title.
IF <ls_bp_addr1_data>-name1 IS NOT INITIAL.
lv_loc_form_name = <ls_bp_addr1_data>-name1.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_bp_addr1_data>-name2 IS NOT INITIAL.
lv_loc_form_name = <ls_bp_addr1_data>-name2.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_bp_addr1_data>-name3 IS NOT INITIAL.
lv_loc_form_name = <ls_bp_addr1_data>-name3.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_bp_addr1_data>-name4 IS NOT INITIAL.
lv_loc_form_name = <ls_bp_addr1_data>-name4.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_bp_addr1_data>-name_txt IS NOT INITIAL.
lv_loc_form_name = <ls_bp_addr1_data>-name_txt.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
**********************************************************************
* Physical Address
**********************************************************************
ls_loc_address-physical_address-country_code = <ls_bp_addr1_data>-country.
ls_loc_address-physical_address-country_name-language_code = <ls_bp_addr1_data>-langu.
ls_loc_address-physical_address-region_code = <ls_bp_addr1_data>-region.
ls_loc_address-physical_address-city_name = <ls_bp_addr1_data>-city1.
ls_loc_address-physical_address-additional_city_name = <ls_bp_addr1_data>-home_city.
ls_loc_address-physical_address-pobox_country_code = <ls_bp_addr1_data>-po_box_cty.
ls_loc_address-physical_address-pobox_region_code = <ls_bp_addr1_data>-po_box_reg.
ls_loc_address-physical_address-pobox_id = <ls_bp_addr1_data>-po_box.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr1_data>-po_box_num " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_address-physical_address-pobox_indicator ). " XSD:Indicator
ls_loc_address-physical_address-street_postal_code = <ls_bp_addr1_data>-post_code1.
ls_loc_address-physical_address-pobox_postal_code = <ls_bp_addr1_data>-post_code2.
ls_loc_address-physical_address-company_postal_code = <ls_bp_addr1_data>-post_code3.
ls_loc_address-physical_address-house_id = <ls_bp_addr1_data>-house_num1.
ls_loc_address-physical_address-additional_house_id = <ls_bp_addr1_data>-house_num2.
ls_loc_address-physical_address-district_name = <ls_bp_addr1_data>-city2.
ls_loc_address-physical_address-building_id = <ls_bp_addr1_data>-building.
ls_loc_address-physical_address-floor_id = <ls_bp_addr1_data>-floor.
ls_loc_address-physical_address-room_id = <ls_bp_addr1_data>-roomnumber.
ls_loc_address-physical_address-street_name = <ls_bp_addr1_data>-street.
IF <ls_bp_addr1_data>-str_suppl1 IS NOT INITIAL OR <ls_bp_addr1_data>-str_suppl2 IS NOT INITIAL.
INSERT <ls_bp_addr1_data>-str_suppl1 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
INSERT <ls_bp_addr1_data>-str_suppl2 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
ENDIF.
IF <ls_bp_addr1_data>-str_suppl3 IS NOT INITIAL OR <ls_bp_addr1_data>-location IS NOT INITIAL.
INSERT <ls_bp_addr1_data>-str_suppl3 INTO TABLE ls_loc_address-physical_address-street_suffix_name.
INSERT <ls_bp_addr1_data>-location INTO TABLE ls_loc_address-physical_address-street_suffix_name.
ENDIF.
* Office
ls_loc_address-office-building_id = <ls_bp_addr1_data>-building.
ls_loc_address-office-floor_id = <ls_bp_addr1_data>-floor.
ls_loc_address-office-room_id = <ls_bp_addr1_data>-roomnumber.
* Communication
ls_loc_address-communication-correspondence_language_code = <ls_bp_addr1_data>-langu.
* Phone
LOOP AT <ls_bp_addr_data>-adtel_tab ASSIGNING FIELD-SYMBOL(<ls_bp_addr_adtel_data>).
CLEAR ls_loc_tel.
ls_loc_tel-number-country_code = <ls_bp_addr_adtel_data>-adtel-country.
ls_loc_tel-number-subscriber_id = <ls_bp_addr_adtel_data>-adtel-tel_number.
ls_loc_tel-number-extension_id = <ls_bp_addr_adtel_data>-adtel-tel_extens.
ls_loc_tel-number-country_code = <ls_bp_addr_adtel_data>-adtel-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr_adtel_data>-adtel-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-number_default_indicator ). " XSD:Indicator
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr_adtel_data>-adtel-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-smsenabled_indicator ). " XSD:Indicator
INSERT ls_loc_tel INTO TABLE ls_loc_address-communication-telephone.
ENDLOOP.
* Fax
LOOP AT <ls_bp_addr_data>-adfax_tab ASSIGNING FIELD-SYMBOL(<ls_bp_addr_adfax_data>).
ls_loc_facs-number-country_code = <ls_bp_addr_adfax_data>-adfax-country.
ls_loc_facs-number-subscriber_id = <ls_bp_addr_adfax_data>-adfax-fax_number.
ls_loc_facs-number-extension_id = <ls_bp_addr_adfax_data>-adfax-fax_extens.
ls_loc_facs-number-country_code = <ls_bp_addr_adfax_data>-adfax-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr_adfax_data>-adfax-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_facs-number_default_indicator ). " XSD:Indicator
INSERT ls_loc_facs INTO TABLE ls_loc_address-communication-facsimile.
ENDLOOP.
* E-mail
LOOP AT <ls_bp_addr_data>-adsmtp_tab ASSIGNING FIELD-SYMBOL(<ls_bp_addr_adsmtp_data>).
CLEAR ls_loc_email.
ls_loc_email-uri = <ls_bp_addr_adsmtp_data>-adsmtp-smtp_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr_adsmtp_data>-adsmtp-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_email-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_email INTO TABLE ls_loc_address-communication-email.
ENDLOOP.
* Web
LOOP AT <ls_bp_addr_data>-aduri_tab ASSIGNING FIELD-SYMBOL(<ls_bp_addr_aduri>).
IF <ls_bp_addr_aduri>-aduri-uri_type = 'HPG' . " Location Type HPG(Homepage) is transffered only
CLEAR ls_loc_web.
ls_loc_web-uri = <ls_bp_addr_aduri>-aduri-uri_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_bp_addr_aduri>-aduri-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_web-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_web INTO TABLE ls_loc_address-communication-web.
ENDIF.
ENDLOOP.
* Only one valid address
ls_loc_repl_mess-location-address = ls_loc_address.
EXIT.
ENDLOOP.
ENDIF.
ms_loc_bulk_repl_req-location_bulk_replication_req-message_header = ls_loc_bulk-message_header.
INSERT ls_loc_repl_mess INTO TABLE lt_loc_repl_mess.
INSERT LINES OF lt_loc_repl_mess INTO TABLE ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~READ_COMPLETE_DATA
* +-------------------------------------------------------------------------------------------------+
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~READ_COMPLETE_DATA.
**********************************************************************
* Read the data of all records that shall be replicated later on
* via the new Location Service.
**********************************************************************
DATA:
lt_bus_sys_tech TYPE mdg_t_bus_sys_tech,
lv_own_business_system TYPE text60,
ls_partner TYPE tys_partner,
lt_partner TYPE TABLE OF tys_partner,
lt_adrc TYPE szadr_adrc_table,
ls_adrc TYPE szadr_st_adrc,
lt_addr_error TYPE szadr_error_table.
FIELD-SYMBOLS:
<ls_bp_data> TYPE tys_bp_data,
<ls_loc_drf_outbound> TYPE any,
<lv_comp> TYPE any.
**********************************************************************
* Get Business System Data
**********************************************************************
* Get own Logical System
CALL FUNCTION 'LCR_GET_OWN_BUSINESS_SYSTEM'
IMPORTING
bs_key_name = lv_own_business_system
EXCEPTIONS
no_business_system = 1
no_rfc_destination = 2
no_landscape_directory = 3
illegal_arguments = 4
communication_error = 5
ld_error = 6
sld_api_exception = 7
OTHERS = 8.
IF sy-subrc NE 0.
RETURN. " RAISE no_business_system.
ENDIF.
mv_sender_bussystem_id = lv_own_business_system.
CALL METHOD cl_drf_access_cust_data=>select_business_sys_for_appl
EXPORTING
iv_appl = ms_runtime_parameter-appl
iv_outb_impl = ms_runtime_parameter-outb_impl
IMPORTING
et_bus_sys_tech = lt_bus_sys_tech.
READ TABLE lt_bus_sys_tech ASSIGNING FIELD-SYMBOL(<ls_bus_sys_tech>) INDEX 1. "#EC CI_NOORDER
mv_receiver_bussystem_id = <ls_bus_sys_tech>-business_system.
**********************************************************************
* Build up table lt_partner
**********************************************************************
LOOP AT ct_relevant_objects ASSIGNING <ls_loc_drf_outbound>.
CLEAR ls_partner.
UNASSIGN <lv_comp>.
ASSIGN COMPONENT 'partner' OF STRUCTURE <ls_loc_drf_outbound> TO <lv_comp>.
IF sy-subrc = 0 AND <lv_comp> IS ASSIGNED.
ls_partner = <lv_comp>.
INSERT ls_partner INTO TABLE lt_partner.
ENDIF.
ENDLOOP.
**********************************************************************
* Retrieve Data of bpier general data
**********************************************************************
IF lt_partner IS NOT INITIAL.
SELECT a~partner a~bu_langu b~addrnumber
FROM but000 as a
LEFT OUTER JOIN but020 as b
on a~partner = b~partner
INTO CORRESPONDING FIELDS OF TABLE mt_bp_data
FOR ALL ENTRIES IN lt_partner
WHERE a~partner = lt_partner-partner.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
**********************************************************************
* Retrieve Text Data of bpier general data ( not existing)
**********************************************************************
* IF lt_partner IS NOT INITIAL.
* SELECT spras vstel vtext FROM tvstt
* INTO CORRESPONDING FIELDS OF TABLE mt_bp_data_txt
* FOR ALL ENTRIES IN lt_partner
* WHERE partner = lt_partner-partner.
* IF sy-subrc <> 0.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
* ELSE.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
*
**********************************************************************
* Retrieve Addresses of the bpier
**********************************************************************
CLEAR lt_adrc.
LOOP AT mt_bp_data ASSIGNING <ls_bp_data>.
IF <ls_bp_data>-addrnumber IS NOT INITIAL.
ls_adrc-addrnumber = <ls_bp_data>-addrnumber.
INSERT ls_adrc INTO TABLE lt_adrc.
ENDIF.
ENDLOOP.
IF lt_adrc IS NOT INITIAL.
CALL FUNCTION 'ADDR_GET_COMPLETE_DB_MASS'
EXPORTING
iv_current_comm_data = 'X'
TABLES
address_selection = lt_adrc
sz_addr1_complete = mt_bp_address
sz_error_table = lt_addr_error.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~SEND_MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_FILE_INFO TYPE DRF_S_FILE_INFO(optional)
* | [--->] IV_OBJECT_COUNT TYPE DRF_PACKAGE_SIZE(optional)
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [<---] ET_FILE_DATA TYPE DRF_T_FILE_OI_CONTENT
* | [<---] ET_MESSAGE TYPE DRF_T_MESSAGE
* | [<-->] CT_OBJ_REP_STA TYPE DRF_T_OBJ_REP_STA_FULL(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~SEND_MESSAGE.
**********************************************************************
* The method calls the servcice LocationBulkReplicationRequest_Out
* Class: CO_LOC_LOC_BULK_REPL_REQ_OUT
* Method: LOC_BULK_REPLICATION_REQ_OUT
* Parameter OUTPUT Type LOC_BULK_REPLICATION_REQ
**********************************************************************
* The service will be called under the followinng circumstances:
* Attribute MS_LOC_BULK_REPL_REQ is not initial
* Attribute MS_RUNTIME_PARAMETER-TESTRUN is not abap_false
* That means, location data for replication are available and
* the DRFOUT wasn't called in test mode.
**********************************************************************
TYPES: BEGIN OF ty_object_id,
prefix TYPE char3,
id TYPE char4,
END OF ty_object_id.
DATA:
ls_message_data_outbound TYPE loc_bulk_replication_req, "TYPE sapplco_loc_blk_repl_req_msg,
lv_path_message_header TYPE string,
lv_path_sequence_fields TYPE string,
lv_default_service_group TYPE xflag,
lv_service_group TYPE srt_wsp_dt_obj_name,
lv_recipient_business_system TYPE sld_bskey,
lv_application_id TYPE bs_soa_appl_id,
lv_tech_seq_context TYPE bs_soa_asyncprx_cntxt,
lv_appl_seq_context TYPE bs_soa_inappseq_cntxt,
lv_reference_message_id TYPE bs_soa_rspnsrcvr_msg_id,
lv_correlation_id TYPE bs_soa_rspnsrcvr_corel_id,
lv_reconciliation_requested TYPE xflag,
ls_lrd_filter TYPE lrd_sld_bskey,
lo_bs_soa_exception TYPE REF TO cx_bs_soa_exception,
lt_outbound_proxy TYPE bssoa_asyncprx_instance_t ##needed.
DATA:
lo_xi_error TYPE REF TO cx_ai_system_fault,
lv_error_txt TYPE string,
lv_error_long_txt TYPE string,
lv_object_id TYPE ty_object_id,
ls_loc_repl_req_msg TYPE sapplco_loc_repl_req_msg.
FIELD-SYMBOLS:
<ls_obj_rep_sta> TYPE drf_s_obj_rep_sta_attr.
***********************************************************************
** Initialize the exporting parameter
***********************************************************************
CLEAR: et_file_data, "Not used
et_message.
**********************************************************************
* Check if the service could be triggerd
* Location Data for replication are available and Test Mode OFF
**********************************************************************
IF ms_runtime_parameter-testrun = abap_true.
"Test Mode --> No Service Call
RETURN.
ENDIF.
IF ms_loc_bulk_repl_req IS NOT INITIAL.
"Replication data available
"Update Replication Status Object with the message_header-UUID (Message Link)
"to be able to identify the message later on in the inbound
LOOP AT ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg
INTO ls_loc_repl_req_msg.
lv_object_id = ls_loc_repl_req_msg-location-location_internal_id.
READ TABLE ct_obj_rep_sta ASSIGNING <ls_obj_rep_sta>
WITH KEY object_id = lv_object_id-id.
IF sy-subrc = 0.
"Entry found --> Set the message_header-UUID
<ls_obj_rep_sta>-msg_link = ls_loc_repl_req_msg-message_header-id-content.
ENDIF.
ENDLOOP.
ls_message_data_outbound = ms_loc_bulk_repl_req.
lv_path_message_header = 'LOCATION_BULK_REPLICATION_REQ-MESSAGE_HEADER'.
lv_path_sequence_fields = 'LOCATION_BULK_REPLICATION_REQ-LOC_REPL_REQ_MSG'.
lv_service_group = 'LOCATION_REPLICATE_REQ'.
lv_recipient_business_system = mv_receiver_bussystem_id.
ls_lrd_filter-bskey = lv_recipient_business_system.
* Context Build
CONCATENATE sy-sysid sy-mandt 'LOC_REPL_REQ'
INTO lv_tech_seq_context.
lv_appl_seq_context = 'LOCREQ'.
TRY.
CALL METHOD cl_bs_soa_asyncprx_out=>execute
EXPORTING
iv_proxy_class = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_method = 'LOC_BULK_REPLICATION_REQ_OUT'
iv_obj_type = 'BUS10002'
iv_path_msg_header = lv_path_message_header
iv_path_of_seq_fields = lv_path_sequence_fields
iv_service_group = lv_service_group
iv_logical_receiver_det_struc = ls_lrd_filter
iv_default_service_group = lv_default_service_group
iv_recipient_business_system = lv_recipient_business_system
iv_application_id = lv_application_id
iv_tech_seq_context = lv_tech_seq_context
iv_appl_seq_context = lv_appl_seq_context
iv_reference_message_id = lv_reference_message_id
iv_correlation_id = lv_correlation_id
iv_reconciliation_requested = lv_reconciliation_requested
IMPORTING
et_proxy_instances = lt_outbound_proxy
CHANGING
cs_message_data_outbound = ls_message_data_outbound.
CATCH cx_bs_soa_exception INTO lo_bs_soa_exception .
"Communication Error
"Get Error Text
CALL METHOD lo_bs_soa_exception->get_text
RECEIVING
result = lv_error_txt.
"Get Long Text
CALL METHOD lo_bs_soa_exception->get_longtext
RECEIVING
result = lv_error_long_txt.
"Write Message to the BAL
"DRF_OUTBOUND 015 - Error during proxy call (&1: &2, &3)
"ADD_MSG_RE --> Add Message and Raise Exception
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '015'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_msgv2 = lv_error_txt
iv_msgv3 = lv_error_long_txt.
CATCH cx_ai_system_fault INTO lo_xi_error.
"Application Integration: Technical Error
"Write BAL - DRF_OUTBOUND 013 - Error while creating the &1 proxy instance
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '013'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
ix_exception_catched = lo_xi_error.
ENDTRY.
ELSE.
"No Replication data available
"Add Message to the BAL
"DRF_OUTBOUND 322 - System does not send blank messages
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '322'
iv_msgid = 'DRF_OUTBOUND'.
ENDIF.
* Clear Message for new Message Run
CLEAR ms_loc_bulk_repl_req.
ENDMETHOD.
ENDCLASS.
Class: ZCL_BP_LOC_DRF_EXPL_FILTER
class ZCL_BP_LOC_DRF_EXPL_FILTER definition
public
final
create public .
public section.
interfaces IF_DRF_FILTER .
protected section.
private section.
ENDCLASS.
CLASS ZCL_BP_LOC_DRF_EXPL_FILTER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_BP_LOC_DRF_EXPL_FILTER->IF_DRF_FILTER~APPLY_FILTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_APPL TYPE DRF_APPL
* | [--->] IV_BUSINESS_SYSTEM TYPE MDG_BUSINESS_SYSTEM
* | [--->] IS_C_FOBJ TYPE DRF_S_C_FOBJ_RUNTIME
* | [--->] IV_OUTB_IMPL TYPE DRF_OUTB_IMPL
* | [--->] IV_DLMOD TYPE DRF_DLMOD
* | [--->] IV_RUNMOD TYPE DRF_RUNMOD
* | [--->] IS_FILT TYPE DRF_S_C_FILT_RUNTIME
* | [--->] IO_BAL TYPE REF TO CL_DRF_BAL
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_UNFILTERED_OBJECTS TYPE SORTED TABLE
* | [--->] IS_ADDITIONAL_PARAMETER TYPE DRF_S_RTIME_PARAM_ADDITIONAL(optional)
* | [<---] ET_FILTERED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_FILTER_OBJECT
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_FILTER~APPLY_FILTER.
**********************************************************************
* Explicit Filter implementation for the DRF Outbound for Shipping Points
* The following filter structure is assigned to the explicit filter
* in the customizing:
* The filter structure contains the following components:
**********************************************************************
DATA:
ls_selopt TYPE rsdsselopt,
lt_bp_range TYPE rsds_selopt_t,
lt_bp_range_unf TYPE rsds_selopt_t,
lt_bp_drf_outbound TYPE ZDRF_T_bp_OUTBOUND.
FIELD-SYMBOLS:
<ls_ext_criteria> TYPE rsds_range,
<ls_filter_range> TYPE rsds_frange,
<ls_unfiltered_objects> TYPE ZDRF_S_bp_OUTBOUND.
**********************************************************************
* Initialize the exporting parameters
**********************************************************************
CLEAR et_filtered_objects.
**********************************************************************
* Process the external filter criteria and split them into the
* corresponding component range tables
**********************************************************************
LOOP AT it_external_criteria ASSIGNING <ls_ext_criteria>.
LOOP AT <ls_ext_criteria>-frange_t ASSIGNING <ls_filter_range>.
CASE <ls_filter_range>-fieldname.
WHEN 'PARTNER'.
INSERT LINES OF <ls_filter_range>-selopt_t INTO TABLE lt_bp_range.
ENDCASE.
ENDLOOP.
ENDLOOP.
**********************************************************************
* Take care of the unfiltered objects and add them to the corresponding
* Range Select Options
**********************************************************************
LOOP AT it_unfiltered_objects ASSIGNING <ls_unfiltered_objects>.
IF <ls_unfiltered_objects>-partner IS NOT INITIAL.
CLEAR ls_selopt.
ls_selopt-sign = if_drf_const=>range_sign_inclusive. "'I'
ls_selopt-option = if_drf_const=>range_option_equal. "'EQ'
ls_selopt-low = <ls_unfiltered_objects>-partner.
INSERT ls_selopt INTO TABLE lt_bp_range_unf.
ENDIF.
ENDLOOP.
"Add the unfiltered object to the affected range for the selection
IF lt_bp_range_unf IS NOT INITIAL.
INSERT LINES OF lt_bp_range_unf INTO TABLE lt_bp_range.
ENDIF.
**********************************************************************
* Select LOCNO and LOCTYPE from /SAPAPO/LOC
**********************************************************************
SELECT partner FROM but000
INTO CORRESPONDING FIELDS OF TABLE lt_bp_drf_outbound
WHERE partner IN lt_bp_range.
**********************************************************************
* Fill the exporting parameters
**********************************************************************
INSERT LINES OF lt_bp_drf_outbound INTO TABLE et_filtered_objects.
ENDMETHOD.
ENDCLASS.
Save and activate all the objects
Replication of Vendor
Follow the similar steps as above below is the list of objects you have to create.
Structure:
ZDRF_S_SUPPL_OUTBOUND
Table Type:
ZDRF_T_SUPPL_OUTBOUND ( with sorted key and Primary key)
Class:
ZCL_SUPPL_LOC_DRF_EXPL_FILTER
ZCL_SUPPL_LOC_DRF_OUTBOUND
Structure: ZDRF_S_SUPPL_OUTBOUND
Table Type: ZDRF_T_SUPPL_OUTBOUND
Implement Classes
Class : ZCL_SUPPL_LOC_DRF_EXPL_FILTER
class ZCL_SUPPL_LOC_DRF_EXPL_FILTER definition
public
final
create public .
public section.
interfaces IF_DRF_FILTER .
protected section.
private section.
ENDCLASS.
CLASS ZCL_SUPPL_LOC_DRF_EXPL_FILTER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_EXPL_FILTER->IF_DRF_FILTER~APPLY_FILTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_APPL TYPE DRF_APPL
* | [--->] IV_BUSINESS_SYSTEM TYPE MDG_BUSINESS_SYSTEM
* | [--->] IS_C_FOBJ TYPE DRF_S_C_FOBJ_RUNTIME
* | [--->] IV_OUTB_IMPL TYPE DRF_OUTB_IMPL
* | [--->] IV_DLMOD TYPE DRF_DLMOD
* | [--->] IV_RUNMOD TYPE DRF_RUNMOD
* | [--->] IS_FILT TYPE DRF_S_C_FILT_RUNTIME
* | [--->] IO_BAL TYPE REF TO CL_DRF_BAL
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_UNFILTERED_OBJECTS TYPE SORTED TABLE
* | [--->] IS_ADDITIONAL_PARAMETER TYPE DRF_S_RTIME_PARAM_ADDITIONAL(optional)
* | [<---] ET_FILTERED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_FILTER_OBJECT
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_FILTER~APPLY_FILTER.
**********************************************************************
* Explicit Filter implementation for the DRF Outbound for Shipping Points
* The following filter structure is assigned to the explicit filter
* in the supplomizing: DRF_S_suppl_LOC_EXPL_FILTER
* The filter structure contains the following components:
* lifnr TYPE lifnr
**********************************************************************
DATA:
ls_selopt TYPE rsdsselopt,
lt_suppl_range TYPE rsds_selopt_t,
lt_suppl_range_unf TYPE rsds_selopt_t,
lt_suppl_drf_outbound TYPE ZDRF_T_SUPPL_OUTBOUND.
FIELD-SYMBOLS:
<ls_ext_criteria> TYPE rsds_range,
<ls_filter_range> TYPE rsds_frange,
<ls_unfiltered_objects> TYPE ZDRF_S_SUPPL_OUTBOUND.
**********************************************************************
* Initialize the exporting parameters
**********************************************************************
CLEAR et_filtered_objects.
**********************************************************************
* Process the external filter criteria and split them into the
* corresponding component range tables
**********************************************************************
LOOP AT it_external_criteria ASSIGNING <ls_ext_criteria>.
LOOP AT <ls_ext_criteria>-frange_t ASSIGNING <ls_filter_range>.
CASE <ls_filter_range>-fieldname.
WHEN 'LIFNR'.
INSERT LINES OF <ls_filter_range>-selopt_t INTO TABLE lt_suppl_range.
ENDCASE.
ENDLOOP.
ENDLOOP.
**********************************************************************
* Take care of the unfiltered objects and add them to the corresponding
* Range Select Options
**********************************************************************
LOOP AT it_unfiltered_objects ASSIGNING <ls_unfiltered_objects>.
IF <ls_unfiltered_objects>-lifnr IS NOT INITIAL.
CLEAR ls_selopt.
ls_selopt-sign = if_drf_const=>range_sign_inclusive. "'I'
ls_selopt-option = if_drf_const=>range_option_equal. "'EQ'
ls_selopt-low = <ls_unfiltered_objects>-lifnr.
INSERT ls_selopt INTO TABLE lt_suppl_range_unf.
ENDIF.
ENDLOOP.
"Add the unfiltered object to the affected range for the selection
IF lt_suppl_range_unf IS NOT INITIAL.
INSERT LINES OF lt_suppl_range_unf INTO TABLE lt_suppl_range.
ENDIF.
**********************************************************************
* Select LOCNO and LOCTYPE from /SAPAPO/LOC
**********************************************************************
SELECT lifnr FROM lfa1
INTO CORRESPONDING FIELDS OF TABLE lt_suppl_drf_outbound
WHERE lifnr IN lt_suppl_range.
**********************************************************************
* Fill the exporting parameters
**********************************************************************
INSERT LINES OF lt_suppl_drf_outbound INTO TABLE et_filtered_objects.
ENDMETHOD.
ENDCLASS.
Class : ZCL_SUPPL_LOC_DRF_OUTBOUND
class ZCL_SUPPL_LOC_DRF_OUTBOUND definition
public
final
create public .
public section.
interfaces IF_DRF_OUTBOUND .
PROTECTED SECTION.
TYPES:
BEGIN OF tys_suppl_data,
lifnr TYPE lifnr,
spras TYPE spras,
adrnr TYPE adrnr,
END OF tys_suppl_data .
TYPES:
tt_suppl_data TYPE STANDARD TABLE OF tys_suppl_data .
TYPES:
BEGIN OF tys_suppl_data_txt,
spras TYPE spras,
lifnr TYPE lifnr,
vtext TYPE vtext,
END OF tys_suppl_data_txt .
TYPES:
tt_suppl_data_txt TYPE STANDARD TABLE OF tys_suppl_data_txt .
TYPES:
BEGIN OF tys_lifnr,
lifnr TYPE lifnr,
END OF tys_lifnr .
DATA mt_suppl_address TYPE szadr_addr1_table .
DATA mt_suppl_data TYPE tt_suppl_data .
DATA mt_suppl_data_txt TYPE tt_suppl_data_txt .
DATA ms_runtime_parameter TYPE drf_s_runtime_parameter_ext .
DATA ms_loc_bulk_repl_req TYPE loc_bulk_replication_req .
CONSTANTS mc_t_drf_loc_outb TYPE string VALUE 'ZDRF_T_SUPPL_OUTBOUND' ##NO_TEXT.
CONSTANTS mc_s_drf_loc_outbound TYPE string VALUE 'ZDRF_S_SUPPL_OUTBOUND' ##NO_TEXT.
DATA mv_sender_bussystem_id TYPE sapplco_business_system_id .
DATA mv_receiver_bussystem_id TYPE sapplco_business_system_id .
private section.
methods FILL_MESSAGE_HEADER
exporting
!ES_MESSAGE_HEADER type SAPPLCO_BUS_DOC_MESSAGE_HEADER .
ENDCLASS.
CLASS ZCL_SUPPL_LOC_DRF_OUTBOUND IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_SUPPL_LOC_DRF_OUTBOUND->FILL_MESSAGE_HEADER
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_MESSAGE_HEADER TYPE SAPPLCO_BUS_DOC_MESSAGE_HEADER
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD FILL_MESSAGE_HEADER.
DATA:
lv_uuid TYPE char32,
lv_timestamp TYPE timestampl.
CLEAR es_message_header.
GET TIME STAMP FIELD lv_timestamp.
cl_gdt_conversion=>date_time_outbound(
EXPORTING
im_value_long = lv_timestamp
IMPORTING
ex_value = es_message_header-creation_date_time " Time Stamp According to ISO 8601
).
es_message_header-sender_business_system_id = mv_sender_bussystem_id.
es_message_header-recipient_business_system_id = mv_receiver_bussystem_id.
TRY.
lv_uuid = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error.
"Should never occur
ASSERT 1 = 0.
ENDTRY.
es_message_header-id-content = lv_uuid.
cl_gdt_conversion=>guid_outbound(
EXPORTING
im_guid_c = lv_uuid " GUID in Character Display
IMPORTING
ex_value = es_message_header-uuid-content " GUID / UUID in XML Display
).
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE DRF_T_BDCP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE MDG_CP_T_CP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<---] EV_SKIP_OBJECT TYPE ABAP_BOOL
* | [<-->] CR_RELEVANT_OBJECT TYPE REF TO DATA
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_PREPARE_DATA TYPE DATA
* | [<---] ER_PACKAGE_DATA TYPE DATA
* | [<---] ES_TASK_PARAM TYPE DRF_S_PARALLEL_TASK_PARAM
* | [<---] EV_ALL_TASKS_DONE TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ET_ADD_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [!CX!] CX_DRF_ENRICH_FILTER_PARAMETER
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~FINALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [--->] IT_ERRONEOUS_OBJECTS TYPE SORTED TABLE
* | [--->] IV_REPEATED_INITIAL_RUN TYPE BOOLE_D
* | [<---] EV_DELETE_CHANGE_POINTER TYPE BOOLE_D
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~FINALIZE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND=>IF_DRF_OUTBOUND~INITIALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_RUNTIME_PARAM TYPE DRF_S_RUNTIME_PARAMETER_EXT
* | [<---] EO_IF_DRF_OUTBOUND TYPE REF TO IF_DRF_OUTBOUND
* | [<---] ES_RUNTIME_PARAM_OUT_IMPL TYPE DRF_S_RUNTIME_PARAM_OUT_IMPL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~INITIALIZE.
**********************************************************************
* Initialization of the DRF Outbound Implementation for Location
* Replication
**********************************************************************
DATA: ls_runtime_parameter TYPE drf_s_runtime_param_out_impl,
lr_drf_loc_outbound TYPE REF TO zcl_suppl_loc_drf_outbound.
**********************************************************************
* Initialize the exporting parameter
**********************************************************************
CLEAR: eo_if_drf_outbound,
es_runtime_param_out_impl.
**********************************************************************
* Create an instance of myself in order to remember the runtime
* parameters for all subsequent methods and pass it to the framework
**********************************************************************
TRY.
CREATE OBJECT lr_drf_loc_outbound.
CATCH cx_sy_create_object_error.
RETURN.
ENDTRY.
IF lr_drf_loc_outbound IS BOUND.
lr_drf_loc_outbound->ms_runtime_parameter = is_runtime_param.
ENDIF.
**********************************************************************
* Set own runtime parameter
**********************************************************************
ls_runtime_parameter-table_type_name = mc_t_drf_loc_outb.
es_runtime_param_out_impl = ls_runtime_parameter.
**********************************************************************
* Set Outbound Implementation
**********************************************************************
eo_if_drf_outbound = lr_drf_loc_outbound.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~MAP_DATA2MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_RELEVANT_OBJECT TYPE REF TO DATA
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD if_drf_outbound~map_data2message.
DATA:
lr_rel_obj TYPE REF TO zdrf_s_suppl_outbound,
lv_timezone TYPE tznzone,
ls_loc_bulk TYPE sapplco_loc_blk_repl_req_msg,
ls_loc_repl_mess TYPE sapplco_loc_repl_req_msg,
lt_loc_repl_mess TYPE sapplco_loc_repl_req_msg_tab,
ls_loc_description TYPE sapplco_short_description,
lv_loc_form_name TYPE sapplco_languageindependent_me,
ls_loc_tel TYPE sapplco_telephone,
ls_loc_facs TYPE sapplco_facsimile,
ls_loc_email TYPE sapplco_nosc_email,
ls_loc_web TYPE sapplco_nosc_web,
ls_loc_address TYPE sapplco_nosc_address.
FIELD-SYMBOLS:
<ls_suppl_addr1_data> TYPE addr1_data.
lr_rel_obj ?= ir_relevant_object.
* Fill Message Header for Bulk Service
fill_message_header(
IMPORTING
es_message_header = ls_loc_bulk-message_header ).
READ TABLE mt_suppl_data ASSIGNING FIELD-SYMBOL(<ls_suppl_data>)
WITH KEY lifnr = lr_rel_obj->lifnr.
IF sy-subrc NE 0.
RETURN.
ENDIF.
* Fill Message Header for Location Replication
fill_message_header(
IMPORTING
es_message_header = ls_loc_repl_mess-message_header ).
CONCATENATE 'VE_' <ls_suppl_data>-lifnr INTO ls_loc_repl_mess-location-location_internal_id.
* Location Type Code for SUPPLomer Location
ls_loc_repl_mess-location-location_type_code = '1011'.
**********************************************************************
* Address and Description
**********************************************************************
READ TABLE mt_suppl_address ASSIGNING FIELD-SYMBOL(<ls_suppl_addr_data>)
WITH KEY addrnumber = <ls_suppl_data>-adrnr.
IF sy-subrc <> 0.
* Error -> No Address found for the plant
ELSE.
LOOP AT <ls_suppl_addr_data>-addr1_tab ASSIGNING FIELD-SYMBOL(<ls_suppl_addr1>).
ASSIGN <ls_suppl_addr1>-data TO <ls_suppl_addr1_data>.
IF NOT ( <ls_suppl_addr1_data>-date_from <= sy-datum AND
<ls_suppl_addr1_data>-date_to >= sy-datum ).
* Not Valid Address
CONTINUE.
ENDIF.
* Description (NAME1 from Address is used as text) -> Here Description of Shipping/Receiving Point.
LOOP AT mt_suppl_data_txt ASSIGNING FIELD-SYMBOL(<ls_suppl_data_txt>) WHERE lifnr = <ls_suppl_data>-lifnr.
CLEAR ls_loc_description.
ls_loc_description-language_code = <ls_suppl_data_txt>-spras.
ls_loc_description-content = <ls_suppl_data_txt>-vtext.
INSERT ls_loc_description INTO TABLE ls_loc_repl_mess-location-description.
ENDLOOP.
* Time Zone
IF <ls_suppl_addr1_data>-time_zone IS NOT INITIAL.
ls_loc_repl_mess-location-time_zone_code = <ls_suppl_addr1_data>-time_zone.
ELSE.
CALL FUNCTION 'TZON_LOCATION_TIMEZONE'
EXPORTING
if_country = <ls_suppl_addr1_data>-country
if_region = <ls_suppl_addr1_data>-region
IMPORTING
ef_timezone = lv_timezone
EXCEPTIONS
no_timezone_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR ls_loc_repl_mess-location-time_zone_code.
ELSE.
ls_loc_repl_mess-location-time_zone_code = lv_timezone.
ENDIF.
ENDIF.
**********************************************************************
* Organization formatted Name
**********************************************************************
ls_loc_address-organisation_form_of_address-code = <ls_suppl_addr1_data>-title.
IF <ls_suppl_addr1_data>-name1 IS NOT INITIAL.
lv_loc_form_name = <ls_suppl_addr1_data>-name1.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_suppl_addr1_data>-name2 IS NOT INITIAL.
lv_loc_form_name = <ls_suppl_addr1_data>-name2.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_suppl_addr1_data>-name3 IS NOT INITIAL.
lv_loc_form_name = <ls_suppl_addr1_data>-name3.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_suppl_addr1_data>-name4 IS NOT INITIAL.
lv_loc_form_name = <ls_suppl_addr1_data>-name4.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_suppl_addr1_data>-name_txt IS NOT INITIAL.
lv_loc_form_name = <ls_suppl_addr1_data>-name_txt.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
**********************************************************************
* Physical Address
**********************************************************************
ls_loc_address-physical_address-country_code = <ls_suppl_addr1_data>-country.
ls_loc_address-physical_address-country_name-language_code = <ls_suppl_addr1_data>-langu.
ls_loc_address-physical_address-region_code = <ls_suppl_addr1_data>-region.
ls_loc_address-physical_address-city_name = <ls_suppl_addr1_data>-city1.
ls_loc_address-physical_address-additional_city_name = <ls_suppl_addr1_data>-home_city.
ls_loc_address-physical_address-pobox_country_code = <ls_suppl_addr1_data>-po_box_cty.
ls_loc_address-physical_address-pobox_region_code = <ls_suppl_addr1_data>-po_box_reg.
ls_loc_address-physical_address-pobox_id = <ls_suppl_addr1_data>-po_box.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr1_data>-po_box_num " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_address-physical_address-pobox_indicator ). " XSD:Indicator
ls_loc_address-physical_address-street_postal_code = <ls_suppl_addr1_data>-post_code1.
ls_loc_address-physical_address-pobox_postal_code = <ls_suppl_addr1_data>-post_code2.
ls_loc_address-physical_address-company_postal_code = <ls_suppl_addr1_data>-post_code3.
ls_loc_address-physical_address-house_id = <ls_suppl_addr1_data>-house_num1.
ls_loc_address-physical_address-additional_house_id = <ls_suppl_addr1_data>-house_num2.
ls_loc_address-physical_address-district_name = <ls_suppl_addr1_data>-city2.
ls_loc_address-physical_address-building_id = <ls_suppl_addr1_data>-building.
ls_loc_address-physical_address-floor_id = <ls_suppl_addr1_data>-floor.
ls_loc_address-physical_address-room_id = <ls_suppl_addr1_data>-roomnumber.
ls_loc_address-physical_address-street_name = <ls_suppl_addr1_data>-street.
IF <ls_suppl_addr1_data>-str_suppl1 IS NOT INITIAL OR <ls_suppl_addr1_data>-str_suppl2 IS NOT INITIAL.
INSERT <ls_suppl_addr1_data>-str_suppl1 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
INSERT <ls_suppl_addr1_data>-str_suppl2 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
ENDIF.
IF <ls_suppl_addr1_data>-str_suppl3 IS NOT INITIAL OR <ls_suppl_addr1_data>-location IS NOT INITIAL.
INSERT <ls_suppl_addr1_data>-str_suppl3 INTO TABLE ls_loc_address-physical_address-street_suffix_name.
INSERT <ls_suppl_addr1_data>-location INTO TABLE ls_loc_address-physical_address-street_suffix_name.
ENDIF.
* Office
ls_loc_address-office-building_id = <ls_suppl_addr1_data>-building.
ls_loc_address-office-floor_id = <ls_suppl_addr1_data>-floor.
ls_loc_address-office-room_id = <ls_suppl_addr1_data>-roomnumber.
* Communication
ls_loc_address-communication-correspondence_language_code = <ls_suppl_addr1_data>-langu.
* Phone
LOOP AT <ls_suppl_addr_data>-adtel_tab ASSIGNING FIELD-SYMBOL(<ls_suppl_addr_adtel_data>).
CLEAR ls_loc_tel.
ls_loc_tel-number-country_code = <ls_suppl_addr_adtel_data>-adtel-country.
ls_loc_tel-number-subscriber_id = <ls_suppl_addr_adtel_data>-adtel-tel_number.
ls_loc_tel-number-extension_id = <ls_suppl_addr_adtel_data>-adtel-tel_extens.
ls_loc_tel-number-country_code = <ls_suppl_addr_adtel_data>-adtel-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr_adtel_data>-adtel-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-number_default_indicator ). " XSD:Indicator
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr_adtel_data>-adtel-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-smsenabled_indicator ). " XSD:Indicator
INSERT ls_loc_tel INTO TABLE ls_loc_address-communication-telephone.
ENDLOOP.
* Fax
LOOP AT <ls_suppl_addr_data>-adfax_tab ASSIGNING FIELD-SYMBOL(<ls_suppl_addr_adfax_data>).
ls_loc_facs-number-country_code = <ls_suppl_addr_adfax_data>-adfax-country.
ls_loc_facs-number-subscriber_id = <ls_suppl_addr_adfax_data>-adfax-fax_number.
ls_loc_facs-number-extension_id = <ls_suppl_addr_adfax_data>-adfax-fax_extens.
ls_loc_facs-number-country_code = <ls_suppl_addr_adfax_data>-adfax-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr_adfax_data>-adfax-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_facs-number_default_indicator ). " XSD:Indicator
INSERT ls_loc_facs INTO TABLE ls_loc_address-communication-facsimile.
ENDLOOP.
* E-mail
LOOP AT <ls_suppl_addr_data>-adsmtp_tab ASSIGNING FIELD-SYMBOL(<ls_suppl_addr_adsmtp_data>).
CLEAR ls_loc_email.
ls_loc_email-uri = <ls_suppl_addr_adsmtp_data>-adsmtp-smtp_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr_adsmtp_data>-adsmtp-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_email-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_email INTO TABLE ls_loc_address-communication-email.
ENDLOOP.
* Web
LOOP AT <ls_suppl_addr_data>-aduri_tab ASSIGNING FIELD-SYMBOL(<ls_suppl_addr_aduri>).
IF <ls_suppl_addr_aduri>-aduri-uri_type = 'HPG' . " Location Type HPG(Homepage) is transffered only
CLEAR ls_loc_web.
ls_loc_web-uri = <ls_suppl_addr_aduri>-aduri-uri_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_suppl_addr_aduri>-aduri-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_web-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_web INTO TABLE ls_loc_address-communication-web.
ENDIF.
ENDLOOP.
* Only one valid address
ls_loc_repl_mess-location-address = ls_loc_address.
EXIT.
ENDLOOP.
ENDIF.
ms_loc_bulk_repl_req-location_bulk_replication_req-message_header = ls_loc_bulk-message_header.
INSERT ls_loc_repl_mess INTO TABLE lt_loc_repl_mess.
INSERT LINES OF lt_loc_repl_mess INTO TABLE ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~READ_COMPLETE_DATA
* +-------------------------------------------------------------------------------------------------+
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD if_drf_outbound~read_complete_data.
**********************************************************************
* Read the data of all records that shall be replicated later on
* via the new Location Service.
**********************************************************************
DATA:
lt_bus_sys_tech TYPE mdg_t_bus_sys_tech,
lv_own_business_system TYPE text60,
ls_lifnr TYPE tys_lifnr,
lt_lifnr TYPE TABLE OF tys_lifnr,
lt_adrc TYPE szadr_adrc_table,
ls_adrc TYPE szadr_st_adrc,
lt_addr_error TYPE szadr_error_table.
FIELD-SYMBOLS:
<ls_suppl_data> TYPE tys_suppl_data,
<ls_loc_drf_outbound> TYPE any,
<lv_comp> TYPE any.
**********************************************************************
* Get Business System Data
**********************************************************************
* Get own Logical System
CALL FUNCTION 'LCR_GET_OWN_BUSINESS_SYSTEM'
IMPORTING
bs_key_name = lv_own_business_system
EXCEPTIONS
no_business_system = 1
no_rfc_destination = 2
no_landscape_directory = 3
illegal_arguments = 4
communication_error = 5
ld_error = 6
sld_api_exception = 7
OTHERS = 8.
IF sy-subrc NE 0.
RETURN. " RAISE no_business_system.
ENDIF.
mv_sender_bussystem_id = lv_own_business_system.
CALL METHOD cl_drf_access_cust_data=>select_business_sys_for_appl
EXPORTING
iv_appl = ms_runtime_parameter-appl
iv_outb_impl = ms_runtime_parameter-outb_impl
IMPORTING
et_bus_sys_tech = lt_bus_sys_tech.
READ TABLE lt_bus_sys_tech ASSIGNING FIELD-SYMBOL(<ls_bus_sys_tech>) INDEX 1. "#EC CI_NOORDER
mv_receiver_bussystem_id = <ls_bus_sys_tech>-business_system.
**********************************************************************
* Build up table lt_lifnr
**********************************************************************
LOOP AT ct_relevant_objects ASSIGNING <ls_loc_drf_outbound>.
CLEAR ls_lifnr.
UNASSIGN <lv_comp>.
ASSIGN COMPONENT 'lifnr' OF STRUCTURE <ls_loc_drf_outbound> TO <lv_comp>.
IF sy-subrc = 0 AND <lv_comp> IS ASSIGNED.
ls_lifnr = <lv_comp>.
INSERT ls_lifnr INTO TABLE lt_lifnr.
ENDIF.
ENDLOOP.
**********************************************************************
* Retrieve Data of supplier general data
**********************************************************************
IF lt_lifnr IS NOT INITIAL.
SELECT lifnr spras adrnr FROM lfa1
INTO CORRESPONDING FIELDS OF TABLE mt_suppl_data
FOR ALL ENTRIES IN lt_lifnr
WHERE lifnr = lt_lifnr-lifnr.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
**********************************************************************
* Retrieve Text Data of supplier general data ( not existing)
**********************************************************************
* IF lt_lifnr IS NOT INITIAL.
* SELECT spras vstel vtext FROM tvstt
* INTO CORRESPONDING FIELDS OF TABLE mt_suppl_data_txt
* FOR ALL ENTRIES IN lt_lifnr
* WHERE lifnr = lt_lifnr-lifnr.
* IF sy-subrc <> 0.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
* ELSE.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
*
**********************************************************************
* Retrieve Addresses of the supplier
**********************************************************************
CLEAR lt_adrc.
LOOP AT mt_suppl_data ASSIGNING <ls_suppl_data>.
IF <ls_suppl_data>-adrnr IS NOT INITIAL.
ls_adrc-addrnumber = <ls_suppl_data>-adrnr.
INSERT ls_adrc INTO TABLE lt_adrc.
ENDIF.
ENDLOOP.
IF lt_adrc IS NOT INITIAL.
CALL FUNCTION 'ADDR_GET_COMPLETE_DB_MASS'
EXPORTING
iv_current_comm_data = 'X'
TABLES
address_selection = lt_adrc
sz_addr1_complete = mt_suppl_address
sz_error_table = lt_addr_error.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_SUPPL_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~SEND_MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_FILE_INFO TYPE DRF_S_FILE_INFO(optional)
* | [--->] IV_OBJECT_COUNT TYPE DRF_PACKAGE_SIZE(optional)
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [<---] ET_FILE_DATA TYPE DRF_T_FILE_OI_CONTENT
* | [<---] ET_MESSAGE TYPE DRF_T_MESSAGE
* | [<-->] CT_OBJ_REP_STA TYPE DRF_T_OBJ_REP_STA_FULL(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~SEND_MESSAGE.
**********************************************************************
* The method calls the servcice LocationBulkReplicationRequest_Out
* Class: CO_LOC_LOC_BULK_REPL_REQ_OUT
* Method: LOC_BULK_REPLICATION_REQ_OUT
* Parameter OUTPUT Type LOC_BULK_REPLICATION_REQ
**********************************************************************
* The service will be called under the followinng circumstances:
* Attribute MS_LOC_BULK_REPL_REQ is not initial
* Attribute MS_RUNTIME_PARAMETER-TESTRUN is not abap_false
* That means, location data for replication are available and
* the DRFOUT wasn't called in test mode.
**********************************************************************
TYPES: BEGIN OF ty_object_id,
prefix TYPE char3,
id TYPE char4,
END OF ty_object_id.
DATA:
ls_message_data_outbound TYPE loc_bulk_replication_req, "TYPE sapplco_loc_blk_repl_req_msg,
lv_path_message_header TYPE string,
lv_path_sequence_fields TYPE string,
lv_default_service_group TYPE xflag,
lv_service_group TYPE srt_wsp_dt_obj_name,
lv_recipient_business_system TYPE sld_bskey,
lv_application_id TYPE bs_soa_appl_id,
lv_tech_seq_context TYPE bs_soa_asyncprx_cntxt,
lv_appl_seq_context TYPE bs_soa_inappseq_cntxt,
lv_reference_message_id TYPE bs_soa_rspnsrcvr_msg_id,
lv_correlation_id TYPE bs_soa_rspnsrcvr_corel_id,
lv_reconciliation_requested TYPE xflag,
ls_lrd_filter TYPE lrd_sld_bskey,
lo_bs_soa_exception TYPE REF TO cx_bs_soa_exception,
lt_outbound_proxy TYPE bssoa_asyncprx_instance_t ##needed.
DATA:
lo_xi_error TYPE REF TO cx_ai_system_fault,
lv_error_txt TYPE string,
lv_error_long_txt TYPE string,
lv_object_id TYPE ty_object_id,
ls_loc_repl_req_msg TYPE sapplco_loc_repl_req_msg.
FIELD-SYMBOLS:
<ls_obj_rep_sta> TYPE drf_s_obj_rep_sta_attr.
***********************************************************************
** Initialize the exporting parameter
***********************************************************************
CLEAR: et_file_data, "Not used
et_message.
**********************************************************************
* Check if the service could be triggerd
* Location Data for replication are available and Test Mode OFF
**********************************************************************
IF ms_runtime_parameter-testrun = abap_true.
"Test Mode --> No Service Call
RETURN.
ENDIF.
IF ms_loc_bulk_repl_req IS NOT INITIAL.
"Replication data available
"Update Replication Status Object with the message_header-UUID (Message Link)
"to be able to identify the message later on in the inbound
LOOP AT ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg
INTO ls_loc_repl_req_msg.
lv_object_id = ls_loc_repl_req_msg-location-location_internal_id.
READ TABLE ct_obj_rep_sta ASSIGNING <ls_obj_rep_sta>
WITH KEY object_id = lv_object_id-id.
IF sy-subrc = 0.
"Entry found --> Set the message_header-UUID
<ls_obj_rep_sta>-msg_link = ls_loc_repl_req_msg-message_header-id-content.
ENDIF.
ENDLOOP.
ls_message_data_outbound = ms_loc_bulk_repl_req.
lv_path_message_header = 'LOCATION_BULK_REPLICATION_REQ-MESSAGE_HEADER'.
lv_path_sequence_fields = 'LOCATION_BULK_REPLICATION_REQ-LOC_REPL_REQ_MSG'.
lv_service_group = 'LOCATION_REPLICATE_REQ'.
lv_recipient_business_system = mv_receiver_bussystem_id.
ls_lrd_filter-bskey = lv_recipient_business_system.
* Context Build
CONCATENATE sy-sysid sy-mandt 'LOC_REPL_REQ'
INTO lv_tech_seq_context.
lv_appl_seq_context = 'LOCREQ'.
TRY.
CALL METHOD cl_bs_soa_asyncprx_out=>execute
EXPORTING
iv_proxy_class = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_method = 'LOC_BULK_REPLICATION_REQ_OUT'
iv_obj_type = 'BUS10002'
iv_path_msg_header = lv_path_message_header
iv_path_of_seq_fields = lv_path_sequence_fields
iv_service_group = lv_service_group
iv_logical_receiver_det_struc = ls_lrd_filter
iv_default_service_group = lv_default_service_group
iv_recipient_business_system = lv_recipient_business_system
iv_application_id = lv_application_id
iv_tech_seq_context = lv_tech_seq_context
iv_appl_seq_context = lv_appl_seq_context
iv_reference_message_id = lv_reference_message_id
iv_correlation_id = lv_correlation_id
iv_reconciliation_requested = lv_reconciliation_requested
IMPORTING
et_proxy_instances = lt_outbound_proxy
CHANGING
cs_message_data_outbound = ls_message_data_outbound.
CATCH cx_bs_soa_exception INTO lo_bs_soa_exception .
"Communication Error
"Get Error Text
CALL METHOD lo_bs_soa_exception->get_text
RECEIVING
result = lv_error_txt.
"Get Long Text
CALL METHOD lo_bs_soa_exception->get_longtext
RECEIVING
result = lv_error_long_txt.
"Write Message to the BAL
"DRF_OUTBOUND 015 - Error during proxy call (&1: &2, &3)
"ADD_MSG_RE --> Add Message and Raise Exception
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '015'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_msgv2 = lv_error_txt
iv_msgv3 = lv_error_long_txt.
CATCH cx_ai_system_fault INTO lo_xi_error.
"Application Integration: Technical Error
"Write BAL - DRF_OUTBOUND 013 - Error while creating the &1 proxy instance
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '013'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
ix_exception_catched = lo_xi_error.
ENDTRY.
ELSE.
"No Replication data available
"Add Message to the BAL
"DRF_OUTBOUND 322 - System does not send blank messages
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '322'
iv_msgid = 'DRF_OUTBOUND'.
ENDIF.
* Clear Message for new Message Run
CLEAR ms_loc_bulk_repl_req.
ENDMETHOD.
ENDCLASS.
Replication of Customer
Follow the similar steps as above below is the list of objects you must create.
Structure:
ZDRF_S_CUST_OUTBOUND
Table Type:
ZDRF_T_CUST_OUTBOUND
Class:
ZCL_CUST_LOC_DRF_EXPL_FILTER
ZCL _CUST_LOC_DRF_OUTBOUND
Structure: ZDRF_S_CUST_OUTBOUND
Table Type: ZDRF_T_CUST_OUTBOUND
Clas : ZCL_CUST_LOC_DRF_EXPL_FILTER
class ZCL_CUST_LOC_DRF_EXPL_FILTER definition
public
final
create public .
public section.
interfaces IF_DRF_FILTER .
protected section.
private section.
ENDCLASS.
CLASS ZCL_CUST_LOC_DRF_EXPL_FILTER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_CUST_LOC_DRF_EXPL_FILTER->IF_DRF_FILTER~APPLY_FILTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_APPL TYPE DRF_APPL
* | [--->] IV_BUSINESS_SYSTEM TYPE MDG_BUSINESS_SYSTEM
* | [--->] IS_C_FOBJ TYPE DRF_S_C_FOBJ_RUNTIME
* | [--->] IV_OUTB_IMPL TYPE DRF_OUTB_IMPL
* | [--->] IV_DLMOD TYPE DRF_DLMOD
* | [--->] IV_RUNMOD TYPE DRF_RUNMOD
* | [--->] IS_FILT TYPE DRF_S_C_FILT_RUNTIME
* | [--->] IO_BAL TYPE REF TO CL_DRF_BAL
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_UNFILTERED_OBJECTS TYPE SORTED TABLE
* | [--->] IS_ADDITIONAL_PARAMETER TYPE DRF_S_RTIME_PARAM_ADDITIONAL(optional)
* | [<---] ET_FILTERED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_FILTER_OBJECT
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_FILTER~APPLY_FILTER.
**********************************************************************
* Explicit Filter implementation for the DRF Outbound for Shipping Points
* The following filter structure is assigned to the explicit filter
* in the customizing: DRF_S_cust_LOC_EXPL_FILTER
* The filter structure contains the following components:
* kunnr TYPE kunnr
**********************************************************************
DATA:
ls_selopt TYPE rsdsselopt,
lt_cust_range TYPE rsds_selopt_t,
lt_cust_range_unf TYPE rsds_selopt_t,
lt_cust_drf_outbound TYPE ZDRF_T_CUST_OUTBOUND.
FIELD-SYMBOLS:
<ls_ext_criteria> TYPE rsds_range,
<ls_filter_range> TYPE rsds_frange,
<ls_unfiltered_objects> TYPE ZDRF_S_CUST_OUTBOUND.
**********************************************************************
* Initialize the exporting parameters
**********************************************************************
CLEAR et_filtered_objects.
**********************************************************************
* Process the external filter criteria and split them into the
* corresponding component range tables
**********************************************************************
LOOP AT it_external_criteria ASSIGNING <ls_ext_criteria>.
LOOP AT <ls_ext_criteria>-frange_t ASSIGNING <ls_filter_range>.
CASE <ls_filter_range>-fieldname.
WHEN 'KUNNR'.
INSERT LINES OF <ls_filter_range>-selopt_t INTO TABLE lt_cust_range.
ENDCASE.
ENDLOOP.
ENDLOOP.
**********************************************************************
* Take care of the unfiltered objects and add them to the corresponding
* Range Select Options
**********************************************************************
LOOP AT it_unfiltered_objects ASSIGNING <ls_unfiltered_objects>.
IF <ls_unfiltered_objects>-kunnr IS NOT INITIAL.
CLEAR ls_selopt.
ls_selopt-sign = if_drf_const=>range_sign_inclusive. "'I'
ls_selopt-option = if_drf_const=>range_option_equal. "'EQ'
ls_selopt-low = <ls_unfiltered_objects>-kunnr.
INSERT ls_selopt INTO TABLE lt_cust_range_unf.
ENDIF.
ENDLOOP.
"Add the unfiltered object to the affected range for the selection
IF lt_cust_range_unf IS NOT INITIAL.
INSERT LINES OF lt_cust_range_unf INTO TABLE lt_cust_range.
ENDIF.
**********************************************************************
* Select LOCNO and LOCTYPE from /SAPAPO/LOC
**********************************************************************
SELECT kunnr FROM kna1
INTO CORRESPONDING FIELDS OF TABLE lt_cust_drf_outbound
WHERE kunnr IN lt_cust_range.
**********************************************************************
* Fill the exporting parameters
**********************************************************************
INSERT LINES OF lt_cust_drf_outbound INTO TABLE et_filtered_objects.
ENDMETHOD.
ENDCLASS.
Class: ZCL _CUST_LOC_DRF_OUTBOUND
class ZCL_CUST_LOC_DRF_OUTBOUND definition
public
final
create public .
public section.
interfaces IF_DRF_OUTBOUND .
protected section.
types:
BEGIN OF tys_cust_data,
kunnr TYPE kunnr,
spras TYPE spras,
adrnr TYPE adrnr,
END OF tys_cust_data .
types:
tt_cust_data TYPE STANDARD TABLE OF tys_cust_data .
types:
BEGIN OF tys_cust_data_txt,
spras TYPE spras,
kunnr TYPE kunnr,
vtext TYPE vtext,
END OF tys_cust_data_txt .
types:
tt_cust_data_txt TYPE STANDARD TABLE OF tys_cust_data_txt .
types:
BEGIN OF tys_kunnr,
kunnr TYPE kunnr,
END OF tys_kunnr .
data MT_cust_ADDRESS type SZADR_ADDR1_TABLE .
data MT_cust_DATA type TT_cust_DATA .
data MT_cust_DATA_TXT type TT_cust_DATA_TXT .
data MS_RUNTIME_PARAMETER type DRF_S_RUNTIME_PARAMETER_EXT .
data MS_LOC_BULK_REPL_REQ type LOC_BULK_REPLICATION_REQ .
constants MC_T_DRF_LOC_OUTB type STRING value 'ZDRF_T_CUST_OUTBOUND' ##NO_TEXT.
constants MC_S_DRF_LOC_OUTBOUND type STRING value 'ZDRF_S_CUST_OUTBOUND' ##NO_TEXT.
data MV_SENDER_BUSSYSTEM_ID type SAPPLCO_BUSINESS_SYSTEM_ID .
data MV_RECEIVER_BUSSYSTEM_ID type SAPPLCO_BUSINESS_SYSTEM_ID .
private section.
methods FILL_MESSAGE_HEADER
exporting
!ES_MESSAGE_HEADER type SAPPLCO_BUS_DOC_MESSAGE_HEADER .
ENDCLASS.
CLASS ZCL_RAV_CUST_LOC_DRF_OUTBOUND IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CUST_LOC_DRF_OUTBOUND->FILL_MESSAGE_HEADER
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_MESSAGE_HEADER TYPE SAPPLCO_BUS_DOC_MESSAGE_HEADER
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD FILL_MESSAGE_HEADER.
DATA:
lv_uuid TYPE char32,
lv_timestamp TYPE timestampl.
CLEAR es_message_header.
GET TIME STAMP FIELD lv_timestamp.
cl_gdt_conversion=>date_time_outbound(
EXPORTING
im_value_long = lv_timestamp
IMPORTING
ex_value = es_message_header-creation_date_time " Time Stamp According to ISO 8601
).
es_message_header-sender_business_system_id = mv_sender_bussystem_id.
es_message_header-recipient_business_system_id = mv_receiver_bussystem_id.
TRY.
lv_uuid = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error.
"Should never occur
ASSERT 1 = 0.
ENDTRY.
es_message_header-id-content = lv_uuid.
cl_gdt_conversion=>guid_outbound(
EXPORTING
im_guid_c = lv_uuid " GUID in Character Display
IMPORTING
ex_value = es_message_header-uuid-content " GUID / UUID in XML Display
).
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE DRF_T_BDCP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_CHG_POINTER.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_CHANGE_POINTER TYPE MDG_CP_T_CP
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_MDG_CP.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS
* +-------------------------------------------------------------------------------------------------+
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [<-->] CT_CHANGED_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_ANALYZE_CHANGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ANALYZE_CHANGES_BY_OTHERS.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_MULTI.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [--->] IT_FOBJ TYPE DRF_T_FOBJ_IMPL
* | [--->] IV_IGNORE_FILTER TYPE ABAP_BOOL (default =' ')
* | [<---] EV_SKIP_OBJECT TYPE ABAP_BOOL
* | [<-->] CR_RELEVANT_OBJECT TYPE REF TO DATA
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~APPLY_NODE_INST_FILTER_SINGLE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_PREPARE_DATA TYPE DATA
* | [<---] ER_PACKAGE_DATA TYPE DATA
* | [<---] ES_TASK_PARAM TYPE DRF_S_PARALLEL_TASK_PARAM
* | [<---] EV_ALL_TASKS_DONE TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~BUILD_PARALLEL_PACKAGE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ET_ADD_EXTERNAL_CRITERIA TYPE RSDS_TRANGE
* | [<---] ES_STAT_INFO TYPE DRF_S_STAT_INFO
* | [!CX!] CX_DRF_ENRICH_FILTER_PARAMETER
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~ENRICH_FILTER_CRITERIA.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~FINALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [--->] IT_ERRONEOUS_OBJECTS TYPE SORTED TABLE
* | [--->] IV_REPEATED_INITIAL_RUN TYPE BOOLE_D
* | [<---] EV_DELETE_CHANGE_POINTER TYPE BOOLE_D
* +--------------------------------------------------------------------------------------</SIGNATURE>
method IF_DRF_OUTBOUND~FINALIZE.
endmethod.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND=>IF_DRF_OUTBOUND~INITIALIZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_RUNTIME_PARAM TYPE DRF_S_RUNTIME_PARAMETER_EXT
* | [<---] EO_IF_DRF_OUTBOUND TYPE REF TO IF_DRF_OUTBOUND
* | [<---] ES_RUNTIME_PARAM_OUT_IMPL TYPE DRF_S_RUNTIME_PARAM_OUT_IMPL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~INITIALIZE.
**********************************************************************
* Initialization of the DRF Outbound Implementation for Location
* Replication
**********************************************************************
DATA: ls_runtime_parameter TYPE drf_s_runtime_param_out_impl,
lr_drf_loc_outbound TYPE REF TO zcl_rav_cust_loc_drf_outbound.
**********************************************************************
* Initialize the exporting parameter
**********************************************************************
CLEAR: eo_if_drf_outbound,
es_runtime_param_out_impl.
**********************************************************************
* Create an instance of myself in order to remember the runtime
* parameters for all subsequent methods and pass it to the framework
**********************************************************************
TRY.
CREATE OBJECT lr_drf_loc_outbound.
CATCH cx_sy_create_object_error.
RETURN.
ENDTRY.
IF lr_drf_loc_outbound IS BOUND.
lr_drf_loc_outbound->ms_runtime_parameter = is_runtime_param.
ENDIF.
**********************************************************************
* Set own runtime parameter
**********************************************************************
ls_runtime_parameter-table_type_name = mc_t_drf_loc_outb. "T_SHPP_LOC_DRF_OUTBOUND
es_runtime_param_out_impl = ls_runtime_parameter.
**********************************************************************
* Set Outbound Implementation
**********************************************************************
eo_if_drf_outbound = lr_drf_loc_outbound.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~MAP_DATA2MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_RELEVANT_OBJECT TYPE REF TO DATA
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~MAP_DATA2MESSAGE.
DATA:
lr_rel_obj TYPE REF TO ZDRF_S_CUST_OUTBOUND,
lv_timezone TYPE tznzone,
ls_loc_bulk TYPE sapplco_loc_blk_repl_req_msg,
ls_loc_repl_mess TYPE sapplco_loc_repl_req_msg,
lt_loc_repl_mess TYPE sapplco_loc_repl_req_msg_tab,
ls_loc_description TYPE sapplco_short_description,
lv_loc_form_name TYPE sapplco_languageindependent_me,
ls_loc_tel TYPE sapplco_telephone,
ls_loc_facs TYPE sapplco_facsimile,
ls_loc_email TYPE sapplco_nosc_email,
ls_loc_web TYPE sapplco_nosc_web,
ls_loc_address TYPE sapplco_nosc_address.
FIELD-SYMBOLS:
<ls_cust_addr1_data> TYPE addr1_data.
lr_rel_obj ?= ir_relevant_object.
* Fill Message Header for Bulk Service
fill_message_header(
IMPORTING
es_message_header = ls_loc_bulk-message_header ).
READ TABLE mt_cust_data ASSIGNING FIELD-SYMBOL(<ls_cust_data>)
WITH KEY kunnr = lr_rel_obj->kunnr.
IF sy-subrc NE 0.
RETURN.
ENDIF.
* Fill Message Header for Location Replication
fill_message_header(
IMPORTING
es_message_header = ls_loc_repl_mess-message_header ).
CONCATENATE 'CU_' <ls_cust_data>-kunnr INTO ls_loc_repl_mess-location-location_internal_id.
* Location Type Code for Customer Location
ls_loc_repl_mess-location-location_type_code = '1010'.
**********************************************************************
* Address and Description
**********************************************************************
READ TABLE mt_cust_address ASSIGNING FIELD-SYMBOL(<ls_cust_addr_data>)
WITH KEY addrnumber = <ls_cust_data>-adrnr.
IF sy-subrc <> 0.
* Error -> No Address found for the plant
ELSE.
LOOP AT <ls_cust_addr_data>-addr1_tab ASSIGNING FIELD-SYMBOL(<ls_cust_addr1>).
ASSIGN <ls_cust_addr1>-data TO <ls_cust_addr1_data>.
IF NOT ( <ls_cust_addr1_data>-date_from <= sy-datum AND
<ls_cust_addr1_data>-date_to >= sy-datum ).
* Not Valid Address
CONTINUE.
ENDIF.
* Description (NAME1 from Address is used as text) -> Here Description of Shipping/Receiving Point.
LOOP AT mt_cust_data_txt ASSIGNING FIELD-SYMBOL(<ls_cust_data_txt>) WHERE kunnr = <ls_cust_data>-kunnr.
CLEAR ls_loc_description.
ls_loc_description-language_code = <ls_cust_data_txt>-spras.
ls_loc_description-content = <ls_cust_data_txt>-vtext.
INSERT ls_loc_description INTO TABLE ls_loc_repl_mess-location-description.
ENDLOOP.
* Time Zone
IF <ls_cust_addr1_data>-time_zone IS NOT INITIAL.
ls_loc_repl_mess-location-time_zone_code = <ls_cust_addr1_data>-time_zone.
ELSE.
CALL FUNCTION 'TZON_LOCATION_TIMEZONE'
EXPORTING
if_country = <ls_cust_addr1_data>-country
if_region = <ls_cust_addr1_data>-region
IMPORTING
ef_timezone = lv_timezone
EXCEPTIONS
no_timezone_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR ls_loc_repl_mess-location-time_zone_code.
ELSE.
ls_loc_repl_mess-location-time_zone_code = lv_timezone.
ENDIF.
ENDIF.
**********************************************************************
* Organization formatted Name
**********************************************************************
ls_loc_address-organisation_form_of_address-code = <ls_cust_addr1_data>-title.
IF <ls_cust_addr1_data>-name1 IS NOT INITIAL.
lv_loc_form_name = <ls_cust_addr1_data>-name1.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_cust_addr1_data>-name2 IS NOT INITIAL.
lv_loc_form_name = <ls_cust_addr1_data>-name2.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_cust_addr1_data>-name3 IS NOT INITIAL.
lv_loc_form_name = <ls_cust_addr1_data>-name3.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_cust_addr1_data>-name4 IS NOT INITIAL.
lv_loc_form_name = <ls_cust_addr1_data>-name4.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
IF <ls_cust_addr1_data>-name_txt IS NOT INITIAL.
lv_loc_form_name = <ls_cust_addr1_data>-name_txt.
INSERT lv_loc_form_name INTO TABLE ls_loc_address-organisation_formatted_name.
ENDIF.
**********************************************************************
* Physical Address
**********************************************************************
ls_loc_address-physical_address-country_code = <ls_cust_addr1_data>-country.
ls_loc_address-physical_address-country_name-language_code = <ls_cust_addr1_data>-langu.
ls_loc_address-physical_address-region_code = <ls_cust_addr1_data>-region.
ls_loc_address-physical_address-city_name = <ls_cust_addr1_data>-city1.
ls_loc_address-physical_address-additional_city_name = <ls_cust_addr1_data>-home_city.
ls_loc_address-physical_address-pobox_country_code = <ls_cust_addr1_data>-po_box_cty.
ls_loc_address-physical_address-pobox_region_code = <ls_cust_addr1_data>-po_box_reg.
ls_loc_address-physical_address-pobox_id = <ls_cust_addr1_data>-po_box.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr1_data>-po_box_num " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_address-physical_address-pobox_indicator ). " XSD:Indicator
ls_loc_address-physical_address-street_postal_code = <ls_cust_addr1_data>-post_code1.
ls_loc_address-physical_address-pobox_postal_code = <ls_cust_addr1_data>-post_code2.
ls_loc_address-physical_address-company_postal_code = <ls_cust_addr1_data>-post_code3.
ls_loc_address-physical_address-house_id = <ls_cust_addr1_data>-house_num1.
ls_loc_address-physical_address-additional_house_id = <ls_cust_addr1_data>-house_num2.
ls_loc_address-physical_address-district_name = <ls_cust_addr1_data>-city2.
ls_loc_address-physical_address-building_id = <ls_cust_addr1_data>-building.
ls_loc_address-physical_address-floor_id = <ls_cust_addr1_data>-floor.
ls_loc_address-physical_address-room_id = <ls_cust_addr1_data>-roomnumber.
ls_loc_address-physical_address-street_name = <ls_cust_addr1_data>-street.
IF <ls_cust_addr1_data>-str_suppl1 IS NOT INITIAL OR <ls_cust_addr1_data>-str_suppl2 IS NOT INITIAL.
INSERT <ls_cust_addr1_data>-str_suppl1 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
INSERT <ls_cust_addr1_data>-str_suppl2 INTO TABLE ls_loc_address-physical_address-street_prefix_name.
ENDIF.
IF <ls_cust_addr1_data>-str_suppl3 IS NOT INITIAL OR <ls_cust_addr1_data>-location IS NOT INITIAL.
INSERT <ls_cust_addr1_data>-str_suppl3 INTO TABLE ls_loc_address-physical_address-street_suffix_name.
INSERT <ls_cust_addr1_data>-location INTO TABLE ls_loc_address-physical_address-street_suffix_name.
ENDIF.
* Office
ls_loc_address-office-building_id = <ls_cust_addr1_data>-building.
ls_loc_address-office-floor_id = <ls_cust_addr1_data>-floor.
ls_loc_address-office-room_id = <ls_cust_addr1_data>-roomnumber.
* Communication
ls_loc_address-communication-correspondence_language_code = <ls_cust_addr1_data>-langu.
* Phone
LOOP AT <ls_cust_addr_data>-adtel_tab ASSIGNING FIELD-SYMBOL(<ls_cust_addr_adtel_data>).
CLEAR ls_loc_tel.
ls_loc_tel-number-country_code = <ls_cust_addr_adtel_data>-adtel-country.
ls_loc_tel-number-subscriber_id = <ls_cust_addr_adtel_data>-adtel-tel_number.
ls_loc_tel-number-extension_id = <ls_cust_addr_adtel_data>-adtel-tel_extens.
ls_loc_tel-number-country_code = <ls_cust_addr_adtel_data>-adtel-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr_adtel_data>-adtel-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-number_default_indicator ). " XSD:Indicator
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr_adtel_data>-adtel-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_tel-smsenabled_indicator ). " XSD:Indicator
INSERT ls_loc_tel INTO TABLE ls_loc_address-communication-telephone.
ENDLOOP.
* Fax
LOOP AT <ls_cust_addr_data>-adfax_tab ASSIGNING FIELD-SYMBOL(<ls_cust_addr_adfax_data>).
ls_loc_facs-number-country_code = <ls_cust_addr_adfax_data>-adfax-country.
ls_loc_facs-number-subscriber_id = <ls_cust_addr_adfax_data>-adfax-fax_number.
ls_loc_facs-number-extension_id = <ls_cust_addr_adfax_data>-adfax-fax_extens.
ls_loc_facs-number-country_code = <ls_cust_addr_adfax_data>-adfax-country.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr_adfax_data>-adfax-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_facs-number_default_indicator ). " XSD:Indicator
INSERT ls_loc_facs INTO TABLE ls_loc_address-communication-facsimile.
ENDLOOP.
* E-mail
LOOP AT <ls_cust_addr_data>-adsmtp_tab ASSIGNING FIELD-SYMBOL(<ls_cust_addr_adsmtp_data>).
CLEAR ls_loc_email.
ls_loc_email-uri = <ls_cust_addr_adsmtp_data>-adsmtp-smtp_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr_adsmtp_data>-adsmtp-dft_receiv " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_email-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_email INTO TABLE ls_loc_address-communication-email.
ENDLOOP.
* Web
LOOP AT <ls_cust_addr_data>-aduri_tab ASSIGNING FIELD-SYMBOL(<ls_cust_addr_aduri>).
IF <ls_cust_addr_aduri>-aduri-uri_type = 'HPG' . " Location Type HPG(Homepage) is transffered only
CLEAR ls_loc_web.
ls_loc_web-uri = <ls_cust_addr_aduri>-aduri-uri_addr.
cl_gdt_conversion=>indicator_outbound(
EXPORTING
im_value = <ls_cust_addr_aduri>-aduri-flgdefault " ABAP Flag: 'X' ="true, ' ' = false
IMPORTING
ex_value = ls_loc_web-uridefault_indicator ). " XSD:Indicator
INSERT ls_loc_web INTO TABLE ls_loc_address-communication-web.
ENDIF.
ENDLOOP.
* Only one valid address
ls_loc_repl_mess-location-address = ls_loc_address.
EXIT.
ENDLOOP.
ENDIF.
ms_loc_bulk_repl_req-location_bulk_replication_req-message_header = ls_loc_bulk-message_header.
INSERT ls_loc_repl_mess INTO TABLE lt_loc_repl_mess.
INSERT LINES OF lt_loc_repl_mess INTO TABLE ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~READ_COMPLETE_DATA
* +-------------------------------------------------------------------------------------------------+
* | [<-->] CT_RELEVANT_OBJECTS TYPE SORTED TABLE
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~READ_COMPLETE_DATA.
**********************************************************************
* Read the data of all records that shall be replicated later on
* via the new Location Service.
**********************************************************************
DATA:
lt_bus_sys_tech TYPE mdg_t_bus_sys_tech,
lv_own_business_system TYPE text60,
ls_kunnr TYPE tys_kunnr,
lt_kunnr TYPE TABLE OF tys_kunnr,
lt_adrc TYPE szadr_adrc_table,
ls_adrc TYPE szadr_st_adrc,
lt_addr_error TYPE szadr_error_table.
FIELD-SYMBOLS:
<ls_cust_data> TYPE tys_cust_data,
<ls_loc_drf_outbound> TYPE any,
<lv_comp> TYPE any.
**********************************************************************
* Get Business System Data
**********************************************************************
* Get own Logical System
CALL FUNCTION 'LCR_GET_OWN_BUSINESS_SYSTEM'
IMPORTING
bs_key_name = lv_own_business_system
EXCEPTIONS
no_business_system = 1
no_rfc_destination = 2
no_landscape_directory = 3
illegal_arguments = 4
communication_error = 5
ld_error = 6
sld_api_exception = 7
OTHERS = 8.
IF sy-subrc NE 0.
RETURN. " RAISE no_business_system.
ENDIF.
mv_sender_bussystem_id = lv_own_business_system.
CALL METHOD cl_drf_access_cust_data=>select_business_sys_for_appl
EXPORTING
iv_appl = ms_runtime_parameter-appl
iv_outb_impl = ms_runtime_parameter-outb_impl
IMPORTING
et_bus_sys_tech = lt_bus_sys_tech.
READ TABLE lt_bus_sys_tech ASSIGNING FIELD-SYMBOL(<ls_bus_sys_tech>) INDEX 1. "#EC CI_NOORDER
mv_receiver_bussystem_id = <ls_bus_sys_tech>-business_system.
**********************************************************************
* Build up table lt_kunnr
**********************************************************************
LOOP AT ct_relevant_objects ASSIGNING <ls_loc_drf_outbound>.
CLEAR ls_kunnr.
UNASSIGN <lv_comp>.
ASSIGN COMPONENT 'KUNNR' OF STRUCTURE <ls_loc_drf_outbound> TO <lv_comp>.
IF sy-subrc = 0 AND <lv_comp> IS ASSIGNED.
ls_kunnr = <lv_comp>.
INSERT ls_kunnr INTO TABLE lt_kunnr.
ENDIF.
ENDLOOP.
**********************************************************************
* Retrieve Data of Customer general data
**********************************************************************
IF lt_kunnr IS NOT INITIAL.
SELECT kunnr spras adrnr FROM kna1
INTO CORRESPONDING FIELDS OF TABLE mt_cust_data
FOR ALL ENTRIES IN lt_kunnr
WHERE kunnr = lt_kunnr-kunnr.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE cx_drf_process_messages.
ENDIF.
**********************************************************************
* Retrieve Text Data of Customer general data ( not existing)
**********************************************************************
* IF lt_kunnr IS NOT INITIAL.
* SELECT spras vstel vtext FROM tvstt
* INTO CORRESPONDING FIELDS OF TABLE mt_cust_data_txt
* FOR ALL ENTRIES IN lt_kunnr
* WHERE kunnr = lt_kunnr-kunnr.
* IF sy-subrc <> 0.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
* ELSE.
* RAISE EXCEPTION TYPE cx_drf_process_messages.
* ENDIF.
*
**********************************************************************
* Retrieve Addresses of the Shipping/Receiving Points
**********************************************************************
CLEAR lt_adrc.
LOOP AT mt_cust_data ASSIGNING <ls_cust_data>.
IF <ls_cust_data>-adrnr IS NOT INITIAL.
ls_adrc-addrnumber = <ls_cust_data>-adrnr.
INSERT ls_adrc INTO TABLE lt_adrc.
ENDIF.
ENDLOOP.
IF lt_adrc IS NOT INITIAL.
CALL FUNCTION 'ADDR_GET_COMPLETE_DB_MASS'
EXPORTING
iv_current_comm_data = 'X'
TABLES
address_selection = lt_adrc
sz_addr1_complete = mt_cust_address
sz_error_table = lt_addr_error.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RAV_CUST_LOC_DRF_OUTBOUND->IF_DRF_OUTBOUND~SEND_MESSAGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_FILE_INFO TYPE DRF_S_FILE_INFO(optional)
* | [--->] IV_OBJECT_COUNT TYPE DRF_PACKAGE_SIZE(optional)
* | [--->] IS_BUS_SYS_TECH TYPE MDG_S_BUS_SYS_TECH(optional)
* | [<---] ET_FILE_DATA TYPE DRF_T_FILE_OI_CONTENT
* | [<---] ET_MESSAGE TYPE DRF_T_MESSAGE
* | [<-->] CT_OBJ_REP_STA TYPE DRF_T_OBJ_REP_STA_FULL(optional)
* | [!CX!] CX_DRF_PROCESS_MESSAGES
* | [!CX!] CX_DRF_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IF_DRF_OUTBOUND~SEND_MESSAGE.
**********************************************************************
* The method calls the servcice LocationBulkReplicationRequest_Out
* Class: CO_LOC_LOC_BULK_REPL_REQ_OUT
* Method: LOC_BULK_REPLICATION_REQ_OUT
* Parameter OUTPUT Type LOC_BULK_REPLICATION_REQ
**********************************************************************
* The service will be called under the followinng circumstances:
* Attribute MS_LOC_BULK_REPL_REQ is not initial
* Attribute MS_RUNTIME_PARAMETER-TESTRUN is not abap_false
* That means, location data for replication are available and
* the DRFOUT wasn't called in test mode.
**********************************************************************
TYPES: BEGIN OF ty_object_id,
prefix TYPE char3,
id TYPE char4,
END OF ty_object_id.
DATA:
ls_message_data_outbound TYPE loc_bulk_replication_req, "TYPE sapplco_loc_blk_repl_req_msg,
lv_path_message_header TYPE string,
lv_path_sequence_fields TYPE string,
lv_default_service_group TYPE xflag,
lv_service_group TYPE srt_wsp_dt_obj_name,
lv_recipient_business_system TYPE sld_bskey,
lv_application_id TYPE bs_soa_appl_id,
lv_tech_seq_context TYPE bs_soa_asyncprx_cntxt,
lv_appl_seq_context TYPE bs_soa_inappseq_cntxt,
lv_reference_message_id TYPE bs_soa_rspnsrcvr_msg_id,
lv_correlation_id TYPE bs_soa_rspnsrcvr_corel_id,
lv_reconciliation_requested TYPE xflag,
ls_lrd_filter TYPE lrd_sld_bskey,
lo_bs_soa_exception TYPE REF TO cx_bs_soa_exception,
lt_outbound_proxy TYPE bssoa_asyncprx_instance_t ##needed.
DATA:
lo_xi_error TYPE REF TO cx_ai_system_fault,
lv_error_txt TYPE string,
lv_error_long_txt TYPE string,
lv_object_id TYPE ty_object_id,
ls_loc_repl_req_msg TYPE sapplco_loc_repl_req_msg.
FIELD-SYMBOLS:
<ls_obj_rep_sta> TYPE drf_s_obj_rep_sta_attr.
***********************************************************************
** Initialize the exporting parameter
***********************************************************************
CLEAR: et_file_data, "Not used
et_message.
**********************************************************************
* Check if the service could be triggerd
* Location Data for replication are available and Test Mode OFF
**********************************************************************
IF ms_runtime_parameter-testrun = abap_true.
"Test Mode --> No Service Call
RETURN.
ENDIF.
IF ms_loc_bulk_repl_req IS NOT INITIAL.
"Replication data available
"Update Replication Status Object with the message_header-UUID (Message Link)
"to be able to identify the message later on in the inbound
LOOP AT ms_loc_bulk_repl_req-location_bulk_replication_req-loc_repl_req_msg
INTO ls_loc_repl_req_msg.
lv_object_id = ls_loc_repl_req_msg-location-location_internal_id.
READ TABLE ct_obj_rep_sta ASSIGNING <ls_obj_rep_sta>
WITH KEY object_id = lv_object_id-id.
IF sy-subrc = 0.
"Entry found --> Set the message_header-UUID
<ls_obj_rep_sta>-msg_link = ls_loc_repl_req_msg-message_header-id-content.
ENDIF.
ENDLOOP.
ls_message_data_outbound = ms_loc_bulk_repl_req.
lv_path_message_header = 'LOCATION_BULK_REPLICATION_REQ-MESSAGE_HEADER'.
lv_path_sequence_fields = 'LOCATION_BULK_REPLICATION_REQ-LOC_REPL_REQ_MSG'.
lv_service_group = 'LOCATION_REPLICATE_REQ'.
lv_recipient_business_system = mv_receiver_bussystem_id.
ls_lrd_filter-bskey = lv_recipient_business_system.
* Context Build
CONCATENATE sy-sysid sy-mandt 'LOC_REPL_REQ'
INTO lv_tech_seq_context.
lv_appl_seq_context = 'LOCREQ'.
TRY.
CALL METHOD cl_bs_soa_asyncprx_out=>execute
EXPORTING
iv_proxy_class = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_method = 'LOC_BULK_REPLICATION_REQ_OUT'
iv_obj_type = 'BUS10002'
iv_path_msg_header = lv_path_message_header
iv_path_of_seq_fields = lv_path_sequence_fields
iv_service_group = lv_service_group
iv_logical_receiver_det_struc = ls_lrd_filter
iv_default_service_group = lv_default_service_group
iv_recipient_business_system = lv_recipient_business_system
iv_application_id = lv_application_id
iv_tech_seq_context = lv_tech_seq_context
iv_appl_seq_context = lv_appl_seq_context
iv_reference_message_id = lv_reference_message_id
iv_correlation_id = lv_correlation_id
iv_reconciliation_requested = lv_reconciliation_requested
IMPORTING
et_proxy_instances = lt_outbound_proxy
CHANGING
cs_message_data_outbound = ls_message_data_outbound.
CATCH cx_bs_soa_exception INTO lo_bs_soa_exception .
"Communication Error
"Get Error Text
CALL METHOD lo_bs_soa_exception->get_text
RECEIVING
result = lv_error_txt.
"Get Long Text
CALL METHOD lo_bs_soa_exception->get_longtext
RECEIVING
result = lv_error_long_txt.
"Write Message to the BAL
"DRF_OUTBOUND 015 - Error during proxy call (&1: &2, &3)
"ADD_MSG_RE --> Add Message and Raise Exception
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '015'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
iv_msgv2 = lv_error_txt
iv_msgv3 = lv_error_long_txt.
CATCH cx_ai_system_fault INTO lo_xi_error.
"Application Integration: Technical Error
"Write BAL - DRF_OUTBOUND 013 - Error while creating the &1 proxy instance
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '013'
iv_msgid = 'DRF_OUTBOUND'
iv_msgv1 = 'CO_LOC_LOC_BULK_REPL_REQ_OUT'
ix_exception_catched = lo_xi_error.
ENDTRY.
ELSE.
"No Replication data available
"Add Message to the BAL
"DRF_OUTBOUND 322 - System does not send blank messages
CALL METHOD ms_runtime_parameter-bal->add_msg_re
EXPORTING
iv_msgno = '322'
iv_msgid = 'DRF_OUTBOUND'.
ENDIF.
* Clear Message for new Message Run
CLEAR ms_loc_bulk_repl_req.
ENDMETHOD.
ENDCLASS.
Configuring Cross Client customisation of Data Replication Framework
After creating all the objects below configuration has to be done in the Data Replication Customization . Transaction : drfimg
The numbers represent the sequence in which the customisations have to be maintained
1. Define Business Objects
2. Define Filter Objects
Create 3 filter objects each representing the corresponding object
For each filter object assign filters
3. Define Object Identifiers
Create object identifier for each of the objects
4. Assign Key Structures to Object Identifiers
5. Assign Filter Objects to Business Objects
6. Define Service Operations Available for Replication
7. Define Outbound Implementations
After doing all these configurations, you have to maintain additional configurations as mentioned in the configuration guide https://help.sap.com/viewer/b4724b2f483e439782b60cab4407c25a/LBN/en-US/86120107c3004203a5ff0c79643199a9.html Within manage location section. However, this time you would have to maintain the BO type and Outbound implementation you have created.
You may test the replication by running the transaction DRFOUT
Summary
But doing the above configuration, you will be able to replication locations of Business Partner, Customer , Vendor, Plant and shipping point to SAP Logistics Business Network
You may also refer the below blog on how to create Location master
https://blogs.sap.com/2021/04/29/prefixes-and-suffixes-when-creating-locations-in-sap-tm/
Great Blogpost, thanks for that input.
I just tried to connect an internal S4 with (embedded TM Master data) and use DRF to get the master data communicated to the LBN. So i don't think, that i directly need to do a setup with the help of LocationBulkReplicateRequest_Out but even when i try to follow the help description
i encounter the problem, that i am missing some entries in table MDG_BUS_SYS_BO (see pic) BO Type is not there. Did i miss a config step here?
what can be the reason, that this table is incomplete and how can i fill it the standard way without tweaking?
thx + br
Patrick
Hi Patrick,
Within the customising " Define Custom Settings for Data Replication -->Define Technical Settings -->Define Technical Settings for Business Systems.", click on new entry and for the Business System column type in the rLBND##SYSCLNT001 ( do not search or F4) and hit enter. The system might through a warning. But just click on enter again and proceed.
Best Regards, Ravish.
Hello Ravish,
this step worked. The entry is in the table.
But then i need to mark the entry and click on Define Bus. Systems,...
in this popup I seem to be unable to get entries in. According to the documentation i need to choose Business Object 189.
how to proceed here / what is the official way to fill this table?
HI Patrick,
From the screen shot after filling the "Define Business Systems", you are directly clicking "Define Bus. Systems, BOs, Communication Channel". Instead you should click on "Define Bus. Systems, BOs"
DRF Just
Hello Ravish,
that happens when you are in a rush. Now that part of the config looks much better and can be saved. But i am afraid there is more message specific stuff missing.
DRFOUT is showing in the log this per location:
Isn't that part of admin guide version2?
br
Patrick
HI Patrick,
Might be some issue with webservices configuration.
Refer: https://launchpad.support.sap.com/#/notes/0002512934
BR, Ravish.