EWM读取凭证信息

  DATA: lo_dlv_db_read_prd TYPE REF TO /scwm/cl_dlv_db_read_prd,
        lt_docid           TYPE /scwm/dlv_docid_item_tab,
        ls_docid           TYPE LINE OF /scwm/dlv_docid_item_tab,
        ls_read_options    TYPE /scwm/dlv_query_contr_str,
        ls_include_data    TYPE /scwm/dlv_query_incl_str,
        lt_items           TYPE /scwm/dlv_item_out_prd_tab,
        ls_item            TYPE LINE OF /scwm/dlv_item_out_prd_tab,
        ls_docflow         TYPE LINE OF /scwm/dl_docflow_tab,
        l_tabix            TYPE sy-tabix.

 CREATE OBJECT lo_dlv_db_read_prd.
  ls_read_options-docflow_succ_1level_only = 'X'.
*  LS_READ_OPTIONS-PARALLEL_PROCESSING = 'X'.
  ls_include_data-item_docflow = 'X'.
  ls_docid-docid  = i_docid.
  ls_docid-doccat = 'PDI'.
  APPEND ls_docid TO lt_docid.
  TRY.
      CALL METHOD lo_dlv_db_read_prd->query(
        EXPORTING
          it_docid        = lt_docid
          is_read_options = ls_read_options
          is_include_data = ls_include_data
        IMPORTING
          et_items        = lt_items ).
    CATCH /scdl/cx_delivery.
      CLEAR lt_items.
  ENDTRY.
  
  
  
  ***更全面的:
    DATA:
    lw_head         TYPE zews2065h,
    lw_item         TYPE zews2065i,
    gv_timezone     TYPE tznzone,
    lo_delivery     TYPE REF TO /scwm/cl_dlv_management_prd,
    lo_message      TYPE REF TO /scwm/cl_dm_message_no,
    lx_delivery     TYPE REF TO /scdl/cx_delivery,
    lt_selection    TYPE TABLE OF /scwm/dlv_selection_str,
    ls_selection    TYPE /scwm/dlv_selection_str,
    ls_read_options TYPE /scwm/dlv_query_contr_str,
    ls_include      TYPE /scwm/dlv_query_incl_str_prd,
    lt_headers      TYPE /scwm/dlv_header_out_prd_tab,
    lt_items        TYPE /scwm/dlv_item_out_prd_tab,
    lt_items_tmp    TYPE /scwm/dlv_item_out_prd_tab,
    ls_header       TYPE /scwm/dlv_header_out_prd_str,
    ls_item         TYPE /scwm/dlv_item_out_prd_str,
    ls_addmeas      TYPE /scdl/dl_addmeas_str,
    ls_partyloc     TYPE /scdl/dl_partyloc_str,
    ls_refdoc       TYPE /scdl/dl_refdoc_str,
    lr_cretst       TYPE /scwm/tt_timestamp_r,
    ls_cretst       TYPE /scwm/s_timestamp_r,
    lt_doctype      TYPE TABLE OF zewt3036_10,
    ls_doctype      TYPE zewt3036_10,
    lv_index        TYPE i.
* get timezone of warehouse
  CALL FUNCTION '/SCWM/LGNUM_TZONE_READ'
    EXPORTING
      iv_lgnum        = iv_lgnum
    IMPORTING
      ev_tzone        = gv_timezone
    EXCEPTIONS
      interface_error = 1
      data_not_found  = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  REFRESH: et_head,et_item.
* get instance
  lo_delivery = /scwm/cl_dlv_management_prd=>get_instance( ).
* build up range of select options
* 仓库号
  ls_selection-fieldname = /scwm/if_dl_logfname_c=>sc_whno_pdo_i.
  ls_selection-sign      = 'I'.
  ls_selection-option    = 'EQ'.
  ls_selection-low       = iv_lgnum.
  APPEND ls_selection TO lt_selection.
  CLEAR ls_selection.

* ERP凭证
  LOOP AT ir_docno INTO DATA(iw_docno).
    ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_refdocno_erp_h.
    ls_selection-sign   = iw_docno-sign.
    ls_selection-option = iw_docno-option.
    ls_selection-low    = iw_docno-low.
    ls_selection-high   = iw_docno-high.
    APPEND ls_selection TO lt_selection.
    CLEAR: ls_selection,iw_docno.
  ENDLOOP.

* 凭证类型
  SELECT * FROM zewt3036_10 INTO TABLE lt_doctype
    WHERE lgnum = iv_lgnum.
  LOOP AT lt_doctype INTO ls_doctype.
    ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_doctype_h.
    ls_selection-sign      = 'I'.
    ls_selection-option    = 'EQ'.
    ls_selection-low       = ls_doctype-doctype.
    APPEND ls_selection TO lt_selection.
    CLEAR ls_selection.
  ENDLOOP.
