Skip to Content
Technical Articles
Author's profile photo Miguel Angel Baca Celi

Obtener características de Material

Tuve un requerimiento que debía obtener las características de un material y aplicar un grupo de condiciones según los valores obtenidos. Para esto, a fin de estandarizar y unificar la lógica donde se obtengan estos valores, creé una FM que recibe como parámetros el material y lote, y devuelve una tabla con las características del mismo.

 

A continuación el código:

 

Solución 1:

En el diccionario de datos:
  • Estructura ZST_MATNR_CHARACTERISTICS – Estructura Características de Material

Componente

Clase tipificación

Tp.Componente

Tipo de datos

Long.

Descripción breve

MATNR

Type

MATNR

CHAR

40

Número de material

CHARG

Type

CHARG_D

CHAR

10

Número de lote

ATNAM

Type

ATNAM

CHAR

30

Nombre de característica

ATBEZ

Type

ATBEZ

CHAR

30

Denominación de la característica

VAL1

Type

ZE_VALOR1

CHAR

50

Valor 1 de característica

VAL2

Type

ZE_VALOR2

CHAR

50

Valor 2 de característica

 

 

  • Tipo Tabla ZTT_MATNR_CHARACTERISTICS – Tipo tabla Características de Material

ZTT_MATNR_CHARACTERISTICS%20-%20Tipo%20de%20l%EDnea

ZTT_MATNR_CHARACTERISTICS – Tipo de línea

ZTT_MATNR_CHARACTERISTICS%20-%20Inicializaci%F3n%20y%20acceso

ZTT_MATNR_CHARACTERISTICS – Inicialización y acceso

ZTT_MATNR_CHARACTERISTICS%20-%20Clave%20primaria

ZTT_MATNR_CHARACTERISTICS – Clave primaria

ZTT_MATNR_CHARACTERISTICS%20-%20Clave%20secundaria

ZTT_MATNR_CHARACTERISTICS – Clave secundaria

 

 

Include TOP

CONSTANTS:
  gc_klart_023 TYPE klassenart VALUE '023'. "Categoría de la clase: Lote

 

Include F01

*&---------------------------------------------------------------------*
*& Form F_GET_CHARACT_OBJECTS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM f_get_charact_objects TABLES tb_charact TYPE ztt_matnr_characteristics
                          USING us_matnr       TYPE matnr
                                us_charg       TYPE charg_d
                                us_object      TYPE bapi1003_key-object
                                us_objecttable TYPE bapi1003_key-objecttable
                                us_classnum    TYPE bapi1003_key-classnum
                                us_classtype   TYPE bapi1003_key-classtype.


  DATA: ltd_num    TYPE numeric_allocation_tt,
        ltd_char   TYPE char_allocation_tt,
        ltd_curr   TYPE currency_allocation_tt,
        ltd_return TYPE bapiret2_t,
        ltd_cabn2  TYPE cabn,
        lv_number  TYPE cha_class_data-stellen.

  DATA: lv_fltp TYPE cha_class_view-sollwert.


  CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
    EXPORTING
      objectkey       = us_object
      objecttable     = us_objecttable
      classnum        = us_classnum
      classtype       = us_classtype
      keydate         = sy-datum
    TABLES
      allocvaluesnum  = ltd_num
      allocvalueschar = ltd_char
      allocvaluescurr = ltd_curr
      return          = ltd_return.

  IF ltd_num[] IS NOT INITIAL.
    SELECT atinn,adzhl,anzdz,atnam
      INTO TABLE @DATA(ltd_cabn)
      FROM cabn
      FOR ALL ENTRIES IN @ltd_num
      WHERE atnam     EQ @ltd_num-charact.
  ENDIF.

  IF ltd_curr[] IS NOT INITIAL.
    SELECT atinn adzhl anzdz atnam
      APPENDING TABLE ltd_cabn
      FROM cabn
      FOR ALL ENTRIES IN ltd_curr
      WHERE atnam     EQ ltd_curr-charact.
  ENDIF.

  SORT ltd_cabn BY atnam.



