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.
Legen Sie im Function Builder einen neuen Funktionsbaustein an.
Legen Sie die Segmente als globale Daten in Ihrer Funktionsgruppe an. Ihr Funktionsbaustein muss die Anwendungsdaten aus den Anwendungstabellen in die entsprechenden Segmente überführen.
Aktivieren Sie Ihren Funktionsbaustein: Wählen Sie dazu im Einstiegsbild des Function Builder
(Aktivieren).
Beispiel
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, dass 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.
Anwendungskürzel |
M (Materialwirtschaft) |
Ablaufart |
normal, Start sofort |
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 |
Syntax
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
Achtung
Beachten Sie, dass 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, dass im Feld INT_EDIDD-SEGNAM die Segmente groß geschrieben werden müssen. Sonst meldet die IDoc-Schnittstelle einen Syntaxfehler.
Syntax
*- 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.