EWM开发相关
基础
1简单业务
- (各种原因)上架
- (各种原因)下架
- (各种原因)库内移动
2常用表
基本都是以/scwm和/scdl为开头
Table Area | Description | Table |
---|---|---|
Reference | Reference | /SCDL/DB_REFDOC |
Status | /SCDL/DB_STATUS | |
Outbound | Outbound Delivery Order Header | /SCDL/DB_PROCH_O |
Outbound Delivery Order Item | /SCDL/DB_PROCI_O | |
Inbound | Inbound Delivery: Header | /SCDL/DB_PROCH_I |
Inbound Delivery Item | /SCDL/DB_PROCI_I | |
HU | Handling Unit | /SCDL/DB_HU |
Handling unit header | /SCWM/HUHDR | |
Handling Unit Item | /SCWM/GMHUITM | |
Handling Unit Reference | /SCWM/HUREF | |
Warehouse Task | Warehouse Tasks Log Table | /SCWM/ORDIM_L |
Warehouse Tasks Confirmed | /SCWM/ORDIM_C | |
Warehouse Tasks Open | /SCWM/ORDIM_O | |
Exception Codes for Warehouse Task | /SCWM/ORDIM_E | |
Wave | Wave - Header Information | SCWM/WAVEHDR |
Wave Item | SCWM/WAVEITM | |
TU | Assignment of Deliveries and HUs to Transportation Units | /SCWM/TU_DLV |
Status of Transportation Unit Activities | /SCWM/TU_STATUS |
通常情况下,EWM开发不直接取底表数据,因为数据有可能不全。
举例:一个HU(物料移动的一个整体),通过库内移动到最初的仓位,会自动销毁,此时无法再HU表里面查到。但是通过仓库任务还是能翻出来的—这一块在提供的类方法里面。基于HU的发货也是,同理。
如果找表找不到,或者不知道值是从哪儿取得,建议让开发参考监控器逻辑去找。
3Tcode
EWM直接前台输入的话需要加/n,否则需要在se93执行tcode
function area | Description | T-code |
---|---|---|
Monitor | 仓库管理监控器 | /n/scwm/mon |
Outbound | 维护出库交货订单 | /n/scwm/prdo |
Inbound | 维护入库交货 | /n/scwm/prdi |
Internal | 创建处理单位的仓库任务 | /n/scwm/adhu |
过账更改 | /n/scwm/post | |
确认仓库任务 | /n/scwm/to_conf | |
包装 - 常规 | /n/scwm/pack | |
维护运输单位 | /n/scwm/tu | |
维护波次 | /n/scwm/wave | |
Physical inventory | 创建实际库存凭证 | /n/scwm/pi_create |
输入库存盘点计数 | /n/scwm/pi_count | |
处理实际库存凭证 | /n/scwm/pi_process | |
RF | 登录到 RF 环境 | /n/scwm/rfui |
用户维护 | /n/scwm/user | |
资源维护 | /n/scwm/rsrc | |
资源组维护 | /n/scwm/rgrp | |
描述设备维护 | /n/scwm/prdvc |
4Function
Function | Description |
---|---|
/SCWM/SELECT_STOCK | Selection of Stock |
/SCWM/STOCK_CHANGE | Stock Transfer Postings |
/SCWM/TO_CREATE | Generate Warehouse Task with Multiple Items |
/SCWM/TO_CONFIRM | Confirm Warehouse Task |
/SCWM/TO_CANCEL | Cancel Warehouse Task |
/SCWM/TO_POST | Update Internal Warehouse Task Tables |
/SCWM/TO_CREATE_MOVE_HU | Generate Warehouse Task for Moving HUs |
/SCWM/HU_SELECT_GEN | Selecting HUs |
/SCWM/HUHEADER_READ | Read a HU Header |
/SCWM/HUITM_READ | Read HU Items |
5Class
Class | Description |
---|---|
/SCDL/CL_SP_PRD_INB | Service Provider PRD Inbound Delivery |
/SCDL/CL_SP_PRD_OUT | Service Provider PRD Outbound Delivery |
/SCWM/CL_WM_PACKING | Packing in WM with Immediately Confirmed Transfer Orders |
/SCWM/CL_DLV_PACK_IBDL | Packing of Outbound Delivery |
/SCWM/CL_RF_BLL_SRVC | RF Business Logic Layer |
扩展
1好用的参考开发平台(EWM)/SCWM/MON
非常好用的工具,EWM相关的内部单据可以在这里查询。基本都能查到。
前面提到的已经销毁的HU查询选择页面如下。已经调度(发货),已经删除(销毁的),都支持查询。查表查不到。
其次,因为执行了查询操作,所以可以可以通过DEBUG标准代码,去找EWM标准程序的查询逻辑。EWM标准的查询逻辑都已经封装好了,甚至可以配置。
然后根据找到的清单功能模块去找SE37寻找对应的处理方法。
EWM的这一块也是可配置的,详情见另一份文档。-----相对路径
2RF相关
RF这一块需要有一定的SAP-DIALOG绘制基础-略。需要在开发之外配置非常多的东西,详情见另一份文档。
2.1RF提示S类型消息
CALL METHOD /scwm/cl_rf_bll_srvc=>message
EXPORTING
iv_flg_continue_flow = 'X'
iv_msgid = pv_msgid
iv_msgty = pv_msgty
iv_msgno = pv_msgno
iv_msgv1 = pv_msgv1
iv_msgv2 = pv_msgv2
iv_msgv3 = pv_msgv3
iv_msgv4 = pv_msgv4.
2.2字段不可编辑调整
/scwm/cl_rf_bll_srvc=>set_screlm_input_off('ZEWMS_RF013_1-HUNO' ).
/scwm/cl_rf_bll_srvc=>set_screlm_input_on('ZEWMS_RF013_1-TU_NUM' ).
2.3确认弹出框
注意:RFUI是基于SAP的模拟PDA测试,因此部分SAP支持的弹窗,也能在电脑端显示,但是在PDA端实机就有问题。
DATA:lv_msg TYPE text256,
lv_msgv1 TYPE symsgv,
lv_msgv2 TYPE symsgv,
lv_msgv3 TYPE symsgv.
* lv_msg = '该辊号盘点凭证仓位在' && pv_vlpla1 && ',扫描仓位在' && pv_vlpla2 && ',系统实际仓位在' && pv_vlpla3 && ',是否继续'.
lv_msgv1 = pv_vlpla1.
lv_msgv2 = pv_vlpla2.
lv_msgv3 = pv_vlpla3.
CALL METHOD /scwm/cl_rf_dynpro_srvc=>display_message
EXPORTING
iv_msgty = /scwm/cl_rf_bll_srvc=>c_msgty_query
* iv_msg_text = lv_msg
iv_msgid = 'ZEWMPROG'
iv_msgno = '068'
iv_msgv1 = lv_msgv1
iv_msgv2 = lv_msgv2
iv_msgv3 = lv_msgv3
RECEIVING
rv_answer = lv_answer.
IF lv_answer <> '1'.
MESSAGE e000(zewmrf) WITH '用户取消操作'.
ENDIF.
另,需要注意,PDA的常见增强。这个根据机器调整。
2.4下拉框
同DIALOG的下拉框,但是参数来源没有那么灵活。
DATA:lt_values TYPE vrm_values
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'ZEWMS_RF025_1-ZCCG'
values = lt_values
EXCEPTIONS
id_illegal_name = 2
OTHERS = 999.
2.5focus on
/scwm/cl_rf_bll_srvc=>set_field( 'ZEWMS_RF013_1-HUNO' ).
2.6修改事件(屏幕跳转)
常用于做页面跳转
/scwm/cl_rf_bll_srvc=>set_fcode( 'ZJUMP1' ) ."跳转到ZJUMP4-
/scwm/cl_rf_bll_srvc=>set_prmod( '1' ) ."后台模式
2.7等待补充
3其他相关
3.1物料转换
物料或者产品,通常存40位或者16位RAW,但是产品主表和描述表需要22位。因此有一个转换关系。
物料相关表:/SAPAPO/MATKEY;/SAPAPO/MATTXT
function:/scwm/mdl_guid_convert
3.2批次转换
注:EWM没有提供标准的批次表,有相似的,但是不全(同HU类似)。推荐使用提供的方法转。
/SAPAPO/VERSKEY
批次比较好转
-
bathno->batchid
"单条" FORM frm_get_batchid USING pv_matid pv_charg_tar CHANGING pv_batchid. TRY. /scwm/cl_batch_appl=>cleanup( ). CALL METHOD /scwm/cl_batch_appl=>get_batchid_by_no EXPORTING is_matid_charg = VALUE /scwm/s_matid_charg( matid = pv_matid charg = pv_charg_tar ) IMPORTING ev_batchid = pv_batchid. CATCH /scwm/cx_batch_precheck . ENDTRY. ENDFORM.
支持多条处理
-
batchid->batchno
比较不合理的是,我们只需要读取ev_result,但是返回的参数都是必填,非常难受。
"批量获取批次 DATA:lt_batchid TYPE /scwm/t_batchid. DATA:ls_batchid TYPE /scwm/s_batchid. DATA:lt_matid_val_splt TYPE /scwm/tt_matid_values_splt. DATA:ls_version TYPE /sapapo/cbm_key_and_att. DATA:lt_result TYPE /scwm/t_batchid_rel. DATA:lv_valuation TYPE xfeld. DATA:lv_matid TYPE /scwm/ordim_c-matid. DATA:lv_charg TYPE /scwm/ordim_c-charg. "这一块随意数据源是啥,batchid进去就行" LOOP AT lt_huitm INTO DATA(ls_huitm). ls_batchid-batchid = ls_huitm-batchid. APPEND ls_batchid TO lt_batchid. ENDLOOP. DELETE lt_batchid WHERE batchid IS INITIAL. IF lt_batchid IS NOT INITIAL. TRY. /scwm/cl_batch_appl=>cleanup( ). CALL METHOD /scwm/cl_batch_appl=>get_batchno_by_id EXPORTING * iv_lgnum = '5101' it_batchid = lt_batchid IMPORTING ev_matid = lv_matid ev_charg = lv_charg es_version_attr = ls_version et_result = lt_result ev_split_valuation = lv_valuation. CATCH /scwm/cx_batch_management . ENDTRY. SORT lt_result BY matid batchid. ENDIF.
3.3单据状态
/SCDL/DB_STATUS
也可直接查相关属性
FORM frm_getsuatus CHANGING ps_rf19_docid
ps_rf19_itemid
lv_status.
DATA:lt_docid TYPE /scwm/dlv_docid_item_tab,
ls_docid TYPE /scwm/dlv_docid_item_str.
DATA: lt_headers TYPE /scwm/dlv_header_out_prd_tab,
ls_headers TYPE /scwm/dlv_header_out_prd_str.
DATA:lt_status TYPE /scdl/dl_status_tab,
ls_status TYPE /scdl/dl_status_str.
ls_docid-docid = ps_rf19_docid.
ls_docid-itemid = ps_rf19_itemid.
APPEND ls_docid TO lt_docid.
CALL FUNCTION '/SCWM/WHR_QUERY'
EXPORTING
it_docid = lt_docid
IMPORTING
et_whr_headers = lt_headers.
READ TABLE lt_headers INTO ls_headers INDEX 1.
lt_status = ls_headers-status.
READ TABLE lt_status INTO ls_status WITH KEY status_type = 'DGR'."收货状态
IF sy-subrc = 0 AND ls_status-status_value = '9'.
"收获过账完成
lv_status = 'X'.
ENDIF.
ENDFORM.
深入了解一下-20230419
常见的单据状态或者需要抓的数据。
抬头状态,通常获取发货状态或者拣配状态。部分数据在交货单抬头表。/SCDL/PROCH_O.
3.4时区处理
SAP的单据通常是精确到天,而EWM是精确到具体的时间。
获取仓库时区
DATA:gv_timezone TYPE tznzone.
CALL FUNCTION '/SCWM/LGNUM_TZONE_READ'
EXPORTING
iv_lgnum = gs_werks-lgnum
IMPORTING
ev_tzone = gv_timezone
EXCEPTIONS
interface_error = 1
data_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
"error handing??
ENDIF.
时间戳转日期
CONVERT TIME STAMP <fs_data>-cretst
TIME ZONE gv_timezone
INTO DATE <fs_data>-cretst1
TIME <fs_data>-cretst2.
日期转时间戳
在语法中,时区必填,如果不需要考虑时区,可以改固定值
CONVERT
DATE gs_066b-datum
TIME '000000'
INTO
TIME STAMP lv_begintime
* TIME ZONE ''."在语法中,时区必填,如果不需要考虑时区,可以改空
TIME ZONE gv_timezone.
类似的,报表选择屏幕的时间也要处理成时间戳格式,参与筛选。
另EWM提供时区的转换例程 TSTWH。看用户需求是否要加时区转换。建议在报表中使用参考表参考字段,如果表字段的域没有例程,那么可以通过fieldcat指定例程,-convert = ’TSTWH‘
3.5EWM内部类型
EWM有个很烦人的地方,底表很少有那种外键或者搜索帮助。很痛苦。
例子:装运单的类型
/SCWM/TU_STATUS-STATUS_TYPE
没有搜索帮助
可以通过TJ20,查询对应值
3.6等待补充
4功能程序开发
EWM的程序设计非常规范,在了解他的开发规范和框架的前提下,能大致了解程序是如何运行的。
相对应的,很多类方法和函数都是内部使用的,并没有封装成BAPI,需要承担一定的风险。
案例:取消基于HU的过账。
需要足够多的测试数据,需要一定的前台操作。
找到执行操作的类,通常情况下一种单据,操作都是包在一起的。
- 这里追填写的默认参数
/scmb/cl_base=>set_process_data
- 具体的增删查改等功能,可以双击进去打断点,看具体传参。
lo_sp->/scmb/if_sp_aspect~select
- 部分功能操作,需要传内表,但是EWM的类方法会使用INDEX TABLE,需要追代码到初始化的地方,有参数定义,和执行是分属两个不同的子方法
如果存在部分数据异常,实在是跑不出来结果。那么就需要DEBUG进程序了,看数据异常的地方。
案例具体代码如下
DATA:
lo_sp TYPE REF TO /scwm/cl_sp_fd,
* lo_sp TYPE REF TO /scwm/cl_sp,
ls_dynprodata TYPE /scmb/s_dynpro_data,
lt_cico TYPE /scwm/tt_asp_cico,
lt_sp_k_head TYPE /scdl/t_sp_k_head,
lv_rejected TYPE char1,
lt_return_codes TYPE /scdl/t_sp_return_code,
ls_option TYPE /scmb/s_sp_query_options,
lv_action TYPE string,
lo_tm TYPE REF TO object,
lo_controller TYPE REF TO /scmb/cl_controller,
lv_memid TYPE char20,
lv_failed TYPE boole_d,
lv_msgtx TYPE msgtx,
lv_flag TYPE flag.
DATA:lo_adapter_handler TYPE REF TO /scwm/cl_dlv_handler_adapter.
CREATE OBJECT lo_adapter_handler.
FIELD-SYMBOLS:<lt_svp> TYPE STANDARD TABLE.
DATA:lt_head TYPE REF TO data .
CREATE DATA lt_head TYPE TABLE OF /scwm/s_sp_a_head_fd.
ASSIGN:lt_head->* TO <lt_svp>.
CLEAR:es_return.
CONCATENATE 'LGNUM_' sy-uname INTO lv_memid.
EXPORT lv_lgnum = iv_lgnum TO MEMORY ID lv_memid.
* Initializing the Warehouse
/scwm/cl_tm=>set_lgnum( iv_lgnum ).
* Initial CONTROLLER handler
lo_controller = /scmb/cl_controller=>get_instance( ).
lo_controller->initialize( io_tm = lo_tm ).
CREATE OBJECT lo_sp
EXPORTING
io_attribute_handler = lo_adapter_handler
io_message_handler = lo_adapter_handler
iv_mode = 'C'.
DATA(ls_default_values) = VALUE /scmb/s_default_values( v_identifier = '/SCWM/FD' v_values_structure = '/SCWM/S_SP_DEFAULT'
t_details = VALUE /scmb/t_default_values_det(
( v_fieldname = 'LGNUM' v_mandatory = 'X' v_memoryid = '/SCWM/LGN' )
* ( v_fieldname = 'ASGN_START_DATE' )
* ( v_fieldname = 'ASGN_START_TIME' )
* ( v_fieldname = 'ASGN_END_DATE' )
* ( v_fieldname = 'ASGN_END_TIME' )
* ( v_fieldname = 'ASGN_PAST_DAYS' )
* ( v_fieldname = 'ASGN_FUTURE_DAYS' )
* ( v_fieldname = 'YLGNUM' v_memoryid = '/SCWM/YLGN' )
* ( v_fieldname = 'YCHKPT' v_memoryid = '/SCWM/YCHKPT' )
* ( v_fieldname = 'SKIP_DLV_DETAILS' )
) ).
* Set process specific static attributes\
/scmb/cl_base=>set_process_data(
io_attribute_handler = lo_adapter_handler->mo_attr_handler
io_service_provider = lo_sp
io_message_handler = lo_adapter_handler->mo_msg_handler
is_dynpro_data = ls_dynprodata
is_default_values = ls_default_values
iv_disable_standard_save = abap_true ).
/scmb/cl_base=>end_of_initialization(
iv_no_message_display = abap_true ).
* lt_sp_k_head = VALUE #(
* ( docid = 'CD4B1F4B23051EEE99FD5BA1427D6DD9' )
* ).
"通过交货单的内部编号获取
SELECT *
FROM /scdl/db_dlvi_o
WHERE refdocno = @iv_docno
INTO TABLE @DATA(lt_dlvi_o).
MOVE-CORRESPONDING lt_dlvi_o TO lt_sp_k_head.
SORT lt_sp_k_head BY docid.
DELETE ADJACENT DUPLICATES FROM lt_sp_k_head COMPARING docid.
"查询信息
* CALL METHOD lo_sp->on_default_data_changed.
CALL METHOD lo_sp->/scmb/if_sp_aspect~select
EXPORTING
inkeys = lt_sp_k_head
aspect = /scwm/if_sp_c=>sc_asp_head
IMPORTING
outrecords = <lt_svp>
* rejected = lv_rejected
return_codes = lt_return_codes.
READ TABLE lt_return_codes TRANSPORTING NO FIELDS WITH KEY failed = abap_true.
IF sy-subrc = 0 .
lv_failed = abap_true.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msgtx.
es_return = VALUE #( type = 'E' message = lv_msgtx ).
ENDIF.
IF lv_failed IS INITIAL .
"冲销发货
CLEAR:lt_return_codes,<lt_svp>.
CALL METHOD lo_sp->/scmb/if_sp_action~execute
EXPORTING
aspect = /scwm/if_sp_c=>sc_asp_head
inkeys = lt_sp_k_head
* INPARAM
action = /scwm/if_sp_c=>sc_act_cancel_gm
IMPORTING
outrecords = <lt_svp>
rejected = lv_rejected
return_codes = lt_return_codes.
READ TABLE lt_return_codes TRANSPORTING NO FIELDS WITH KEY failed = abap_true.
IF sy-subrc = 0 OR lv_rejected = abap_true.
lv_failed = abap_true.
es_return-type = 'E'.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO es_return-message.
ENDIF.
IF lv_failed IS INITIAL.
CLEAR lv_rejected.
CALL METHOD lo_sp->/scmb/if_sp_transaction~save
EXPORTING
synchronously = abap_false
IMPORTING
rejected = lv_rejected.
IF lv_rejected = abap_true.
lv_failed = abap_true.
es_return-type = 'E'.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO es_return-message.
ENDIF.
CASE lv_rejected.
WHEN abap_false.
COMMIT WORK AND WAIT.
* Call CLEANUP method of service provider
CALL METHOD lo_sp->('CLEANUP')
EXPORTING
reason = /scmb/if_sp_transaction=>sc_cleanup_commit.
WHEN abap_true.
ROLLBACK WORK.
* IF ss_data-o_ppf_manager IS BOUND.
* ss_data-o_ppf_manager->refresh(
* EXPORTING clear_all = abap_true ).
* ENDIF.
* Call CLEANUP method of service provider
CALL METHOD lo_sp->('CLEANUP')
EXPORTING
reason = /scmb/if_sp_transaction=>sc_cleanup_commit.
MESSAGE e021(/scmb/esa_emulation) INTO es_return-message.
ENDCASE.
ENDIF.
ENDIF.
当然,要是能找到自开发程序参考最好。
分散式EWM
1队列
SMQ1出站队列,SMQ2入站队列
队列数据是序列化的,在TRFCQSTATE,TRFCQDATA。如果数据异常,通常是业务原因,有调整的需求。当前处理方式是在队列的处理函数里面,打断点手动调整处理函数的值。
20240308-补充
在SAP FOR ME查询到一篇文档,点这个连接
可以通过添加SAP提供的方案包来实现这个功能,但是没有可以使用的系统测试。因此打个标记。
添加一下相关NOTE的连接:2226334 ,需要P账号。
2模型CFM1/2/3/4
模型用于传输主数据,例如物料批次,供应商等信息
正常情况下(P)系统的模型是一直在执行的。Q因为服务器性能等原因,会选择随用随传,遇到的最多的报错就是EWM物料批次不存在。
使用综合模型传输数据到EWM,会进入一些增强。例子如下。
2.1分类
BADI:SMOD_APOCF035
传输物料批次特征信息。
场景:用户的批次特征较多,在取数据的时候,都是取的自建表。EWM同理需要将传过来的批次特征转化为自建表。
2.2物料
BADI:SMOD_APOCF005
传输物料信息。
场景:物料基本单位是KG,但是实际收货、移动、发货都是按实际件数EA来。
SAP维护如下:
EWM维护如下:
计量单位类别需要根据实际需要调整。搞乱了的话,后续的物料相关凭证流会出问题。
2.3略
通过上面两个典型的BADI,可以推测出一堆命名方式相同的。
3IDOC
IDOC是比较常见的两个不同系统之间的数据交互方式,是非常成熟的方案。具体的可以问一下大佬,我不是很熟。
3.1SHIPMENT
装运单通过IDOC传输。
场景:SAP装运单母单传输到EWM,绑定EWMTU。仓库操作人员使用TU拆分,拆分成多个子TU,子TU过账后。EWM会产生一个IDOC,传给SAP用于创建装运单子单。
存在部分字段未传输给SAP的异常。因此在SAP做了不少增强处理。
3.2略
当然,也可以建自定义的IDOC。
4DESTINATION
常用于RFC。
4.1调用远程RFC
场景:业务需要再SAP做发货冲销。此时SAP交货单已经过账,产生物料凭证等后续凭证。在启用EWM的后,冲销收货物料凭证会产生退货交货单,退货交货单会触发队列,传输到EWM。此时SAP触发事件,调用EWM的过账函数完成操作。
代码示例
CALL FUNCTION 'ZEWM_RFC_010' DESTINATION LV_DEST
EXPORTING
IV_VBELN = LV_VBELN
IMPORTING
EV_MSGTY = LV_TYPE
EV_MSGTX = LV_MSGTX.
4.1读取表数据
因为分散式EWM,是一个独立的系统,必然存在缺少非关键数据或自定义数据的情况。数据规模比较大的话,会推荐封装一个外部接口。
SAP提供标准函数,用于读取底表数据 RFC_READ_TABLE。有很多缺点,少量数据使用。
场景:EWM传输IDOC到SAP,出现数据不全的情况,需要获取EWM的部分信息,用于更新SAPVTTK表。
代码如下。
FUNCTION zewm_fm_update_vttk_zstu.
*"----------------------------------------------------------------------
*"*"更新函数模块:
*"
*"*"本地接口:
*" IMPORTING
*" VALUE(IV_TAB) TYPE TABNAME DEFAULT '/SCWM/TUNIT'
*" VALUE(IV_TU_NUM) TYPE ZEL_TU_NUM OPTIONAL
*"----------------------------------------------------------------------
DATA: p_dest TYPE rfcdest,
* p_table TYPE tabname VALUE '/SCWM/ORDIM_C',
p_table TYPE tabname VALUE '/SCWM/TUNIT',
lt_option TYPE TABLE OF rfc_db_opt,
lt_field TYPE TABLE OF rfc_db_fld,
lt_data TYPE STANDARD TABLE OF tab512.
FIELD-SYMBOLS:<any> TYPE tab512,
<fs_line> TYPE zewms001.
DATA:lt_tab TYPE TABLE OF zewms001,
ls_tab TYPE zewms001.
DATA:lv_tkuum TYPE char10.
"找到目标系统
SELECT SINGLE rfcdest FROM tblsysdest
INTO @p_dest.
IF iv_tab IS NOT INITIAL.
p_table = iv_tab.
ENDIF.
"添加筛选字段,只取这些字段
DATA:ls_field TYPE rfc_db_fld.
ls_field-fieldname = 'TU_NUM'.
APPEND ls_field TO lt_field.
ls_field-fieldname = 'ZSTU'.
APPEND ls_field TO lt_field.
ls_field-fieldname = 'TPBEZ'.
APPEND ls_field TO lt_field.
ls_field-fieldname = 'ZSJH'.
APPEND ls_field TO lt_field.
ls_field-fieldname = 'ZCX'.
APPEND ls_field TO lt_field.
ls_field-fieldname = 'ZFZ'.
APPEND ls_field TO lt_field.
DATA:ls_option TYPE rfc_db_opt.
"添加筛选条件
iv_tu_num = |{ iv_tu_num ALPHA = IN }|.
lv_tkuum = |{ iv_tu_num ALPHA = IN }|.
IF iv_tu_num IS NOT INITIAL.
ls_option-text = 'TU_NUM = `' && iv_tu_num && '`'.
APPEND ls_option TO lt_option.
ENDIF.
CALL FUNCTION 'RFC_READ_TABLE' DESTINATION p_dest
EXPORTING
query_table = p_table
* NO_DATA = ' '
* ROWSKIPS = 0
* ROWCOUNT = 0
TABLES
options = lt_option
fields = lt_field
data = lt_data
EXCEPTIONS
table_not_available = 1
table_without_data = 2
option_not_valid = 3
field_not_valid = 4
not_authorized = 5
data_buffer_exceeded = 6
OTHERS = 7.
CLEAR:lt_tab.
* BREAK-POINT.
LOOP AT lt_data INTO DATA(ls_data).
CLEAR:ls_tab.
ls_tab = ls_data.
APPEND ls_tab TO lt_tab.
IF ls_tab-zfz = 'Y'.
UPDATE vttk
SET
zztknum = ls_tab-zstu"源装运单
tpbez = ls_tab-tpbez"司机
text1 = ls_tab-zsjh"手机
text2 = ls_tab-zcx"车型
add01 = '1001'"固定
WHERE tknum = lv_tkuum.
ENDIF.
ENDLOOP.
READ TABLE lt_tab INTO ls_tab INDEX 1.
ENDFUNCTION.
5多系统处理
5.1跨系统调用Tcode
这里涉及到账号类型的一个问题。先贴一张图方便后续理解。
开发可能深有体会,需要打开多个client,查阅数据,开发程序。用户在执行操作的时候,希望只打开一个系统即可。此时我们需要提供跨系统调用TCode的方案。
百度会提供一个标准函数:TH_REMOTE_TRANSACTION。不建议使用。因为实际登录账号是SM59维护的连接账号。如果要满足用户需要的话,这个账号得是一个大权限账号,不利于权限控制以及日志记录。甚至支持用户新增窗口。--------这个建立在SM59维护账号是会话账号的前提下。否则会DUMP。