* 抬头拣配状态
  ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_status_value_dgi_i.
  ls_selection-sign      = 'I'.
  ls_selection-option    = 'EQ'.
  ls_selection-low       = /scdl/if_dl_status_c=>sc_v_mfg_complete.
  APPEND ls_selection TO lt_selection.
  CLEAR ls_selection.

* set read options
  ls_read_options-data_retrival_only = abap_true.
  ls_read_options-mix_in_object_instances = /scwm/if_dl_c=>sc_mix_in_load_instance.
  ls_read_options-parallel_processing = abap_true.

*  ls_include-head_status = abap_true.
*  ls_include-head_partyloc = abap_true.
*  ls_include-item_addmeas = abap_true.
  ls_include-item_refdoc = abap_true.

* call Outbound DLV query
  TRY.
      CALL METHOD lo_delivery->query
        EXPORTING
          iv_whno         = iv_lgnum    "并行取数据时用来读并行相关配置信息,不用来过滤交货单
          iv_doccat       = /scdl/if_dl_c=>sc_doccat_out_prd
          it_selection    = lt_selection
          is_read_options = ls_read_options
          is_include_data = ls_include
        IMPORTING
          et_headers      = lt_headers
          et_items        = lt_items
          eo_message      = lo_message.

* 取出的交货单数据要把已在任务池中的数据排除掉
      IF lt_items[] IS NOT INITIAL.
        SORT lt_headers BY docid.
        SORT lt_items BY docid.
* 整理交货单数据
        CLEAR:lv_index.
        LOOP AT lt_headers INTO ls_header.
          " 交货单创建日期
          CONVERT TIME STAMP ls_header-admin-cretst
            TIME ZONE gv_timezone
            INTO DATE lw_head-erdat.

          LOOP AT lt_items INTO ls_item FROM lv_index. "从上次读取的位置的查找数据
            IF ls_item-docid NE ls_header-docid.
              lv_index = sy-tabix.
              EXIT.
            ENDIF.
            IF ls_item-product-batchno IS INITIAL.
              CONTINUE.
            ENDIF.
            "ERP交货单号
            READ TABLE ls_item-refdoc INTO ls_refdoc WITH KEY refdoccat = 'ERP'.
            IF sy-subrc = 0.
              lw_head-vbeln   = ls_refdoc-refdocno.
              lw_item-vbeln   = ls_refdoc-refdocno.
              lw_item-posnr   = ls_item-itemno+4(6)."ls_refdoc-refitemno.
              lw_item-matnr   = ls_item-product-productno+22(18).
              lw_item-batchno = ls_item-product-batchno.
              lw_item-qty     = ls_item-qty-qty.
              lw_item-uom     = ls_item-qty-uom.
            ENDIF.
            APPEND lw_item TO et_item.
            CLEAR:lw_item,ls_refdoc.
          ENDLOOP.
          IF sy-subrc = 0.
            APPEND lw_head TO et_head.
          ENDIF.
          CLEAR :lw_head,ls_header.
        ENDLOOP.
      ENDIF.

    CATCH /scdl/cx_delivery INTO lx_delivery.
      IF lx_delivery->mo_message IS BOUND.
        lo_message->add( lx_delivery->mo_message ).
      ENDIF.
  ENDTRY.

