Technical Articles
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 – Tipo de línea
ZTT_MATNR_CHARACTERISTICS – Inicialización y acceso
—
ZTT_MATNR_CHARACTERISTICS – Clave primaria
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 lotesLos 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.