Funktionsbaustein anlegen (Ausgang unter NAST)
Sie legen einen Funktionsbaustein an, der vom Report RSNASTED (Formroutine NEW_DYN_PERFORM) aus über einen neuen Vorgangscode identifiziert wird. Dieser Funktionsbaustein füllt den neuen Basistyp mit Anwendungsdaten. RSNASTED selbst steht in der Tabelle TNAPR als EDI-Verarbeitungsprogramm. Die Nachrichtensteuerung liest diese Tabelle und kann dadurch RSNASTED aufrufen.
Vorgehensweise
Im Fallbeispiel heißt Ihr neuer Funktionsbaustein IDOC_OUTPUT_TESTER. Er verwendet die neue Schnittstelle (ab Release 3.0), d.h. er stellt die Anwendungsdaten in eine interne Tabelle. Außerdem wird der Weg ohne die ALE-Schicht (also ohne Filtern) gewählt.
Ihr Funktionsbaustein wird wie IDOC_OUTPUT_ORDERS (IDoc-Typ ORDERS01) aus dem Einkauf (Bestellung anlegen) aufgerufen. Er füllt daher auch die Segmente Ihres neuen IDoc-Typs aus ein Einkaufstabellen, nämlich EKKO und EKPO (Einkaufsbelegkopf und -position). Beachten Sie, daß keine realistische Bestellung simuliert, sondern nur dargelegt werden soll, wie Daten aus Anwendungstabellen über Segmentstrukturen schließlich in eine IDoc-Tabelle wandern. Dazu beachten Sie die Formroutinen HEADER_E1HEAD_FILL oder POSITION_E1ITEM_FILL.
Verwaltungsparameter von IDOC_OUTPUT_TESTER
Anwendungskürzel |
M (Materialwirtschaft) |
Ablaufart |
normal, Start sofort |
Schnittstelle von IDOC_OUTPUT_TESTER
Formalparameter |
Bezugsstruktur |
Erläuterung |
Importparameter |
||
OBJECT |
NAST |
aktueller NAST-Satz |
CONTROL_RECORD_IN |
EDIDC |
enthält die Empfängerinformation |
Exportparameter |
||
OBJECT_TYPE |
WFAS1-ASGTP |
Objekttyp für das Anwendungsobjekt im Business Object Repository (BOR) |
CONTROL_RECORD_OUT |
EDIDC |
enthält die Senderinformation sowie Datum und Uhrzeit, zu dem die IDoc-Tabelle gefüllt wurde. |
Tabelle |
||
INT_EDIDD |
EDIDD |
Interne Tabelle der IDoc-Datensätze |
Beispielcoding
FUNCTION IDOC_OUTPUT_TESTER.
*"------------------------------------------------------------------
*"*"Globale Schnittstelle:
*" IMPORTING
*" VALUE(OBJECT) LIKE NAST STRUCTURE NAST
*" VALUE(CONTROL_RECORD_IN) LIKE EDIDC STRUCTURE EDIDC
*" EXPORTING
*" VALUE(OBJECT_TYPE) LIKE WFAS1-ASGTP
*" VALUE(CONTROL_RECORD_OUT) LIKE EDIDC STRUCTURE EDIDC
*" TABLES
*" INT_EDIDD STRUCTURE EDIDD
*" EXCEPTIONS
*" ERROR_MESSAGE_RECEIVED
*"-------------------------------------------------------------------
CLEAR CONTROL_RECORD_OUT.
* fill help fields
H_KAPPL = OBJECT-KAPPL.
H_EBELN = OBJECT-OBJKY.
H_PARVW = OBJECT-PARVW.
* fill control record
MOVE CONTROL_RECORD_IN TO CONTROL_RECORD_OUT.
CONTROL_RECORD_OUT-DIRECT = '1'.
CONTROL_RECORD_OUT-SERIAL = SY-DATUM.
CONTROL_RECORD_OUT-SERIAL+8 = SY-UZEIT.
* read orders
PERFORM ORDERS_READ.
* fill idoc table
PERFORM IDOC_TABLE_FILL.
* provide object type
OBJECT_TYPE = 'BUS2012'.
ENDFUNCTION.
FORM ORDERS_READ.
SELECT SINGLE * FROM T000 WHERE MANDT EQ SY-MANDT.
* read header data
SELECT SINGLE * FROM EKKO WHERE EBELN EQ H_EBELN.
IF SY-SUBRC NE 0.
MESSAGE E751 WITH H_EBELN.
ENDIF.
EDIDC-SNDPRT = 'MM'.
EDIDC-SNDPRN = EKKO-EKORG.
* read data of supplier (book keeping view)
SELECT SINGLE * FROM LFB1 WHERE LIFNR = EKKO-LIFNR
AND BUKRS = EKKO-BUKRS.
* fill purchasing organization
IF LFB1-EIKTO EQ SPACE.
LFB1-EIKTO = EKKO-EKORG.
ENDIF.
* read position data
SELECT * FROM EKPO WHERE EBELN = EKKO-EBELN.
MOVE-CORRESPONDING EKPO TO XEKPO.
APPEND XEKPO.
ENDSELECT.
* read schedule lines
SELECT * FROM EKET WHERE EBELN = EKKO-EBELN.
ENDSELECT.
ENDFORM. " ORDERS_READ
FORM IDOC_TABLE_FILL.
* header data
PERFORM HEADER_E1HEAD_FILL.
* data in position
PERFORM POSITION_E1ITEM_FILL.
ENDFORM. " IDOC_TABLE_FILL
FORM HEADER_E1HEAD_FILL.
CLEAR INT_EDIDD.
CLEAR E1HEAD.
INT_EDIDD-SEGNAM = 'E1HEAD'.
* fill fields
* document number
E1HEAD-BELNR = EKKO-EBELN.
* Die folgenden Konstanten (Zuordnung Kunde/Lieferant zur
* Verkaufsorganisation) werden nur in die Segmente geschrieben, damit
* im Fallbeispiel die nachfolgende Eingangsverarbeitung im SD
* funktioniert. Beim „reellen" Terminauftrag im SD Eingang pflegt man
* hierzu Customizing-Tabellen, oder die Zuordnung wird vom
* EDI-Subsystem übernommen.
* sales organization (not supplied -> constant)
E1HEAD-VKORG = '1000'.
* distribution channel (not supplied -> constant)
E1HEAD-VTWEG = '10'.
* division (not supplied -> constant)
E1HEAD-SPART = '00'.
ENDSELECT.
* order type
E1HEAD-AUART = 'NB'.
* date of delivery
IF EKET-EINDT NE 0.
E1HEAD-WLDAT = EKET-EINDT.
ELSE.
E1HEAD-WLDAT = SY-DATUM + 21.
ENDIF.
CONDENSE E1HEAD-WLDAT.
* ordering party / sold to party (AG)
E1HEAD-AUGEB = LFB1-EIKTO.
* supplier
E1HEAD-LIEF = EKKO-LIFNR.
* order date
E1HEAD-BSTDK = EKKO-BEDAT.
CONDENSE E1HEAD-BSTDK.
* order time
E1HEAD-BELUZT = SY-UZEIT.
* move data to segment area of data record
MOVE E1HEAD TO INT_EDIDD-SDATA.
* append data record to internal table
APPEND INT_EDIDD.
* customer function in order to change header segment
CALL CUSTOMER-FUNCTION '001'
EXPORTING
PI_EKKO = EKKO
IMPORTING
PE_EKKO = EKKO
TABLES
PT_IDOC_DATA_RECORDS = INT_EDIDD.
ENDFORM. " HEADER_E1HEAD_FILL
FORM POSITION_E1ITEM_FILL.
* loop at positions
LOOP AT XEKPO.
CLEAR INT_EDIDD.
CLEAR E1ITEM.
INT_EDIDD-SEGNAM = 'E1ITEM'.
MOVE XEKPO TO EKPO.
* fill fields
* position number
E1ITEM-POSEX = EKPO-EBELP.
CONDENSE E1ITEM-POSEX.
* material number
IF EKPO-MATNR NE SPACE.
E1ITEM-MATNR = EKPO-MATNR.
ENDIF.
* amount
E1ITEM-MENGE = EKPO-MENGE.
CONDENSE E1ITEM-MENGE.
* unit
PERFORM ISO_CODE_UNIT USING EKPO-MEINS.
E1ITEM-BMEINH = EKPO-MEINS.
* material number of supplier
IF EKPO-IDNLF NE SPACE.
E1ITEM-LMATNR = EKPO-IDNLF.
ENDIF.
* move data to segment area of data record
MOVE E1ITEM TO INT_EDIDD-SDATA.
* append data record to internal table
APPEND INT_EDIDD.
* customer function for position segment
CALL CUSTOMER-FUNCTION '002'
EXPORTING
PI_EKPO = EKPO
IMPORTING
PE_EKPO = EKPO
TABLES
PT_IDOC_DATA_RECORDS = INT_EDIDD.
ENDFORM. " HEADER_E1HEAD_FILL
ENDLOOP.
ENDFORM. " POSITION_E1ITEM_FILL
FORM ISO_CODE_UNIT USING ICU_UNIT.
CHECK ICU_UNIT NE SPACE.
CALL FUNCTION 'UNIT_OF_MEASURE_SAP_TO_ISO'
EXPORTING
SAP_CODE = ICU_UNIT
IMPORTING
ISO_CODE = ISO_UNIT
EXCEPTIONS
NOT_FOUND = 01
NO_ISO_CODE = 02.
IF SY-SUBRC NE 0.
MESSAGE I764 WITH EKPO-EBELP ICU_UNIT.
ENDIF.
MOVE ISO_UNIT TO ICU_UNIT.
ENDFORM. " ISO_CODE_UNIT
Beachten Sie, daß im Verwaltungsteil das Feld HLEVEL (Hierarchieebene des Segmentes) nicht gefüllt wird. Das übernimmt die IDoc-Schnittstelle, die den entsprechenden Wert aus der Definition des IDoc-Typs TESTER01 bekommt.
Beachten Sie auch, daß im Feld INT_EDIDD-SEGNAM die Segmente groß geschrieben werden müssen. Sonst meldet die IDoc-Schnittstelle einen Syntaxfehler.
Globale Daten von IDOC_OUTPUT_TESTER
*- Tabellen ------------------------------------------------------*
TABLES:
EKPO,
EKET,
LFB1,
EDIDC,
E1HEAD,
E1ITEM,
T000,
EDSDC.
* help fields
DATA:
H_EBELN LIKE EKKO-EBELN,
H_KAPPL LIKE NAST-KAPPL,
H_PARVW LIKE EKPA-PARVW.
* iso codes
DATA:
ISO_UNIT LIKE T006-ISOCODE.
TYPE-POOLS ISOC.
*- Direktwerte für Return_variables ---------------------------------
DATA:
EID LIKE BDWFRETVAR-WF_PARAM VALUE 'Error_IDOCs',
PID LIKE BDWFRETVAR-WF_PARAM VALUE 'Processed_IDOCs',
APO LIKE BDWFRETVAR-WF_PARAM VALUE 'Appl_Objects',
APE LIKE BDWFRETVAR-WF_PARAM VALUE 'Appl_Object'.
*- Hilfsfelder für Änderungsbeleg ----------------------------------*
INCLUDE FM06ECDT.
*- Common-Part für Änderungsbeleg ----------------------------------*
INCLUDE FM06LCCD.
*- Direktwerte -----------------------------------------------------*
INCLUDE FMMEXDIR.