SAP 物料与批次特征值转化为表存储

7 篇文章 0 订阅

        SAP的物料余批次特征值在做SQL查询时比较麻烦,将其特征字段转化为数据库表字段后再进行查询就方便多了。

        在BTE:4002中实现将特征值同步到自定义表的Code逻辑,如下Code所示:

FUNCTION zfm_bte_interface_00004002.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_ECM_NO) TYPE  AENNR OPTIONAL
*"  TABLES
*"      I_ALLOCATION_TAB STRUCTURE  RMCLKSSK OPTIONAL
*"      I_VALUE_TAB STRUCTURE  RMCLAUSP OPTIONAL
*"      I_DELOB_TAB STRUCTURE  RMCLDOB OPTIONAL
*"----------------------------------------------------------------------
  DATA:BEGIN OF ls_mch1_key,
         matnr TYPE mch1-matnr,
         charg TYPE mch1-charg,
       END OF ls_mch1_key.

  DATA:lt_mara_chara TYPE TABLE OF zmmtmara_chara, " 物料特征值表
       ls_mara_chara TYPE zmmtmara_chara.

  DATA:lt_charg_chara TYPE TABLE OF zmmtcharg_chara, " 特此特征值表
       ls_charg_chara TYPE zmmtcharg_chara.

  DATA:BEGIN OF ls_cabn,
         atinn TYPE cabn-atinn ,  " 字段编号
         atnam TYPE cabn-atnam ,  " 字段名
         atfor TYPE cabn-atfor ,  " 类型
         anzdz TYPE cabn-anzdz ,  " 长度
       END OF ls_cabn,
       lt_cabn LIKE TABLE OF ls_cabn.

  DATA:lv_sollwert  TYPE cha_class_view-sollwert,
       lv_stellen   TYPE cha_class_data-stellen,
       lv_date      TYPE p   LENGTH  8 DECIMALS 0,
       lv_date1(20).

  FIELD-SYMBOLS:<fs_chara> TYPE any,
                <fs_value> TYPE any.

  IF NOT i_value_tab[] IS INITIAL.
    "特征
    SELECT atinn    " 字段编号
           atnam    " 字段名
           atfor    " 类型
           anzdz    " 长度
            INTO TABLE lt_cabn
           FROM cabn
           FOR ALL ENTRIES IN i_value_tab
           WHERE atinn = i_value_tab-atinn
           .
  ENDIF.

  LOOP AT i_allocation_tab INTO DATA(ls_allo).
    CLEAR:ls_charg_chara,ls_mara_chara.
    CASE ls_allo-klart.
      WHEN '001'. " 物料特征
*        IF ls_allo-vbkz  = 'I'.     "创建." 取到数据
          SELECT SINGLE * INTO ls_mara_chara
           FROM zmmtmara_chara
             WHERE matnr EQ ls_allo-objek(40).
        IF SY-SUBRC EQ 0.
          ls_mara_chara-matnr = ls_9998-matnr.
        ENDIF.
        ls_mara_chara-aedat = sy-datum.
        ls_mara_chara-aetim = sy-uzeit.
        ls_mara_chara-aenam = sy-uname.
        APPEND ls_mara_chara TO lt_mara_chara ASSIGNING <fs_chara>.
      WHEN '023'. " 批次特征
        MOVE ls_allo-objek TO ls_mch1_key.
*        IF ls_allo-vbkz  = 'I'.    "创建." 取到数据
          SELECT SINGLE * INTO ls_charg_chara
            FROM zmmtcharg_chara
              WHERE matnr EQ ls_mch1_key-matnr
                AND charg EQ ls_mch1_key-charg.
        IF SY-SUBRC EQ 0.
          ls_charg_chara-matnr = ls_mch1_key-matnr.
          ls_charg_chara-charg = ls_mch1_key-charg.
        ENDIF.
        ls_charg_chara-aedat = sy-datum.
        ls_charg_chara-aetim = sy-uzeit.
        ls_charg_chara-aenam = sy-uname.
        APPEND ls_charg_chara TO lt_charg_chara ASSIGNING <fs_chara>.

      WHEN OTHERS.
        CONTINUE.
    ENDCASE.

    CHECK <fs_chara> IS ASSIGNED.

    LOOP AT  i_value_tab INTO DATA(ls_value) WHERE objek = ls_allo-objek
                                               AND statu = 'H'.    "状态.
      CLEAR: ls_cabn.
      READ TABLE lt_cabn INTO ls_cabn WITH KEY atinn = ls_value-atinn. " 取特征字段名称
      IF sy-subrc EQ 0.                      
        ASSIGN COMPONENT ls_cabn-atnam   OF STRUCTURE <fs_chara> TO <fs_value>. " 取特征字段引用
        IF sy-subrc EQ  0.
          IF ls_cabn-atfor = 'CHAR'.
            <fs_value>  = ls_value-atwrt.
          ELSEIF ls_cabn-atfor = 'DATE'.
            lv_date   = ls_value-atflv .
            lv_date1  = lv_date.
            CONDENSE:   lv_date1.
            <fs_value>  = lv_date1.
          ELSEIF ls_cabn-atfor = 'NUM'.
            CLEAR:lv_sollwert,lv_stellen.
            lv_stellen  = ls_cabn-anzdz.
            CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
              EXPORTING
                i_number_of_digits = lv_stellen
                i_fltp_value       = ls_value-atflv
              IMPORTING
                e_char_field       = lv_sollwert.
            CONDENSE:lv_sollwert.
            <fs_value> = lv_sollwert .
          ELSE.
            <fs_value>  = ls_value-atflv.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDLOOP.

* 物料特征值表
  IF lt_mara_chara[] IS NOT INITIAL. " 物料特征值同步
    MODIFY zmmtmara_chara FROM TABLE lt_mara_chara.
  ENDIF.
* 批次特征值表
  IF lt_charg_chara[] IS NOT INITIAL. " 批次特征值同步
    MODIFY zmmtcharg_chara FROM TABLE lt_charg_chara.
  ENDIF.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值