* Numeric Values
  LOOP AT ltd_num ASSIGNING FIELD-SYMBOL(<fs_num>).

    CLEAR lv_number.

    APPEND INITIAL LINE TO tb_charact ASSIGNING FIELD-SYMBOL(<fs_carac>).
    <fs_carac>-matnr =  us_matnr.
    <fs_carac>-charg =  us_charg.
    <fs_carac>-atnam = <fs_num>-charact.
    <fs_carac>-atbez = <fs_num>-charact_descr.

    READ TABLE ltd_cabn ASSIGNING FIELD-SYMBOL(<fs_cabn>) WITH KEY atnam = <fs_num>-charact BINARY SEARCH.
    IF sy-subrc EQ 0.
      lv_number = <fs_cabn>-anzdz.
    ENDIF.

    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = lv_number
        i_fltp_value       = <fs_num>-value_from
      IMPORTING
        e_char_field       = lv_fltp.

    CONDENSE lv_fltp NO-GAPS.
    <fs_carac>-val1 = lv_fltp.


    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = lv_number
        i_fltp_value       = <fs_num>-value_to
      IMPORTING
        e_char_field       = lv_fltp.

    CONDENSE lv_fltp NO-GAPS.
    <fs_carac>-val2 = lv_fltp.


    CALL FUNCTION 'CTUT_FEATURE_DATA'
      EXPORTING
        class_type                  = '023'
        feature_id                  = 0
        feature_name                = ' '
        feature_neutral_name        = <fs_num>-charact
        language                    = ' '
        message_type_inp            = 'E'
        key_date                    = sy-datum
        ignore_delete_flag          = ' '
        ignore_rename               = ' '
        ignore_buffer               = ' '
        change_number               = ' '
      IMPORTING
        ecabn                       = ltd_cabn2
      EXCEPTIONS
        invalid_class_type          = 1
        missing_feature_information = 2
        no_feature_found            = 3
        no_feature_valid            = 4
        no_language                 = 5
        OTHERS                      = 6.

    IF sy-subrc <> 0.

    ELSE.

      CASE ltd_cabn2-atfor.

        WHEN 'DATE'.
          CONDENSE: <fs_carac>-val1, <fs_carac>-val2.
          CONCATENATE <fs_carac>-val1+6(2) <fs_carac>-val1+4(2) <fs_carac>-val1+0(4) INTO <fs_carac>-val1 SEPARATED BY '.'.
          IF <fs_carac>-val2 IS NOT INITIAL AND <fs_carac>-val2 NE '0'.
            CONCATENATE <fs_carac>-val2+6(2) <fs_carac>-val2+4(2) <fs_carac>-val2+0(4) INTO <fs_carac>-val2 SEPARATED BY '.'.
          ENDIF.

        WHEN 'TIME'.
          CONDENSE: <fs_carac>-val1, <fs_carac>-val2.

          IF <fs_carac>-val1+0(1) < 10.
            CONCATENATE '0' <fs_carac>-val1 INTO <fs_carac>-val1.
          ENDIF.
          CONCATENATE <fs_carac>-val1+0(2) <fs_carac>-val1+2(2) <fs_carac>-val1+4(2) INTO <fs_carac>-val1 SEPARATED BY ':'.


          IF <fs_carac>-val2 IS NOT INITIAL AND <fs_carac>-val2 NE '0'.
            IF <fs_carac>-val2+0(1) < 10.
              CONCATENATE '0' <fs_carac>-val2 INTO <fs_carac>-val2.
            ENDIF.
            CONCATENATE <fs_carac>-val2+0(2) <fs_carac>-val2+2(2) <fs_carac>-val2+4(2) INTO <fs_carac>-val2 SEPARATED BY ':'.
          ENDIF.
      ENDCASE.

    ENDIF.

  ENDLOOP.



* Alphanumeric Values
  LOOP AT ltd_char ASSIGNING FIELD-SYMBOL(<fs_char>).
    APPEND INITIAL LINE TO tb_charact ASSIGNING <fs_carac>.
    <fs_carac>-matnr =  us_matnr.
    <fs_carac>-charg =  us_charg.
    <fs_carac>-atnam = <fs_char>-charact.
    <fs_carac>-val1  = <fs_char>-value_char.
    <fs_carac>-atbez = <fs_char>-charact_descr.
  ENDLOOP.



