您的位置:首页 > 其它

BAPI:BAPI_SALESORDER_CHANGE (TCODE:VA02 销售订单修改)

2010-08-23 10:46 495 查看
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_SALESORDER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_ITEM text
* -->P_LT_COND text
* -->P_LT_MSG text
* -->P_LS_HEAD text
* <--P_LV_EIND text
*----------------------------------------------------------------------*
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_st_no = 040.
* wa_cond-cond_count = 01.
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
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. "frm_create_salesorder
*&---------------------------------------------------------------------*
*& Form FRM_GET_COND_KEY
*&---------------------------------------------------------------------*
* 读取价格条件记录的Key
*----------------------------------------------------------------------*
* -->P_UP_HEAD_VBELN text
* -->P_LS_COND_POSNR text
* -->P_LS_COND_KSCHL text
* <--P_WA_COND_COND_ST_NO text
* <--P_WA_COND_COND_COUNT text
*----------------------------------------------------------------------*
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: