Voraussetzung sind die vorangegangenen notwendigen Schritte aus Definition und Verwendung eines Basistyps.
Bei synchronen Methoden brauchen Sie kein Ereignis zu definieren, mit dem sich die Methode zurückmeldet.
Sie haben eine Methode durch ein konkretes ABAP-Programm realisiert. Sie müssen noch eine Aufgabe anlegen, die diese Methode und den zugehörigen Objekttyp referenziert.
Im Fallbeispiel definieren Sie die synchrone, dialogfreie Methode InputBackgroundTest für Ihren Objekttyp IDOCTEST. Der Quelltext lautet:
INCLUDE <OBJECT>. " Workflow-Makros zur Objektdefinition
begin_data object. " Do not change.. DATA is generated
* only private members may be inserted into structure private
data:
" begin of private,
" to declare private attributes remove comments and
" insert private attributes here...
" end of private,
begin of key,
idocnumber like edidc-docnum,
end of key.
end_data object. " Do not change.. DATA is generated
...
BEGIN_METHOD inputBackgroundTest changing container.
CALL FUNCTION 'IDOC_INPUT_WF_TESTER'
EXPORTING idocnumber = object-key-idocnumber
EXCEPTIONS
OTHERS = 01.
END_METHOD.
Der übergebene Parameter ist idocnumber, den der Objekttyp IDOCTEST vom Supertyp IDOCAPPL als Schlüsselfeld geerbt hat.
Den Funktionsbaustein IDOC_INPUT_WF_TESTER legen Sie per Vorwärtsnavigation (Doppelklick) an. Er liest die Daten aus dem IDoc und erzeugt ein Ereignis im Fehlerfall (durch Aufruf des Funktionsbausteins SWE_EVENT_CREATE). In der FORM-Routine READ_IDOC_TESTER sehen Sie, wie Daten aus einer IDoc-Tabelle über Segmentstrukturen in Anwendungstabellen wandern.
Im folgenden Quelltext wird öfters auf das Analogon beim direkten Eingang verwiesen (Beispiel IDOC_INPUT_TESTER), jedoch nur aus Platzgründen, da man ja entweder den direkten oder den Workflow-Eingang wählt.
Anwendungskürzel |
V (Vertrieb) |
Ablaufart |
normal, Start sofort |
FUNCTION IDOC_INPUT_WF_TESTER.
*---------------------------------------------------------
*Globale Schnittstelle:
* IMPORTING idocnumber LIKE EDIDC-DOCNUM
*---------------------------------------------------------
INCLUDE <CNTN01>. " Workflow-Makros zur Containerdefinition
DATA:
i_edids LIKE edi_ds OCCURS 1 WITH HEADER LINE,
event_id like swedumevid-evtid,
status like edids-status,
cidocnumber like sweinstcou-objkey,
errorcode like sy-subrc.
"Für Test der Ausnahmebehandlung
swc_container ev_container.
* initialize SET/GET parameters and internal tables
PERFORM INITIALIZE_ORGANIZATIONAL_DATA.
CALL FUNCTION 'EDI_DOCUMENT_OPEN_FOR_PROCESS'
EXPORTING
document_number = idocnumber
IMPORTING
idoc_control = idoc_contrl
EXCEPTIONS
document_foreign_lock = 01
document_not_exist = 02
document_number_invalid = 03
document_is_already_open = 04.
CALL FUNCTION 'EDI_SEGMENTS_GET_ALL'
EXPORTING
document_number = idocnumber
TABLES
idoc_containers = idoc_data
EXCEPTIONS
document_number_invalid = 01
end_of_document = 02.
PERFORM READ_IDOC_TESTER.
PERFORM CALL_VA01_IDOC_ORDERS
using errorcode.
PERFORM WRITE_STATUS_RECORD TABLES i_edids "Status schreiben
USING errorcode.
CALL FUNCTION 'EDI_DOCUMENT_CLOSE_PROCESS'
EXPORTING
document_number = idocnumber
IMPORTING
idoc_control = idoc_contrl
EXCEPTIONS
document_not_open = 01
failure_in_db_write = 02
parameter_error = 03
status_set_missing = 04.
IF errorcode <> 0.
cidocnumber = idocnumber.
CALL FUNCTION 'SWE_EVENT_CREATE'
EXPORTING
objtype = 'IDOCTEST'
objkey = cidocnumber
event = 'InputErrorOccurred'
start_recfb_synchron = 'X'
"synchroner Aufruf
IMPORTING
event_id = event_id
TABLES
event_container = ev_container
EXCEPTIONS
objtype_not_found = 1
others = 2.
COMMIT WORK.
ENDIF.
ENDFUNCTION.
FORM INITIALIZE_ORGANIZATIONAL_DATA
...
* Formroutine wie im Abschnitt
* Funktionsbaustein anlegen (direkter Eingang)
ENDFORM.
" INITIALIZE_ORGANIZATIONAL_DATA
FORM READ_IDOC_TESTER.
...
* Formroutine und aufgerufene Routinen wie im Abschnitt
* Funktionsbaustein anlegen (direkter Eingang)
ENDFORM.
" READ_IDOC_TESTER
FORM CALL_VA01_IDOC_ORDERS using errorcode.
* call transaction first dynpro
PERFORM DYNPRO_START.
* call transaction double-line entry
PERFORM DYNPRO_DETAIL2.
* incoterms
PERFORM DYNPRO_HEAD_300.
* call transaction item datas
PERFORM DYNPRO_POSITION.
PERFORM DYNPRO_SET USING 'BDC_OKCODE' 'SICH'.
* call transaction VA01
CALL TRANSACTION 'VA01' USING BDCDATA
MODE 'N'
UPDATE 'S'
MESSAGES INTO XBDCMSGCOLL.
errorcode = SY-SUBRC. " remember returncode for status update
ENDFORM. " CALL_VA01_IDOC_ORDERS
FORM DYNPRO_START.
...
* Formroutine und aufgerufene Routinen wie im Abschnitt
* Funktionsbaustein anlegen (direkter Eingang)
ENDFORM.
" DYNPRO_START
FORM WRITE_STATUS_RECORD TABLES i_edids STRUCTURE edi_ds
USING errorcode.
* fill status record
I_EDIDS-DOCNUM = IDOC_CONTRL-DOCNUM.
I_EDIDS-LOGDAT = SY-DATUM.
IF errorcode = 0.
I_EDIDS-STATUS = BELEG_GEBUCHT. "value 53
GET PARAMETER ID 'AUN' FIELD BELEGNUMMER.
I_EDIDS-STAMID = 'V1'.
I_EDIDS-STAMNO = '311'.
I_EDIDS-STAPA1 = 'Terminauftrag'.
I_EDIDS-STAPA2 = BELEGNUMMER.
ELSE.
I_EDIDS-STATUS = BELEG_NICHT_GEBUCHT.
"value 51
I_EDIDS-STAMID = SY-MSGID.
I_EDIDS-STAMNO = SY-MSGNO.
I_EDIDS-STAPA1 = SY-MSGV1.
I_EDIDS-STAPA2 = SY-MSGV2.
I_EDIDS-STAPA3 = SY-MSGV3.
I_EDIDS-STAPA4 = SY-MSGV4.
ENDIF.
CALL FUNCTION 'EDI_DOCUMENT_STATUS_SET'
EXPORTING
document_number = idoc_contrl-docnum
idoc_status = i_edids
IMPORTING
idoc_control = idoc_contrl
EXCEPTIONS
document_number_invalid = 01
other_fields_invalid = 02
status_invalid = 03.
ENDFORM. " WRITE_STATUS_RECORD
Globale Daten von IDOC_INPUT_WF_TESTER
data:
idoc_data LIKE edidd occurs 10 WITH HEADER LINE,
idoc_contrl LIKE edidc occurs 1 WITH HEADER LINE.
* weitere Daten wie im Abschnitt
* Funktionsbaustein anlegen (direkter Eingang)