<think> 嗯,用户这次在深入探讨VL02N操作中XLIKP和YLIKP的技术细节。看来用户对SAP交货单的增强逻辑很熟悉,可能是个ABAP开发人员或物流模块顾问。从ta连续追问交货单类型、行项目类别到现在的数据结构关系来看,应该是在处理交货单相关的增强开发。 用户引用的代码片段显示这是个交货单保存时的增强点(ENHANCEMENT 2 ZIM_EWM_V50K),其中gt_ylikp和is_likp的交互特别关键。需要明确几个技术点:XLIKP代表修改前的交货单抬头旧值,YLIKP则是修改后的新值,这个命名规则符合SAP的标准修改凭证(X/Y Header)规范。 注意到用户提到VL02N这个事务码,结合引用[4]的提示,在4.6版本之后不能依赖SY-TCODE判断模式,这点很重要。在解释时应该强调数据状态与事务码的独立性——即无论VL02N处于显示模式还是修改模式,XLIKP/YLIKP的取值逻辑都保持不变。 用户引用的增强点位置(MV50AFZ1)是个经典的用户出口,这里通常用来实现EWM仓库对接逻辑。从代码中的frm_call_ewm函数调用可以看出,用户可能在处理交货单过账到EWM系统的接口场景。这时候解释清楚新旧值差异尤为重要,因为EWM接口通常需要校验字段变更。 需要特别说明gt_ylikp这个内表的结构来源。根据标准SAP逻辑,在交货单保存时,系统会先锁定VBELN对应的凭证,然后将当前抬头数据存入XLIKP,用户修改后的值存入YLIKP。这个增强点读取gt_ylikp的动作,实际上是在获取其他程序预填充的定制字段值。 最后提醒用户注意版本差异。在S/4 HANA中这个增强点可能被BAdI替代,但X/Y Header的数据传递机制仍然兼容。如果用户需要迁移代码,建议检查新版本的字段对应关系。 </think>在SAP交货单处理中(特别是VL02N事务),**XLIKP和YLIKP代表交货单抬头数据的两种关键状态**,其关系如下: --- ### 1. **数据状态定义** | **结构** | **描述** | **存储位置** | |----------|--------------------------------------------------------------------------|-------------------------| | **XLIKP** | **修改前的交货单抬头数据**(旧值)<br>保存前系统自动缓存的原数据快照 | 内存结构(`SAPMV50A`) | | **YLIKP** | **用户修改后的交货单抬头数据**(新值)<br>包含用户在VL02N界面输入的最新内容 | 内存结构(`SAPMV50A`) | --- ### 2. **核心关系解析** ```mermaid graph LR A[VL02N打开交货单] --> B[系统加载原始数据到XLIKP] B --> C[用户修改字段] C --> D[更新后的数据存入YLIKP] D --> E{保存操作} E -->|校验| F[比较XLIKP vs YLIKP差异] F -->|有变化| G[更新数据库表LIKP] F -->|无变化| H[放弃保存] ``` --- ### 3. **技术实现细节** 1. **数据流向** - 打开交货单时:`LIKP表数据` → `XLIKP结构` - 用户修改后:`界面输入值` → `YLIKP结构` - 保存时触发校验: ```abap IF XLIKP-VBELN NE YLIKP-VBELN. "关键字段对比 MESSAGE e888(sabapdocu) WITH '交货单号被非法修改'. ENDIF. ``` 2. **在增强中的应用**(引用[1]代码解析) ```abap READ TABLE gt_ylikp INTO DATA(ls_ylikp) WITH KEY vbeln = is_likp-vbeln. "从全局内表gt_ylikp读取当前修改值(YLIKP) IF sy-subrc <> 0. CLEAR ls_ylikp. "异常处理 ENDIF. ``` - `gt_ylikp`:存储所有修改后交货单的YLIKP集合 - `is_likp`:代表当前处理的交货单原始数据(XLIKP等价物)[^1] 3. **与事务码的关联** 如引用[4]所述,**在VL02N中不能依赖SY-TCODE判断模式**(因4.6版本后支持显示/修改模式动态切换)。需通过数据状态识别变更: ```abap DATA lv_changed TYPE abap_bool. lv_changed = abap_false. LOOP AT FIELD-SYMBOLS(<field>) ASSIGNING. IF XLIKP-<field> NE YLIKP-<field>. lv_changed = abap_true. "检测到修改 EXIT. ENDIF. ENDLOOP. ``` --- ### 4. **业务场景示例** - **场景1:交货日期修改** - XLIKP-LFDAT = '20240101'(原计划交货日) - YLIKP-LFDAT = '20240105'(用户修改后日期) - 保存时触发JOB调度重排 - **场景2:仓库状态更新**(引用[2]相关) 若用户修改`交货类型`(YLIKP-VBTYP),系统自动触发仓位重分配(参考存储条件配置)[^2]。 --- ### 5. **关键配置点** | **对象** | **配置路径** | **影响范围** | |------------|-----------------------------------------------------------------------------|--------------------------| | 数据校验 | SPRO → 后勤执行 → 装运 → 交货 → 定义凭证类型 → 分配检查规则 | XLIKP/YLIKP差异校验逻辑 | | 字段状态 | OVA2 → 维护交货单类型的字段选择 | 控制哪些字段允许修改 | | 增强检查 | User Exit **MV50AFZ1**(引用[3]) | 自定义XLIKP/YLIKP校验逻辑[^3] | > ⚠️ **重要提示**:在并行处理(如VL10后台作业)中,XLIKP/YLIKP可能指向内存副本而非实际数据库值(引用[4])[^4]。 --- ### 附录:相关表结构 | 表名 | 结构类型 | 描述 | |-------|-----------|-----------------------| | LIKP | 数据库表 | 交货单抬头实际存储 | | XLIKP | 内存结构 | 修改前的数据缓存 | | YLIKP | 内存结构 | 修改后的数据缓存 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值