BAPI_SALESORDER_CHANGE 更新特性值的系统错误

先附上程序的源代码,然后再说明相关的问题。

  首先要说明的是,本程序代码基本上是完整的应用程序代码,是可以直接应用的。而我们所提到的问题则是指调用BAPI时系统所出现的错误。有些公司应用的特性值会简单一些,可能不会出现相应的问题,有些公司应用的复杂一些,就会出现相应的问题。

  一般情况下,程序员喜欢解决不了问题就直接BDC了。其实这个问题是可以解决的。不用我们更改代码,SAP在我们提报这个问题后给出了一个NOTE来处理这个问题。附件代码如下:

*&---------------------------------------------------------------------*
*& Report ZSG010_XUE 销售订单生产分厂批量修改程序
*&
*&---------------------------------------------------------------------*
*& Created by Xavery Hsueh on 2013-06-19
*&
*&---------------------------------------------------------------------*

REPORT zsg010_xue NO STANDARD PAGE HEADING
MESSAGE-ID v01.

************************************************************************
** 声明数据库表 Declaration of database **
************************************************************************

TABLES:vbak,
vbap,
vbup,
vbfa. "
************************************************************************
** 定义结构类型 Define the structure's type **
************************************************************************

TYPES:BEGIN OF typ_excel,
cell01 TYPE char50,
cell02 TYPE char50,
cell03 TYPE char50,
cell04 TYPE char50,
END OF typ_excel.

TYPES:BEGIN OF typ_result,
vbeln TYPE vbap-vbeln, "销售订单号
posnr TYPE posnr_va, "销售订单行项目
cuobj TYPE vbap-cuobj, "对象号
exart TYPE vbap-exart, "排产状态
werks TYPE char50, "特性值:生产分厂
sorce TYPE char50, "特性值:原料来源
icond TYPE icon_d, "更新状态
msg TYPE char100, "返回信息
box TYPE c,
END OF typ_result.
TYPES:BEGIN OF typ_vbap,
vbeln TYPE vbap-vbeln,
posnr TYPE vbap-posnr,
END OF typ_vbap.
************************************************************************
** 定义变量与内表 Define the variants and Internal tables **
************************************************************************

DATA:gt_excel TYPE TABLE OF typ_excel WITH HEADER LINE,
gt_result TYPE TABLE OF typ_result WITH HEADER LINE,
gt_cell TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
g_indic TYPE c.

DATA:g_p8362 TYPE atinn,
g_p8413 TYPE atinn.

RANGES:r_atwrt_p8413 FOR cawn-atwrt,
r_atwrt_p8362 FOR cawn-atwrt.
* 处理销售订单的特性值的内表
TYPE-POOLS ibco2.
DATA:gt_config TYPE ibco2_instance_tab2,
wa_config LIKE LINE OF gt_config,
wa_config_values TYPE ibvalue0,
g_object TYPE cuib_business_object,
g_atnam TYPE atnam,
g_subrc LIKE sy-subrc.

