Creating a Function Module (Outbound Processing Under MC)

This section describes how to create a function module which is identified by the report RSNASTED (form routine NEW_DYN_PERFORM) via a new process code. This function module enters application data in the new basic type. RSNASTED can be found in table TNAPR as an EDI processing program. Message Control reads this table and can then call RSNASTED.

Procedure

  1. Use the Function Builder to create a new function module.
  2. Create the segments as global data in your function group. The function module must transfer the application data from the application tables to the corresponding segments.
  3. Activate the function module: In the initial screen of the Function Builder select .

In the example, the new function module is called IDOC_OUTPUT_TESTER. The function module uses the new interface (from Release 3.0 onwards), that is, the application data is stored in an internal table. In addition, the path without the ALE layer (that is, without filters) is selected.

The function module is called from Purchasing (create purchase order) in the same way as IDOC_OUTPUT_ORDERS (IDoc type ORDERS01). The function module therefore fills the segments of your new IDoc type from a purchasing table, that is, EKKO and EKPO (purchasing document header and item). Note that the intention here is not to simulate a realistic purchase order, but to describe how data reaches an IDoc table from application tables via segment structures. In this case, you should pay particular attention to the form routines HEADER_E1HEAD_FILL or POSITION_E1ITEM_FILL.

Administration parameters for IDOC_OUTPUT_TESTER

Application abbreviation

M (Materials Management)

Processing type

normal, start immediately

Interface for IDOC_OUTPUT_TESTER

Formal parameters

Reference structure

Explanation

Import parameters

   

OBJECT

MC

Current Message Control record

CONTROL_RECORD_IN

EDIDC

Contains recipient information

Export parameters

   

OBJECT_TYPE

WFAS1-ASGTP

Object type for the application object in the Business Object Repository (BOR)

CONTROL_RECORD_OUT

EDIDC

Contains the sender information as well as the date and time at which the IDoc table was filled.

Table

   

INT_EDIDD

EDIDD

IDoc data records (internal table)

Coding example

FUNCTION IDOC_OUTPUT_TESTER.
*"------------------------------------------------------------------
*"*
"Global interface:
*"       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.

* The following constants (assignment of customer/vendor to sales organization) are only written in the segments, so that the subsequent inbound processing works correctly in the example for SD. In the case of a "real" standard order in SD inbound processing, Customizing tables are maintained or the assignment is transferred from the EDI subsystem.

* 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

The HLEVEL field (hierarchy level of segment) in the administration section is not filled. This is carried out by the IDoc interface, which receives this value from the definition of the IDoc type TESTER01.

You should also note that the segment in the INT_EDIDD-SEGNAM field must be written in upper case letters. Otherwise, the IDoc interface will return a syntax error.

Global data from 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.
*- Direct values for 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'.

*- Help fields for change document ----------------------------------*
  INCLUDE FM06ECDT.

*- Common part for change document ----------------------------------*
  INCLUDE FM06LCCD.

* - Direct values -----------------------------------------------------*
  INCLUDE FMMEXDIR.