Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
mabace
Explorer
0 Kudos
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 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.