FIELD-SYMBOLS: TYPE typ_result.
*@------------------ ALV 相关的变量-----------------------------------*
TYPE-POOLS:slis.
DATA: g_grid TYPE REF TO cl_gui_alv_grid,
g_repid LIKE sy-repid,
g_structure_name TYPE tabname,
g_command TYPE slis_formname,
g_title TYPE lvc_title,
g_setting TYPE lvc_s_glay,
wa_print TYPE slis_print_alv,
gt_list_top_of_page TYPE slis_t_listheader,
gt_events TYPE slis_t_event WITH HEADER LINE,
gt_sort TYPE slis_t_sortinfo_alv,
wa_sort TYPE slis_sortinfo_alv,
wa_layout TYPE slis_layout_alv,
gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
wa_fieldcat LIKE LINE OF gt_fieldcat,
g_field TYPE char30,
g_save TYPE c,
g_con_mark TYPE slis_fieldcat_alv-fieldname VALUE 'MARK',
g_length TYPE i,
g_pos TYPE i.
*@---------- BAPI创建销售订单相关的变量与内表-------------------------*
DATA:wa_header TYPE bapisdhd1,
wa_header_inx TYPE bapisdhd1x,
gt_item TYPE TABLE OF bapisditm WITH HEADER LINE,
gt_itemx TYPE TABLE OF bapisditmx WITH HEADER LINE,
gt_schedules_in TYPE TABLE OF bapischdl WITH HEADER LINE,
gt_schedules_inx TYPE TABLE OF bapischdlx WITH HEADER LINE,
gt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
gt_order_partners TYPE TABLE OF bapiparnr WITH HEADER LINE ,
wa_bapicucfg TYPE bapicucfg,
gt_ordertext TYPE TABLE OF bapisdtext WITH HEADER LINE,
gt_extensionin TYPE TABLE OF bapiparex WITH HEADER LINE,
gt_bapicuins TYPE TABLE OF bapicuins WITH HEADER LINE,
gt_bapicuprt TYPE TABLE OF bapicuprt WITH HEADER LINE,
gt_bapicuval TYPE TABLE OF bapicuval WITH HEADER LINE,
gt_bapicuvk TYPE TABLE OF bapicuvk WITH HEADER LINE,
gt_cfgs_ref TYPE TABLE OF bapicucfg WITH HEADER LINE,
gt_cfgs_inst TYPE TABLE OF bapicuins WITH HEADER LINE,
gt_cfgs_value TYPE TABLE OF bapicuval WITH HEADER LINE,
gt_cfgs_refinst TYPE TABLE OF bapicuref WITH HEADER LINE,
gt_cfgs_part_of TYPE TABLE OF bapicuprt WITH HEADER LINE,
gt_cfgs_blob TYPE TABLE OF bapicublb WITH HEADER LINE,
gt_cfgs_vk TYPE TABLE OF bapicuvk WITH HEADER LINE,
gt_partners TYPE TABLE OF bapiparnr WITH HEADER LINE,
gt_partneraddresses TYPE TABLE OF bapiaddr1 WITH HEADER LINE.
DATA:wa_header_m TYPE bapisdh1,
wa_header_mx TYPE bapisdh1x.
FIELD-SYMBOLS:.

DATA:wa_order_view TYPE order_view,
gt_sale_doc TYPE TABLE OF sales_key WITH HEADER LINE,
gt_items TYPE TABLE OF bapisdit WITH HEADER LINE,
gt_flows TYPE TABLE OF bapisdflow WITH HEADER LINE,
gt_cfgs_curefs TYPE TABLE OF bapicurefm WITH HEADER LINE,
gt_cfgs_cucfgs TYPE TABLE OF bapicucfgm WITH HEADER LINE,
gt_cfgs_cuins TYPE TABLE OF bapicuinsm WITH HEADER LINE,
gt_cfgs_cuprts TYPE TABLE OF bapicuprtm WITH HEADER LINE,
gt_cfgs_cuvals TYPE TABLE OF bapicuvalm WITH HEADER LINE,
gt_cfgs_cublbs TYPE TABLE OF bapicublbm WITH HEADER LINE,
gt_cfgs_cuvks TYPE TABLE OF bapicuvkm WITH HEADER LINE.
************************************************************************
** 宏定义 Define the macro **
************************************************************************

