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'EXPORTINGinput  = i_lifnr "供应商帐户号IMPORTINGoutput = 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-tabixCONDENSE lv_posnr NO-GAPS.lt_poitem-po_item =  lv_posnr."采购凭证的项目编号CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGinput  = t_item-matnrIMPORTINGoutput = 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'EXPORTINGpoheader         = ls_poheaderpoheaderx        = ls_poheaderx
*     POADDRVENDOR     =
*     TESTRUN          =
*     MEMORY_UNCOMPLETE            =
*     MEMORY_COMPLETE  =
*     POEXPIMPHEADER   =
*     POEXPIMPHEADERX  =
*     VERSIONS         =
*     NO_MESSAGING     =
*     NO_MESSAGE_REQ   =
*     NO_AUTHORITY     =
*     NO_PRICE_FROM_PO =IMPORTINGexppurchaseorder = lv_ebeln
*     EXPHEADER        =
*     EXPPOEXPIMPHEADER            =TABLESreturn           = lt_returnpoitem           = lt_poitempoitemx          = lt_poitemx
*     POADDRDELIVERY   =poschedule       = lt_poscheduleposchedulex      = lt_poschedulexpoaccount        = 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'EXPORTINGwait = '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.
"-----------------------------@斌将军-----------------------------


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部