目录
LT01 转储前台操作
首先输入T-CODE LT01 进入一下界面
如图所示输入必输项(数据用自个的) 然后回车
回车后会进入下面的界面输入从.......到目的地的数据,数量也要输
然后在点击回车,回车之后会返回到创建转储单:初始屏幕
然后屏幕左下角会显示转储订单号
到这里就已经转储成功了
用L_TO_CREATE_MULTIPLE做转储
我们已经熟悉了前台操作,接下用代码(这个函数模块:L_TO_CREATE_MULTIPLE)实现他的转储就容易许多了.因为我们在做前台操作时所输入的数据就是我们要传进L_TO_CREATE_MULTIPLE函数模块的值.
本篇博客做的是接口,所以大家可以参考web service 接口操作,再次之前最好看一下SAP Web Service接口测试及数据传输问题 “顺便吐槽一下国庆假期. 这篇博客讲的有一些细节性的问题,可以提供给大家做参考.
我先一段一段的分析代码最后把完整代码放在最后
数据的传参
151~152行他的意思是将穿过来的目的仓储区和目的仓位转换成大写再赋值.
为什么要这样做?
因为我在postman测试传入小写,返回数据是错的.可以参考:SAP Web Service接口测试及数据传输问题 “顺便吐槽一下国庆假期
右面的这些数据就是我在前台操作时输入的数据,只不过,不需要我们输入了,而是需要在接口的输入和数据库中查询出来数据,然后再传进去
TRY-CATCH 异常捕获
为什么要进行TEY-CATCH ?
因为我们如果输入了一些错误的数据,导致转储失败,但不知道哪里出现错误了,也不知道是哪个字段出现的错误,因此我们要对他进行TRY-CATCH捕获,并且把他用接口输出出去,给用户一个提示.
注意:如果代码执行到了CATCH就说明他一定出现错误,(前提是你不需要其他操作了)所以一定要在后面加上EXIT退出程序,要不然后面的代码代码会继续执行下去,而且SY-SUBRC = 0
我这里添加是因为我只需要做转储,不需要其他的操作,转储失败就直接退出.
如果不晓得他的异常类是什么,你就在postman或soapUI中测试一下,在到SAP中使用SRT_LOG中查看他的异常类
用接口输出的异常消息就是你SE91查看到的消息
代码展示
以下代码仅提供大家做参考 .欢迎评论区留言
FUNCTION zpp_shifting_001 .
*"----------------------------------------------------------------------
*"*"本地接口:
*" EXPORTING
*" VALUE(MSGTYPE) TYPE STRING
*" VALUE(MESSAGE) TYPE STRING
*" TABLES
*" INT_DATA STRUCTURE ZPP_SHIF0003 OPTIONAL
*" OUT_DATA STRUCTURE ZPP_SHIF0001 OPTIONAL
*"----------------------------------------------------------------------
TYPES:BEGIN OF ty_data,
aufnr TYPE afpo-aufnr,
matnr TYPE afpo-matnr,
dwerk TYPE afpo-dwerk,
vltyp TYPE ltap-vltyp,
lgort TYPE ltap-lgort,
lgnum TYPE ltap-lgnum,
werks TYPE ltap-werks,
mblnr TYPE mseg-mblnr,
nlpla TYPE ltap-nlpla,
nlber TYPE ltap-nlber,
END OF ty_data.
DATA:lt_data TYPE TABLE OF ty_data,
ls_data TYPE ty_data.
DATA:gt_data TYPE TABLE OF zpp_shif0003,
gs_data TYPE zpp_shif0003.
DATA: iv_lgnum TYPE ltak-lgnum, "仓库号
iv_bwlvs TYPE ltak-bwlvs, "移动类型
iv_tanum TYPE ltak-tanum. "转储单号
DATA: it_ltap_creat TYPE TABLE OF ltap_creat,
is_ltap_creat TYPE ltap_creat.
DATA:return TYPE TABLE OF bapiret2 WITH HEADER LINE.
DATA:catch_error TYPE REF TO cx_sy_message_in_plugin_mode.
LOOP AT int_data.
int_data-aufnr = |{ int_data-aufnr ALPHA = IN }|.
MODIFY int_data.
ENDLOOP.
IF NOT int_data[] IS INITIAL.
SELECT mseg~mblnr
FROM mseg
LEFT JOIN afpo ON afpo~aufnr = mseg~aufnr
INTO TABLE @DATA(lv_mblnr)
FOR ALL ENTRIES IN @int_data
WHERE mseg~aufnr = @int_data-aufnr.
IF lv_mblnr IS NOT INITIAL.
SELECT
ltap~vltyp,
ltap~lgort,
ltap~lgnum,
ltap~werks,
ltap~nistm,
ltap~nlpla,
ltap~wenum,
ltap~nltyp,
ltap~nlber,
ltap~vlpla,
ltap~matnr,
ltap~vlenr,
ltap~meins,
ltap~sobkz,
ltap~sonum,
ltap~vlber,
afpo~aufnr
INTO TABLE @DATA(lt_ltap)
FROM afpo
LEFT JOIN ltap ON afpo~matnr = ltap~matnr
AND afpo~dwerk = ltap~werks
FOR ALL ENTRIES IN @lv_mblnr
WHERE afpo~aufnr = @int_data-aufnr
AND ltap~wenum = @lv_mblnr-mblnr
AND ltap~nltyp = 'Z01'
AND ltap~lgort = '1001'
AND ltap~werks IN ( 3110 , 3210 ,3310 ) .
ENDIF.
ELSE.
msgtype = 'E'.
message = '输入表为空,请检查输入!'.
ENDIF..
SORT lt_ltap BY wenum.
iv_bwlvs = '999'. "移动类型
LOOP AT lt_ltap INTO DATA(ls_ltap).
iv_lgnum = ls_ltap-lgnum. "仓库号
is_ltap_creat-vltyp = ls_ltap-nltyp."源仓储类型
is_ltap_creat-vlber = ls_ltap-nlber."源发地仓储区
is_ltap_creat-vlpla = ls_ltap-nlpla."源发地仓储位
READ TABLE int_data INTO DATA(ls_int_data) WITH KEY aufnr = ls_ltap-aufnr.
is_ltap_creat-nltyp = 'Z01'."目的地仓储类型
is_ltap_creat-nlber = to_upper( ls_int_data-nlber ) ."目的地仓储区
is_ltap_creat-nlpla = to_upper( ls_int_data-nlpla )."目的地仓位
is_ltap_creat-matnr = ls_ltap-matnr."物料编号
is_ltap_creat-werks = ls_ltap-werks."工厂
is_ltap_creat-lgort = ls_ltap-lgort."存储地点
is_ltap_creat-vlenr = ls_ltap-vlenr."源发地仓储单位编号
is_ltap_creat-altme = ls_ltap-meins."数量计量单位
is_ltap_creat-anfme = ls_ltap-nistm."数量
is_ltap_creat-sobkz = ls_ltap-sobkz."特殊库存标识
is_ltap_creat-sonum = ls_ltap-sonum."特殊库存编号
APPEND is_ltap_creat TO it_ltap_creat.
CLEAR:is_ltap_creat.
ENDLOOP.
TRY.
CALL FUNCTION 'L_TO_CREATE_MULTIPLE'
EXPORTING
i_lgnum = iv_lgnum "
i_bwlvs = iv_bwlvs "
i_commit_work = 'X'
i_bname = sy-uname
IMPORTING
e_tanum = iv_tanum
TABLES
t_ltap_creat = it_ltap_creat
EXCEPTIONS
no_to_created = 1
bwlvs_wrong = 2
betyp_wrong = 3
benum_missing = 4
betyp_missing = 5
foreign_lock = 6
vltyp_wrong = 7
vlpla_wrong = 8
vltyp_missing = 9
nltyp_wrong = 10
nlpla_wrong = 11
nltyp_missing = 12
rltyp_wrong = 13
rlpla_wrong = 14
rltyp_missing = 15
squit_forbidden = 16
manual_to_forbidden = 17
letyp_wrong = 18
vlpla_missing = 19
nlpla_missing = 20
sobkz_wrong = 21
sobkz_missing = 22
sonum_missing = 23
bestq_wrong = 24
lgber_wrong = 25
xfeld_wrong = 26
date_wrong = 27
drukz_wrong = 28
ldest_wrong = 29
update_without_commit = 30
no_authority = 31
material_not_found = 32
lenum_wrong = 33
matnr_missing = 34
werks_missing = 35
anfme_missing = 36
altme_missing = 37
lgort_wrong_or_missing = 38
OTHERS.
CATCH cx_sy_message_in_plugin_mode INTO catch_error.
msgtype = 'E'.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
INTO message.
EXIT.
ENDTRY.
IF sy-subrc <> 0 .
msgtype = 'E'.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
INTO message.
EXIT.
ELSE.
out_data-tanum = iv_tanum. "转储单号
APPEND out_data.
msgtype = 'S'.
message = '转储' && iv_tanum && '成功'.
RETURN-type = 'S'.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
INTO return-message .
ENDIF.
ENDFUNCTION.