& 创建采购订单
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_creat_aufnr .
* 创建前检查
IF line_exists( gt_data[ zmsg = '' ] ).
MESSAGE '请先检查数据' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
IF line_exists( gt_data[ icon = '@0A@' ] ).
MESSAGE '存在错误数据,请检查后重新导入' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
LOOP AT gt_data INTO gs_data WHERE icon = '@08@' AND ebeln <> ''.
MESSAGE '采购订单创建成功,请勿重复创建' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDLOOP.
* 物料评估类取得
IF gt_data IS NOT INITIAL.
SELECT matnr
bklas
INTO TABLE lt_mbew
FROM mbew
FOR ALL ENTRIES IN gt_data
WHERE matnr = gt_data-matnr
AND bwkey = '1000'.
ENDIF.
* 物料总账科目取得
SELECT *
INTO TABLE lt_t030
FROM t030
WHERE ktosl = 'BSX'
AND bwmod = '1000'.
SORT lt_t030 BY bklas.
LOOP AT lt_mbew INTO ls_mbew.
CLEAR ls_t030.
READ TABLE lt_t030 INTO ls_t030 WITH KEY bklas = ls_mbew-bklas
BINARY SEARCH.
IF sy-subrc = 0.
ls_mbew-konts = ls_t030-konts.
MODIFY lt_mbew FROM ls_mbew TRANSPORTING konts.
ENDIF.
ENDLOOP.
SORT lt_mbew BY matnr.
LOOP AT gt_head INTO gs_head."已按照供应商、订单类型去重,按照供应商、订单类型维度进行创建。
CLEAR: gs_poheader,gt_item,gt_itemx,gt_poaccount,gt_poaccountx,gt_poschedule,gt_poschedulex,gt_pocond,gt_pocondx.
* 抬头数据
"公司代码
gs_poheader-comp_code = '1000'.
gs_poheaderx-comp_code = 'X'.
"采购组织
gs_poheader-purch_org = '1000'.
gs_poheaderx-purch_org = 'X'.
"采购组
gs_poheader-pur_group = gs_head-ekgrp.
gs_poheaderx-pur_group = 'X'.
"采购凭证类别
IF p_2 = 'X'.
gs_poheader-doc_type = 'Z12'.
gs_poheaderx-doc_type = 'X'.
ELSE.
gs_poheader-doc_type = gs_head-bsart.
gs_poheaderx-doc_type = 'X'.
ENDIF.
"供应商
gs_poheader-vendor = gs_head-lifnr.
gs_poheaderx-vendor = 'X'.
LOOP AT gt_data INTO gs_data WHERE lifnr = gs_head-lifnr AND bsart = gs_head-bsart AND ekgrp = gs_head-ekgrp.
* 行项目数据
"行项目
gs_item-po_item = gs_data-ebelp.
gs_itemx-po_item = gs_data-ebelp.
"物料编码
gs_item-material_long = gs_data-matnr.
gs_itemx-material_long = 'X'.
"采购订单数量
gs_item-quantity = gs_data-menge.
gs_itemx-quantity = 'X'.
"工厂
gs_item-plant = '1000'.
gs_itemx-plant = 'X'.
"税码
IF p_2 = 'X'.
gs_item-tax_code = 'J0'.
gs_itemx-tax_code = 'X'.
ELSE.
gs_item-tax_code = gs_data-mwskz.
gs_itemx-tax_code = 'X'.
ENDIF.
IF gs_data-meins IS NOT INITIAL .
"订单单位
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = gs_data-meins
language = sy-langu
IMPORTING
output = gs_item-po_unit
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
gs_itemx-po_unit = 'X'.
ENDIF.
"净值
gs_item-net_price = gs_data-netpr. " 货币金额
gs_itemx-net_price = 'X'.
" gs_item-po_price = '2'.
" gs_itemx-po_price = 'X'.
"价格单位
gs_item-price_unit = gs_data-peinh.
gs_itemx-price_unit = 'X'.
" 订单价格单位
" gs_item-orderpr_un = gs_item-po_unit."暂时设置等于订单单位
" gs_itemx-orderpr_un = gs_item-po_unit.
"采购申请
IF gs_data-banfn IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-banfn
IMPORTING
output = gs_item-preq_no.
gs_item-preq_item = gs_data-bnfpo.
gs_itemx-preq_no = 'X'.
gs_itemx-preq_item = 'X'.
ENDIF.
IF p_2 = 'X'.
gs_item-acctasscat = 'Q'. " 科目分配类别
gs_itemx-acctasscat = 'X'.
ELSE.
IF gs_data-knttp IS NOT INITIAL.
gs_item-acctasscat = gs_data-knttp. " 科目分配类别
gs_itemx-acctasscat = 'X'.
ENDIF.
ENDIF.
IF p_2 NE 'X'. "创建免费采购订单,不设置基于发票收据标识
gs_item-ir_ind = 'X'. "发票收据标识
gs_item-gr_basediv = 'X'. "基于收货的发票校验
ENDIF.
IF p_2 EQ 'X'. "免费订单标识
gs_item-free_item = 'X'.
gs_itemx-free_item = 'X'.
ENDIF.
APPEND gs_item TO gt_item.
APPEND gs_itemx TO gt_itemx.
CLEAR:gs_item,gs_itemx.
* WBS元素
IF gs_data-disub_pspnr IS NOT INITIAL.
DATA:lv_posid TYPE ps_pspid.
CLEAR lv_posid.
"CALL FUNCTION 'CONVERSION_EXIT_ABPSP_INPUT'
" EXPORTING
" input = gs_data-disub_pspnr
" IMPORTING
" output = lv_posid
" EXCEPTIONS
" not_found = 1.
CLEAR:gs_poaccount,gs_poaccountx.
gs_poaccount-po_item = gs_data-ebelp. " 采购凭证的项目编号
gs_poaccount-quantity = gs_data-menge. "数量
gs_poaccount-wbs_element = gs_data-disub_pspnr. "WBS 元素
* 总账科目取得
CLEAR ls_mbew.
READ TABLE lt_mbew INTO ls_mbew WITH KEY matnr = gs_data-matnr
BINARY SEARCH.
IF sy-subrc = 0.
gs_poaccount-gl_account = ls_mbew-konts. "总账科目
ENDIF.
gs_poaccountx-po_item = gs_data-ebelp." 采购凭证的项目编号
gs_poaccountx-quantity = 'X'. "数量
gs_poaccountx-wbs_element = 'X'. "WBS 元素
gs_poaccountx-gl_account = 'X'. "总账科目
APPEND gs_poaccount TO gt_poaccount.
APPEND gs_poaccountx TO gt_poaccountx.
CLEAR:gs_poaccount,gs_poaccountx.
ENDIF.
* 计划交货行
"项目编号
gs_poschedule-po_item = gs_data-ebelp.
gs_poschedulex-po_item = gs_data-ebelp.
"计划行编号
gs_poschedule-sched_line = 0001.
gs_poschedulex-sched_line = 0001.
"交货日的类别
gs_poschedule-del_datcat_ext = 'D'.
gs_poschedulex-del_datcat_ext = 'X'.
"交货日期
IF gs_data-eindt IS NOT INITIAL.
gs_poschedule-delivery_date = gs_data-eindt .
gs_poschedulex-delivery_date = 'X'.
ENDIF.
"采购订单数量
gs_poschedule-quantity = gs_data-menge.
gs_poschedulex-quantity = 'X'.
APPEND gs_poschedule TO gt_poschedule.
APPEND gs_poschedulex TO gt_poschedulex.
CLEAR: gs_poschedule,gs_poschedulex.
* 价格条件
"行项目
gs_pocond-itm_number = gs_data-ebelp.
gs_pocondx-itm_number = gs_data-ebelp.
"条件类型
gs_pocond-cond_type = 'PBXX'.
gs_pocondx-cond_type = 'X'.
"价格
gs_pocond-cond_value = gs_data-netpr .
gs_pocondx-cond_value = 'X'.
* 价格单位poitem
gs_pocond-cond_p_unt = gs_data-peinh.
gs_pocondx-cond_p_unt = 'X'.
gs_pocond-cond_updat = 'X'.
* "货币码
gs_pocond-currency = 'CNY'.
gs_pocondx-currency = 'X'.
* 更改类型
APPEND gs_pocond TO gt_pocond.
APPEND gs_pocondx TO gt_pocondx.
CLEAR:gs_pocondx,gs_pocond.
CLEAR:gs_data.
ENDLOOP.
CLEAR: ls_mes_1,lv_num.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = gs_poheader
poheaderx = gs_poheaderx
no_price_from_po = 'X'
testrun = p_testrun
IMPORTING
exppurchaseorder = lv_num
TABLES
return = gt_return
poitem = gt_item
poitemx = gt_itemx
poschedule = gt_poschedule
poschedulex = gt_poschedulex
pocond = gt_pocond
pocondx = gt_pocondx
pocomponents = gt_pocomponents
pocomponentsx = gt_pocomponentsx
poaccount = gt_poaccount
poaccountx = gt_poaccountx.
* FREE MEMORY ID 'PO_CREATE'.
READ TABLE gt_return INTO gs_return WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT gt_return INTO gs_return WHERE type = 'E' .
CLEAR ls_mes.
MESSAGE ID gs_return-id
TYPE gs_return-type
NUMBER gs_return-number
INTO ls_mes
WITH gs_return-message_v1
gs_return-message_v2
gs_return-message_v3
gs_return-message_v4.
IF ls_mes_1 IS INITIAL.
ls_mes_1 = ls_mes.
ELSE.
CONCATENATE ls_mes_1 ls_mes INTO ls_mes_1 SEPARATED BY '|'.
ENDIF.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ls_mes_1 = '采购订单创建成功'.
ENDIF.
LOOP AT gt_data INTO DATA(gs_data2) WHERE lifnr = gs_head-lifnr AND bsart = gs_head-bsart AND ekgrp = gs_head-ekgrp.
IF ls_mes_1 = '采购订单创建成功'.
gs_data2-icon = '@08@'.
gs_data2-zmsg = ls_mes_1.
gs_data2-ebeln = lv_num.
ELSE.
gs_data2-icon = '@0A@'.
gs_data2-zmsg = ls_mes_1.
ENDIF.
MODIFY gt_data FROM gs_data2 TRANSPORTING icon zmsg ebeln.
CLEAR gs_data2.
ENDLOOP.
CLEAR:gs_head,gs_data.
ENDLOOP.
ENDFORM.
创建采购订单
最新推荐文章于 2024-06-13 08:37:22 发布