只是做个简单记录,用的时候方便copy修改
大致的代码如下:
FORM frm_create_so .
DATA:lw_show LIKE LINE OF gt_show.
FIELD-SYMBOLS LIKE LINE OF gt_show.
DATA: l_header_in TYPE bapisdhd1,
l_header_inx TYPE bapisdhd1x,
lt_item_in TYPE TABLE OF bapisditm WITH HEADER LINE,
lt_item_inx TYPE TABLE OF bapisditmx WITH HEADER LINE,
lt_partners TYPE TABLE OF bapiparnr WITH HEADER LINE,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_business_ex TYPE TABLE OF bapisdbusi WITH HEADER LINE,
lt_conditions TYPE TABLE OF bapicond WITH HEADER LINE,
lt_conditions_inx TYPE bapicondx OCCURS 0 WITH HEADER LINE,
lt_schedules_in TYPE TABLE OF bapischdl WITH HEADER LINE,
lt_schedules_inx TYPE TABLE OF bapischdlx WITH HEADER LINE.
DATA: l_swith TYPE bapisdls .
DATA: l_vbeln LIKE vbak-vbeln.
DATA: l_po LIKE bapisdhd1-purch_no_c.
DATA: l_vrkme LIKE t006a-mseh3.
DATA: l_msg TYPE string.
DATA: l_vbeln1 TYPE bapivbeln-vbeln.
LOOP AT gt_show ASSIGNING WHERE err IS INITIAL.
* L_SWITH-PRICING = 'G'. "定价类型 :G:复制不变定价因素且重定税款
* L_SWITH-COND_HANDL = 'X'. "定价类型 :G:复制不变定价因素且重定税款
* L_HEADER_IN-SD_DOC_CAT = 'C'. "SD 凭证类别 C 订单
l_header_in-doc_type = -auart. "销售凭证类型
l_header_in-sales_org = -vkorg. "销售组织
l_header_in-distr_chan = -vtweg. "分销渠道
l_header_in-division = -spart. "产品组
* L_HEADER_IN-SALES_GRP = -VKGRP. "销售组
l_header_in-sales_off = -vkbur. "销售部门
l_header_in-doc_date = -audat. "凭证日期 (接收/发送日期)
* L_HEADER_IN-WAR_DATE = SY-DATUM. "担保日期
PERFORM frm_matnr_input CHANGING -matnr.
lt_item_in-itm_number = 10. "行项目
lt_item_in-material = -matnr. "物料号
lt_item_in-plant = -werks. "工厂
lt_item_in-store_loc = -lgort. "库存地点
lt_item_in-sales_unit = -vrkme. "销售单位
lt_item_in-ship_point = -vstel. "装运点/接收点
lt_item_in-val_type = -bwtar. "评估类型
lt_item_in-target_qty = -wmeng. "目标数量
APPEND lt_item_in.
*
IF -netpr IS NOT INITIAL.
lt_conditions-itm_number = 10.
lt_conditions-cond_type = 'ZR06'. "条件类型
lt_conditions-currency = 'RMB'.
* lt_conditions-cond_unit = -kmein. "条件单位
lt_conditions-cond_value = -netpr. "定价比率 单价
IF -kpein IS INITIAL.
-kpein = 1.
ENDIF.
lt_conditions-cond_p_unt = -kpein. "条件定价单位 "定价基数
lt_conditions-cond_updat = 'X'.
lt_conditions-cond_st_no = 10.
lt_conditions-cond_count = 1.
lt_conditions-condchaman = 'X'.
APPEND lt_conditions.
CLEAR lt_conditions.
CLEAR lt_conditions_inx[].
lt_conditions_inx-itm_number = 10.
lt_conditions_inx-cond_st_no = 10.
lt_conditions_inx-cond_count = 1.
lt_conditions_inx-cond_type = 'ZR06'.
lt_conditions_inx-cond_value = 'X'.
lt_conditions_inx-currency = 'X'.
* lt_conditions_inx-cond_unit = 'X'. "条件单位 delete at 20141014
lt_conditions_inx-cond_p_unt = 'X'.
lt_conditions_inx-updateflag = 'U'.
APPEND lt_conditions_inx.
ENDIF.
CLEAR lt_schedules_in.
lt_schedules_in-itm_number = 10.
lt_schedules_in-sched_line = 10.
lt_schedules_in-req_qty = -wmeng. "以销售单位计的订单数量
lt_schedules_in-req_date = sy-datum. "以销售单位计的订单数量
lt_schedules_in-date_type = 1. "以销售单位计的订单数量
APPEND lt_schedules_in.
CLEAR lt_schedules_inx.
lt_schedules_inx-itm_number = 10.
lt_schedules_inx-sched_line = 10.
lt_schedules_inx-req_qty = 'X'.
lt_schedules_inx-updateflag = 'X'. "以销售单位计的订单数量
APPEND lt_schedules_inx.
lt_item_inx-itm_number = 10.
lt_item_inx-material = 'X'.
lt_item_inx-plant = 'X'.
lt_item_inx-store_loc = 'X'.
lt_item_inx-target_qty = 'X'.
lt_item_inx-target_qu = 'X'.
lt_item_inx-val_type = 'X'.
lt_item_inx-updateflag = 'I'..
lt_item_inx-sales_unit = 'X'.
lt_item_inx-ship_point = 'X'.
APPEND lt_item_inx.
*
PERFORM frm_kunnr_input CHANGING -kunnr.
lt_partners-partn_role = 'WE'. "合作伙伴功能 RE 收票方 WE 送达方
lt_partners-partn_numb = -kunnr.
APPEND lt_partners.
lt_partners-partn_role = 'RE'. "合作伙伴功能 RE 收票方 WE 送达方
lt_partners-partn_numb = -kunnr.
APPEND lt_partners.
lt_partners-partn_role = 'AG'. "合作伙伴功能 RE 收票方 WE 送达方
lt_partners-partn_numb = -kunnr.
APPEND lt_partners.
lt_partners-partn_role = 'RG'. "合作伙伴功能 RE 收票方 WE 送达方
lt_partners-partn_numb = -kunnr.
APPEND lt_partners.
* LT_BUSINESS_EX-ITM_NUMBER = 10.
* LT_BUSINESS_EX-TRANS_CAT = 'Z005'. "运输方式类型 Z005 公路运输
* APPEND LT_BUSINESS_EX.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
order_header_in = l_header_in
logic_switch = l_swith
IMPORTING
salesdocument = l_vbeln1
TABLES
return = lt_return
order_items_in = lt_item_in
order_items_inx = lt_item_inx
order_partners = lt_partners
order_schedules_in = lt_schedules_in
order_schedules_inx = lt_schedules_inx
order_conditions_in = lt_conditions
order_conditions_inx = lt_conditions_inx.
-vbeln_va = l_vbeln1.
l_vbeln = l_vbeln1.
READ TABLE lt_return WITH KEY type = 'E'.
"异常处理
CLEAR l_vbeln.
CLEAR lt_return[].
CLEAR lt_item_in[].
CLEAR lt_item_inx[].
CLEAR lt_partners[].
CLEAR lt_schedules_in[].
CLEAR lt_conditions[].
CLEAR lt_conditions_inx[].
CLEAR lt_schedules_inx[].
ENDLOOP.
ENDFORM. " FRM_CREATE_SO
然后说几点问题:
一、首先是两个单位:
修改价格的时候,别把定价条件的单位给变了,
当然,具体根据需求来看
二、:
* L_SWITH-PRICING = 'G'. "定价类型 :G:复制不变定价因素且重定税款
这个B C G具体取哪个值或者使用默认值可以参考:
双击行项目,点更新
三、 lt_conditions_inx -updateflag = 'U' .
这里更新标志是用U还是用I,
一般而言,U是修改原来数据,I是插入一条新数据
当然,有时候是修改不了价格的,
比如后台配置不允许手动修改价格等
当然,可以在创建的时候直接修改审批状态:
FORM frm_change_status
USING pv_vbeln
.
.
DATA
: l_objnr
TYPE vbak
-objnr
.
DO
20
TIMES
.
SELECT
SINGLE objnr
INTO l_objnr
FROM vbak
WHERE vbeln
= pv_vbeln
.
IF sy
-subrc
=
0
.
EXIT
.
ELSE
.
WAIT
UP
TO
1 SECONDS
.
ENDIF
.
ENDDO
.
CHECK l_objnr
IS
NOT
INITIAL
.
* USER_STATUS = 'E0004'.
CALL
FUNCTION
'STATUS_CHANGE_EXTERN'
EXPORTING
objnr
= l_objnr
user_status
=
'E0004' “审批通过
EXCEPTIONS
object_not_found
=
1
status_inconsistent
=
2
status_not_allowed
=
3
OTHERS
=
4
.
ENDFORM
.
" FRM_CHAN
有时候,计划行数量没更新过来
到时候再自己调试下哪儿的原因,或者最笨的方法,录个bdc确认计划行就行了
欢迎关注订阅号:SAP学习记录 (SAPlearning )