DEFINE mcr_range.
clear &1.
&1-sign = 'I'.
&1-option = &2.
&1-low = &3.
&1-high = &4.
append &1.
END-OF-DEFINITION.
* 给FILEDCAT ALV内表赋值
DEFINE mcr_field.
clear wa_fieldcat.
clear g_field.
g_pos = g_pos + 1 .
wa_fieldcat-col_pos = g_pos.
wa_fieldcat-fieldname = &1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-tabname = 'GT_RESULT'.
* wa_fieldcat-no_out = 'X'. "field nodisplay, choose from layout
wa_fieldcat-key = &2. "SUBTOTAL KEY
wa_fieldcat-seltext_l = &3.
* 计算输出字段的长度
concatenate 'GT_RESULT-' &1 into g_field.
assign (g_field) to .
describe field output-length g_length.
wa_fieldcat-outputlen = g_length.
append wa_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
************************************************************************
** 选择屏幕 Customize the selection-screen **
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLEtext-001.
PARAMETERS: p_filenm LIKE rlgrap-filename OBLIGATORY.
PARAMETERS: s_vbeln TYPE vbak-vbeln DEFAULT '421975'.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************
** 执行程序事件 Executing the program's events **
************************************************************************

INITIALIZATION.
PERFORM sub_init_cond.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filenm.
PERFORM sub_search_help_for_filename.

START-OF-SELECTION.
PERFORM sub_upload_data.
PERFORM sub_process_result.
PERFORM sub_check_result.

END-OF-SELECTION.
PERFORM sub_create_fieldcat.
PERFORM sub_init_layout.
PERFORM sub_display_as_alv. "以ALV的方式输出结果表

*@---------------------------------------------------------------------*
*@ Form SUB_INIT_COND
*@---------------------------------------------------------------------*
* 初始化选择条件
*----------------------------------------------------------------------*

FORM sub_init_cond .
p_filenm = 'D:\模版\销售订单生产分厂指定批' &
'处理及查询程序-20130619-模版V2.0.xls'.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = 'P8362'
IMPORTING
output = g_p8362.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = 'P8413'
IMPORTING
output = g_p8413.
ENDFORM. " SUB_INIT_COND
*&---------------------------------------------------------------------*
*& Form SUB_SEARCH_HELP_FOR_FILENAME
*&---------------------------------------------------------------------*
* 使用FUNCTION打开计算机上的文件目录并选中文件
*----------------------------------------------------------------------*

FORM sub_search_help_for_filename .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = ' '
def_path = ' '
mask = ',*.* ,*.*. '
mode = 'O'
title = ' '
IMPORTING
filename = p_filenm
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM. " SUB_SEARCH_HELP_FOR_FILENAME
*&---------------------------------------------------------------------*
*& Form SUB_UPLOAD_DATA
*&---------------------------------------------------------------------*
* 上载更改销售订单特性值所需要的数据
*----------------------------------------------------------------------*

FORM sub_upload_data .
CHECK 1 = 2.
DATA: lv_tind(2) TYPE n.
DATA: lv_cell(19) TYPE c.
FIELD-SYMBOLS .
* 上载电子表格数据
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_filenm
i_begin_col = 1
i_begin_row = 2
i_end_col = 20
i_end_row = 9999
TABLES
intern = gt_cell
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
ELSE.
SORT gt_cell BY row col.
LOOP AT gt_cell.
lv_tind = gt_cell-col.
CONCATENATE 'GT_EXCEL-CELL' lv_tind INTO lv_cell.
ASSIGN (lv_cell) TO .
= gt_cell-value.
AT END OF row.
APPEND gt_excel.
CLEAR gt_excel.
ENDAT.
ENDLOOP.
ENDIF.
* 清空无用的内表
FREE gt_cell.
ENDFORM. " SUB_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form SUB_PROCESS_RESULT
*&---------------------------------------------------------------------*
* 将数据放到结果内表内并检查
*----------------------------------------------------------------------*

FORM sub_process_result .
gt_excel-cell01 = '3'.
gt_excel-cell02 = s_vbeln.
gt_excel-cell03 = '000010'.
gt_excel-cell04 = space.
APPEND gt_excel.
LOOP AT gt_excel.
CLEAR gt_result.
gt_result-werks = gt_excel-cell01.
gt_result-vbeln = gt_excel-cell02.
gt_result-posnr = gt_excel-cell03.
gt_result-sorce = gt_excel-cell04.
gt_result-icond = '@08@'.
* 对数据进行检查并更新检查状态
APPEND gt_result.
ENDLOOP.
* 清空中间内表
FREE gt_excel.

