1. 程式人生 > 其它 >ME21N採購訂單批導

ME21N採購訂單批導

1業務場景

事務程式碼:ME21N建立採購訂單

可以通過BAPI_PO_CREATE1批量建立

2程式碼實現

1.抬頭

 

2.行專案

 

3.增強

抬頭增強欄位放在BAPI_TE_MEPOHEADER結構中的CI_EKKODB附加結構中

 

行專案增強欄位放在BAPI_TE_MEPOITEM結構中的CI_EKPODB附加結構中

 

另外抬頭和行專案還需要在更新表中加入增強欄位

 

給採購訂單BAPI中傳入增強欄位

 

4.問題解決

當建立時會報錯:

物件型別 PurchaseOrder 沒有被建立的例項. 外部參考:採購訂單仍包含錯誤專案,請輸入物料號或帳戶設定類。

但是物料號明明已經輸入了,這時回到前臺,發現前臺的物料號用的不是MATNR這種欄位,而是EMATN,在POITEM中並不是MATERIAL這個欄位接物料號,而是EMATERIAL用來接物料號,修改之後測試通過。

公司間採購維護髮貨儲存地點:

在前臺操作時,需要將編碼Y032輸入①的位置,然後回車後,編碼自動跳到②的位置,並在①的位置,自動帶出描述。

 

在BAPI中如果直接維護髮貨庫存地點②這個欄位,則沒有效果。通過Google後發現,除了在行專案維護SUPPL_STLOC(發貨儲存地點)外,還要再抬頭維護SUPPL_PLNT(轉儲單的供應(發出)工廠)欄位,即公司間採購時,哪個是供貨方,就維護那方的工廠。

 

 

維護的數量自動擴大:

 

計劃行這裡要輸入1而不能輸入10

當用戶維護了採購資訊記錄時,仍然傳入自定義淨價:

在抬頭頁籤中傳入不從上個訂單中帶出價格

LV_NO_PRICE_FROM_PO = 'X'

.

在行專案中傳入POITEM-PO_PRICE,讓訂單使用傳入的價格複製到條件頁籤

如果應將值從POITEM-NET_PRICE欄位複製到條件,則可以在專案級別使用PO_PRICE欄位進行控制。 PO_PRICE的值可以為'','1'或'2',含義如下:

PO_PRICE ='':條件是自動確定的,僅當系統無法確定條件時才複製NET_PRICE欄位中的值。

PO_PRICE ='1':將在NET_PRICE欄位中傳輸的值複製為總價格,即,使用在計算模式中指定為基本價格的條件型別進行設定。 在SAP Standard System中,這些條件型別為PB00或PBXX。 所有其他條件型別保持不變。 沒有條件從上一個文件複製。

PO_PRICE ='2':將在NET_PRICE欄位中傳輸的值複製為淨價,即在計算過程中使用指定為基準價的條件型別進行設定。 所有其他條件型別都將被刪除。

5.原始碼

FUNCTION zfmm040.
*"----------------------------------------------------------------------
*"*"本地介面:
*"  IMPORTING
*"     VALUE(I_BSART) TYPE  EKKO-BSART
*"     VALUE(I_LIFNR) TYPE  EKKO-LIFNR
*"     VALUE(I_EKORG) TYPE  EKKO-EKORG
*"     VALUE(I_KNTTP) TYPE  EKPO-KNTTP OPTIONAL
*"     VALUE(I_EKGRP) TYPE  EKKO-EKGRP
*"  TABLES
*"      T_ITEM STRUCTURE  ZSMM_CGDD_ITEM
*"      E_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
  DATA: ls_poheader    TYPE bapimepoheader,
        ls_poheaderx   TYPE bapimepoheaderx,
        lt_return      TYPE TABLE OF bapiret2  WITH HEADER LINE,
        lt_poitem      TYPE TABLE OF bapimepoitem WITH HEADER LINE,
        lt_poitemx     TYPE TABLE OF bapimepoitemx WITH HEADER LINE,
        lt_poschedule  TYPE TABLE OF bapimeposchedule WITH HEADER LINE,
        lt_poschedulex TYPE TABLE OF bapimeposchedulx WITH HEADER LINE,
        lt_poaccount   TYPE TABLE OF bapimepoaccount WITH HEADER LINE,
        lt_poaccountx  TYPE TABLE OF bapimepoaccountx WITH HEADER LINE,
        lt_pocond      TYPE TABLE OF bapimepocond WITH HEADER LINE,
        lt_pocondx     TYPE TABLE OF bapimepocondx WITH HEADER LINE,
        lt_potextitem  TYPE TABLE OF bapimepotext WITH HEADER LINE.

  DATA: lv_ebeln   LIKE bapimepoheader-po_number,
        lv_check   TYPE char2,
        lv_message TYPE char100,
        lv_count   TYPE char5, "計數器
        lv_posnr   TYPE char5. "行專案


  ls_poheader-doc_type    = i_bsart."採購憑證型別
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = i_lifnr "供應商帳戶號
    IMPORTING
      output = ls_poheader-vendor. "lifnr供應商帳戶號
  ls_poheader-purch_org  = i_ekorg."t_item-ekorg.採購組織
  ls_poheader-pur_group  = i_ekgrp."t_item-ekgrp.採購組
