IDOC的處理函式IDOC_INPUT_ORDERS的增強點的分析

JackWu發表於2017-04-10

sap系統會根據we20的配置讀取,讀取IDOC的處理函式IDOC_INPUT_ORDERS,( Basic type:ORDERS05:Purchasing/Sales)

在IDOC_INPUT_ORDERS的函式中共有以下幾個增強點:

1、每個段資料讀取時的增強,對應出口函式是EXIT_SAPLVEDA_001 /  ZXVEDU03,可用於填寫特殊資料和資料的轉換,這是我們經常會用到的增強點;

2、SD EDI: Incoming Orders: Create Customer Number/Sales Area;對應函式:EXIT_SAPLVEDA_007  / ZXVEDU14

3、SD EDI Incoming Orders: Changing Internal Table Configurable Materials,對應函式:EXIT_SAPLVEDA_012  / ZXVEDU09

4、SD EDI Incoming Orders: Manipulation of Error Tables in Processing,對應函式:EXIT_SAPLVEDA_008  / ZXVEDU10

5、SD EDI Incoming Orders: Final Processing of Internal Error Tables,對應函式:EXIT_SAPLVEDA_011  / ZXVEDU13

6、SD EDI Incoming Orders: Manipulation of Status Table,對應函式:EXIT_SAPLVEDA_010  / ZXVEDU12

7、SD EDI Incoming Orders: Additional Sales Activities Call Transaction VA01,對應函式:EXIT_SAPLVEDA_003  / ZXVEDU05

8、SD EDI Incoming Orders: Final Sales Activities per Sales Order,對應函式:EXIT_SAPLVEDA_004  / ZXVEDU06

9、SD EDI Incoming Orders: Final Sales Activities (Mass Processing),對應函式:EXIT_SAPLVEDA_005  / ZXVEDU07


FUNCTION idoc_input_orders.
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*"  IMPORTING
*"     VALUE(INPUT_METHOD) LIKE  BDWFAP_PAR-INPUTMETHD
*"     VALUE(MASS_PROCESSING) LIKE  BDWFAP_PAR-MASS_PROC
*"  EXPORTING
*"     VALUE(WORKFLOW_RESULT) LIKE  BDWFAP_PAR-RESULT
*"     VALUE(APPLICATION_VARIABLE) LIKE  BDWFAP_PAR-APPL_VAR
*"     VALUE(IN_UPDATE_TASK) LIKE  BDWFAP_PAR-UPDATETASK
*"     VALUE(CALL_TRANSACTION_DONE) LIKE  BDWFAP_PAR-CALLTRANS
*"     VALUE(DOCUMENT_NUMBER) LIKE  VBAK-VBELN
*"  TABLES
*"      IDOC_CONTRL STRUCTURE  EDIDC
*"      IDOC_DATA STRUCTURE  EDIDD
*"      IDOC_STATUS STRUCTURE  BDIDOCSTAT
*"      RETURN_VARIABLES STRUCTURE  BDWFRETVAR
*"      SERIALIZATION_INFO STRUCTURE  BDI_SER
*"      EDI_TEXT STRUCTURE  EDIORDTXT1 OPTIONAL
*"      EDI_TEXT_LINES STRUCTURE  EDIORDTXT2 OPTIONAL
*"----------------------------------------------------------------------
ENHANCEMENT-POINT IDOC_INPUT_ORDERS_G1 SPOTS ES_SAPLVEDA.
*$*$-Start: IDOC_INPUT_ORDERS_G1----------------------------------------------------------------$*$*
ENHANCEMENT 1  MGV_GENERATED_SAPLVEDA.    "active version
*{ALE Begin} generation http://intranet.sap.com/materialversion
 CALL FUNCTION 'MGV_ALE_ADD_INTERNAL_MATNR'
      TABLES
           idoc_data       idoc_data
           idoc_contrl     idoc_contrl
      EXCEPTIONS
           NUMBER_MISMATCH 1
           OTHERS          2.
*{ALE End} generation
ENDENHANCEMENT.
*$*$-End:   IDOC_INPUT_ORDERS_G1----------------------------------------------------------------$*$*

* initialize incoterms_versions_switch base on business switch
  PERFORM incoterms_ver_switch_check.

  LOOP AT idoc_contrl.
* SET/GET Parameter und interne Tabellen neu initialisieren
* initialize SET/GET Parameter and internal tables
    PERFORM initialize_organizational_data.
* IDOC-Segmente in die entsprechenden Anwendungsdaten übernehmen
* Move IDOC to internal tables
    PERFORM interpret_idoc_orders.  "第一個增強點
