20231030EWM开发相关

EWM开发相关

基础

1简单业务

  • (各种原因)上架
  • (各种原因)下架
  • (各种原因)库内移动

2常用表

基本都是以/scwm和/scdl为开头

Table AreaDescriptionTable
ReferenceReference/SCDL/DB_REFDOC
Status/SCDL/DB_STATUS
OutboundOutbound Delivery Order Header/SCDL/DB_PROCH_O
Outbound Delivery Order Item/SCDL/DB_PROCI_O
InboundInbound Delivery: Header/SCDL/DB_PROCH_I
Inbound Delivery Item/SCDL/DB_PROCI_I
HUHandling Unit/SCDL/DB_HU
Handling unit header/SCWM/HUHDR
Handling Unit Item/SCWM/GMHUITM
Handling Unit Reference/SCWM/HUREF
Warehouse TaskWarehouse 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
WaveWave - Header InformationSCWM/WAVEHDR
Wave ItemSCWM/WAVEITM
TUAssignment 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 areaDescriptionT-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

FunctionDescription
/SCWM/SELECT_STOCKSelection of Stock
/SCWM/STOCK_CHANGEStock Transfer Postings
/SCWM/TO_CREATEGenerate Warehouse Task with Multiple Items
/SCWM/TO_CONFIRMConfirm Warehouse Task
/SCWM/TO_CANCELCancel Warehouse Task
/SCWM/TO_POSTUpdate Internal Warehouse Task Tables
/SCWM/TO_CREATE_MOVE_HUGenerate Warehouse Task for Moving HUs
/SCWM/HU_SELECT_GENSelecting HUs
/SCWM/HUHEADER_READRead a HU Header
/SCWM/HUITM_READRead HU Items

5Class

ClassDescription
/SCDL/CL_SP_PRD_INBService Provider PRD Inbound Delivery
/SCDL/CL_SP_PRD_OUTService Provider PRD Outbound Delivery
/SCWM/CL_WM_PACKINGPacking in WM with Immediately Confirmed Transfer Orders
/SCWM/CL_DLV_PACK_IBDLPacking of Outbound Delivery
/SCWM/CL_RF_BLL_SRVCRF Business Logic Layer

扩展

1好用的参考开发平台(EWM)/SCWM/MON

image-20231030094738816

非常好用的工具,EWM相关的内部单据可以在这里查询。基本都能查到。

前面提到的已经销毁的HU查询选择页面如下。已经调度(发货),已经删除(销毁的),都支持查询。查表查不到。

image-20231030094954985

其次,因为执行了查询操作,所以可以可以通过DEBUG标准代码,去找EWM标准程序的查询逻辑。EWM标准的查询逻辑都已经封装好了,甚至可以配置。

image-20231030095341341

image-20231030095823382

然后根据找到的清单功能模块去找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端实机就有问题。

image-20231030103446245

  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的常见增强。这个根据机器调整。

image-20231030103710037

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.
    

    支持多条处理

    image-20230419105958059

  • 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.

image-20230419111527730

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

没有搜索帮助

image-20231030110115584

可以通过TJ20,查询对应值

image-20231030110129192

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

模型用于传输主数据,例如物料批次,供应商等信息

image-20240308140418581

正常情况下(P)系统的模型是一直在执行的。Q因为服务器性能等原因,会选择随用随传,遇到的最多的报错就是EWM物料批次不存在。

使用综合模型传输数据到EWM,会进入一些增强。例子如下。

2.1分类

BADI:SMOD_APOCF035

传输物料批次特征信息。

场景:用户的批次特征较多,在取数据的时候,都是取的自建表。EWM同理需要将传过来的批次特征转化为自建表。

2.2物料

BADI:SMOD_APOCF005

传输物料信息。

场景:物料基本单位是KG,但是实际收货、移动、发货都是按实际件数EA来。

SAP维护如下:

image-20240815105337053

EWM维护如下:image-20240815105121168

image-20240815105236523

计量单位类别需要根据实际需要调整。搞乱了的话,后续的物料相关凭证流会出问题。

2.3略

通过上面两个典型的BADI,可以推测出一堆命名方式相同的。image-20240308143020697

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

这里涉及到账号类型的一个问题。先贴一张图方便后续理解。

img

开发可能深有体会,需要打开多个client,查阅数据,开发程序。用户在执行操作的时候,希望只打开一个系统即可。此时我们需要提供跨系统调用TCode的方案。

百度会提供一个标准函数:TH_REMOTE_TRANSACTION。不建议使用。因为实际登录账号是SM59维护的连接账号。如果要满足用户需要的话,这个账号得是一个大权限账号,不利于权限控制以及日志记录。甚至支持用户新增窗口。--------这个建立在SM59维护账号是会话账号的前提下。否则会DUMP。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值