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 0 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.