* Prüfen ob gewisse Segmente gefüllt sind
* check IDOC-Segments
    PERFORM check_idoc_segments.   
* Prüfen und Ermitteln von Organisationsdaten
* check internal tables and determine organization data
    PERFORM check_idoc_orders    "第二個增強點
* Prüfen und Ermitteln von Konfigurationsdaten
* check internal tables and determine configuration order data
    PERFORM check_configuration.   "第三個增強點
* ermitteln Partner für Auftrag
* determine partner
    PERFORM determine_partner.
* ermitteln Positionstyp
* determine item type
    PERFORM determine_postyp.
* ermitteln Texte
* determine texts
    PERFORM check_text.
* exportieren Posguid ins globale Memory
* export posguid to global memory
    PERFORM check_posguid.
* vergleichen errtab mit Ausnahmetabelle WFMCMSGENQ
* compare ERRTAB with message table WFMCMSGENQ
    PERFORM errorhandling TABLES errtab.   "第四個增強點
* abschliessendes Bearbeiten der internen Fehlertabelle.
* final coding to change the internal ERRTAB
    CALL CUSTOMER-FUNCTION '011'          "第五個增強點
         EXPORTING
              dxvbak  xvbak
              docnum  idoc_contrl-docnum
         TABLES
              derrtab errtab
              dxvbap  xvbap
              dxvbep  xvbep
              dxvbadr xvbadr
              dxvbpa  xvbpa
              dxvbuv  xvbuv
              dedidc  idoc_contrl
              dedidd  idoc_data
              dxkomv  xkomv
              dxvekp  xvekp
              dyvekp  yvekp.
    DESCRIBE TABLE errtab LINES anzahl.

    IF anzahl GT AND input_method 'X'.
      EXPORT errtab TO MEMORY ID 'idoc_test_errtab'.
    ENDIF.

    IF anzahl GT  0  AND
       xaprau EQ 'D'.
* Bei der Anlage von Auslieferungsaufträgen dienen Meldungen bzgl.
* Lieferplänen mit Absagegrund nur der Information: Sie dürfen
* nicht zum Abbruch der IDoc-Verarbeitung führen.
*                When creating delivery orders messages regarding
* scheduling agreement with 'reason for rejection' are only for
* information: They must not force the idoc integration to fail.
      LOOP AT errtab WHERE arbgb EQ 'VG' AND
                           msgnr EQ '219'.
        anzahl anzahl 1.
      ENDLOOP.
      IF anzahl EQ 0.
        REFRESH errtab.
      ENDIF.
    ENDIF.
    IF anzahl NE 0
     AND input_method IS INITIAL.
      PERFORM determine_user.
      PERFORM statusrecord TABLES errtab.
* Userexit zum Ändern der Statustabelle
* User exit to change the status table
      CALL CUSTOMER-FUNCTION '010'           "第6個增強點
           EXPORTING
                docnum      idoc_contrl-docnum
           TABLES
                derrtab     errtab
                xbdidocstat idoc_status.
    ELSE.
      IF check_orga IS INITIAL.

* EDI Kennzeichen für Sonderprüfungen innerhalb anderer Anwendungen als
* Folge der Auftragsbearbeitung.
* EDI checkmark for other applications processed during order creation.
        PERFORM edi_mode_to_mem.
************************************************************************
* Aufruf Transaktion Auftragerfassung VA01                             *
* call transaction Order Entry VA01                                    *
************************************************************************
ENHANCEMENT-POINT SAPLVEDA_A9 SPOTS ES_SAPLVEDA .
        CASE xaprau.
          WHEN ' '.
            PERFORM call_va01_new_orders USING ok.
          WHEN 'Q'.
* Aufruf Transaktion Auftragerfassung VA01 mit Bezug auf Angebot
* call transaction Order Entry VA01 with refer to quote number.
            PERFORM call_va01_new_orders_angbt USING ok.
          WHEN 'C'.
* Aufruf Transaktion Auftragerfassung VA01 mit Bezug auf Kontrakt
* call transaction Order Entry VA01 with refer to contract number
            PERFORM call_va01_new_orders_contk USING ok.
          WHEN 'L'.
* Aufruf Transaktion Auftragerfassung für Auftragsarten mit Vertiebs-
* belegtypen D,G,K,L
* call transaction Order Entry VA01 for order types with
* SD document category D,G,K,L
            PERFORM call_va01_new_orders_cremo USING ok.
          WHEN 'R'.
* Aufruf Transaktion Auftragerfassung für Auftragsarten mit Vertiebs-
* belegtypen H (z.B. Konsigantionsretoure)
* call transaction Order Entry VA01 for order types with
* SD document category H (for example consingment return)
            PERFORM call_va01_new_orders_return USING ok.
          WHEN 'D'.
