Advertising:
Step-by-step for creating custom IDoc
From SAP Knowledge Base
Schritt-für-Schritt Anleitung
- WE31 - Create segment ====
Don't forget to release the latest version.
WE30 - Create basic type
Don't forget to release the base type.
WE81 - Create message type
WE82 - Assign basis type to message type
SE80 - Funktionsgruppe erstellen
SE37 - Create custom IDoc processing function module
Code snippet
DATA: eid TYPE bdwfretvar-wf_param VALUE 'Error_IDOCs',
pid TYPE bdwfretvar-wf_param VALUE 'Processed_IDOCs',
apo TYPE bdwfretvar-wf_param VALUE 'Appl_Objects',
c_wf_result_error TYPE bdwfap_par-result VALUE '99999',
c_wf_result_ok TYPE bdwfap_par-result VALUE '0',
xyz_struc_seg TYPE xyz_seg_structure,
error_occurend TYPE char1,
msgv1 TYPE edids-stapa1,
msgv2 TYPE edids-stapa2,
msgv3 TYPE edids-stapa3,
msgv4 TYPE edids-stapa4,
message TYPE bapiret2-message,
error_log TYPE bal_t_msg.
CONSTANTS: status_51_failed TYPE edidc-status VALUE '51',
status_53_successful TYPE edidc-status VALUE '53',
segnam_xyz TYPE String VALUE 'XYZ',
mestyp_xyz TYPE String VALUE 'XYZ'.
IF idoc_contrl-mestyp <> mestyp_xyz.
RAISE wrong_function_called.
ENDIF.
LOOP AT idoc_contrl.
error_occurend = ''.
TRY.
* Have a look for ZCL_BAL here: https://wiki.m1ch3l.de/ZCL_BAL
DATA(bal) = NEW zcl_bal(
object = zcl_bal=>cs_object-idoc
subobject = zcl_bal=>cs_subobject-idoc_xyz
extnumber = |IDoc_{ idoc_contrl-mestyp }_{ idoc_contrl-docnum }|
).
CATCH zcx_basic INTO DATA(zcx_basic).
RAISE bal_creating_failed.
ENDTRY.
LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum.
CASE idoc_data-segnam.
WHEN segnam_xyz.
ENDCASE.
ENDLOOP.
IF error_occurend = abap_true. "Error
IF lines( bal->get_all_msgs_bapiret2( ) ) > 0.
bal->store_and_free( ).
ENDIF.
idoc_status-docnum = idoc_contrl-docnum.
idoc_status-status = status_51_failed.
idoc_status-msgty = 'E'.
idoc_status-msgid = 'ZMC_XYZ'.
idoc_status-msgno = '004'.
idoc_status-msgv1 = |TCODE: SLG1|.
idoc_status-msgv2 = zcl_bal=>cs_object-idoc.
idoc_status-msgv3 = zcl_bal=>cs_subobject-idoc_xyz.
idoc_status-msgv4 = |IDoc_{ idoc_contrl-mestyp }_{ idoc_contrl-docnum }|.
APPEND idoc_status.
ELSE. "OK
idoc_status-docnum = idoc_contrl-docnum.
idoc_status-status = status_53_successful.
idoc_status-msgty = 'S'.
idoc_status-msgid = 'ZMC_XYZ'.
idoc_status-msgno = '012'.
idoc_status-repid = sy-repid.
idoc_status-msgv1 = 'XYZ'.
idoc_status-msgv2 = 'XYZ'.
APPEND idoc_status.
ENDIF.
* set workflow output parameters
* Allocate IDOC numbers to Workflow output parameters
IF lv_error_occurend = abap_true.
workflow_result = c_wf_result_error.
return_variables-wf_param = eid.
return_variables-doc_number = idoc_contrl-docnum.
APPEND return_variables.
ELSE.
workflow_result = c_wf_result_ok.
return_variables-wf_param = pid.
return_variables-doc_number = idoc_contrl-docnum.
APPEND return_variables.
return_variables-wf_param = apo.
return_variables-doc_number = idoc_contrl-docnum.
APPEND return_variables.
ENDIF.
ENDLOOP.
WE57 - Nachrichtentyp zu FuBa zuordnen
Hinweis: SAP weist darauf hin, dass es evtl. nicht transportiert wird. Sollte man in jedem System prüfen.
BD51 - Eintrag für Z FuBa erstellen
WE41/42 - Vorgangscode erstellen
Wenn das AusgangsIDoc z.B. nicht über die Nachrichtensteuerung mit einem Vorgangscode im Ausgang(hinter diesem einem Funktionsbaustein steckt) erstellt wird, dann ist das AusgangsIDoc selber zu erzeugen.
Hier könnte die Z-Klasse "ZCL_IDOC_UTILITIES" direkt verwendet oder sich am Code orientiert werden. Wesentlich wird für die Erstellung der Fuba "MASTER_IDOC_DISTRIBUTE" verwendet.