Anfang des Inhaltsbereichs

Vorgehensweisen Funktionsbaustein anlegen (Ausgang unter NAST)  Dokument im Navigationsbaum lokalisieren

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

  1. Legen Sie im Function Builder einen neuen Funktionsbaustein an.
  2. Legen Sie die Segmente als globale Daten in Ihrer Funktionsgruppe an. Ihr Funktionsbaustein muß die Anwendungsdaten aus den Anwendungstabellen in die entsprechenden Segmente überführen.
  3. Aktivieren Sie Ihren Funktionsbaustein: Wählen Sie dazu im Einstiegsbild des Function Builder Diese Grafik wird im zugehörigen Text erklärt.

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, 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

Achtung

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.

Ende des Inhaltsbereichs