定义一个结构 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: lf_objek TYPE objnum,
lf_obtab TYPE tabelle,
lf_klart TYPE klassenart, "就是T-COD是MM03下面的批次分类下的对象下的类别种类
lf_class TYPE klasse_d, "就是T-COD是MM03下面的批次分类下的分配表里的类别
tmp_str TYPE string.
DATA: lt_char TYPE TABLE OF bapi1003_alloc_values_char,
lt_num TYPE TABLE OF bapi1003_alloc_values_num,
lt_curr TYPE TABLE OF bapi1003_alloc_values_curr,
lt_return TYPE TABLE OF bapiret2,
ls_char TYPE bapi1003_alloc_values_char,
ls_num TYPE bapi1003_alloc_values_num.
REFRESH: it_data.
DATA: tmp_str1 TYPE cha_class_view-sollwert,
tmp_i TYPE cha_class_data-sollwert.
* 取批次特性先清空这些存放数据的变量和内表及结构
CLEAR: lf_objek,lf_obtab,lf_klart,lf_class.
REFRESH: lt_num,lt_char,lt_curr,lt_return.
CLEAR: ls_num,ls_char.
*定义一个子例程 增加前导零,
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 'VB_BATCH_2_CLASS_OBJECT'
EXPORTING
i_matnr = gs_pd-matnr "输入值为物料编号
i_charg = gs_pd-charg "输入值为批次号
i_werks = gs_pd-werks "输入值为工厂号
IMPORTING
e_objek = lf_objek 输出值
e_obtab = lf_obtab 输出值
e_klart = lf_klart 输出值
e_class = lf_class. 输出值
IF lf_objek IS NOT INITIAL.
CLEAR: lt_char, lt_num, lt_curr, lt_return.
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
EXPORTING
objectkey = lf_objek
objecttable = lf_obtab
classnum = lf_class
classtype = lf_klart
TABLES
allocvaluesnum = lt_num 输出一个存放批次特性表里面存放的有B2000001、2、13的批次特性
allocvalueschar = lt_char 输出一个存放批次特性表里面存放的有B2000003到BVENDOR1除了B2000013的批次特性
allocvaluescurr = lt_curr
return = lt_return.
*循环内表 lt_char把批次特性放在我们定义的内表中
LOOP AT lt_char INTO ls_char.
it_data-atnam = ls_char-charact. "特性名称
it_data-atwrt = ls_char-value_neutral. "特性值
it_data-atbez = ls_char-charact_descr. "特征描述
APPEND it_data.
CLEAR ls_char.
ENDLOOP.
循环内表lt_num把批次特性放在我们定义的内表中
LOOP AT lt_num INTO ls_num.
* CLEAR it_data.
tmp_i = ls_num-value_from.
CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
EXPORTING
i_number_of_digits = 2
i_fltp_value = tmp_i
IMPORTING
e_char_field = tmp_str1.
it_data-atnam = ls_num-charact. "特性名称
it_data-atwrt = tmp_str1. "特性值
CONDENSE it_data-atwrt.
* DISAPART_FLOAT IT_DATA-ATWRT.
it_data-atbez = ls_num-charact_descr. "特征描述
APPEND it_data.
CLEAR ls_num.
SORT it_data BY atnam atbez. "排序批次特性表
DELETE ADJACENT DUPLICATES FROM it_data COMPARING ALL FIELDS. "删除重复的数据。
然后就是把特性表里的特性值读出来放在所要显示的内表中,这里的内表是gt_tab。
注意:我们在取特性值的时候是要传递一些内表中的比如物料这些信息的,所以在取特性值的前提下我们要先loop 那些内表,这里是内表gt_pd,这里我没有做循环。