好把,到新公司我的第一个程序,销售订单批量创建(带配置)

使用ABAP的BAPI: BAPI_SALESORDER_CREATEFROMDAT2

每一条数据处理逻辑:
1、准备BAPI参数
2、调用BAPI
3、查询BAPI返回信息:
如果正确,提交保存;并得到销售订单凭证号,用凭证号,保存行项目的备注文本,写日志表。
如果错误,放弃其它操作,写日志表。
*&---------------------------------------------------------------------*
*& report zsde0006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
report zsde0006.
tables ztsd0026.
data gs_ztsd0026 like ztsd0026.
data gt_ztsd0026 like table of ztsd0026.
"ecxel数据定义
types :
begin of gs_t_excel,
doc_type like ztsd0026-doc_type,
sales_org like ztsd0026-sales_org,
distr_chan like ztsd0026-distr_chan,
division like ztsd0026-division,
req_date_h like ztsd0026-req_date_h,
partn_numb like ztsd0026-partn_numb,
name like ztsd0026-name,
material like ztsd0026-material,
maktx like ztsd0026-maktx,
xmlx like ztsd0026-xmlx,
pmnttrms like ztsd0026-pmnttrms,
plant like ztsd0026-plant,
ship_point like ztsd0026-ship_point,
req_qty like ztsd0026-req_qty,
zmodel like ztsd0026-zmodel,
zcolor like ztsd0026-zcolor,
zinterior like ztsd0026-zinterior,
zoptpack like ztsd0026-zoptpack,
text like ztsd0026-text,
excelid like ztsd0026-excelid,
end of gs_t_excel.
data gs_excel type gs_t_excel.
data gs_excel_check type gs_t_excel.
data gs_excel_temp type gs_t_excel.
data gt_excel type table of gs_t_excel.
data gt_excel_check type table of gs_t_excel.
"备注文本text零时表定义
types :
begin of gs_t_bztxt,
text like ztsd0026-text,
posnr TYPE posnr,
end of gs_t_bztxt.
data gs_bztxt type gs_t_bztxt.
data gt_bztxt type table of gs_t_bztxt.
"检查用
types :
begin of gs_t_field6,
doc_type like ztsd0026-doc_type,
sales_org like ztsd0026-sales_org,
distr_chan like ztsd0026-distr_chan,
division like ztsd0026-division,
req_date_h like ztsd0026-req_date_h,
end of gs_t_field6.
data gs_field6 type gs_t_field6.
data gt_field6 type table of gs_t_field6.
"BAPI 数据定义
DATA gs_header TYPE bapisdhd1.
DATA gt_partner TYPE TABLE OF bapiparnr.
DATA gs_partner TYPE bapiparnr.
DATA gv_posnr TYPE posnr. " 订单Item号
DATA gv_charact_cfgid TYPE cux_cfg_id.
DATA gv_charact_insid TYPE cu_inst_id.
DATA gt_item TYPE TABLE OF bapisditm.
DATA gs_item TYPE bapisditm.
DATA gv_etenr TYPE etenr. " 订单Schedule Line号
DATA gt_sl TYPE TABLE OF bapischdl.
DATA gs_sl TYPE bapischdl.
DATA gt_cfgins TYPE TABLE OF bapicuins.
DATA gs_cfgins TYPE bapicuins.
DATA gt_cfgref TYPE TABLE OF bapicucfg.
DATA gs_cfgref TYPE bapicucfg.
DATA gv_class TYPE cuib_objkey.
DATA gt_cfgval TYPE TABLE OF bapicuval.
DATA gs_cfgval TYPE bapicuval.
DATA gs_cha TYPE char70.
DATA gt_cha TYPE TABLE OF char70.
DATA gv_char50 TYPE char50.
DATA gv_vbeln TYPE vbeln. " SO凭证号
DATA gt_rc TYPE TABLE OF bapiret2.
DATA gs_rc TYPE bapiret2.
DATA gv_err_flag TYPE xfeld.
DATA ls_header TYPE thead.
data gt_line type table of tline.
data wa_line like tline.
selection-screen begin of block bk with frame title text-b02.
parameter:p_path like rlgrap-filename modif id md1.
selection-screen end of block bk.
DATA: functxt TYPE smp_dyntxt.
TABLES: sscrfields.
SELECTION-SCREEN: FUNCTION KEY 1,FUNCTION KEY 2."download template.
initialization.
functxt-icon_id = icon_xxl.
functxt-icon_text = text-002.
sscrfields-functxt_01 = functxt.
functxt-icon_id = ICON_SPOOL_REQUEST.
functxt-icon_text = text-003.
sscrfields-functxt_02 = functxt.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_template_down.
WHEN 'FC02'.
SUBMIT ZSDR0026 VIA SELECTION-SCREEN.
ENDCASE.
at selection-screen on value-request for p_path.
perform frm_sel_file changing p_path.
start-of-selection.
perform frm_excel_import.
FORM frm_template_down .
DATA: lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_user_action TYPE i,
lv_destination TYPE rlgrap-filename,
ls_objdata TYPE wwwdatatab,
lv_objid TYPE wwwdatatab-objid,
lv_rc TYPE sy-subrc.
lv_filename = 'Template Download'.
CONCATENATE sy-datum '-' sy-uzeit '-' lv_filename INTO lv_filename.
IF lv_user_action <> 9.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND objid = 'ZSDE0006'
AND relid = 'MI'.
IF sy-subrc = 0.
CLEAR lv_rc.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = lv_destination
IMPORTING
rc = lv_rc
* CHANGING
* TEMP =
.
IF lv_rc EQ 0 .
MESSAGE 'Template download sucessful.' TYPE 'S'.
ELSE.
MESSAGE 'The template is not exit.' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ELSE.
MESSAGE 'The template is not exit.' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
ENDFORM. " FRM_TEMPLATE_DOWN.
*&---------------------------------------------------------------------*
*& form frm_sel_file
*&---------------------------------------------------------------------*
* text 选择文件
*----------------------------------------------------------------------*
form frm_sel_file changing po_path.
data:
lt_filetable type filetable,
ls_filetable type file_table,
lv_rc type sy-subrc,
lv_filename type string.
"lv_initial_path type string value 'c:\'.
clear lv_filename.
lv_filename = p_path.
call method cl_gui_frontend_services=>file_open_dialog
exporting
default_filename = lv_filename
file_filter = cl_gui_frontend_services=>filetype_excel
" initial_directory = lv_initial_path
changing
file_table = lt_filetable
rc = lv_rc
exceptions
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4.
if sy-subrc ne 0 or lv_rc lt 0.
message '上传文件选择失败' TYPE 'I'."上传文件选择失败
else.
if lv_rc = 1.
read table lt_filetable into ls_filetable index 1.
po_path = ls_filetable-filename.
else.
exit.
endif.
endif.
endform.
*&---------------------------------------------------------------------*
*& form frm_excel_import
*&---------------------------------------------------------------------*
* text 读取excel文件
*----------------------------------------------------------------------*
form frm_excel_import.
data cl_ex type ref to cx_root.
check p_path is not initial.
try .
call function 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
exporting
filename = p_path
i_begin_col = 1
i_begin_row = 3
i_end_col = 21
i_end_row = 5000
* sheet_name =
tables
intern = gt_excel
exceptions
inconsistent_parameters = 1
upload_ole = 2
others = 3.
catch cx_root into cl_ex.
message cl_ex->get_text( ) TYPE 'I' .
endtry.
*gs_excel-PARTN_NUMB. "客户编码
*gs_excel-MATERIAL. "物料
*gs_excel-ZMODEL. "基本车型
*gs_excel-ZCOLOR. "外饰
*gs_excel-ZINTERIOR. "内饰
*gs_excel-ZOPTPACK. "选装包
sort gt_excel by PARTN_NUMB .
DATA n type i VALUE 0.
"按表头字段检查,分类
gt_excel_check = gt_excel .
loop at gt_excel_check into gs_excel_check.
gs_field6-doc_type = gs_excel_check-doc_type. " 订单类型
gs_field6-sales_org = gs_excel_check-sales_org. " 销售组织
gs_field6-distr_chan = gs_excel_check-distr_chan. " 分销渠道
gs_field6-division = gs_excel_check-division. " 产品组
gs_field6-REQ_DATE_H = gs_excel_check-REQ_DATE_H. "请求交货日期
APPEND gs_field6 TO gt_field6.
AT END OF PARTN_NUMB.
DELETE ADJACENT DUPLICATES FROM gt_field6.
DESCRIBE TABLE gt_field6 LINES n.
IF n <> 1.
write :/ gs_excel_check-PARTN_NUMB && ' 多行表头数据必须相同!'.
RETURN.
ENDIF.
ENDAT.
endloop.
"行项目号初始化
gv_posnr = '000000'.
gv_etenr = '0000'.
gv_charact_cfgid = '000000'.
gv_charact_insid = '00000001'.
loop at gt_excel into gs_excel.
"so header
gs_header-doc_type = gs_excel-doc_type. " 订单类型
gs_header-sales_org = gs_excel-sales_org. " 销售组织
gs_header-distr_chan = gs_excel-distr_chan. " 分销渠道
gs_header-division = gs_excel-division. " 产品组
gs_header-REQ_DATE_H = gs_excel-REQ_DATE_H. "请求交货日期
"so partner
gs_partner-partn_numb = gs_excel-PARTN_NUMB.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = gs_partner-partn_numb
IMPORTING
OUTPUT = gs_partner-partn_numb. "'0011000001'.
gs_partner-partn_role = 'AG'.
APPEND gs_partner TO gt_partner.
"so item
gv_posnr = gv_posnr + 10.
gs_item-itm_number = gv_posnr.
gs_item-material = gs_excel-material . "物料
gs_item-plant = gs_excel-plant. "工厂
gs_item-ship_point = gs_excel-ship_point. "装运点、接收点
gs_item-pmnttrms = gs_excel-pmnttrms.
gs_item-po_itm_no = gv_posnr. "注意这个参数,有增强需要这个参数
append gs_item to gt_item.
"so Schedule Lines
gv_etenr = gv_etenr + 1.
gs_sl-itm_number = gv_posnr.
gs_sl-req_qty = gs_excel-REQ_QTY. "数量
gs_sl-sched_line = gv_etenr.
APPEND gs_sl TO gt_sl.
"bztxt 先存起来
gs_bztxt-text = gs_excel-text.
gs_bztxt-posnr = gv_posnr.
APPEND gs_bztxt TO gt_bztxt.
" Step2.2. Characteristic - Reference
* IF ls_ibp_prod-zmodel IS NOT INITIAL. " 如果是VC物料
gv_charact_cfgid = gv_charact_cfgid + 1.
gs_cfgref-posex = gv_posnr.
gs_cfgref-config_id = gv_charact_cfgid.
gs_cfgref-root_id = gv_charact_insid.
APPEND gs_cfgref TO gt_cfgref.
" Step2.3. Characteristic - Instance
gs_cfgins-config_id = gv_charact_cfgid.
gs_cfgins-inst_id = gv_charact_insid.
gs_cfgins-obj_type = 'MARA'.
gs_cfgins-class_type = '300'.
gs_cfgins-obj_key = gv_class.
APPEND gs_cfgins TO gt_cfgins.
gv_char50 = gs_excel-material.
" Step2.4. Characteristic - Values
PERFORM _frm_charact_values USING gs_excel-ZMODEL gv_charact_cfgid
gv_charact_insid gv_char50
'ZDP_0001_MODEL'
CHANGING gs_cfgval.
APPEND gs_cfgval TO gt_cfgval.
PERFORM _frm_charact_values USING gs_excel-ZCOLOR gv_charact_cfgid
gv_charact_insid gv_char50
'ZDP_0001_COLOR'
CHANGING gs_cfgval.
APPEND gs_cfgval TO gt_cfgval.
PERFORM _frm_charact_values USING gs_excel-ZINTERIOR gv_charact_cfgid
gv_charact_insid gv_char50
'ZDP_0001_INTERI'
CHANGING gs_cfgval.
APPEND gs_cfgval TO gt_cfgval.
SPLIT gs_excel-ZOPTPACK AT '_' INTO TABLE gt_cha.
LOOP AT gt_cha INTO gs_cha.
PERFORM _frm_charact_values USING gs_cha gv_charact_cfgid
gv_charact_insid gv_char50
'ZDP_0001_OPTPAC'
CHANGING gs_cfgval.
APPEND gs_cfgval TO gt_cfgval.
ENDLOOP.
gs_excel_temp = gs_excel. "后面AT END OF 会把工作区的字符变成*,这里要先缓存一下
AT END OF PARTN_NUMB. "如果后面的数据有变化了,现在执行这些行项目产生SO
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
order_header_in = gs_header
IMPORTING
salesdocument = gv_vbeln
TABLES
return = gt_rc
order_items_in = gt_item
order_partners = gt_partner
order_schedules_in = gt_sl
order_cfgs_ref = gt_cfgref
order_cfgs_inst = gt_cfgins
order_cfgs_value = gt_cfgval.
LOOP AT gt_rc INTO gs_rc WHERE type CA 'EA'.
gv_err_flag = abap_on.
ENDLOOP.
IF gv_err_flag IS INITIAL. " Success
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
commit work and wait .
loop at gt_bztxt into gs_bztxt.
ls_header-tdobject = 'VBBP'.
ls_header-tdid = '0001'.
ls_header-tdspras = 'E'. "英语!
ls_header-tdname = gv_vbeln && gs_bztxt-posnr. "采购订单号加行项目号,应该是后台有配置
wa_line-tdline = gs_bztxt-TEXT.
wa_line-tdformat = '*'.
append wa_line to gt_line.
"先删除!
CALL FUNCTION 'DELETE_TEXT'
EXPORTING
id = ls_header-tdid
language = sy-langu
NAME = ls_header-tdname
OBJECT = ls_header-tdobject
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
CALL FUNCTION 'DELETE_TEXT'
EXPORTING
id = ls_header-tdid
language = 'E' "英语!
NAME = ls_header-tdname
OBJECT = ls_header-tdobject
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
"再save
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = ls_header
savemode_direct = 'X'
TABLES
lines = gt_line
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
clear gt_line[].
endloop.
data ss like bapiret2-message.
data gv_long(200) type c.
loop at gt_rc into gs_rc.
call function 'MESSAGE_TEXT_BUILD'
exporting
msgid = gs_rc-id
msgnr = gs_rc-number
msgv1 = gs_rc-message_v1
msgv2 = gs_rc-message_v2
msgv3 = gs_rc-message_v3
msgv4 = gs_rc-message_v4
importing
message_text_output = ss.
gv_long = gv_long && '(' && sy-tabix && ')' && '[' && gs_rc-type && ']' && ss .
endloop.
write:/ gv_long.
"得到一个uuid为主键,保证每一条数据主键不同,可以从内表写入到透明表
gs_ztsd0026-uuid = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
gs_ztsd0026-ADNAM = sy-uname. "用户名
gs_ztsd0026-ADDAT = sy-datum. "日期
gs_ztsd0026-ADTIM = sy-uzeit. "时间
gs_ztsd0026-excelid = gs_excel_temp-excelid.
gs_ztsd0026-DOC_TYPE = gs_excel_temp-DOC_TYPE.
gs_ztsd0026-SALES_ORG = gs_excel_temp-SALES_ORG.
gs_ztsd0026-DISTR_CHAN = gs_excel_temp-DISTR_CHAN.
gs_ztsd0026-DIVISION = gs_excel_temp-DIVISION.
gs_ztsd0026-REQ_DATE_H = gs_excel_temp-REQ_DATE_H.
gs_ztsd0026-PARTN_NUMB = gs_excel_temp-PARTN_NUMB.
gs_ztsd0026-NAME = gs_excel_temp-NAME.
gs_ztsd0026-MATERIAL = gs_excel_temp-MATERIAL.
gs_ztsd0026-MAKTX = gs_excel_temp-MAKTX.
gs_ztsd0026-XMLX = gs_excel_temp-XMLX.
gs_ztsd0026-PMNTTRMS = gs_excel_temp-PMNTTRMS.
gs_ztsd0026-PLANT = gs_excel_temp-PLANT.
gs_ztsd0026-SHIP_POINT = gs_excel_temp-SHIP_POINT.
gs_ztsd0026-REQ_QTY = gs_excel_temp-REQ_QTY.
gs_ztsd0026-ZMODEL = gs_excel_temp-ZMODEL.
gs_ztsd0026-ZCOLOR = gs_excel_temp-ZCOLOR.
gs_ztsd0026-ZINTERIOR = gs_excel_temp-ZINTERIOR.
gs_ztsd0026-ZOPTPACK = gs_excel_temp-ZOPTPACK.
gs_ztsd0026-TEXT = gs_excel_temp-TEXT.
gs_ztsd0026-VBELN = gv_vbeln.
gs_ztsd0026-STATUS = 'S'.
gs_ztsd0026-message = gv_long.
modify ztsd0026 from gs_ztsd0026.
commit work and wait .
CLEAR: gv_err_flag,gs_rc.
clear: gv_long,gs_excel,gs_ztsd0026, gs_header,gv_vbeln,gt_rc[],gt_item[],gt_partner[],gt_sl[],gt_cfgref[],gt_cfgins[],gt_cfgval[],gt_line[],
gt_bztxt[],gs_bztxt.
"行项目号初始化
gv_posnr = '000000'.
gv_etenr = '0000'.
gv_charact_cfgid = '000000'.
gv_charact_insid = '00000001'.
ELSE. "Fail
loop at gt_rc into gs_rc.
call function 'MESSAGE_TEXT_BUILD'
exporting
msgid = gs_rc-id
msgnr = gs_rc-number
msgv1 = gs_rc-message_v1
msgv2 = gs_rc-message_v2
msgv3 = gs_rc-message_v3
msgv4 = gs_rc-message_v4
importing
message_text_output = ss.
gv_long = gv_long && '(' && sy-tabix && ')' && '[' && gs_rc-type && ']' && ss .
endloop.
write:/ gv_long.
"得到一个uuid为主键,保证每一条数据主键不同,可以从内表写入到透明表
gs_ztsd0026-uuid = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
gs_ztsd0026-ADNAM = sy-uname. "用户名
gs_ztsd0026-ADDAT = sy-datum. "日期
gs_ztsd0026-ADTIM = sy-uzeit. "时间
gs_ztsd0026-excelid = gs_excel_temp-excelid.
gs_ztsd0026-DOC_TYPE = gs_excel_temp-DOC_TYPE.
gs_ztsd0026-SALES_ORG = gs_excel_temp-SALES_ORG.
gs_ztsd0026-DISTR_CHAN = gs_excel_temp-DISTR_CHAN.
gs_ztsd0026-DIVISION = gs_excel_temp-DIVISION.
gs_ztsd0026-REQ_DATE_H = gs_excel_temp-REQ_DATE_H.
gs_ztsd0026-PARTN_NUMB = gs_excel_temp-PARTN_NUMB.
gs_ztsd0026-NAME = gs_excel_temp-NAME.
gs_ztsd0026-MATERIAL = gs_excel_temp-MATERIAL.
gs_ztsd0026-MAKTX = gs_excel_temp-MAKTX.
gs_ztsd0026-XMLX = gs_excel_temp-XMLX.
gs_ztsd0026-PMNTTRMS = gs_excel_temp-PMNTTRMS.
gs_ztsd0026-PLANT = gs_excel_temp-PLANT.
gs_ztsd0026-SHIP_POINT = gs_excel_temp-SHIP_POINT.
gs_ztsd0026-REQ_QTY = gs_excel_temp-REQ_QTY.
gs_ztsd0026-ZMODEL = gs_excel_temp-ZMODEL.
gs_ztsd0026-ZCOLOR = gs_excel_temp-ZCOLOR.
gs_ztsd0026-ZINTERIOR = gs_excel_temp-ZINTERIOR.
gs_ztsd0026-ZOPTPACK = gs_excel_temp-ZOPTPACK.
gs_ztsd0026-TEXT = gs_excel_temp-TEXT.
gs_ztsd0026-VBELN = gv_vbeln.
gs_ztsd0026-STATUS = 'E'.
gs_ztsd0026-message = gv_long.
modify ztsd0026 from gs_ztsd0026.
commit work and wait .
CLEAR: gv_err_flag,gs_rc.
clear: gv_long,gs_excel,gs_ztsd0026, gs_header,gv_vbeln,gt_rc[],gt_item[],gt_partner[],gt_sl[],gt_cfgref[],gt_cfgins[],gt_cfgval[],gt_line[],
gt_bztxt[],gs_bztxt.
"行项目号初始化
gv_posnr = '000000'.
gv_etenr = '0000'.
gv_charact_cfgid = '000000'.
gv_charact_insid = '00000001'.
ENDIF.
ENDAT.
endloop.
SUBMIT ZSDR0026 .
ENDFORM.
FORM _frm_charact_values USING iv_charact_value TYPE char70
iv_charact_cfgid TYPE cux_cfg_id
iv_charact_insid TYPE cu_inst_id
iv_prodcut TYPE cuib_objkey
iv_zdp_00001 TYPE zz_config_key
CHANGING is_cfgval TYPE bapicuval.
CLEAR is_cfgval.
DATA iv_data TYPE char32.
CALL METHOD zcl_ca_tools=>get_hc_single
EXPORTING
iv_config_key = iv_zdp_00001
IMPORTING
ev_single = iv_data
EXCEPTIONS
dynamic_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
" .......
ENDIF.
is_cfgval-config_id = iv_charact_cfgid.
is_cfgval-inst_id = iv_charact_insid.
is_cfgval-value = iv_charact_value.
CONCATENATE iv_prodcut '_' iv_data INTO is_cfgval-charc.
ENDFORM.
这是一个使用ABAP编程语言实现的程序,通过BAPI_SALESORDER_CREATEFROMDAT2来批量创建销售订单。程序从Excel文件中读取数据,处理每条记录,包括设置BAPI参数、调用BAPI、检查返回信息。成功则提交订单,记录凭证号和备注,失败则记录错误信息。整个流程涉及订单头信息、伙伴信息、行项目、配置引用和实例、值等细节处理。
5143

被折叠的 条评论
为什么被折叠?



