本场景是更具PR创建PO采购订单,由于业务需求,需要通过采购申请创建费用化采购订单,前台可以将直接将服务、科目分配等数据自动带出来
BAPI则要通过相关操作才能完成
费用化采购申请可通过IW31创建
BAPI : BAPI_PO_CREATE1
前台操作
输入采购申请和行项目自动带出相关数据
ITEM赋值的时候注意需要填写科目分配类别/项目类别/以及pack_no字段
pack_no字段会与服务结构字段对应,这里pack_no可以给一个流水(例:0000000001)
bapiesllc结构父包赋值
pckg_no与item中的pckg_no对应
line_no是行号,子包中的line_no会跟着父包流水下去
subpckg_no与子包中的pckg_no对应
跟具采购申请单号以及行项目去AFVC去取包编号
包编号+1为子包编号
拿着子包编号取esll表中取子包中相关服务数据
子包bapiesllc赋值
pckg_no与父包中的subpckg_no对应
line_no接着父包line_no的流水号
ext_line服务行的编号:取服务中的数据即可,也可流水
pln_pckg为子包的编号
hi_line_no为父包的pckg_no
其余数据可在表中取出
pckg_no为子包的pack_no
line_no子包的line_no
填充计划行
bapi赋值
DATA: wa_bapimepoheader_input TYPE bapimepoheader,
wa_bapimepoheader_output TYPE bapimepoheader,
wa_bapimepoheaderx TYPE bapimepoheaderx.
DATA: wa_return TYPE bapiret2,
wa_poitem TYPE bapimepoitem,
wa_poitemx TYPE bapimepoitemx,
wa_posche TYPE bapimeposchedule,
wa_poschex TYPE bapimeposchedulx,
wa_account TYPE bapimepoaccount,
wa_accountx TYPE bapimepoaccountx,
wa_text_item TYPE bapimepotext,
wa_pocond TYPE bapimepocond,
wa_pocondx TYPE bapimepocondx,
wa_pose TYPE bapiesllc,
it_return TYPE TABLE OF bapiret2,
it_poitem TYPE TABLE OF bapimepoitem,
it_poitemx TYPE TABLE OF bapimepoitemx,
it_posche TYPE TABLE OF bapimeposchedule,
it_poschex TYPE TABLE OF bapimeposchedulx,
it_account TYPE TABLE OF bapimepoaccount WITH HEADER LINE,
it_text_item TYPE TABLE OF bapimepotext WITH HEADER LINE,
it_accountx TYPE TABLE OF bapimepoaccountx WITH HEADER LINE,
it_pocond TYPE TABLE OF bapimepocond,
it_pocondx TYPE TABLE OF bapimepocondx,
lt_pose TYPE TABLE OF bapiesllc.
DATA: lv_itemno TYPE vbap-posnr.
DATA: lv_ebeln TYPE ekko-ebeln.
DATA:lv_line_no LIKE bapiesllc-line_no VALUE '0000000001'.
DATA: posrvaccessvalues TYPE TABLE OF bapiesklc WITH HEADER LINE.
DATA : ext_line TYPE char10 .
*PO 抬头
wa_bapimepoheader_input-comp_code = input-bukrs. "公司代码
wa_bapimepoheader_input-doc_type = input-bsart. "订单类型
wa_bapimepoheader_input-creat_date = sy-datum. "创建日期
wa_bapimepoheader_input-vendor = input-lifnr. "供应商
wa_bapimepoheader_input-purch_org = input-ekorg. "采购组织
wa_bapimepoheader_input-pur_group = input-ekgrp. "采购组
wa_bapimepoheader_input-currency = input-waers. "货币
wa_bapimepoheader_input-doc_date = input-order_data. "凭证日期
wa_bapimepoheader_input-pmnttrms = input-zterm. "付款条件
wa_bapimepoheaderx-comp_code = 'X'.
wa_bapimepoheaderx-doc_type = 'X'.
wa_bapimepoheaderx-creat_date = 'X'.
wa_bapimepoheaderx-vendor = 'X'.
wa_bapimepoheaderx-purch_org = 'X'.
wa_bapimepoheaderx-pur_group = 'X'.
wa_bapimepoheaderx-currency = 'X'.
wa_bapimepoheaderx-doc_date = 'X'.
wa_bapimepoheaderx-pmnttrms = 'X'.
****取服务**
DATA : pack_no TYPE numc10 .
DATA:lv_sub_pack_no TYPE numc10 .
DATA:lv_ext TYPE numc10.
pack_no = 1 .
LOOP AT input-item INTO DATA(ls_item) .
IF input-zse IS NOT INITIAL .
* IF input-zse IS NOT INITIAL .
wa_pose-pckg_no = pack_no." '0000000001' .
wa_pose-line_no = lv_line_no .
wa_pose-outl_level = 0 ."test
wa_pose-outl_ind = 'X' ."test
wa_pose-subpckg_no = pack_no + 1 .
lv_sub_pack_no = wa_pose-subpckg_no .
APPEND wa_pose TO lt_pose .
CLEAR :wa_pose.
* ENDIF .
SELECT SINGLE packno FROM afvc INTO @DATA(lv_afvc) WHERE banfn = @ls_item-banfn AND bnfpo = @ls_item-bnfpo .
IF sy-subrc = 0 .
lv_afvc = lv_afvc + 1 .
ENDIF .
lv_line_no = 1.
lv_ext = 0.
SELECT * FROM esll INTO TABLE @DATA(lt_esll) WHERE packno = @lv_afvc .
LOOP AT lt_esll INTO DATA(ls_esll) .
lv_line_no = lv_line_no + 1.
lv_ext = lv_ext + 10.
wa_pose-pckg_no = lv_sub_pack_no .
wa_pose-line_no = lv_line_no.
wa_pose-ext_line = lv_ext. "服务确认行项目编号
wa_pose-outl_level = 0.
* wa_pose-matl_group = 'F08011' . "test
wa_pose-quantity = ls_esll-menge. "数量
wa_pose-base_uom = ls_esll-meins . "单位"ls_zentrysheet01-base_uom. "单位
wa_pose-gr_price = ls_esll-tbtwr. "ls_zentrysheet01-gr_price. "总价
wa_pose-short_text = ls_esll-ktext1." ls_zentrysheet01-short_text. "短文本
wa_pose-pln_pckg = lv_afvc . "原始包装编号
wa_pose-pln_line = ls_esll-introw. "输入:计划包行
wa_pose-hi_line_no = pack_no.
posrvaccessvalues-pckg_no = lv_sub_pack_no.
posrvaccessvalues-line_no = lv_line_no.
posrvaccessvalues-serno_line = '01'.
posrvaccessvalues-percentage = 100.
posrvaccessvalues-serial_no = '01'.
APPEND posrvaccessvalues.
APPEND wa_pose TO lt_pose .
CLEAR :wa_pose ,ls_esll .
ENDLOOP .
wa_posche-po_item = ls_item-ebelp .
wa_posche-sched_line = '0001' .
wa_posche-preq_no = ls_item-banfn .
wa_posche-preq_item = ls_item-bnfpo .
APPEND wa_posche TO it_posche .
wa_poschex-po_item = ls_item-ebelp .
wa_poschex-sched_line = '0001' .
wa_poschex-po_itemx = 'X' .
wa_poschex-sched_linex = 'X ' .
wa_poschex-preq_no = 'X' .
wa_poschex-preq_item = 'X' .
APPEND wa_poschex TO it_poschex .
ENDIF .
******************
IF ls_item-loekz = 'L' .
wa_poitem-delete_ind = 'L' .
ENDIF .
wa_poitem-po_item = ls_item-ebelp. "采购订单行项目
wa_poitem-trackingno = input-no. "跟踪号
wa_poitem-preq_no = ls_item-banfn. "采购申请
wa_poitem-preq_item = ls_item-bnfpo. "采购申请行
wa_poitem-quantity = ls_item-menge. "采购数量
wa_poitem-gr_ind = 'X'. "收货标识
wa_poitem-gr_basediv = 'X'. "标识:基于收货的发票验证
wa_poitem-tax_code = ls_item-mwskz. "税码
IF input-zse IS NOT INITIAL .
SELECT SINGLE * FROM eban INTO @DATA(lv_eban) WHERE banfn = @ls_item-banfn AND bnfpo = @ls_item-bnfpo .
IF sy-subrc = 0 .
wa_poitem-acctasscat = lv_eban-knttp."科目分配类别
wa_poitem-item_cat = lv_eban-pstyp."项目类别
wa_poitem-pckg_no = pack_no."
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_poitem-pckg_no
IMPORTING
output = wa_poitem-pckg_no.
ENDIF .
ENDIF .
APPEND wa_poitem TO it_poitem.
CLEAR : wa_poitem .
IF ls_item-loekz = 'L' .
wa_poitemx-delete_ind = 'X' .
ENDIF .
wa_poitemx-po_item = ls_item-ebelp. "采购订单行项目
wa_poitemx-po_itemx = 'X'. "采购订单行项目
wa_poitemx-trackingno = 'X'. "跟踪号
wa_poitemx-preq_no = 'X'. "采购申请
wa_poitemx-preq_item = 'X'. "采购申请行
wa_poitemx-quantity = 'X'. "采购数量
wa_poitemx-gr_ind = 'X'. "收货标识
wa_poitemx-gr_basediv = 'X'.
wa_poitemx-tax_code = 'X'.
IF input-zse IS NOT INITIAL .
wa_poitemx-acctasscat = 'X'."科目分配类别
wa_poitemx-item_cat = 'X'."项目类别
wa_poitemx-pckg_no = 'X'."
ENDIF .
APPEND wa_poitemx TO it_poitemx.
CLEAR : wa_poitemx .
wa_pocond-itm_number = ls_item-ebelp.
wa_pocond-cond_type = 'PBXX'.
wa_pocond-cond_value = ls_item-netpr.
wa_pocond-currency = input-waers.
wa_pocond-cond_p_unt = ls_item-peinh.
IF input-erp_no IS INITIAL .
wa_pocond-change_id = 'U'.
ELSE.
wa_pocond-change_id = 'U'.
ENDIF.
APPEND wa_pocond TO it_pocond.
CLEAR wa_pocond.
wa_pocondx-itm_number = ls_item-ebelp.
wa_pocondx-itm_numberx = 'X'.
wa_pocondx-cond_type = 'X'.
wa_pocondx-cond_value = 'X'.
wa_pocondx-currency = 'X'.
wa_pocondx-cond_p_unt = 'X'.
* wa_pocondx-condorigin = 'X'.
wa_pocondx-change_id = 'X'.
APPEND wa_pocondx TO it_pocondx.
CLEAR wa_pocondx.
CLEAR :ls_item .
pack_no = lv_sub_pack_no + 1.
ENDLOOP .
IF input-erp_no IS INITIAL .
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = wa_bapimepoheader_input
poheaderx = wa_bapimepoheaderx
* TESTRUN = 'X'
IMPORTING
exppurchaseorder = lv_ebeln
expheader = wa_bapimepoheader_output
TABLES
return = it_return
poitem = it_poitem
poitemx = it_poitemx
poschedule = it_posche
poschedulex = it_poschex
* poaccount = it_account[]
* poaccountx = it_accountx[]
* potextitem = it_text_item
pocond = it_pocond
pocondx = it_pocondx
poservices = lt_pose
posrvaccessvalues = posrvaccessvalues[].
LOOP AT it_return INTO wa_return WHERE type = 'E' OR type = 'A' .
output-return-msgtx = output-return-msgtx && wa_return-message .
ENDLOOP .