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.