* 取行项目的对象号
LOOP AT gt_result ASSIGNING .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = -vbeln
IMPORTING
output = -vbeln.

ENDLOOP.
ENDFORM. " SUB_PROCESS_RESULT
*&---------------------------------------------------------------------*
*& Form SUB_CHECK_RESULT
*&---------------------------------------------------------------------*
* 检查数据是否有错误,并用指识灯标记
*----------------------------------------------------------------------*

FORM sub_check_result .
* 取特性值原料来源的值的范围
SELECT atwrt AS low
FROM cawn
INTO CORRESPONDING FIELDS OF TABLE r_atwrt_p8413
WHERE atinn = g_p8413.

LOOP AT r_atwrt_p8413.
r_atwrt_p8413-sign = 'I'.
r_atwrt_p8413-option = 'EQ'.
MODIFY r_atwrt_p8413.
ENDLOOP.
* 取特性值生产工厂的值的范围
SELECT atwrt AS low
FROM cawn
INTO CORRESPONDING FIELDS OF TABLE r_atwrt_p8362
WHERE atinn = g_p8362.

LOOP AT r_atwrt_p8362.
r_atwrt_p8362-sign = 'I'.
r_atwrt_p8362-option = 'EQ'.
MODIFY r_atwrt_p8362.
ENDLOOP.

LOOP AT gt_result ASSIGNING .
* 判断销售订单是否存在
SELECT SINGLE vbeln FROM vbak
INTO -vbeln
WHERE vbeln = -vbeln.
IF sy-subrc NE 0.
-icond = '@0A@'.
CONCATENATE '销售订单编码:' -vbeln
' 在系统中不存在'
INTO -msg.
CONTINUE.
ENDIF.
* 取销售订单的对象号
SELECT SINGLE cuobj exart
FROM vbap
INTO (-cuobj,-exart)
WHERE vbeln = -vbeln AND
posnr = -posnr.
IF sy-subrc = 0.
IF -exart NE space.
-icond = '@0A@'.
CONCATENATE '销售订单编号:' -vbeln
'的行项目' -posnr
'已排产'
INTO -msg SEPARATED BY space.
CONTINUE.
ENDIF.
ELSE.
-icond = '@0A@'.
CONCATENATE '销售订单编号:' -vbeln
'的行项目' -posnr
'在系统中不存在!'
INTO -msg SEPARATED BY space.
CONTINUE.
ENDIF.
* 判断是否有后续的单据
SELECT SINGLE * FROM vbfa
WHERE vbelv = -vbeln AND
posnv = -posnr AND
vbtyp_n = 'J'.
IF sy-subrc = 0.
-icond = '@0A@'.
CONCATENATE '销售订单编号:' -vbeln
'的行项目' -posnr
'后续单据存在!'
INTO -msg SEPARATED BY space.
CONTINUE.
ENDIF.
* 判断行项目的状态
SELECT SINGLE * FROM vbup
WHERE vbeln = -vbeln AND
posnr = -posnr AND
( gbsta = 'B' OR gbsta = 'C' ).
IF sy-subrc = 0.
-icond = '@0A@'.
CONCATENATE '销售订单编号:' -vbeln
'的行项目' -posnr
'总览状态已完成!'
INTO -msg SEPARATED BY space.
CONTINUE.
ENDIF.
* 检查数据来源的字段内容是否有错误
IF -sorce IN r_atwrt_p8413 OR
-sorce IS INITIAL.

ELSE.
-icond = '@0A@'.
-msg = '用途大类字段数据有误,请检查!'.
g_indic = 'X'.
ENDIF.
* 检查产品类别的字段内容是否有错误
IF -werks IN r_atwrt_p8362.
ELSE.
-icond = '@0A@'.
IF -msg IS INITIAL.
-msg = '字段数据有误,请检查!'.
ELSE.
CONCATENATE -msg '产品类别字段数据有误,请检查!'
INTO -msg SEPARATED BY space.
ENDIF.
g_indic = 'X'.
ENDIF.
ENDLOOP.