* Aufruf Transaktion Auftragerfassung für Auslieferungsauftrag
* call transaction Order Entry VA01 for delivery order
            PERFORM call_va01_new_orders_delord USING ok.
          WHEN 'K'.
* Aufruf Transaktion Auftragerfassung für Anlegen mit Bezug auf
* Positionsebene (Anlegen mit Bezug zum Angebot/Kontrakt)
* call transaction Order Entry VA01 for delivery order
            PERFORM call_va01_new_orders_refer USING ok.
        ENDCASE.
* Zusätzliche Aktionen nach call transaction VA01
* additional checks after call transaction VA01
        CALL CUSTOMER-FUNCTION '003'              "第7個增強點
          EXPORTING
            sales_document belegnummer
            docnum         idoc_contrl-docnum
          TABLES
            didoc_data      idoc_data
            dbdcmsgcoll     xbdcmsgcoll
          CHANGING
            status         ok.

* Löschen des EDI-Kennzeichens im Memory / delete EDI-checkmark from
* memory
        PERFORM edi_mode_delete_mem.

      ENDIF.

* füllen IDOC_Status
* fill IDOC_Status
      IF ok space.
        idoc_status-docnum idoc_contrl-docnum.
        idoc_status-status beleg_nicht_gebucht.
        IF check_orga 'X'.
          idoc_status-msgty  'E'.
          idoc_status-msgid  'VG'.
          idoc_status-msgno  '204'.
          idoc_status-msgv1  xvbak-kunnr.
          idoc_status-msgv2  lieferant.
          APPEND idoc_status.
        ELSE.
          idoc_status-msgty  sy-msgty.
          idoc_status-msgid  sy-msgid.
          idoc_status-msgno  sy-msgno.
          idoc_status-msgv1  msgv1.
          idoc_status-msgv2  msgv2.
          idoc_status-msgv3  msgv3.
          idoc_status-msgv4  msgv4.
          APPEND idoc_status.
        ENDIF.
      ELSE.
        call_transaction_done 'X'.

*- Übergabe  BUS für Verknüpfungssätze --------------------------------*
*- set object type for the link ---------------------------------------*
*       if not object_type is initial.
*        return_variables-doc_number = object_type.
*        append return_variables.
*       endif.
*- Wenn Texte geschrieben werden muss nochmals ein Commit abgesetzt ---*
*- werden. Das Hilfsfeld CALL-TRANSACTION_DONE bewirkt, dass dieser ---*
*- Commit nicht von der ALE-Schicht abgesetzt wird, da der Commit von -*
*- Transaktion abgesetzt wurde ----------------------------------------*
        IF xe1edkt2 NE space OR
           xe1edpt2 NE space.
          COMMIT WORK.
        ENDIF.
* Belegnummer in die Schnittstelle zurückgeben für Textworkflow
* send document number back for textworkflow
        document_number belegnummer.
      ENDIF.
      CLEAR msgv1.
      CLEAR msgv2.
      CLEAR msgv3.
      CLEAR msgv4.
    ENDIF.

* setzen Workflow Ausgangsparameter
* Allocate IDOC numbers to Workflow output parameters
    IF ok space.
      return_variables-wf_param eid.
      return_variables-doc_number idoc_contrl-docnum.
      APPEND return_variables.
      workflow_result c_wf_result_error.
    ENDIF.
* Abschließende Aktionen pro Auftrag
* final checks per order
    CALL CUSTOMER-FUNCTION '004'            "第8個增強點
      EXPORTING
        sales_document belegnummer
        docnum         idoc_contrl-docnum
      TABLES
        didoc_data      idoc_data
        didoc_status    idoc_status
        didoc_cntrl     idoc_contrl.

  ENDLOOP.                             "End loop at idoc_contrl.

*- Clear auf APPLICATION_VARIABLE - nur für Auslieferungsaufträge -----*
*- Clear APPLICATION_VARIABLE  - only for delivery-orders -------------*
  PERFORM clear_appl_variable.
*-potentiellen Mailempfänger ermitteln - nur für Auslieferungsaufträge *
*- determine mail receiver - only for delivery-orders -----------------*
  PERFORM determine_mail_receiver.

* Abschließende Aktionen (Massenverarbeitung)
* final checks (mass processing)
  CALL CUSTOMER-FUNCTION '005'             "第9個增強點
    TABLES
      didoc_data        idoc_data
      didoc_status      idoc_status
      didoc_cntrl       idoc_contrl
      dreturn_variables return_variables.

ENDFUNCTION.



相關文章