[转]BAPI_SALESORDER_CHANGE (VA02)订单修改
2011-05-21 17:32:52| 分类:
BAPI
| 标签:
|举报
|字号大中小 订阅
report.
*---(TCODE:VA02 ****订单修改)
form frm_change_salesorder tables tp_item structure zrmxsds004
tp_cond structure zrmxsds005
tp_message structure zifsret01
using up_head like zrmxsds003
changing cp_eind type c.
data: ls_item like zrmxsds004,
ls_cond like zrmxsds005,
ls_msg like zifsret01,
ls_vbep like vbep.
data: wa_header type bapisdh1, "表头
wa_headerx type bapisdh1x, "表头标志
wa_partner type bapiparnr, "业务伙伴
wa_partnerc type bapiparnrc,
wa_item type bapisditm, "行项目
wa_itemx type bapisditmx,
wa_cond type bapicond, "价格条件
wa_condx type bapicondx,
wa_schdl type bapischdl, "交付计划
wa_schdlx type bapischdlx,
wa_return type bapiret2,
wa_sdls type bapisdls,
wa_text type bapisdtext. "文本
data: lt_partner type standard table of bapiparnr,
lt_partnerc type standard table of bapiparnrc,
lt_item type standard table of bapisditm,
lt_itemx type standard table of bapisditmx,
lt_schdl type standard table of bapischdl,
lt_schdlx type standard table of bapischdlx,
lt_cond type standard table of bapicond,
lt_condx type standard table of bapicondx,
lt_return type standard table of bapiret2,
lt_text like standard table of bapisdtext.
data: lt_sokey type standard table of zrmxsds015,
ls_sokey type zrmxsds015.
* Header
clear: wa_header,wa_headerx.
if up_head-updateflag = cns_update.
wa_header-pmnttrms = up_head-zterm. "付款条件
wa_headerx-pmnttrms = cns_yes.
wa_headerx-updateflag = cns_update. "Update
* Header texts,表头文本,若传输空值,则清空该字段
clear: wa_text,lt_text[].
wa_text-itm_number = space.
wa_text-text_id = cns_textid.
wa_text-langu = sy-langu.
wa_text-format_col = "*".
wa_text-text_line = up_head-tknum. "运输合同号
append wa_text to lt_text.
endif.
* Partners
if up_head-kunnr_re is not initial.
"收票方
clear: wa_partnerc.
wa_partnerc-document = up_head-vbeln.
wa_partnerc-itm_number = "000000".
wa_partnerc-updateflag = cns_update.
wa_partnerc-partn_role = "RE".
wa_partnerc-p_numb_new = up_head-kunnr_re.
append wa_partnerc to lt_partnerc.
endif.
if up_head-kunnr_rg is not initial.
"付款方
clear: wa_partnerc.
wa_partnerc-document = up_head-vbeln.
wa_partnerc-itm_number = "000000".
wa_partnerc-updateflag = cns_update.
wa_partnerc-partn_role = "RG".
wa_partnerc-p_numb_new = up_head-kunnr_rg.
append wa_partnerc to lt_partnerc.
endif.
if up_head-kunnr_we is not initial.
"送达方
clear: wa_partnerc.
wa_partnerc-document = up_head-vbeln.
wa_partnerc-itm_number = "000000".
wa_partnerc-updateflag = cns_update.
wa_partnerc-partn_role = "WE".
wa_partnerc-p_numb_new = up_head-kunnr_we.
append wa_partnerc to lt_partnerc.
endif.
*---Items
refresh: lt_item, lt_cond, lt_schdl,
lt_itemx, lt_condx,lt_schdl.
loop at tp_item into ls_item.
if ls_item-updateflag = cns_new.
"新增行项目
clear wa_item.
wa_item-itm_number = ls_item-posnr.
wa_item-material = ls_item-mabnr. "物料
wa_item-sales_unit = ls_item-vrkme. "计量单位
wa_item-plant = ls_item-werks. "工厂
wa_item-store_loc = ls_item-lgort. "库存地
append wa_item to lt_item.
"行状态
wa_itemx-itm_number = ls_item-posnr.
wa_itemx-updateflag = cns_new.
wa_itemx-material = cns_yes.
wa_itemx-sales_unit = cns_yes.
wa_itemx-plant = cns_yes.
wa_itemx-store_loc = cns_yes.
append wa_itemx to lt_itemx.
"Schedule lines
clear: wa_schdl,wa_schdlx.
wa_schdl-itm_number = ls_item-posnr.
wa_schdl-req_qty = ls_item-kwmeng. "数量
append wa_schdl to lt_schdl.
wa_schdlx-itm_number = ls_item-posnr.
wa_schdlx-updateflag = cns_new.
wa_schdlx-req_qty = cns_yes.
append wa_schdlx to lt_schdlx.
"新增行,需要对自动生成的生产订单进行下达
clear ls_sokey.
ls_sokey-vbeln = up_head-vbeln.
ls_sokey-posnr = ls_item-posnr.
append ls_sokey to lt_sokey.
elseif ls_item-updateflag = cns_update.
"更新行项目信息
* Schedule line
* 仅行数量
clear: wa_schdl,wa_schdlx.
wa_schdl-itm_number = ls_item-posnr.
wa_schdl-sched_line = "0001". "默认都是第一行
wa_schdl-req_qty = ls_item-kwmeng. "数量
append wa_schdl to lt_schdl.
wa_schdlx-itm_number = ls_item-posnr.
wa_schdlx-sched_line = "0001".
wa_schdlx-updateflag = cns_update.
wa_schdlx-req_qty = cns_yes.
append wa_schdlx to lt_schdlx.
endif.
endloop.
* Item Conditions
* 价格条件,需要设置该参数,才能够修改价格条件
wa_sdls-cond_handl = cns_yes.
loop at tp_cond into ls_cond.
if ls_cond-updateflag = cns_new.
"新增价格条件记录
clear: wa_cond,wa_condx.
wa_cond-itm_number = ls_cond-posnr.
wa_cond-cond_type = ls_cond-kschl. "定价条件
wa_cond-cond_value = ls_cond-kbetr. "价格
wa_cond-currency = ls_cond-koein. "货币或%
wa_cond-cond_unit = ls_cond-kmein. "条件单位
wa_cond-cond_p_unt = ls_cond-kpein. "条件定价单位
append wa_cond to lt_cond.
wa_condx-itm_number = ls_cond-posnr.
wa_condx-cond_type = ls_cond-kschl. "定价条件
wa_condx-updateflag = cns_new.
wa_condx-cond_value = cns_yes. "价格
wa_condx-currency = cns_yes. "货币或%
wa_condx-cond_unit = cns_yes. "条件单位
wa_condx-cond_p_unt = cns_yes. "条件定价单位
append wa_condx to lt_condx.
elseif ls_cond-updateflag = cns_update.
"更新价格条件记录
clear: wa_cond,wa_condx.
"需要读取已经存在行的Key
perform frm_get_cond_key using up_head-vbeln
ls_cond-posnr
ls_cond-kschl
changing wa_cond-cond_st_no
wa_cond-cond_count.
wa_cond-itm_number = ls_cond-posnr.
wa_cond-cond_type = ls_cond-kschl. "定价条件
wa_cond-cond_value = ls_cond-kbetr. "价格
wa_cond-currency = ls_cond-koein. "货币或%
wa_cond-cond_unit = ls_cond-kmein. "条件单位
wa_cond-cond_p_unt = ls_cond-kpein. "条件定价单位
append wa_cond to lt_cond.
wa_condx-itm_number = ls_cond-posnr.
wa_condx-cond_st_no = wa_cond-cond_st_no.
wa_condx-cond_count = wa_cond-cond_count.
wa_condx-cond_type = ls_cond-kschl.
wa_condx-updateflag = cns_update.
wa_condx-cond_value = cns_yes.
wa_condx-currency = cns_yes.
wa_condx-cond_unit = cns_yes.
wa_condx-cond_p_unt = cns_yes.
append wa_condx to lt_condx.
else.
"报错
endif.
endloop.
*---Call BAPI
call function 'BAPI_SALESORDER_CHANGE'
exporting
salesdocument = up_head-vbeln
order_header_in = wa_header
order_header_inx = wa_headerx
* SIMULATION =
* BEHAVE_WHEN_ERROR = " "
* INT_NUMBER_ASSIGNMENT = " "
logic_switch = wa_sdls
* NO_STATUS_BUF_INIT = " "
tables
return = lt_return
order_item_in = lt_item
order_item_inx = lt_itemx
* partners = lt_partner
partnerchanges = lt_partnerc
* PARTNERADDRESSES =
* ORDER_CFGS_REF =
* ORDER_CFGS_INST =
* ORDER_CFGS_PART_OF =
* ORDER_CFGS_VALUE =
* ORDER_CFGS_BLOB =
* ORDER_CFGS_VK =
* ORDER_CFGS_REFINST =
schedule_lines = lt_schdl
schedule_linesx = lt_schdlx
order_text = lt_text
* ORDER_KEYS =
conditions_in = lt_cond
conditions_inx = lt_condx
* EXTENSIONIN =
.
* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
loop at lt_return into wa_return.
clear ls_msg.
ls_msg-class = "BUS".
ls_msg-msgtyp = wa_return-type.
ls_msg-msgno = wa_return-number.
ls_msg-msgtxt = wa_return-message.
append ls_msg to tp_message.
if wa_return-type eq 'E' or
wa_return-type = 'A' or
wa_return = 'X'.
cp_eind = 'X'. "失败
endif.
endloop.
if cp_eind ne 'X'.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
else.
call function 'BAPI_TRANSACTION_ROLLBACK'.
endif.
check cp_eind ne 'X' and lt_sokey[] is not initial.
* 订单自动产生生产订单,对生产订单进行下达
call function 'Z_RMXPP_PRDORD_RELEASE'
* EXPORTING
* I_WAIT = 3
tables
t_sokey = lt_sokey
exceptions
no_saleorders = 1
no_valid_saleorders = 2
cannot_find_product_orders = 3
others = 4
.
endform. "frm_create_salesorder
*&---------------------------------------------------------------------*
*& Form FRM_GET_COND_KEY
*&---------------------------------------------------------------------*
form frm_get_cond_key using up_vbeln like vbap-vbeln
up_posnr like vbap-posnr
up_kschl like konv-kschl
changing cp_st_no like konv-stunr
cp_count like konv-zaehk.
data: lv_knumv like vbak-knumv.
"由于需要多次判断,预先读取聚集表,将订单的所有行读取出来
if gt_konv[] is initial.
select single knumv into lv_knumv
from vbak
where vbeln = up_vbeln.
select
knumv kposn kschl stunr zaehk
into corresponding fields of table gt_konv
from konv
where knumv = lv_knumv.
* AND kposn = up_posnr.
sort gt_konv by kposn kschl.
endif.
clear gwa_konv.
read table gt_konv into gwa_konv
with key kposn = up_posnr
kschl = up_kschl
binary search.
if sy-subrc eq 0.
cp_st_no = gwa_konv-stunr.
cp_count = gwa_konv-zaehk.
endif.
endform. " FRM_GET_COND_KEY
评论这张
转发至微博
转发至微博
评论