LOOP AT gt_result ASSIGNING .
IF -icond = '@0A@'.
g_indic = 'X'.
ENDIF.
ENDLOOP.

* 释放中间内表
FREE:r_atwrt_p8413,
r_atwrt_p8362.
ENDFORM. " SUB_CHECK_RESULT
*&---------------------------------------------------------------------*
*& Form SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
* 给输出的结果内表指定字段
*----------------------------------------------------------------------*

FORM sub_create_fieldcat .
CLEAR gt_fieldcat[].
mcr_field 'ICOND' 'X' '指识标识' .
mcr_field 'VBELN' 'X' '销售订单号' .
mcr_field 'POSNR' 'X' '项目号' .
mcr_field 'WERKS' '' '产品类别' .
mcr_field 'SORCE' '' '用途大类' .
mcr_field 'MSG' '' '执行结果说明          ' .
ENDFORM. " SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
*& Form SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
* 设置常用的输出布局参数
*----------------------------------------------------------------------*

FORM sub_init_layout .
wa_layout-zebra = 'X'.
wa_layout-window_titlebar = '销售订单生产分厂批量修改程序'.
wa_layout-colwidth_optimize = 'X'.
wa_layout-box_fieldname = 'BOX'.
wa_layout-header_text = '选择'.
ENDFORM. " SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
*& Form SUB_DISPLAY_AS_ALV
*&---------------------------------------------------------------------*
* 调用 ALV 的FUNCTION来输出结果
*----------------------------------------------------------------------*

FORM sub_display_as_alv .
g_repid = sy-repid.
g_setting-coll_top_p = 'X'. "最小化 CALLBACK-TOP-OF-PAGE.
* ABAP List Viewer
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_structure_name = 'TYP_RESULT'
i_grid_title = g_title
i_grid_settings = g_setting
i_callback_user_command = 'SUB_USER_COMMAND'
i_callback_pf_status_set = 'SUB_SET_PF_STATUS'
i_save = g_save
is_layout = wa_layout
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = gt_result
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " SUB_DISPLAY_AS_ALV
*@---------------------------------------------------------------------*
*@ FORM SUB_SET_PF_STATUS *
*@---------------------------------------------------------------------*
* 设置ALV菜单
* 通过SE41,拷贝程序SAPLSLVC_FULLSCREEN的状态STANDARD_FULLSCREEN过来
*@---------------------------------------------------------------------*

FORM sub_set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "sub_set_pf_status
*@--------------------------------------------------------------------*
*@ Form sub_user_command
*@--------------------------------------------------------------------*
* -->R_UCOMM 事务功能码
* -->RS_SELFIELD ALV相关的数据
*---------------------------------------------------------------------*

FORM sub_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'. "双击事件的功能码

WHEN 'EDIT'. "刷新订单的特性值
PERFORM sub_ucomm_update.
ENDCASE.
* 刷新ALV报表
rs_selfield-refresh = 'X'.

ENDFORM. "sub_user_command

*&---------------------------------------------------------------------*
*& Form SUB_UCOMM_UPDATE
*&---------------------------------------------------------------------*
* 根据新的推导规则重新推导预算品种并更新到订单
*----------------------------------------------------------------------*

FORM sub_ucomm_update .
IF g_indic = 'X'.
MESSAGE '数据有错误,请检查' TYPE 'S'.
ENDIF.
CHECK g_indic NE 'X'.

* 得到订单行项目的特性值
PERFORM sub_salesorder_detail.
LOOP AT gt_result ASSIGNING .
REFRESH:gt_item,
gt_itemx.

PERFORM sub_process_cfgs.
gt_item-itm_number = -posnr.
gt_item-po_itm_no = -posnr.
APPEND gt_item.

