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.