*  ls_poheader-comp_code = '1000'."t_item-bukrs.公司程式碼
* ls_POHEADER-REF_1          = ''."您的參考
  ls_poheader-doc_date   = sy-datum."t_item-bsart採購憑證日期
  ls_poheader-langu = sy-langu."t_item-bsart語言程式碼
* ls_POHEADER-CURRENCY = 'CNY'."waers."貨幣

  ls_poheaderx-doc_type    = abap_true.
  ls_poheaderx-vendor       = abap_true.
  ls_poheaderx-purch_org  = abap_true.
  ls_poheaderx-pur_group  = abap_true.
*  ls_poheaderx-comp_code = abap_true.
* ls_POHEADER-REF_1          = ABAP_TRUE.
  ls_poheaderx-doc_date   = abap_true.
  ls_poheaderx-langu =  abap_true.
* ls_POHEADERX-CURRENCY = ABAP_TRUE."貨幣

  LOOP AT t_item.
    CLEAR:lv_posnr.
*    lv_count = lv_count + 1.
    lv_posnr = sy-tabix * 10."  此處為與OA傳過來的行專案對應,因此不用累加而用sy-tabix
    CONDENSE lv_posnr NO-GAPS.
    lt_poitem-po_item =  lv_posnr."採購憑證的專案編號

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input  = t_item-matnr
      IMPORTING
        output = lt_poitem-ematerial.
    lt_poitem-short_text = t_item-txz01."短文字
    lt_poitem-quantity = t_item-menge."採購訂單數量
    lt_poitem-po_unit = t_item-meins." 採購訂單的計量單位
    lt_poitem-net_price = t_item-netpr."淨價
    IF i_bsart = 'YG05'."成本中心
      lt_poitem-matl_group = t_item-matkl."物料組
    ENDIF.
    lt_poitem-plant = t_item-werks." 工廠
    lt_poitem-acctasscat = i_knttp."科目分配類別
*   lt_POITEM-TRACKINGNO =  ''."t_item-BEDNR."需求跟蹤號
*   lt_POITEM-PREQ_NAME = ''."t_item-AFNAM."需求者/請求者姓名
*   lt_POITEM-TAX_CODE = 'J1'."t_item-MWSKZ."銷售稅程式碼
*   lt_POITEM-CONF_CTRL = ''."BSTAE."確認控制程式碼
    APPEND lt_poitem.

CLEAR:LT_EXTENSIONIN,LS_MEPOITEM.
        LS_MEPOITEM-PO_ITEM = LV_POSNR."編號
        LS_MEPOITEM-ZKONNR = WA_DATA-EBELN."協議編號
        LS_MEPOITEM-ZKTWRT = WA_DATA-KTWRT."目標值
        LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEM'.
        LT_EXTENSIONIN+30(960) = LS_MEPOITEM.
        APPEND LT_EXTENSIONIN.

        CLEAR:LT_EXTENSIONIN,LS_MEPOITEMX.
        LS_MEPOITEMX-PO_ITEM = LV_POSNR."編號
        LS_MEPOITEMX-ZKONNR = 'X'."協議編號
        LS_MEPOITEMX-ZKTWRT = 'X'."目標值
        LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEMX'.
        LT_EXTENSIONIN+30(960) = LS_MEPOITEMX.
        APPEND LT_EXTENSIONIN.

    lt_poitemx-po_item =  lv_posnr.
    lt_poitemx-ematerial = abap_true.
    lt_poitemx-short_text = abap_true.
    lt_poitemx-quantity = abap_true.
    lt_poitemx-po_unit = abap_true .
    lt_poitemx-net_price = abap_true.
    IF i_bsart = 'YG05'."成本中心
      lt_poitemx-matl_group = abap_true.
    ENDIF.
    lt_poitemx-plant = abap_true.
    lt_poitemx-acctasscat = abap_true.
*   lt_POITEMX-TRACKINGNO =  ABAP_TRUE.
*   lt_POITEMX-PREQ_NAME = ABAP_TRUE.
    lt_poitemx-tax_code = abap_true.
*   lt_POITEMX-CONF_CTRL = ABAP_TRUE.
    APPEND lt_poitemx.

    lt_poschedule-po_item =   lv_posnr."採購憑證的專案編號
*    lt_poschedule-sched_line =  '10'."計劃行
*    lt_poschedule-del_datcat_ext = 'D'."交貨日期的類別
    lt_poschedule-delivery_date = t_item-eeind."交貨日期
    lt_poschedule-quantity  = t_item-menge."採購訂單數量
    APPEND lt_poschedule.

    lt_poschedulex-po_item =  lv_posnr.