gt_itemx-itm_number = -posnr.
gt_itemx-po_itm_no = 'X'.
gt_itemx-updateflag = 'U'.
APPEND gt_itemx.
* 更新特性值
PERFORM sub_salesorder_change.
ENDLOOP.
ENDFORM. " SUB_UCOMM_UPDATE
*&---------------------------------------------------------------------*
*& Form SUB_DERIVE_CONFIG
*&---------------------------------------------------------------------*
* 将要更新的数据添加到指定的内表中
*----------------------------------------------------------------------*

FORM sub_derive_config .
CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = 'P8362'
IMPORTING
output = g_p8362.

CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = 'P8413'
IMPORTING
output = g_p8413.

* g_P8413 = '0000000454'.
LOOP AT gt_config INTO wa_config.
* 如果相关特性已经有值,则进行更改
LOOP AT wa_config-values INTO wa_config_values
WHERE atinn EQ g_p8413 OR atinn EQ g_p8362
.
CASE wa_config_values-atinn.
WHEN g_p8362.
IF -werks+0(1) NE 'L' AND
wa_config_values-atwrt+0(1) NE 'L'.
wa_config_values-atwrt = -werks.
MODIFY wa_config-values FROM wa_config_values
TRANSPORTING atwrt.
ENDIF.
WHEN g_p8413.
wa_config_values-atwrt = -sorce.
MODIFY wa_config-values FROM wa_config_values
TRANSPORTING atwrt.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
* 如果相关特性值不存在,则向对应的表中添加纪录
CLEARwa_config_values.
READ TABLE wa_config-values INTO wa_config_values
WITH KEY atinn = g_p8413.
IF sy-subrc EQ 0.
ELSE.
IF -sorce IS NOT INITIAL.
CLEAR wa_config_values.
* wa_config_values-config_id =wa_config-config_id.
* wa_config_values-inst_id = wa_config-inst_id.

wa_config_values-atinn = g_p8413.
wa_config_values-atwrt = -sorce.
wa_config_values-atcod = 1.
APPEND wa_config_values TO wa_config-values.
ENDIF.
ENDIF.

CLEAR wa_config_values.
READ TABLE wa_config-values INTO wa_config_values
WITH KEY atinn = g_p8362.
IF sy-subrc EQ 0.
ELSE.
IF -werks IS NOT INITIAL AND
-werks+0(1) NE 'L'.
CLEAR wa_config_values.
wa_config_values-atinn = g_p8362.
wa_config_values-atwrt = -werks.
wa_config_values-atcod = 1.
APPEND wa_config_values TO wa_config-values.
ENDIF.
ENDIF.
* 更新相关的数据库表
MODIFY gt_config FROM wa_config.
ENDLOOP.
ENDFORM. " SUB_DERIVE_CONFIG
*&---------------------------------------------------------------------*
*& Form SUB_SALESORDER_DETAIL
*&---------------------------------------------------------------------*
* 取销售订单特性值的内容
*----------------------------------------------------------------------*

FORM sub_salesorder_detail .
REFRESH:gt_items,
gt_flows,
gt_sale_doc,
gt_cfgs_curefs,
gt_cfgs_cucfgs,
gt_cfgs_cuins,
gt_cfgs_cuprts,
gt_cfgs_cuvals,
gt_cfgs_cublbs,
gt_cfgs_cuvks.


wa_order_view-item = 'X'.
wa_order_view-configure = 'X'.

LOOP AT gt_result.
gt_sale_doc-vbeln = gt_result-vbeln.
COLLECT gt_sale_doc.
ENDLOOP.

CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = wa_order_view
TABLES
sales_documents = gt_sale_doc
order_items_out = gt_items
order_flows_out = gt_flows
order_cfgs_curefs_out = gt_cfgs_curefs
order_cfgs_cucfgs_out = gt_cfgs_cucfgs
order_cfgs_cuins_out = gt_cfgs_cuins
order_cfgs_cuprts_out = gt_cfgs_cuprts
order_cfgs_cuvals_out = gt_cfgs_cuvals
order_cfgs_cublbs_out = gt_cfgs_cublbs
order_cfgs_cuvks_out = gt_cfgs_cuvks.