* Currency Values
  LOOP AT ltd_curr ASSIGNING FIELD-SYMBOL(<fs_curr>).

    CLEAR lv_number.

    APPEND INITIAL LINE TO tb_charact ASSIGNING <fs_carac>.
    <fs_carac>-matnr =  us_matnr.
    <fs_carac>-charg =  us_charg.
    <fs_carac>-atnam = <fs_curr>-charact.
    <fs_carac>-atbez = <fs_curr>-charact_descr.

    READ TABLE ltd_cabn ASSIGNING <fs_cabn> WITH KEY atnam = <fs_num>-charact BINARY SEARCH.

    IF sy-subrc EQ 0.
      lv_number = <fs_cabn>-anzdz.
    ENDIF.

    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = lv_number
        i_fltp_value       = <fs_curr>-value_from
      IMPORTING
        e_char_field       = lv_fltp.

    <fs_carac>-val1 = lv_fltp.

    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = lv_number
        i_fltp_value       = <fs_curr>-value_to
      IMPORTING
        e_char_field       = lv_fltp.

    <fs_carac>-val2 = lv_fltp.

  ENDLOOP.

ENDFORM.

 

 

FM ZFM_GET_MATNR_CHARACTERISTICS

FUNCTION zfm_get_matnr_characteristics.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(I_MATNR) TYPE  MATNR
*"     REFERENCE(I_CHARG) TYPE  CHARG_D
*"  EXPORTING
*"     REFERENCE(ET_CHARACT) TYPE  ZTT_MATNR_CHARACTERISTICS
*"----------------------------------------------------------------------

  DATA:
    lv_matnr_aux TYPE matnr,
    lv_type_var  TYPE dd01v-datatype,
    lv_object    TYPE bapi1003_key-object,
    lv_classnum  TYPE bapi1003_key-classnum.

  CONSTANTS:
    lc_table TYPE bapi1003_key-objecttable VALUE 'MCH1',  "Name of Database Table for Object
    lc_char  TYPE c LENGTH 4 VALUE 'CHAR'.



  CLEAR lv_object.

**********************************************************************
* Validar si el Material es Alfanumérico

  CLEAR: lv_matnr_aux,
         lv_type_var.

  CALL FUNCTION 'NUMERIC_CHECK'
    EXPORTING
      string_in  = i_matnr
    IMPORTING
      string_out = lv_matnr_aux
      htype      = lv_type_var.

  IF lv_type_var EQ lc_char.
    CONCATENATE lv_matnr_aux
                i_charg
                INTO lv_object RESPECTING BLANKS.
  ELSE.
    lv_object = i_matnr && i_charg.
  ENDIF.


**********************************************************************
* Obtener Clases del Material

  DATA: lt_alloclist TYPE STANDARD TABLE OF bapi1003_alloc_list,
        lt_bapiret   TYPE bapiret2_t.

  CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
    EXPORTING
      objectkey_imp   = lv_object        " Key of Object to be Classified
      objecttable_imp = lc_table         " Name of Database Table for Object
      classtype_imp   = gc_klart_023          " Class Type
      read_valuations = 'X'              " Read Assigned Values
*     keydate         = SY-DATUM         " Key date
*     language        = SY-LANGU         " Language Key
*     objectkey_imp_long =
    TABLES
      alloclist       = lt_alloclist     " Class BAPI: Assignment List
      return          = lt_bapiret.      " Return Parameters

  IF sy-subrc EQ 0
  AND lt_alloclist IS NOT INITIAL.

    READ TABLE lt_alloclist ASSIGNING FIELD-SYMBOL(<fs_alloclist>) INDEX 1.
    lv_classnum = <fs_alloclist>-classnum.



**********************************************************************
* Obtener Características de Material

    PERFORM f_get_charact_objects
              TABLES ET_CHARACT
               USING i_matnr i_charg lv_object lc_table lv_classnum gc_klart_023.

  ENDIF.

ENDFUNCTION.

 

 

Con todo esto código se obtiene lo siguiente:

 

Parámetros entrada:

Resultado:

contenido tabla ET_CHARACT:

 

 

Solución 2:

Esta parte la realicé a pedido de mi líder, mejor dicho, no la implementé. La idea era unificar el proceso de obtención de características y no se debía tocar. Sin embargo, en el proceso de análisis de cómo obtener las características de un(os) material(es), llegué a la siguiente FM:
CUSL_BATCHES_HAS_VALUES

Descripción: NOTRANSL: Selektionskriterien für Chargenfindung
Tradución: Criterios de selección para la determinación de lotes

 

Los parámetros de entrada de esta FM estándar, para mi ejemplo, son:

 

Parámetros entrada:

Resultado:

contenido tabla CLASSIFICATION:

 

 

Conclusión

Como se puede apreciar, por ambos caminos se obtienen las características del material. Mas, con la solución 2 se logra obtener la información de manera rápida, estándar y con menos líneas de código.

 

 

 

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.