本文重点讲解如何利用BAPI函数实现销售订单中价格与数量等关键信息的调整。
涉及的主要BAPI函数为:BAPI_SALESORDER_CHANGE。
在修改销售订单的数量时,需通过BAPI向销售计划行传递更新后的数量数据,从而完成数量变更操作。
针对销售订单价格的调整,需根据定价类型的不同进行差异化处理:若定价类型为金额类信息,则必须在调用BAPI时明确指定对应的货币单位;而当定价类型为百分比形式(例如折扣率)时,则无需传输货币相关字段。此外,务必设置逻辑开关参数 logic_switch-cond_handl 的值为 X,以启用条件处理机制,确保系统识别到价格条件需要被修改。
FORM build_records_4_bapi USING ps_sales_order TYPE gty_data.
DATA: ls_view TYPE order_view,
lt_sales TYPE TABLE OF sales_key,
ls_sales TYPE sales_key,
lt_conditions_out TYPE TABLE OF bapisdcond,
ls_conditions_out TYPE bapisdcond.
* fill items
CLEAR:wa_item.
wa_item-itm_number = ps_sales_order-posnr. "行项目
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_item-target_qty = ps_sales_order-kwmeng. "数量
ENDIF.
wa_item-reason_rej = ps_sales_order-abgru. "拒绝原因
IF ps_sales_order-bstkd_e IS NOT INITIAL.
wa_item-purch_no_s = ps_sales_order-bstkd_e. "客户PO号
ENDIF.
APPEND wa_item TO lt_item.
CLEAR:wa_itemx.
wa_itemx-updateflag = 'U'.
wa_itemx-itm_number = ps_sales_order-posnr.
IF ps_sales_order-kwmeng IS NOT INITIAL..
wa_itemx-target_qty = 'X'.
ENDIF.
wa_itemx-reason_rej = 'X'.
IF ps_sales_order-bstkd_e IS NOT INITIAL.
wa_itemx-purch_no_s = 'X'.
ENDIF.
APPEND wa_itemx TO lt_itemx.
* fill schedules
IF ps_sales_order-etdat IS NOT INITIAL OR ps_sales_order-kwmeng IS NOT INITIAL.
READ TABLE lt_vbep INTO ls_vbep WITH KEY vbeln = ps_sales_order-vbeln
posnr = ps_sales_order-posnr.
IF sy-subrc = 0.
CLEAR:wa_schdl.
wa_schdl-itm_number = ps_sales_order-posnr. "行项目
wa_schdl-sched_line = ls_vbep-etenr. "交货计划行号
IF ps_sales_order-etdat IS NOT INITIAL.
wa_schdl-req_date = ps_sales_order-etdat. "首个交货日期
ENDIF.
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_schdl-req_qty = ps_sales_order-kwmeng.
ENDIF.
APPEND wa_schdl TO lt_schdl.
CLEAR wa_schdlx.
wa_schdlx-itm_number = ps_sales_order-posnr.
wa_schdlx-sched_line = ls_vbep-etenr. "交货计划行号
wa_schdlx-updateflag = 'U'.
IF ps_sales_order-etdat IS NOT INITIAL.
wa_schdlx-req_date = 'X'.
ENDIF.
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_schdlx-req_qty = 'X'.
ENDIF.
APPEND wa_schdlx TO lt_schdlx.
ENDIF.
ENDIF.
* fill condition
IF ps_sales_order-kschl IS NOT INITIAL.
CLEAR: logic_switch.
logic_switch-cond_handl = 'X'.
CLEAR: lt_sales, ls_sales, lt_conditions_out, ls_conditions_out.
ls_view-sdcond = 'X'.
ls_sales-vbeln = ps_sales_order-vbeln.
APPEND ls_sales TO lt_sales.
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = ls_view
TABLES
sales_documents = lt_sales
order_conditions_out = lt_conditions_out.
READ TABLE lt_conditions_out INTO ls_conditions_out
WITH KEY sd_doc = ps_sales_order-vbeln
itm_number = ps_sales_order-posnr
cond_type = ps_sales_order-kschl.
IF sy-subrc = 0."修改价格
CLEAR:wa_cond.
wa_cond-itm_number = ps_sales_order-posnr. "行项目
* wa_cond-cond_st_no = ls_conditions_out-cond_st_no.
* wa_cond-cond_count = ls_conditions_out-cond_count.
wa_cond-cond_value = ps_sales_order-netpr. "价格
wa_cond-cond_type = ps_sales_order-kschl. "条件类型
wa_cond-cond_p_unt = ps_sales_order-kpein. "条件单位
wa_cond-currency = ps_sales_order-konwa. "货币
APPEND wa_cond TO lt_cond.
CLEAR:wa_condx.
wa_condx-updateflag = 'U'.
wa_condx-itm_number = ps_sales_order-posnr.
wa_condx-cond_st_no = ls_conditions_out-cond_st_no.
wa_condx-cond_count = ls_conditions_out-cond_count.
wa_condx-cond_type = 'X'.
wa_condx-cond_value = 'X'.
wa_condx-currency = 'X'.
wa_condx-cond_p_unt = 'X'.
APPEND wa_condx TO lt_condx.
ELSE."新增定价条件行
CLEAR:wa_cond.
wa_cond-itm_number = ps_sales_order-posnr. "行项目
wa_cond-cond_value = ps_sales_order-netpr. "价格
wa_cond-cond_type = ps_sales_order-kschl. "条件类型
wa_cond-cond_p_unt = ps_sales_order-kpein. "条件单位
wa_cond-currency = ps_sales_order-konwa. "货币
APPEND wa_cond TO lt_cond.
CLEAR:wa_condx.
wa_condx-updateflag = 'I'.
wa_condx-itm_number = ps_sales_order-posnr.
wa_condx-cond_type = 'X'.
wa_condx-cond_value = 'X'.
wa_condx-currency = 'X'.
wa_condx-cond_p_unt = 'X'.
APPEND wa_condx TO lt_condx.
ENDIF.
ENDIF.
ENDFORM.
FORM build_header_4_bapi USING ps_sales_order TYPE gty_data.
* 抬头数据
CLEAR wa_header.
* IF ps_sales_order-bstkd IS NOT INITIAL.
* wa_header-purch_no_c = ps_sales_order-bstkd. "客户参考号
* ENDIF.
CLEAR:wa_headerx.
* IF ps_sales_order-bstkd IS NOT INITIAL.
* wa_headerx-purch_no_c = 'X'.
* ENDIF.
wa_headerx-updateflag = 'U'.
ENDFORM.
FORM upload_sales_order_with_bapi USING ps_sales_order TYPE gty_data .
CLEAR: gv_salesdocument,
gs_result,
lt_return,
ls_return.
gv_salesdocument = ps_sales_order-vbeln.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = gv_salesdocument
order_header_in = wa_header
order_header_inx = wa_headerx
* SIMULATION =
* BEHAVE_WHEN_ERROR = ' '
* INT_NUMBER_ASSIGNMENT = ' '
logic_switch = logic_switch
* NO_STATUS_BUF_INIT = ' '
TABLES
return = lt_return
order_item_in = lt_item
order_item_inx = lt_itemx
* PARTNERS =
* PARTNERCHANGES =
* 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 =
* ORDER_KEYS =
conditions_in = lt_cond
conditions_inx = lt_condx
* EXTENSIONIN =
* EXTENSIONEX =
.
* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
LOOP AT lt_return INTO ls_return WHERE type = 'E'
OR type = 'A'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
"失败处理
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
CLEAR: gs_result-message,gs_result.
LOOP AT lt_return INTO ls_return WHERE type EQ 'E' OR type EQ 'A'.
gs_result-vbeln = ps_sales_order-vbeln.
gs_result-bstkd_e = ps_sales_order-bstkd_e.
gs_result-message = ls_return-message && ';' && '创建失败!'.
APPEND gs_result TO gt_result.
ENDLOOP.
ELSE.
"成功处理
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR gs_result.
gs_result-vbeln = ps_sales_order-vbeln.
gs_result-bstkd_e = ps_sales_order-bstkd_e.
CONCATENATE '销售订单' gs_result-vbeln '修改成功' INTO gs_result-message.
APPEND gs_result TO gt_result.
ENDIF.
ENDFORM.
以下为完整的代码示例:
*&---------------------------------------------------------------------*
*& Report ZSDF009
*&
*&---------------------------------------------------------------------*
*&
*&销售订单批量修改
*&---------------------------------------------------------------------*
REPORT zsdf009.
TABLES: sscrfields.
TYPES: BEGIN OF gty_data,
vbeln TYPE vbak-vbeln, "销售订单
posnr TYPE vbap-posnr, "销售订单行项目
etdat TYPE vbak-erdat, "首个交货日期
kwmeng TYPE vbap-kwmeng, " 订单数量
kschl TYPE komv-kschl, " 条件类型
netpr TYPE vbap-netpr, "条件价格
kpein TYPE konp-kpein, "条件价格单位
konwa TYPE konp-konwa, "货币
abgru TYPE vbap-abgru, "拒绝原因
bstkd_e TYPE vbkd-bstkd_e, "客户PO号
END OF gty_data.
TYPES:BEGIN OF ty_result,
vbeln TYPE vbak-vbeln,
message TYPE bapiret2-message,
bstkd_e TYPE vbkd-bstkd_e, "客户采购订单编号
END OF ty_result.
DATA: gt_data TYPE TABLE OF gty_data,
gs_data TYPE gty_data.
DATA: 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,
ls_return LIKE LINE OF lt_return.
DATA: lt_vbep TYPE TABLE OF vbep,
ls_vbep TYPE vbep.
DATA: wa_header TYPE bapisdh1, "表头
wa_headerx TYPE bapisdh1x, "表头标志
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.
DATA: gs_result TYPE ty_result.
DATA: gt_result TYPE TABLE OF ty_result.
DATA: gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE TABLE OF lvc_s_fcat,
gs_fieldcat TYPE lvc_s_fcat.
DATA: BEGIN OF gt_excel_result OCCURS 0,
text TYPE string,
END OF gt_excel_result.
DATA: gv_salesdocument LIKE bapivbeln-vbeln.
DATA: logic_switch TYPE bapisdls.
DATA: g_grid TYPE REF TO cl_gui_alv_grid. "刷新alv
DATA: functxt TYPE smp_dyntxt."模板下载按钮
*----------------------------------------------------------------------*
* 常量变量
*----------------------------------------------------------------------*
CONSTANTS:
cns_pf_status TYPE slis_formname VALUE 'FRM_PF_STATUS', "ALV自定义按钮
cns_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'. "ALV自定义按钮响应事件
SELECTION-SCREEN BEGIN OF BLOCK col1 WITH FRAME TITLE text-001.
SELECTION-SCREEN:FUNCTION KEY 1.
PARAMETERS:p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK col1.
*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*
DEFINE fill_field. "宏定义
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1. "ALV 控制: 内部表字段的字段名称
gs_fieldcat-scrtext_l = &2. "长字段标签
gs_fieldcat-cfieldname = &3. "ALV 控制: 参考的当前单位的字段名称
gs_fieldcat-outputlen = &4. "ALV 控制: 列的字符宽度
gs_fieldcat-edit = &5. "ALV 控制: 准备输入(可编辑字段)
gs_fieldcat-emphasize = &6. "ALV 控制: 带有颜色的高亮列
gs_fieldcat-decimals_o = &7. "ALV 控制: 输出小数位的编号
gs_fieldcat-ref_table = &8. "参考表
gs_fieldcat-ref_field = &9. "参考字段
* GS_FIELDCAT-CHECKBOX = &9.
gs_fieldcat-colddictxt = 'L'.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CLEAR functxt.
functxt-icon_id = icon_export.
functxt-icon_text = '下载'.
functxt-quickinfo = '模版下载!'.
sscrfields-functxt_01 = functxt.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file. "返回文件名
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FC01' .
PERFORM frm_download_template.
ENDIF.
START-OF-SELECTION.
PERFORM frm_upload_data.
END-OF-SELECTION.
* ALV处理
* PERFORM frm_display_data.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_display_data .
PERFORM frm_layout.
PERFORM frm_fill_field.
PERFORM frm_alv_display.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_download_template .
"-----检查系统是否存在模板
DATA: lv_objname TYPE wwwdata-objid VALUE 'ZSALES_ORDER'.
DATA: ls_objdata TYPE wwwdatatab.
"-----弹出选择存放的路径.
DATA: lv_window_title TYPE string VALUE '文件下载',
lv_default_extension TYPE string VALUE 'xlsx',
lv_default_file_name TYPE string VALUE '销售订单批量修改导入模版',
lv_file_filter TYPE string VALUE 'Excel文件(*.xlsx)|*.xlsx|',
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_user_action TYPE i.
DATA: lv_key TYPE wwwdatatab,
lv_destination TYPE rlgrap-filename,
lv_rc TYPE i,
lv_temp TYPE c.
"****----------------------------------------------
CLEAR:ls_objdata.
*从SAP服务器中下载Excel模板
SELECT SINGLE relid
objid
FROM wwwdata "存对象模板的表
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND relid = 'MI' "有三种类型 HT MI IT
AND objid = lv_objname. "MONTLYSTOCK
IF sy-subrc <> 0.
MESSAGE 'Excel 模板不存在,请用TCODE:SMW0进行加载' TYPE 'E'.
RETURN.
ENDIF.
IF ls_objdata-objid = space .
MESSAGE 'Excel 模板不存在,请用TCODE:SMW0进行加载' TYPE 'E'.
RETURN.
ENDIF.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_window_title
default_extension = lv_default_extension
default_file_name = lv_default_file_name
file_filter = lv_file_filter
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF lv_user_action = ( cl_gui_frontend_services=>action_ok ).
* 下载模板
SELECT SINGLE * INTO CORRESPONDING FIELDS OF lv_key FROM wwwdata WHERE objid = 'ZSDF009' .
lv_destination = lv_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lv_key
destination = lv_destination
IMPORTING
rc = lv_rc
CHANGING
temp = lv_temp.
IF lv_rc <> 0.
MESSAGE '下载Excel模板出错' TYPE 'E'.
STOP.
ENDIF.
ELSE.
MESSAGE '已取消选择上载文件!' TYPE 'S'.
ENDIF.
ENDIF.
ENDFORM. " FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_data .
CONSTANTS first_col TYPE i VALUE 1.
CONSTANTS first_row TYPE i VALUE 2.
DATA: l_row TYPE i,
l_text TYPE string.
DATA: excel TYPE ole2_object.
DATA: lt_file TYPE STANDARD TABLE OF zalsmex_tabline.
DATA: ls_file TYPE zalsmex_tabline.
FIELD-SYMBOLS:<field> TYPE gty_data.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = first_col
i_begin_row = first_row
i_end_col = '10'
i_end_row = '60000'
TABLES
intern = lt_file
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE '上传数据失败!' TYPE 'E'.
ELSE.
* translate data
LOOP AT lt_file INTO ls_file.
l_row = ls_file-row + 1.
CASE ls_file-col.
WHEN '0001'. "销售订单
gs_data-vbeln = ls_file-value.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-vbeln
IMPORTING
output = gs_data-vbeln.
WHEN '0002'. " 销售订单行项目
gs_data-posnr = ls_file-value.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-posnr
IMPORTING
output = gs_data-posnr.
WHEN '0003'. " 首个交货日期
gs_data-etdat = ls_file-value.
WHEN '0004'. " 订单数量
gs_data-kwmeng = ls_file-value.
WHEN '0005'. " 条件类型
gs_data-kschl = ls_file-value.
WHEN '0006'. " 条件价格
gs_data-netpr = ls_file-value.
WHEN '0007'. " 条件价格单位
gs_data-kpein = ls_file-value.
WHEN '0008'. " 货币
gs_data-konwa = ls_file-value.
WHEN '0009'. " 拒绝原因
gs_data-abgru = ls_file-value.
WHEN '0010'. " 客户PO号
gs_data-bstkd_e = ls_file-value.
WHEN OTHERS.
ENDCASE.
* 数据检查
AT END OF row.
* 检查销售订单
IF gs_data-vbeln = ''.
l_text = l_row.
CONCATENATE '第' l_text '行“销售订单”不能为空。' INTO l_text.
gt_excel_result-text = l_text.
APPEND gt_excel_result.
ENDIF.
* 检查销售订单行项目
IF gs_data-posnr = ''.
l_text = l_row.
CONCATENATE '第' l_text '行“销售订单行项目”不能为空。' INTO l_text.
gt_excel_result-text = l_text.
APPEND gt_excel_result.
ENDIF.
APPEND gs_data TO gt_data.
CLEAR gs_data.
ENDAT.
ENDLOOP.
IF gt_excel_result[] IS NOT INITIAL.
LOOP AT gt_excel_result.
WRITE:/ gt_excel_result-text.
ENDLOOP.
ELSE.
SORT gt_data BY vbeln posnr.
IF gt_data IS NOT INITIAL.
SELECT * INTO TABLE lt_vbep
FROM vbep
FOR ALL ENTRIES IN gt_data
WHERE vbeln = gt_data-vbeln
AND posnr = gt_data-posnr.
ENDIF.
* build records and calling bapi
LOOP AT gt_data ASSIGNING <field>.
* build records 赋值
PERFORM build_records_4_bapi USING <field>.
* one order with serval items
AT END OF vbeln.
* build header
PERFORM build_header_4_bapi USING <field>.
* call bapi to upload sales order
PERFORM upload_sales_order_with_bapi USING <field>.
CLEAR: lt_item, lt_itemx, lt_schdl, lt_schdlx, lt_cond, lt_condx.
ENDAT.
ENDLOOP.
* if no error exist , raise report
PERFORM frm_display_data.
ENDIF.
ENDIF.
ENDFORM. " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form BUILD_RECORDS_4_BAPI
*&---------------------------------------------------------------------*
*& text item
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_records_4_bapi USING ps_sales_order TYPE gty_data.
DATA: ls_view TYPE order_view,
lt_sales TYPE TABLE OF sales_key,
ls_sales TYPE sales_key,
lt_conditions_out TYPE TABLE OF bapisdcond,
ls_conditions_out TYPE bapisdcond.
* fill items
CLEAR:wa_item.
wa_item-itm_number = ps_sales_order-posnr. "行项目
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_item-target_qty = ps_sales_order-kwmeng. "数量
ENDIF.
wa_item-reason_rej = ps_sales_order-abgru. "拒绝原因
IF ps_sales_order-bstkd_e IS NOT INITIAL.
wa_item-purch_no_s = ps_sales_order-bstkd_e. "客户PO号
ENDIF.
APPEND wa_item TO lt_item.
CLEAR:wa_itemx.
wa_itemx-updateflag = 'U'.
wa_itemx-itm_number = ps_sales_order-posnr.
IF ps_sales_order-kwmeng IS NOT INITIAL..
wa_itemx-target_qty = 'X'.
ENDIF.
wa_itemx-reason_rej = 'X'.
IF ps_sales_order-bstkd_e IS NOT INITIAL.
wa_itemx-purch_no_s = 'X'.
ENDIF.
APPEND wa_itemx TO lt_itemx.
* fill schedules
IF ps_sales_order-etdat IS NOT INITIAL OR ps_sales_order-kwmeng IS NOT INITIAL.
READ TABLE lt_vbep INTO ls_vbep WITH KEY vbeln = ps_sales_order-vbeln
posnr = ps_sales_order-posnr.
IF sy-subrc = 0.
CLEAR:wa_schdl.
wa_schdl-itm_number = ps_sales_order-posnr. "行项目
wa_schdl-sched_line = ls_vbep-etenr. "交货计划行号
IF ps_sales_order-etdat IS NOT INITIAL.
wa_schdl-req_date = ps_sales_order-etdat. "首个交货日期
ENDIF.
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_schdl-req_qty = ps_sales_order-kwmeng.
ENDIF.
APPEND wa_schdl TO lt_schdl.
CLEAR wa_schdlx.
wa_schdlx-itm_number = ps_sales_order-posnr.
wa_schdlx-sched_line = ls_vbep-etenr. "交货计划行号
wa_schdlx-updateflag = 'U'.
IF ps_sales_order-etdat IS NOT INITIAL.
wa_schdlx-req_date = 'X'.
ENDIF.
IF ps_sales_order-kwmeng IS NOT INITIAL.
wa_schdlx-req_qty = 'X'.
ENDIF.
APPEND wa_schdlx TO lt_schdlx.
ENDIF.
ENDIF.
* fill condition
IF ps_sales_order-kschl IS NOT INITIAL.
CLEAR: logic_switch.
logic_switch-cond_handl = 'X'.
CLEAR: lt_sales, ls_sales, lt_conditions_out, ls_conditions_out.
ls_view-sdcond = 'X'.
ls_sales-vbeln = ps_sales_order-vbeln.
APPEND ls_sales TO lt_sales.
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = ls_view
TABLES
sales_documents = lt_sales
order_conditions_out = lt_conditions_out.
READ TABLE lt_conditions_out INTO ls_conditions_out
WITH KEY sd_doc = ps_sales_order-vbeln
itm_number = ps_sales_order-posnr
cond_type = ps_sales_order-kschl.
IF sy-subrc = 0."修改价格
CLEAR:wa_cond.
wa_cond-itm_number = ps_sales_order-posnr. "行项目
* wa_cond-cond_st_no = ls_conditions_out-cond_st_no.
* wa_cond-cond_count = ls_conditions_out-cond_count.
wa_cond-cond_value = ps_sales_order-netpr. "价格
wa_cond-cond_type = ps_sales_order-kschl. "条件类型
wa_cond-cond_p_unt = ps_sales_order-kpein. "条件单位
wa_cond-currency = ps_sales_order-konwa. "货币
APPEND wa_cond TO lt_cond.
CLEAR:wa_condx.
wa_condx-updateflag = 'U'.
wa_condx-itm_number = ps_sales_order-posnr.
wa_condx-cond_st_no = ls_conditions_out-cond_st_no.
wa_condx-cond_count = ls_conditions_out-cond_count.
wa_condx-cond_type = 'X'.
wa_condx-cond_value = 'X'.
wa_condx-currency = 'X'.
wa_condx-cond_p_unt = 'X'.
APPEND wa_condx TO lt_condx.
ELSE."新增定价条件行
CLEAR:wa_cond.
wa_cond-itm_number = ps_sales_order-posnr. "行项目
wa_cond-cond_value = ps_sales_order-netpr. "价格
wa_cond-cond_type = ps_sales_order-kschl. "条件类型
wa_cond-cond_p_unt = ps_sales_order-kpein. "条件单位
wa_cond-currency = ps_sales_order-konwa. "货币
APPEND wa_cond TO lt_cond.
CLEAR:wa_condx.
wa_condx-updateflag = 'I'.
wa_condx-itm_number = ps_sales_order-posnr.
wa_condx-cond_type = 'X'.
wa_condx-cond_value = 'X'.
wa_condx-currency = 'X'.
wa_condx-cond_p_unt = 'X'.
APPEND wa_condx TO lt_condx.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_HEADER_4_BAPI
*&---------------------------------------------------------------------*
*& text header
*&---------------------------------------------------------------------*
* -->P_<FIELD> text
*&---------------------------------------------------------------------*
FORM build_header_4_bapi USING ps_sales_order TYPE gty_data.
* 抬头数据
CLEAR wa_header.
* IF ps_sales_order-bstkd IS NOT INITIAL.
* wa_header-purch_no_c = ps_sales_order-bstkd. "客户参考号
* ENDIF.
CLEAR:wa_headerx.
* IF ps_sales_order-bstkd IS NOT INITIAL.
* wa_headerx-purch_no_c = 'X'.
* ENDIF.
wa_headerx-updateflag = 'U'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_SALES_ORDER_WITH_BAPI
*&---------------------------------------------------------------------*
*& text 创建销售订单
*&---------------------------------------------------------------------*
* -->P_GS_SALES_ORDER text
*&---------------------------------------------------------------------*
FORM upload_sales_order_with_bapi USING ps_sales_order TYPE gty_data .
CLEAR: gv_salesdocument,
gs_result,
lt_return,
ls_return.
gv_salesdocument = ps_sales_order-vbeln.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = gv_salesdocument
order_header_in = wa_header
order_header_inx = wa_headerx
* SIMULATION =
* BEHAVE_WHEN_ERROR = ' '
* INT_NUMBER_ASSIGNMENT = ' '
logic_switch = logic_switch
* NO_STATUS_BUF_INIT = ' '
TABLES
return = lt_return
order_item_in = lt_item
order_item_inx = lt_itemx
* PARTNERS =
* PARTNERCHANGES =
* 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 =
* ORDER_KEYS =
conditions_in = lt_cond
conditions_inx = lt_condx
* EXTENSIONIN =
* EXTENSIONEX =
.
* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
LOOP AT lt_return INTO ls_return WHERE type = 'E'
OR type = 'A'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
"失败处理
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
CLEAR: gs_result-message,gs_result.
LOOP AT lt_return INTO ls_return WHERE type EQ 'E' OR type EQ 'A'.
gs_result-vbeln = ps_sales_order-vbeln.
gs_result-bstkd_e = ps_sales_order-bstkd_e.
gs_result-message = ls_return-message && ';' && '创建失败!'.
APPEND gs_result TO gt_result.
ENDLOOP.
ELSE.
"成功处理
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR gs_result.
gs_result-vbeln = ps_sales_order-vbeln.
gs_result-bstkd_e = ps_sales_order-bstkd_e.
CONCATENATE '销售订单' gs_result-vbeln '修改成功' INTO gs_result-message.
APPEND gs_result TO gt_result.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_layout .
CLEAR: gs_layout."它用来定义ALV报表的整体属性
gs_layout-zebra = 'X' ."ZBbra
gs_layout-cwidth_opt = 'X'."优化列宽选项是否设置
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_fill_field .
REFRESH gt_fieldcat.
fill_field: 'VBELN' '订单号' '' '' '' '' '' 'VBAK' 'VBELN',
'MESSAGE' '消息' '' '' '' '' '' '' '',
'BSTKD_E' '参考订单号' '' '' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid "SY-REPID 当前程序名
i_callback_user_command = cns_user_command
i_callback_pf_status_set = cns_pf_status
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat[]
i_save = 'A'
* it_events = gt_events
TABLES
t_outtab = gt_result[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'ALV DISPLAY IS ERROR' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PF_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_PF_STATUS
*&---------------------------------------------------------------------*
* ALV的自定义按钮GUI
*----------------------------------------------------------------------*
FORM frm_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
* ALV自定义按钮响应事件
*----------------------------------------------------------------------*
FORM frm_user_command USING ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: l_valid TYPE char01.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "刷新ALV
IMPORTING
e_grid = g_grid.
CALL METHOD g_grid->check_changed_data
IMPORTING
e_valid = l_valid.
IF l_valid IS INITIAL.
EXIT.
ENDIF.
CASE ucomm.
WHEN '&IC1'.
IF rs_selfield-fieldname = 'VBELN'. "双击单元格的列字段
IF rs_selfield-value IS NOT INITIAL.
SET PARAMETER ID 'AUN' FIELD rs_selfield-value.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN .
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
ENDFORM.

雷达卡


京公网安备 11010802022788号







