销售订单inbound idoc

背景:

IDOC是一种系统间通用的数据交换格式,通过Idoc接口可以实现SAP系统之间以及SAP系统与其他系统之间的数据交换。那么SAP中关于创建SO的 850 IDOC ,是我们最常用的ECC与其他系统对接的SO Inbound的IDOC。

增强适用场景及规范:

IDOC数据主要包含三部分内容,Control Record,Data Record和Status Record。而对于IDOC传输的相关数据的处理,都是通过process code来实现的。所以关于IDOC的数据逻辑增强,也都是写在IDOC对应的process code中。
850对应的Inbound IDOC的process code:IDOC_INPUT_ORDERS

在IDOC_INPUT_ORDERS的函数中共有如下几个增强点以及应用场景:

No
Description
FM/Include
Usage
Lenovo Usage 
1 SD EDI:Incoming Orders: Reading Additional Data from IDOC EXIT_SAPLVEDA_001 /  ZXVEDU03 用于每个segment数据读取时的增强,可用于填写一些Additional Data和数据的转换,这是我们经常会用到的增强点.  Y
2 SD EDI: SD EDI: Incoming Orders: Create Customer Number/Sales Area EXIT_SAPLVEDA_007  /  ZXVEDU09 实际应用场景:用于Partner以及Sales Area的determine增强。  Y
3 SD EDI Incoming Orders: Changing Internal Table Configurable Materials EXIT_SAPLVEDA_012  / ZXVEDU14 用于CTO物料等c&v值,sbb等configuration属性值的替换修改增强。  Y
4 SD EDI Incoming Orders: Manipulation of Error Tables in Processing EXIT_SAPLVEDA_008  / ZXVEDU10 用于message的筛选处理,即哪些message不需要在最终的结果中显示  N
5 SD EDI Incoming Orders: Final Processing of Internal Error Tables EXIT_SAPLVEDA_011  / ZXVEDU13 用于message的最终处理,包括新的message的写入,原有message的修改处理等等  Y
6 SD EDI Incoming Orders: Manipulation of Status Table EXIT_SAPLVEDA_010  / ZXVEDU12 用于status的处理。(Inbound的状态码则是50以后,53表示ok)  Y
7 SD EDI Incoming Orders:Schedule Additional Data for Screen EXIT_SAPLVEDA_002/ ZXVEDU04

用于调用VA01 BDC时,对BDC屏幕调用的增强。

目前联想的Input SO的bdc都写在此处,IDOC bdc失败原因大多在于增强部分的逻辑。

 Y
8 SD EDI Incoming Orders: Additional Sales Activities Call Transaction VA01 EXIT_SAPLVEDA_003  / ZXVEDU05 用于调用VA01 BDC生成SO之后对SO以及BDC相关的message的处理。  Y
9 SD EDI Incoming Orders: Final Sales Activities per Sales Order EXIT_SAPLVEDA_004  / ZXVEDU06 基于SO level对IDOC的状态记录,数据记录以及状态记录做最后的处理。  Y
10  SD EDI Incoming Orders: Final Sales Activities (Mass Processing) EXIT_SAPLVEDA_005  / ZXVEDU07 对IDOC整体数据做最后的处理。  Y

具体位置如下: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.”第7个增强点
           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’              “第8个增强点
           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’            “第9个增强点
       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’             “第10个增强点
     TABLES
      didoc_data        = idoc_data
      didoc_status      = idoc_status
      didoc_cntrl       = idoc_contrl
      dreturn_variables = return_variables.
 ENDFUNCTION.

但是有极少数的一些特殊需求逻辑,标准出口增强无法满足业务需求,所以就会创建隐式增强点去修改标准程序逻辑。但是必须要先考虑目前XX项目关于SO inbound的相关隐式增强点主要有以下几个:

Enhancement Name
Usage
ZINITIALIZE

用途:用于清空变量,没有对应的标准出口增强点。

ZCOS_E014

用途:用于SO生成前,根据Segment的一些值,修改Partner相关的值。

应将此逻辑放到第一个出口增强中实现(由于第二个修改partner的出口中没有segment 相关数据参数传入,因此只能放在第一个增强点。)

  ZIMPORT_MEMORY

 用途:用于将IDOC segment的数据export出去。

应将此逻辑放到第一个出口增强中实现

ZSDT_ORDERS_LOG

用途:用于Standard SO、CMR、DMR生成后记录相应的的log。

应将此逻辑放到第九个出口增强中实现

ZSDT_ORDERS_LOG2

用途:用于Return SO生成后记录相应的log。

应将此逻辑放到第九个出口增强中实现

所以对于SO 850  inbound IDOC的增强,须严格遵守如下规则:

1.严禁杜绝修改标准代码。

2.具体业务需求的增强,请参照如上具体增强出口点做相关的对应增强逻辑。

3.隐式增强请谨慎使用,如果必须要做隐式增强,请尽量在已有的Spot下面做enhancment。

人已赞赏
知识点

SMARTFORMS打印二维码

2021-1-19 14:23:21

知识点

请求管理-SE03

2021-3-1 11:58:31

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索