ENDFORM. " SUB_SALESORDER_DETAIL
*&---------------------------------------------------------------------*
*& Form SUB_SALESORDER_CHANGE
*&---------------------------------------------------------------------*
* 更新销售订单特性值
*----------------------------------------------------------------------*
FORM sub_salesorder_change .
wa_header_mx-updateflag = 'U'.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = -vbeln
order_header_in = wa_header_m
order_header_inx = wa_header_mx
simulation = ''
int_number_assignment = 'X'
TABLES
return = gt_return
order_item_in = gt_item
order_item_inx = gt_itemx
order_cfgs_ref = gt_cfgs_ref
order_cfgs_inst = gt_cfgs_inst
order_cfgs_part_of = gt_cfgs_part_of
order_cfgs_value = gt_cfgs_value
order_cfgs_blob = gt_cfgs_blob
order_cfgs_vk = gt_cfgs_vk
order_cfgs_refinst = gt_cfgs_refinst.

LOOP AT gt_return WHERE type = 'E' OR type = 'A'.
CONCATENATE -msg ';' gt_return-message INTO
-msg.
ENDLOOP.
IF sy-subrc <> 0.
-icond = '@2K@'.
-msg = '销售订单的特性值更新已成功!'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDFORM. " SUB_SALESORDER_CHANGE
*&---------------------------------------------------------------------*
*& Form SUB_PROCESS_CFGS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*

FORM sub_process_cfgs .
REFRESH: gt_cfgs_refinst,
gt_cfgs_ref,
gt_cfgs_vk,
gt_cfgs_inst,
gt_cfgs_value,
gt_cfgs_part_of.

LOOP AT gt_cfgs_curefs WHERE sd_doc = -vbeln AND
posex = -posnr.
CLEAR gt_cfgs_refinst.
MOVE-CORRESPONDING gt_cfgs_curefs TO gt_cfgs_refinst.
APPEND gt_cfgs_refinst.

ENDLOOP.

LOOP AT gt_cfgs_cucfgs WHERE sd_doc = -vbeln AND
posex = -posnr.
CLEAR gt_cfgs_ref.
MOVE-CORRESPONDING gt_cfgs_cucfgs TO gt_cfgs_ref.
APPEND gt_cfgs_ref.
ENDLOOP.

LOOP AT gt_cfgs_cuvks WHERE sd_doc = -vbeln AND
config_id = gt_cfgs_refinst-config_id.
CLEAR gt_cfgs_vk.
MOVE-CORRESPONDING gt_cfgs_cuvks TO gt_cfgs_vk.
APPEND gt_cfgs_vk.
ENDLOOP.

LOOP AT gt_cfgs_cuins WHERE sd_doc = -vbeln AND
config_id = gt_cfgs_refinst-config_id.
CLEAR gt_cfgs_inst.
MOVE-CORRESPONDING gt_cfgs_cuins TO gt_cfgs_inst.
APPEND gt_cfgs_inst.
ENDLOOP.

LOOP AT gt_cfgs_cuvals WHERE sd_doc = -vbeln AND
config_id = gt_cfgs_refinst-config_id.
CLEAR gt_cfgs_value.
MOVE-CORRESPONDING gt_cfgs_cuvals TO gt_cfgs_value.
APPEND gt_cfgs_value.
ENDLOOP.

LOOP AT gt_cfgs_cuprts WHERE sd_doc = -vbeln AND
config_id = gt_cfgs_refinst-config_id.
CLEAR gt_cfgs_part_of.
MOVE-CORRESPONDING gt_cfgs_cuprts TO gt_cfgs_part_of.
APPEND gt_cfgs_part_of.
ENDLOOP.

