定义结构存放特性值:
DATA: BEGIN OF wa_mchb,
atnam LIKE cabn-atnam, "特征名称
atbez LIKE cabnt-atbez, "特征描述
atwrt LIKE cawn-atwrt, "特性值
END OF wa_mchb.
DATA: it_data LIKE wa_mchb OCCURS 0 WITH HEADER LINE. ”定义内表存放特性值
*取物料组特性
DATA: lt_class TYPE TABLE OF sclass. 里面放着物料主数据t-cod是MM03里分类下的分配表
DATA: lt_objectdata TYPE TABLE OF clobjdat. 里面放着物料主数据t-cod是MM03里分类下的物料特性表
DATA: ls_objectdata TYPE clobjdat. 物料特性结构
DATA: lf_object LIKE ausp-objek. 一个对象的变量:就是把物料编号增加前导零到18位赋给 lf_object
*定义一个子例程 增加前导零,
DEFINE zm_convert_alpha_input2.
call function 'CONVERSION_EXIT_MATN1_INPUT'
exporting
input = &1
importing
output = &1
exceptions
length_error = 1
others = 2.
if sy-subrc <> 0.
* Implement suitable error handling here
endif.
* 清空工作区和内表准备存放物料特性
CLEAR: lf_object,ls_objectdata.
REFRESH: lt_class,lt_objectdata.
* 调用刚才定义的增加前导零,把物料编号增加前导零到18位赋给 lf_object
zm_convert_alpha_input2: gs_pd-matnr.
* 调用该函数取出物料特性值
CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
EXPORTING
classtype = '001'
object = lf_object
TABLES
t_class = lt_class
t_objectdata = lt_objectdata
EXCEPTIONS
no_classification = 1
no_classtypes = 2
invalid_class_type = 3
OTHERS = 4.
IF sy-subrc <> 0.
ENDIF.
*循环内表里把特性值名称、特性值、特性值描述取出来放在自定义的内表it_data里.
LOOP AT lt_objectdata INTO ls_objectdata.
it_data-atnam = ls_objectdata-atnam. "特性名称
it_data-atwrt = ls_objectdata-ausp1. "特性值
IF it_data-atwrt = '?'.
it_data-atwrt = ''.
ENDIF.
it_data-atbez = ls_objectdata-smbez. "特征描述
APPEND it_data.
CLEAR: ls_objectdata.
ENDLOOP.
SORT it_data BY atnam atbez. "排序批次特性表
DELETE ADJACENT DUPLICATES FROM it_data COMPARING ALL FIELDS. "删除重复的数据。
然后就是把特性表里的特性值读出来放在所要显示的内表中,这里的内表是gt_tab。
注意:我们在取特性值的时候是要传递一些内表中的比如物料这些信息的,所以在取特性值的前提下我们要先loop 那些内表,这里是内表gt_pd,这里我没有做循环。
提示:
这边我们在取特性值之前我还可以先转换一下单位
* 单位转换
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = gs_pd-meins
language = '1'
IMPORTING
output = gs_pd-meins.
MODIFY gt_pd FROM gs_pd."
MOVE-CORRESPONDING gs_pd TO it_data.