我们如何在bapi中上传多个订单项。

2020-08-31 03:37发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个bapi =====>

KKPI_BDC_COSTING_CREATE

我为此写了一个代码。

SPAN {font-family:" Courier New"; 字体大小:10pt; 颜色:#000000; 背景:#FFFFFF; } .L0S31 {font-style:italic; 颜色:#808080; } .L0S32 {color:#3399FF; } .L0S33 {color:#4DA619; } .L0S52 {color:#0000FF; } .L0S55 {color:#800080; } .L0S70 {color:#808080; }

TYPES:开始输入ty_file,
line(1000)TYPE c,
v_fin1 TYPE MATNR,
ty_file的结尾。



DATA:it_file TYPE STANDARD ty_file初始大小表1,
wa_file类型ty_file,
it_fin TYPE标准表ty_fin初始大小表1,
wa_fin类型ty_fin。

数据:it_return bapiret2初始类型的标准表 1,
wa_return TYPE bapiret2。

DATA:input_data TYPE kkpi_transfer_data_line,
table_control_line TYPE rk70l。

SELECT SCREEN BEGGIN OF BLOCK B1 WITH FRAME TITLE text-001。 >参数p_path类型本地文件。
b1块的选择屏幕结束。

在p_path的值请求上的选择屏幕上。
调用功能'F4_FILENAME'
导出
程序名 = syst-cprog
dynpro_number = syst-dynnr
* FIELD_NAME =''
导入
file_name = p_path。

在选择屏幕上。
如果p_path初始。
消息text-002类型'E'。
ELSE。
IF p_path CP'* .TXT'或
p_path CP'* .txt'。
ELSE。
消息文本003类型'E'。
ENDIF。
ENDIF。

开始选择。

数据:p_file1类型字符串。
p_file1 = p_path。

调用功能'GUI_UPLOAD'
导出
文件名= p_file1
表格
data_tab = it_file
例外情况
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
spacer_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
*在此处实施适当的错误处理
ENDIF。

END-OF-SELECTION。
数据:t_input_data类型kkpi_transfer_data。

数据:v_klvar类型ck_klvar ,
v_matnr类型matnr,
v_werks类型werks_d,
v_losgr(100)类型c,
v_tvers类型ck_tvers,
v_kadat类型ck_abdat,
v_bidat TYPE ck_bidat,
v_posnr TYPE ck_posnr,
v_typps TYPE typps,
v_herk2 TYPE herk2,
v_herk3 TYPE herk3,
v_menge(100)TYPE c,
v_meeht TYPE meins,
> v_lwertb(100)类型c,
v_ltext类型kltxt,
v_lpreis(100)类型c,
v_lpeinh(100)类型c,
v_kstar类型kstar,
v_elemt类型ck_element,< br> v_lpreifx(100)TYPE c,
v_lwertfx(100)TYPE c,
v_fin1 TYPE matr。

在it_file中将其放入wa_file。
清除:v_klvar,v_matnr,v_werks,v_losgr ,v_tvers,v_kadat,v_bidat,v_posnr,v_typps,v_herk2,v_herk3,v_menge,v_meeht,
v_lwertb,v_ltext,v_lpreis,v_lpeinh,v_kstar,v_elemt,v_lwerifx> 分割wa_file-line AT';' INTO v_klvar v_matnr v_werks v_losgr v_tvers v_kadat v_bidat v_posnr v_typps v_herk2 v_herk3 v_menge v_meeht
v_lwertb v_ltext v_lpreis v_l_n_n_r_n_r_n_r_n_r_n_n_data_f_l-n_v_k_vstar_f_l-n_t_n_data_l input_data-werks = v_werks。
input_data-losgr = v_losgr。
input_data-tvers = v_tvers。
input_data-kadat = v_kadat。
input_data-bidat = v_bidat。
table_control_line-posnr = v_posnr
table_control_line-typps = v_typps。
table_control_line-herk2 = v_herk2。
table_control_line-herk3 = v_herk3。
table_control_line-menge = v_menge。
table_control_line-meeht = v_meeht。 -lwertb = v_lwertb。
table_control_line-ltext = v_ltext。
table_control_line-lpreis = v_lpreis。
table_control_line-lpeinh = v_lpeinh。
table_control_line-lpreifx = v_lpreifx。
table_control_line-lwertfx = v_lwertfx。
附录t able_control_line到输入数据位置。
APPEND输入数据到t_input_data。
ENDIF。
ENDIF。
通话功能'KKPI_BDC_COSTING_CREATE'
导出
客户端= sy-mandt
用户= sy -uname
模式='A'
更新='A'
it_transfer_data = t_input_data
例外情况
call_transaction_error = 1
no_transfer_data = 2
错误的模式参数= 3
其他 =4。
IF sy-subrc <> 0.
*在此处实施适当的错误处理
ENDIF。
ENDLOOP。

当我为一个带有一个订单项的标头上传成功时,但问题是,当我上传一个带有多个订单项的标头时,其生成错误,例如材料已退出。

我的文件数据是

Z001; 1600640014; 3504; 1; 1; 20190704; 99990331; 1; M; 1300630004; 1020; 10; KG; 570;精制棕榈油精; 57000.00; 1; 4100202; 10; 0; 0。
Z001; 1600640014; 3504; 1; 1; 20190704; 99990331; 2; M; 5002120114; 1020; 1; NOS; 71.5; 15KG锡罐900G; 71.5; 1; 4700103; 40; 0; 0。

所以,我在代码中更改了上传多个订单项的内容。

plz建议。


         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个bapi =====>

KKPI_BDC_COSTING_CREATE

我为此写了一个代码。

SPAN {font-family:" Courier New"; 字体大小:10pt; 颜色:#000000; 背景:#FFFFFF; } .L0S31 {font-style:italic; 颜色:#808080; } .L0S32 {color:#3399FF; } .L0S33 {color:#4DA619; } .L0S52 {color:#0000FF; } .L0S55 {color:#800080; } .L0S70 {color:#808080; }

TYPES:开始输入ty_file,
line(1000)TYPE c,
v_fin1 TYPE MATNR,
ty_file的结尾。



DATA:it_file TYPE STANDARD ty_file初始大小表1,
wa_file类型ty_file,
it_fin TYPE标准表ty_fin初始大小表1,
wa_fin类型ty_fin。

数据:it_return bapiret2初始类型的标准表 1,
wa_return TYPE bapiret2。

DATA:input_data TYPE kkpi_transfer_data_line,
table_control_line TYPE rk70l。

SELECT SCREEN BEGGIN OF BLOCK B1 WITH FRAME TITLE text-001。 >参数p_path类型本地文件。
b1块的选择屏幕结束。

在p_path的值请求上的选择屏幕上。
调用功能'F4_FILENAME'
导出
程序名 = syst-cprog
dynpro_number = syst-dynnr
* FIELD_NAME =''
导入
file_name = p_path。

在选择屏幕上。
如果p_path初始。
消息text-002类型'E'。
ELSE。
IF p_path CP'* .TXT'或
p_path CP'* .txt'。
ELSE。
消息文本003类型'E'。
ENDIF。
ENDIF。

开始选择。

数据:p_file1类型字符串。
p_file1 = p_path。

调用功能'GUI_UPLOAD'
导出
文件名= p_file1
表格
data_tab = it_file
例外情况
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
spacer_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
*在此处实施适当的错误处理
ENDIF。

END-OF-SELECTION。
数据:t_input_data类型kkpi_transfer_data。

数据:v_klvar类型ck_klvar ,
v_matnr类型matnr,
v_werks类型werks_d,
v_losgr(100)类型c,
v_tvers类型ck_tvers,
v_kadat类型ck_abdat,
v_bidat TYPE ck_bidat,
v_posnr TYPE ck_posnr,
v_typps TYPE typps,
v_herk2 TYPE herk2,
v_herk3 TYPE herk3,
v_menge(100)TYPE c,
v_meeht TYPE meins,
> v_lwertb(100)类型c,
v_ltext类型kltxt,
v_lpreis(100)类型c,
v_lpeinh(100)类型c,
v_kstar类型kstar,
v_elemt类型ck_element,< br> v_lpreifx(100)TYPE c,
v_lwertfx(100)TYPE c,
v_fin1 TYPE matr。

在it_file中将其放入wa_file。
清除:v_klvar,v_matnr,v_werks,v_losgr ,v_tvers,v_kadat,v_bidat,v_posnr,v_typps,v_herk2,v_herk3,v_menge,v_meeht,
v_lwertb,v_ltext,v_lpreis,v_lpeinh,v_kstar,v_elemt,v_lwerifx> 分割wa_file-line AT';' INTO v_klvar v_matnr v_werks v_losgr v_tvers v_kadat v_bidat v_posnr v_typps v_herk2 v_herk3 v_menge v_meeht
v_lwertb v_ltext v_lpreis v_l_n_n_r_n_r_n_r_n_r_n_n_data_f_l-n_v_k_vstar_f_l-n_t_n_data_l input_data-werks = v_werks。
input_data-losgr = v_losgr。
input_data-tvers = v_tvers。
input_data-kadat = v_kadat。
input_data-bidat = v_bidat。
table_control_line-posnr = v_posnr
table_control_line-typps = v_typps。
table_control_line-herk2 = v_herk2。
table_control_line-herk3 = v_herk3。
table_control_line-menge = v_menge。
table_control_line-meeht = v_meeht。 -lwertb = v_lwertb。
table_control_line-ltext = v_ltext。
table_control_line-lpreis = v_lpreis。
table_control_line-lpeinh = v_lpeinh。
table_control_line-lpreifx = v_lpreifx。
table_control_line-lwertfx = v_lwertfx。
附录t able_control_line到输入数据位置。
APPEND输入数据到t_input_data。
ENDIF。
ENDIF。
通话功能'KKPI_BDC_COSTING_CREATE'
导出
客户端= sy-mandt
用户= sy -uname
模式='A'
更新='A'
it_transfer_data = t_input_data
例外情况
call_transaction_error = 1
no_transfer_data = 2
错误的模式参数= 3
其他 =4。
IF sy-subrc <> 0.
*在此处实施适当的错误处理
ENDIF。
ENDLOOP。

当我为一个带有一个订单项的标头上传成功时,但问题是,当我上传一个带有多个订单项的标头时,其生成错误,例如材料已退出。

我的文件数据是

Z001; 1600640014; 3504; 1; 1; 20190704; 99990331; 1; M; 1300630004; 1020; 10; KG; 570;精制棕榈油精; 57000.00; 1; 4100202; 10; 0; 0。
Z001; 1600640014; 3504; 1; 1; 20190704; 99990331; 2; M; 5002120114; 1020; 1; NOS; 71.5; 15KG锡罐900G; 71.5; 1; 4700103; 40; 0; 0。

所以,我在代码中更改了上传多个订单项的内容。

plz建议。


付费偷看设置
发送
4条回答
愤怒的猪头君
1楼-- · 2020-08-31 04:02

Subham,

并且提到的FM不是BAPI。 它的FM包含BDC代码。

在循环中附加头数据时得到的原因(表:t_input_data)。 假设您为单个物料有5个订单项,那么您应该追加1个标题行和5个项目行。 因此,在这种情况下,总共有6行。 但是,您要添加5个标题行和5个项目行,共10行。 因此,出现了问题。

希望这可以解决您的问题。 干杯!

Gourab

四川大学会员
2楼-- · 2020-08-31 04:18

Subham,

如果BAPI不可用,请进行BDC录音并使用呼叫交易方法。

谢谢

Gourab

哎,真难
3楼-- · 2020-08-31 04:08

如果没有文档,我会在哪里使用列表来查找导入和表格的填充方式。 (此FM只能在一个地方使用。)

但是,此FM是"未发布"的,请勿使用它。

哎,真难
4楼-- · 2020-08-31 04:09

最终我得到了。

SPAN {font-family:" Courier New"; 字体大小:10pt; 颜色:#000000; 背景:#FFFFFF; } .L0S31 {font-style:italic; 颜色:#808080; } .L0S32 {color:#3399FF; } .L0S33 {color:#4DA619; } .L0S52 {color:#0000FF; } .L0S55 {color:#800080; } .L0S70 {color:#808080; }

TYPE:ty_file的开始,
line(1000)TYPE c,
v_fin1 TYPE matnr,
ty_file的末尾。

TYPEs:ty_fin的开始,
klvar TYPE ck_klvar,
matnr TYPE matnr,
werks TYPE werks_d,
losgr TYPE ck_losgr,
tvers TYPE ck_tvers,
kadat TYPE ck_abdat,
bidat TYPE ck_bidat,
raw_material TYPE ,
pmark TYPE pmark,
posnr TYPE ck_posnr,
typps TYPE Typps,
arbplwerk TYPE kkek_arbplwerk,
menge TYPE menge_pos,
meeht TYPE meins,
pmeht TYPE pmeht,
ltext TYPE kltxt,
price_manual TYPE ck_price_manual,
lpeinh TYPE peinh,
kstar TYPE kstar,
elemt TYPE ck_element,
lpreifx TYPE lpreifx,
lwertfx TYPE lwertfx, br> opcod类型opcod,
ty_fin的末尾。

数据:ty_file初始大小1的it_file TYPE标准表,
wa_file ty_file类型的标准表,
it_fin ty_fin类型标准表ty_fin初始大小1 ,
wa_fin类型ty_fin。

数据:bdcmsgcoll lt_messages类型标准表INITIAL SIZE 1,
wa_message TY PE bdcmsgcoll。

数据:it_return类型bapiret2初始大小标准表1,
wa_return类型bapiret2。

数据:input_data类型kkpi_transfer_data_line,
table_control_line类型rk70l。

带框架标题text-001的b1块的选择屏幕开始。
参数p_path类型localfile。
b1块的选择屏幕结束。

在有请求值的选择屏幕上 FOR p_path。
调用功能'F4_FILENAME'
导出
程序名= syst-cprog
dynpro_number = syst-dynnr
* FIELD_NAME =''
导入
文件名= p_path。

在选择屏幕上。
如果p_path初始。
消息text-002类型'E'。
ELSE。
如果p_path CP'* .TXT'或
p_path CP'* .txt'。
ELSE。
消息文本003类型'E'。
ENDIF。
ENDIF。

开始选择。

数据:p_file1 TYPE字符串。
p_file1 = p_path。

调用功能'GUI_UPLOAD'
导出
文件名= p_file1
表格
data_tab = it_file
例外 S
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8 < br> header_not_allowed = 9
分隔符--not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
其他=17。
IF sy-subrc <> 0.
*在此处实施适当的错误处理
ENDIF。

END-OF-SELECTION。
DATA:V_ERROR(20) 类型C,
V_SUCCESS(1000)类型C.


数据:t_input_data类型kkpi_transfer_data。
类型:初值ty_cost,
v_klvar类型ck_klvar,
v_matnr类型matnr ,
v_werks类型werks_d,
v_losgr类型c,
v_tvers类型ck_tvers,
v_kadat类型ck_abdat,
v_bidat类型ck_bidat,
v_posnr类型ck_posnr,
v_typp
v_herk2 TYPE herk2,
v_herk3 TYPE herk3,
v_menge TYPE char16,
v_meeht TYPE介面,
v_lwertb(05)TYPE c,
v_ltext类型kltxt,
v_lpreis类型char17,
v_lpeinh类型char17,
v_kstar类型kstar,
v_elemt类型ck_element,
v_lpreifx(100)类型c,
v_lwertfx(100)类型c,
v_fin1类型矩阵,
ty_cost结束。
数据:wa_cost类型ty_cost,
it_cost类型标准表ty_cost,
wa_cost1类型ty_cost,
it_cost1类型标准表ty_cost。
循环到it_file放入wa_file。
*清除:v_klvar,v_matnr,v_werks,v_losgr,v_tvers,v_kadat,v_bidat,v_posnr,v_typps,v_herk2,v_herk2, > * v_lwertb,v_ltext,v_lpreis,v_lpeinh,v_kstar,v_elemt,v_lpreifx,v_lwertfx,table_control_line,input_data,t_input_data。

SPLIT wa_file-line AT';' INTO wa_cost-v_klvar wa_cost-v_matnr wa_cost-v_werks wa_cost-v_losgr wa_cost-v_tvers wa_cost-v_kadat wa_cost-v_bidat
wa_cost-v_posnr wa_cost-v_typps wa_cost-v_w_t ___ t__t___t__t__t___t__t_b -v_ltext wa_cost-v_lpreis wa_cost-v_lpeinh wa_cost-v_kstar wa_cost-v_elemt wa_cost-v_lpreifx wa_cost-v_lwertfx。
如果sy-tabix = 1.
继续。
endif。
it_cost。
清除wa_cost。
ENDLOOP。
it_cost1 [] = it_cost []。
从it_cost比较中删除相邻副本v_matnr。
将it_cost循环到in wa_cost中。
input_data-klvar = wa_cost-v_klvar。
input_data-matnr = wa_cost-v_matnr。
input_data-werks = wa_cost-v_werks。
input_data-losgr = wa_cost-v_losgr。
input_data-tvers = wa_cost-v_tvers。
br> input_data-kadat = wa_cost-v_kadat。
input_data-bidat = wa_cost-v_bidat。
*将input_data附加到t_input_data。


将it_cost1循环到wa_cost1,其中v_matnr = wa_cost-v_matn。 >桌子_ control_line-posnr = wa_cost1-v_posnr。
table_control_line-typps = wa_cost1-v_typps。
table_control_line-herk2 = wa_cost1-v_herk2。
table_control_line-herk3 = wa_cost1-v_herk3。
table_control_line-herk3。 v_menge。
table_control_line-meeht = wa_cost1-v_meeht。
table_control_line-lwertb = wa_cost1-v_lwertb。
table_control_line-ltext = wa_cost1-v_ltext。
table_control_line-lpreis = wa_cost1-v_l -lpeinh = wa_cost1-v_lpeinh。
table_control_line-kstar = wa_cost1-v_kstar。
table_control_line-elemt = wa_cost1-v_elemt。
table_control_line-lpreifx = wa_cost1-v_lpreifx。
table_control_linex 。
APPEND table_control_line到输入数据位置。

ENDLOOP。
APPEND输入数据到t_input_data。
调用功能'KKPI_BDC_COSTING_CREATE'
导出
客户端= sy-mandt
用户= sy-uname
模式='N'
更新='A'
it_transfer_data = t_input_data
例外情况
call_transac tion_error = 1
no_transfer_data = 2
错误_mode_parameter = 3
其他=4。
如果sy-subrc <>0。
*合并wa_cost-v_matnr INTO V_ERROR分隔符为''。 >写:/2 wa_cost-v_matnr,15'Cost fail'。
ELSE。
*合并wa_cost-v_matnr wa_cost-v_werks插入到由''分隔的V_SUCCESS中。
写:/2 wa_cost-v_matnr,15 "成功成本"。
ENDIF。
ENDLOOP。

一周热门 更多>