原因:其实就是订单抬头没有买方,主要是因为销售订单合作伙伴表ORDER_PARTNERS中字段ITM_NUMBER销售和分销凭证的项目号给赋值了,则这些数据就是项目数据的合作伙伴了,因此抬头合作伙伴信息就缺失了。
解决办法:在给销售订单合作伙伴表ORDER_PARTNERS赋值时,字段ITM_NUMBER不用赋值即可。
原因:本人一开始以为BAPI:BAPI_SALESORDER_CREATEFROMDAT2中行项目表ORDER_ITEMS_IN中字段TARGET_QTY目标数量进行赋值就可以了。计划行的没有进行赋值,则会出现上面的情况。
解决办法:把订单数量对计划行表ORDER_SCHEDULES_IN中字段REQ_QTY进行赋值。
原因:这是因为BAPI_SALESORDER_CREATEFROMDAT2中调用了BAPI: SD_SALESDOCUMENT_CREATE,而SD_SALESDOCUMENT_CREATE中业务对象business_object定义为BUS2032,而且业务对象BUS2032不能创建退货订单。
解决办法:创建退货订单时,不用BAPI:BAPI_SALESORDER_CREATEFROMDAT2进行创建,改用BAPI: SD_SALESDOCUMENT_CREATE进
form frm_va01_bapi.
data:l_order_header_in like bapisdhd1, "销售订单抬头
l_order_header_inx like bapisdhd1x, "销售订单抬头更新
gt_return like table of bapiret2 with header line, "返回参数
gt_order_items_in like table of bapisditm with header line, "销售订单项目
gt_order_items_inx like table of bapisditmx with header line, "销售订单项目更新
gt_order_partners like table of bapiparnr with header line, "销售订单合作伙伴
l_sender like bapi_sender, "发送人逻辑系统
l_salesdocumentin like bapivbeln-vbeln, "销售订单
l_logic_switch like bapisdls, "逻辑切换的 SD 复选框
l_order_conditions_in like table of bapicond with header line, "条件类型
l_order_conditions_inx like table of bapicondx with header line, "条件类型更新
l_salesdocument like bapivbeln-vbeln, "BAPI 销售订单
gt_order_schedules_in like table of bapischdl with header line, "计划行
gt_order_schedules_inx like table of bapischdlx with header line, "计划行更新。
GT_ORDER_TEXT LIKE TABLE OF BAPISDTEXT WITH HEADER LINE."文本
data:cp_eind type string,
l_w type string,
i_mes type char200.
"记录销售订单抬头,用作循环使用
data:begin of gt_head occurs 0,
index type string, "销售订单
auart type string, "销售凭证类型
vkorg type string, "销售组织
vtweg type string, "分销渠道
spart type string, "产品组
vkbur type string, "销售办事处
bstnk type string, "客户参考
augru type string, "订货原因
kunnr type string, "售达方
kunag type string, "送达方
Remarks TYPE STRING,
end of gt_head.
"获取到选中的订单
loop at gt_out where box = 'X'.
gt_head-index = gt_out-index.
gt_head-auart = gt_out-auart.
gt_head-vkorg = gt_out-vkorg.
gt_head-vtweg = gt_out-vtweg.
gt_head-spart = gt_out-spart.
gt_head-vkbur = gt_out-vkbur.
gt_head-bstnk = gt_out-bstnk.
gt_head-augru = gt_out-augru.
gt_head-kunnr = gt_out-kunnr .
gt_head-kunag = gt_out-kunag.
GT_HEAD-Remarks = GT_OUT-Remarks.
append gt_head.
endloop.
"删除重复项
delete adjacent duplicates from gt_head comparing all fields.
sort gt_head.
* break k99997.
"进行数据处理
loop at gt_head.
"销售订单
clear l_salesdocumentin.
* L_SALESDOCUMENTIN = GT_HEAD-INDEX.
l_logic_switch-pricing = 'G'.
"销售订单抬头
clear l_order_header_in.
l_order_header_in-doc_type = gt_head-auart."销售订单凭证类型
l_order_header_in-sales_org = gt_head-vkorg."销售组织
l_order_header_in-distr_chan = gt_head-vtweg."分销渠道
l_order_header_in-division = gt_head-spart."产品组
l_order_header_in-sales_off = gt_head-vkbur."销售办事处
l_order_header_in-purch_no_c = gt_head-bstnk."客户参考
l_order_header_in-req_date_h = sy-datum."要求的交货日期
l_order_header_in-doc_date = sy-datum."凭证日期(接收/发送)
if gt_head-auart = 'ZRE' or gt_head-auart = 'ZFR'.
l_order_header_in-ord_reason = gt_head-augru."订单原因
endif.
"抬头更新
clear l_order_header_inx.
l_order_header_inx-doc_type = 'X'.
l_order_header_inx-sales_org = 'X'.
l_order_header_inx-distr_chan = 'X'.
l_order_header_inx-division = 'X'.
l_order_header_inx-sales_off = 'X'.
l_order_header_inx-purch_no_c = 'X'.
l_order_header_inx-req_date_h = 'X'.
l_order_header_inx-doc_date = 'X'.
if gt_out-auart = 'ZRE'.
l_order_header_inx-ord_reason = 'X'.
endif.
"销售合作伙伴
gt_order_partners-partn_role = 'AG'."售达方
gt_order_partners-partn_numb = gt_head-kunnr."售达方编号
* GT_ORDER_PARTNERS-ITM_NUMBER = GT_OUT-POSNR."销售订单项目
append gt_order_partners.
clear gt_order_partners.
gt_order_partners-partn_role = 'WE'."送达方
gt_order_partners-partn_numb = gt_head-kunag."送达方编号
* GT_ORDER_PARTNERS-ITM_NUMBER = GT_OUT-POSNR."销售订单项目
append gt_order_partners.
clear gt_order_partners.
"抬头备注
GT_ORDER_TEXT-TEXT_ID = 'Z003'."文本ID
GT_ORDER_TEXT-LANGU = '1'."语言
GT_ORDER_TEXT-TEXT_LINE = gt_head-Remarks."文本
APPEND GT_ORDER_TEXT.
CLEAR GT_ORDER_TEXT.
loop at gt_out where box = 'X' and index = gt_head-index.
call function 'CONVERSION_EXIT_CUNIT_INPUT'
exporting
input = gt_out-kmein
importing
output = gt_out-kmein.
"销售订单项目
gt_order_items_in-itm_number = gt_out-posnr."销售订单项目
gt_order_items_in-material = gt_out-matnr."物料编码
gt_order_items_in-plant = gt_out-werks."工厂
gt_order_items_in-store_loc = gt_out-lgort."库存地点
gt_order_items_in-target_qty = gt_out-kwmeng."目标数量
gt_order_items_in-price_date = gt_out-prsdt."行项目定价日期
append gt_order_items_in.
clear gt_order_items_in.
"销售订单项目更新
gt_order_items_inx-itm_number = gt_out-posnr.
gt_order_items_inx-material = 'X'.
gt_order_items_inx-plant = 'X'.
gt_order_items_inx-store_loc = 'X'.
gt_order_items_inx-target_qty = 'X'.
gt_order_items_inx-price_date = 'X'.
append gt_order_items_inx.
clear gt_order_items_inx.
"计划行
gt_order_schedules_in-itm_number = gt_out-posnr."销售凭证项目
gt_order_schedules_in-req_qty = gt_out-kwmeng."各销售单位订单数量
append gt_order_schedules_in.
clear gt_order_schedules_in.
gt_order_schedules_inx-itm_number = gt_out-posnr."销售凭证项目
gt_order_schedules_inx-req_qty = 'X'."各销售单位订单数量
append gt_order_schedules_inx.
clear gt_order_schedules_inx.
"条件类型
l_order_conditions_in-itm_number = gt_out-posnr."销售订单项目
l_order_conditions_in-cond_type = gt_out-kschl."条件类型
l_order_conditions_in-cond_value = gt_out-kbetr."条件金额
l_order_conditions_in-currency = gt_out-konwa."条件货币
l_order_conditions_in-cond_unit = gt_out-kmein ."条件单位
l_order_conditions_in-cond_p_unt = gt_out-kpein."条件定价单位
l_order_conditions_in-curr_iso = gt_out-konwa."IOS代码货币
append l_order_conditions_in.
clear l_order_conditions_in.
"条件类型更新
l_order_conditions_inx-itm_number = gt_out-posnr."销售订单项目
l_order_conditions_inx-cond_type = gt_out-kschl."条件类型
l_order_conditions_inx-cond_value = 'X'."条件金额
l_order_conditions_inx-currency = 'X'."条件货币
l_order_conditions_inx-cond_unit = 'X' ."条件单位
l_order_conditions_inx-cond_p_unt = 'X'."条件定价单位
append l_order_conditions_inx.
clear l_order_conditions_inx.
"项目备注
GT_ORDER_TEXT-TEXT_ID = 'Z005'."文本 ID
GT_ORDER_TEXT-ITM_NUMBER = gt_out-posnr."销售订单项目
GT_ORDER_TEXT-LANGU = '1'."语言代码
GT_ORDER_TEXT-TEXT_LINE = gt_out-LIN."文本行
APPEND GT_ORDER_TEXT.
CLEAR GT_ORDER_TEXT.
endloop.
"调用销售订单创建BAPI
if gt_head-auart = 'ZRE'.
"由于BAPI:BAPI_SALESORDER_CREATEFROMDAT2把业务对象定义死了, 所以退货订单用此BAPI进行创建
call function 'SD_SALESDOCUMENT_CREATE'
exporting
* salesdocument = salesdocumentin
sales_header_in = l_order_header_in
sales_header_inx = l_order_header_inx
* sender = sender
* binary_relationshiptype = binary_relationshiptype
* int_number_assignment = int_number_assignment
* behave_when_error = behave_when_error
logic_switch = l_logic_switch
* business_object = 'BUS2032'
* testrun = testrun
* convert_parvw_auart = convert
importing
salesdocument_ex = l_salesdocument
tables
return = gt_return[]
sales_items_in = gt_order_items_in[]
sales_items_inx = gt_order_items_inx[]
sales_partners = gt_order_partners[]
sales_schedules_in = gt_order_schedules_in[]
sales_schedules_inx = gt_order_schedules_inx[]
sales_conditions_in = l_order_conditions_in[]
sales_conditions_inx = l_order_conditions_inx[]
* sales_cfgs_ref = order_cfgs_ref
* sales_cfgs_inst = order_cfgs_inst
* sales_cfgs_part_of = order_cfgs_part_of
* sales_cfgs_value = order_cfgs_value
* sales_cfgs_blob = order_cfgs_blob
* sales_cfgs_vk = order_cfgs_vk
* sales_cfgs_refinst = order_cfgs_refinst
* sales_ccard = order_ccard
sales_text = GT_ORDER_TEXT[]
* sales_keys = order_keys
* extensionin = extensionin
* partneraddresses = partneraddresses
* extensionex = extensionex
.
else.
clear l_salesdocument.
call function 'BAPI_SALESORDER_CREATEFROMDAT2'
exporting
* SALESDOCUMENTIN = L_SALESDOCUMENTIN
order_header_in = l_order_header_in
order_header_inx = l_order_header_inx
* SENDER = L_SENDER
* BINARY_RELATIONSHIPTYPE =
* INT_NUMBER_ASSIGNMENT =
* BEHAVE_WHEN_ERROR =
logic_switch = l_logic_switch
* TESTRUN =
* CONVERT = ' '
importing
salesdocument = l_salesdocument
tables
return = gt_return[]
order_items_in = gt_order_items_in[]
order_items_inx = gt_order_items_inx[]
order_partners = gt_order_partners[]
order_schedules_in = gt_order_schedules_in[]
order_schedules_inx = gt_order_schedules_inx[]
order_conditions_in = l_order_conditions_in[]
order_conditions_inx = l_order_conditions_inx[]
* ORDER_CFGS_REF =
* ORDER_CFGS_INST =
* ORDER_CFGS_PART_OF =
* ORDER_CFGS_VALUE =
* ORDER_CFGS_BLOB =
* ORDER_CFGS_VK =
* ORDER_CFGS_REFINST =
* ORDER_CCARD =
ORDER_TEXT = GT_ORDER_TEXT[]
* ORDER_KEYS =
* EXTENSIONIN =
* PARTNERADDRESSES =
* EXTENSIONEX =
* NFMETALLITMS =
.
endif.
* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
clear i_mes.
loop at gt_return.
i_mes = i_mes && '*' && gt_return-type && gt_return-number && gt_return-message.
if gt_return-type eq 'E' or
gt_return-type = 'A' or
gt_return = 'X'.
cp_eind = 'X'. "失败
endif.
if gt_return-type eq 'W'.
l_w = 'X'.
endif.
endloop.
if cp_eind ne 'X'.
if l_w <> 'X'.
"存在警告信息
loop at gt_out where index = gt_head-index and box = 'X'.
gt_out-tabix = i_mes.
gt_out-text = icon_green_light .
gt_out-index = l_salesdocument.
modify gt_out.
endloop.
else.
"成功生成订单
loop at gt_out where index = gt_head-index and box = 'X'.
gt_out-tabix = i_mes.
gt_out-text = icon_yellow_light .
gt_out-index = l_salesdocument.
modify gt_out.
endloop.
endif.
"提交事务
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
commit work and wait.
else.
"存在错误,创建失败
loop at gt_out where index = gt_head-index and box = 'X'.
gt_out-tabix = i_mes.
gt_out-text = icon_red_light .
modify gt_out.
endloop.
"回滚事务
call function 'BAPI_TRANSACTION_ROLLBACK' .
endif.
clear l_order_header_in.
clear l_order_header_inx.
clear l_logic_switch.
clear l_salesdocument.
clear gt_return[].
clear gt_order_items_in[].
clear gt_order_items_inx[].
clear gt_order_partners[].
clear l_order_conditions_in[].
clear l_order_conditions_inx[].
clear gt_order_schedules_in[].
clear gt_order_schedules_inx[].
clear cp_eind.
clear l_w.
endloop.