取批次特性值

定义一个结构  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 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,这里我没有做循环。

具体“一个简单的打印报表”文章里也有取批次特性的用法。

原文地址:https://www.cnblogs.com/caizjian/p/3012772.html