* 如果相关特性已经有值,则进行更改
LOOP AT gt_cfgs_value WHERE charc = 'P8362'.
IF -werks+0(1) NE 'L' AND
gt_cfgs_value-value+0(1) NE 'L'.
gt_cfgs_value-value = -werks.
gt_cfgs_value-author = ''.
MODIFY gt_cfgs_value TRANSPORTING value author.
ENDIF.
ENDLOOP.
* 如果相关特性值不存在,则向对应的表中添加纪录
IF -werks IS NOT INITIAL.
READ TABLE gt_cfgs_value WITH KEY charc = 'P8362'.
IF sy-subrc <> 0.
IF -werks IS NOT INITIAL AND
-werks+0(1) NE 'L'.
CLEAR gt_cfgs_value.
gt_cfgs_value-config_id = wa_bapicucfg-config_id.
gt_cfgs_value-inst_id = wa_bapicucfg-root_id.
gt_cfgs_value-charc = 'P8362'.
gt_cfgs_value-value = -werks.
gt_cfgs_value-author = ''.
gt_cfgs_value-valcode = '1'.
APPEND gt_cfgs_value.
ENDIF.
ENDIF.
ENDIF.
* 如果相关特性已经有值,则进行更改
LOOP AT gt_cfgs_value WHERE charc = 'P8413'.
gt_cfgs_value-value = -sorce.
gt_cfgs_value-author = ''.
MODIFY gt_cfgs_value TRANSPORTING value author.
CLEAR gt_cfgs_value.
ENDLOOP.
* 如果相关特性值不存在,则向对应的表中添加纪录
IF -sorce IS NOT INITIAL.
READ TABLE gt_cfgs_value WITH KEY charc = 'P8413'.
IF sy-subrc <> 0.
gt_cfgs_value-config_id = wa_bapicucfg-config_id.
gt_cfgs_value-inst_id = wa_bapicucfg-root_id.
gt_cfgs_value-charc = 'P8413'.
gt_cfgs_value-value = -sorce.
gt_cfgs_value-author = ''.
gt_cfgs_value-valcode = '1'.
APPEND gt_cfgs_value.
ENDIF.
ENDIF.
ENDFORM. " SUB_PROCESS_CFGS


BAPI_SALESORDER_CHANGE此FUNCTION更新特性值的错误如下,当销售订单存在下面这样一个间隔特性值时,更新其内容时报错。

BAPI_SALESORDER_CHANGE <wbr>更新特性值的系统错误(二)

  间隔特性值在内表中的内容如下所示,它由一低端值、一高端值组成,并且valcode的值大于1。AUTHOR字段的内容为8。这种情况下,此特性值在更新时必会出错误。

BAPI_SALESORDER_CHANGE <wbr>更新特性值的系统错误(二)

  订单特性值更新完成后,前台显示如下。它将低值变成一个新特性值的值并增加到系统中。

BAPI_SALESORDER_CHANGE <wbr>更新特性值的系统错误(二)

  这是个系统错误,当初我碰到此问题时,还以为是我们的自开发程序出现了问题。后来经过反复核查确认是SAP程序的问题,通过Message与SAP反复沟通后,SAP 确认了此程序的问题,并为我们发布了一个Note来解决这个问题。Note号为 1900649。

 

  1900649概要如下:

Summary

Symptom

You want to change the characteristic value assignment of aconfiguration using a BAPI or IDoc. You want to assign an intervalto a numeric characteristic. When you check the valuation, younotice that the lower limit of the interval was set as a singlevalue.

Other terms

ATCOD, VALCODE

Reason and Prerequisites

There is a program error.

Solution

Implement the correction instructions.

Header Data

   
Release Status: PilotRelease
Released on: 2013-08-15  12:07:58
Master Language: German
Priority: Correction withmedium priority
Category: Programerror
PrimaryComponent: LO-VC-CHRCharacteristic Value Assignment / Interface Design

  系统打补丁后,可解决此问题,而不用换成BDC或其它技术来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值