*    lt_poschedulex-sched_line =  '10'.
*    lt_poschedulex-del_datcat_ext = abap_true."交貨日期的類別
    lt_poschedulex-delivery_date = abap_true."交貨日期
    lt_poschedulex-quantity  = abap_true."採購訂單數量
    APPEND lt_poschedulex.

    lt_poaccount-po_item = lv_posnr. "採購憑證的專案編號
    CASE i_bsart.
      WHEN 'YG05'."成本中心
        lt_poaccount-gl_account = t_item-sakto."總帳科目
        lt_poaccount-costcenter = t_item-kostl."成本中心
      WHEN 'YG02'."固定資產
        lt_poaccount-asset_no = t_item-anln1."主資產號
      WHEN 'YG06'."內部訂單
        lt_poaccount-orderid = t_item-aufnr."訂單號
      WHEN OTHERS.
    ENDCASE.
*   lt_POACCOUNT-CO_AREA = 'BELL'."成本控制
    APPEND lt_poaccount.

    lt_poaccountx-po_item = lv_posnr.""採購憑證的專案編號
    CASE i_bsart.
      WHEN 'YG05'."成本中心
        lt_poaccountx-gl_account = abap_true."總帳科目
        lt_poaccountx-costcenter = abap_true."成本中心
      WHEN 'YG02'."固定資產
        lt_poaccountx-asset_no = abap_true."主資產號
      WHEN 'YG06'."內部訂單
        lt_poaccountx-orderid = abap_true."訂單號
      WHEN OTHERS.
    ENDCASE.
*   lt_POACCOUNTX-CO_AREA = ABAP_TRUE."成本控制
    APPEND lt_poaccountx.

*   lt_POTEXTITEM-PO_ITEM =  '10'. "採購憑證的專案編號
*   lt_POTEXTITEM-TEXT_ID = 'F03'."來自採購申請專案詳細清單
*   lt_POTEXTITEM-text_line = t_item-str1."行專案文字-來自採購申請專案詳細清單
*   APPEND  lt_POTEXTITEM.

    CLEAR:e_return.
    e_return-id = '1'."作為後邊更新內表的關鍵值
    e_return-message_v2 = lv_posnr.
    APPEND e_return.
  ENDLOOP.

  CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader         = ls_poheader
      poheaderx        = ls_poheaderx
*     POADDRVENDOR     =
*     TESTRUN          =
*     MEMORY_UNCOMPLETE            =
*     MEMORY_COMPLETE  =
*     POEXPIMPHEADER   =
*     POEXPIMPHEADERX  =
*     VERSIONS         =
*     NO_MESSAGING     =
*     NO_MESSAGE_REQ   =
*     NO_AUTHORITY     =
*     NO_PRICE_FROM_PO =
    IMPORTING
      exppurchaseorder = lv_ebeln
*     EXPHEADER        =
*     EXPPOEXPIMPHEADER            =
    TABLES
      return           = lt_return
      poitem           = lt_poitem
      poitemx          = lt_poitemx
*     POADDRDELIVERY   =
      poschedule       = lt_poschedule
      poschedulex      = lt_poschedulex
      poaccount        = lt_poaccount
*     POACCOUNTPROFITSEGMENT       =
      poaccountx       = lt_poaccountx
*     POCONDHEADER     =
*     POCONDHEADERX    =
*     POCOND           =
*     POCONDX          =
*     POLIMITS         =
*     POCONTRACTLIMITS =
*     POSERVICES       =
*     POSRVACCESSVALUES            =
*     POSERVICESTEXT   =
     EXTENSIONIN      = LT_EXTENSIONIN
*     EXTENSIONOUT     =
*     POEXPIMPITEM     =
*     POEXPIMPITEMX    =
*     POTEXTHEADER     =
      potextitem       = lt_potextitem
*     ALLVERSIONS      =
*     POPARTNER        =
*     POCOMPONENTS     =
*     POCOMPONENTSX    =
*     POSHIPPING       =
*     POSHIPPINGX      =
*     POSHIPPINGEXP    =
    .

  CLEAR:lv_check,lv_message.
  lv_check = 'S'.
  LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
    CONCATENATE lv_message lt_return-message INTO lv_message.
    lv_check = 'E'.
  ENDLOOP.
  IF lv_check = 'S'.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    e_return-type = lv_check.
    CONCATENATE '訂單' lv_ebeln '建立成功' INTO lv_message.
    e_return-message = lv_message.
    e_return-message_v1 = lv_ebeln.

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    e_return-type = lv_check.
    e_return-message = lv_message.
  ENDIF.
  MODIFY e_return[] FROM e_return TRANSPORTING type id message message_v1  WHERE id = '1'.
  CLEAR:e_return.



ENDFUNCTION.