SAP EM Newsletter

Subscribe for SAP EM related news
Banner
Banner
Banner

Attention: open in a new window. PDFPrintE-mail

2009
21
Jul

Example Function to send Event to SAP EM

 The following function module can be used to generate an EVMSTA IDoc based on the STATUS message received for an outbound ORDERS IDoc (Purchase Order).

 

FUNCTION zem_idoc_status.

*"----------------------------------------------------------------------

*"*"Local Interface:

*"  IMPORTING

*"     VALUE(STATUS) TYPE  EDIDC-STATUS

*"     VALUE(IDOC_NUMBER) TYPE  EDIDC-DOCNUM

*"----------------------------------------------------------------------

 

  TABLES: edidc, edid4.

 

  DATA :

* Event Message data

         ls_trackingheader TYPE /saptrx/bapi_evm_header,

         lv_evtcnt TYPE /saptrx/bapi_evm_header-evtcnt,

* BAPI Structures

         lt_bapi_evm_header

           TYPE STANDARD TABLE OF /saptrx/bapi_evm_header,

         lt_bapireturn

           TYPE STANDARD TABLE OF bapiret2,

* Working variables

         new_date TYPE sy-datum,

         new_time TYPE sy-uzeit,

         lv_po LIKE ekko-ebeln,

         lv_lifnr LIKE ekko-lifnr,

         lv_bsart LIKE ekko-bsart,

         e1edk01 TYPE e1edk01,

* BAPI Calling structures

         v_last_digit,

         v_queue TYPE trfcqout-qname,

         lt_trxserv TYPE STANDARD TABLE OF /saptrx/trxserv,

         lw_trxserv TYPE /saptrx/trxserv.

  DATA:

*   System Timezone

        lv_timezone        TYPE timezone.

 

  CHECK NOT idoc_number IS INITIAL.

  CHECK status = '05' OR

        status = '06' OR

        status = '15' OR

        status = '16'.

 

* From the IDoc number get ORDERS details

  SELECT SINGLE mestyp direct

    INTO (edidc-mestyp, edidc-direct)

    FROM edidc

    WHERE docnum = idoc_number.

 

  IF sy-subrc = 0 AND

     edidc-mestyp = 'ORDERS' AND

     edidc-direct = '1'.

 

* Get PO Number

    SELECT SINGLE sdata INTO edid4-sdata

      FROM edid4

      WHERE docnum = idoc_number AND

            segnam = 'E1EDK01'.

 

    IF sy-subrc = 0.

      e1edk01 = edid4-sdata.

      lv_po = e1edk01-belnr.

    ENDIF.

 

    CHECK NOT lv_po IS INITIAL.

 

* Now check if our vendor is valid

 

    SELECT SINGLE bsart lifnr

      INTO (lv_bsart, lv_lifnr)

      FROM ekko

      WHERE ebeln = lv_po.

 

    CHECK NOT lv_bsart IS INITIAL AND

          NOT lv_lifnr IS INITIAL.

 

    SELECT SINGLE * FROM b025 WHERE kappl = 'EF'         AND

                               kschl = 'ZEMP'            AND

                               bsart = lv_bsart  AND

                               lifnr = lv_lifnr.

 

    IF sy-subrc = 0.  "Relevant for SAP EM event

 

      ls_trackingheader-trxcod  = 'PO_NO'.

      ls_trackingheader-trxid = lv_po.

      ls_trackingheader-evtdat  = sy-datum.

      ls_trackingheader-evttim  = sy-uzeit.

 

*   Get System TimeZone

      CALL FUNCTION 'GET_SYSTEM_TIMEZONE'

        IMPORTING

          timezone            = lv_timezone

        EXCEPTIONS

          customizing_missing = 1

          OTHERS              = 2.

      ls_trackingheader-evtzon  = lv_timezone.

      lv_evtcnt                 = lv_evtcnt + 1.

      ls_trackingheader-evtcnt  = lv_evtcnt.

 

*     Event ID

      CASE status.

 

        WHEN '05'.   "Translation error

          ls_trackingheader-evtid   = 'PO_SEND_ERR'.

 

        WHEN '06'.   "Translation OK

          ls_trackingheader-evtid   = 'PO_SEND'.

 

        WHEN '15'.   "Functionally acknowledged with error

          ls_trackingheader-evtid   = 'PO_VENDOR_ERR'.

 

        WHEN '16'.   "Functionally Acknowledged

          ls_trackingheader-evtid   = 'PO_VENDOR'.

 

      ENDCASE.

 

      APPEND ls_trackingheader TO lt_bapi_evm_header.

 

      CALL FUNCTION 'TRFC_SET_QUEUE_NAME'

        EXPORTING

          qname              = 'EM_ESC_PURPORD'

        EXCEPTIONS

          invalid_queue_name = 1

          OTHERS             = 2.

 

      IF sy-subrc <> 0.

        MESSAGE i099(b1) WITH 'Failed to change queue name!'.

      ENDIF.

*

**** CALL BAPI ***

* Get tracking servers

      SELECT * FROM /saptrx/trxserv INTO TABLE lt_trxserv.

      IF sy-subrc <> 0.

        MESSAGE w021(/saptrx/asc).

      ENDIF.

 

      LOOP AT lt_trxserv INTO lw_trxserv.

 

        IF NOT lt_bapi_evm_header[] IS INITIAL.

 

          CALL FUNCTION '/SAPTRX/BAPI_EH_ADDEVENTMSG_02'

            IN BACKGROUND TASK

            DESTINATION lw_trxserv-rfcdest

            EXPORTING

              simulate           = space

              synchronous        = space

              eh_generation_mode = 'N'

            TABLES

              trackingheader     = lt_bapi_evm_header

              return             = lt_bapireturn.

 

* Set queue for the Commit as well

          CALL FUNCTION 'TRFC_SET_QUEUE_NAME'

            EXPORTING

              qname              = 'EM_ESC_PURPORD'

            EXCEPTIONS

              invalid_queue_name = 1

              OTHERS             = 2.

 

          IF sy-subrc <> 0.

            MESSAGE i099(b1) WITH 'Failed to change queue name!'.

          ENDIF.

 

          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

            IN BACKGROUND TASK

            DESTINATION lw_trxserv-rfcdest.

        ENDIF.

      ENDLOOP.

      REFRESH lt_bapi_evm_header.

      REFRESH lt_bapireturn.

 

    ENDIF.

 

  ENDIF.

 

ENDFUNCTION.

 

Last Updated (Tuesday, 30 November 1999 00:00)
Banner
Free software downloads