A menudo, durante la codificación ABAP, surge una tarea típica: inicializar otros campos mediante los valores de algunos campos de la tabla interna (seleccione de la tabla de la base de datos, llamando a FM, subrutinas). Y el código en este caso es muy simple en términos del algoritmo, pero es bastante. Siempre quise reducir el tiempo dedicado a tales operaciones de rutina. E incluso escribió un método basado en la creación dinámica de programas para
seleccionar valores de referencia por sus claves de las tablas de la base de datos .
En los comentarios apuntados a
"
ilegibilidad del código " es su micro-lenguaje que necesita aprender.
"
llamadas dinámicas ":
las llamadas dinámicas no son bienvenidas, incluso cuando en este caso el registro de uso no encuentra un lugar para usar las tablas / campos correspondientes.
Como alternativa, todavía estaba proponiendo una opción con generación automática de código, pero solo ahora llevé esto a una
herramienta terminada . A quién le importa, por favor, debajo del gato.
La idea es simple: hay un conjunto de parámetros mediante los cuales se genera un código ABAP de acuerdo con una plantilla dada.
Tomemos un ejemplo simple: en la tabla interna, coloque el nombre del campo por el valor del campo . Hablando en el lenguaje técnico del desarrollador:
en la tabla interna, por el valor del campo BUKRS, coloque el valor del campo BUTXT de acuerdo con la tabla de base de datos T001 .
Declaración simple en una sola oración. Pero para darse cuenta de esto, debe hacer LOOP en la tabla interna y SELECT SINGLE en un bucle (que es rápido, pero desde el punto de vista de la velocidad, no es muy bienvenido, especialmente si hay muchas filas en la tabla interna), o seleccionar valores únicos de BUKRS, una consulta a la tabla de base de datos T001, y luego colocamos los valores correspondientes del campo BUTXT a través de READ TABLE. En este caso, el código será más óptimo, pero su escritura no es tan rápida, porque este código ya es mucho. Además, no tiene nada de complicado: un trabajo de "mono" casi simple para escribir.
Y aquí un generador automático viene al rescate, porque dicho código tiene una forma repetitiva, lo que significa que su escritura puede automatizarse.
Especifique los siguientes parámetros:
Tabla DB:
T001campos de comunicación:
BUKRScampos inicializados:
BUTXTy obtén el siguiente código generado*-- T001 FORM values_from_tab_T001 USING "-- () uv_in_BUKRS TYPE any "-- uv_out_BUTXT TYPE any CHANGING "-- ct_table TYPE ANY TABLE . "-- ? CHECK NOT ( ct_table[] IS INITIAL ). "-- TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "-- LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "-- SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "-- SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "-- SORT lt_item BY BUKRS. "-- LOOP AT ct_table ASSIGNING <ls_table>. "-- ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "-- ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "-- READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM.
Ahora es suficiente llamar a la subrutina generada en su programa
PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE.
Ver el código en el sitio web del
generador ABAPLos nombres de los campos en la tabla interna y la tabla interna en sí se pasan como parámetros a la subrutina. Después de la llamada, el campo BUTXT tendrá el valor deseado.
Los nombres de los campos en la tabla interna se hacen en forma de parámetros para que se pueda llamar a la misma subrutina para diferentes campos. Es decir Si tiene dos campos BE en la tabla interna (por ejemplo, BUKRS1 y BUKRS2), solo necesita generar una subrutina y llamarla dos veces
PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE.
En este caso, aparece "no optimismo", ya que habrá dos SELECT de la tabla de base de datos T001, aunque en el caso ideal, puede hacer todo a través de uno. Pero este es el costo de la automatización. Es poco probable que esto disminuya significativamente la ejecución del programa, pero si es necesario, siempre puede "terminar" el subprograma para sus necesidades privadas.
Puede inicializar varios campos a la vez y, en condiciones, especificar constantes (por ejemplo, sy-langu, que a menudo se usa al elegir textos). En el ejemplo estándar, los
nombres del UE se seleccionan de acuerdo con la tabla T006A.
Al generar el código, también se crea un enlace mediante el cual el ejemplo creado se puede abrir en el navegador.
Actualmente hay varias plantillas en el generador:
- Defina la estructura [+ tipo de tabla] : defina la estructura + tipo de tabla + tabla de este tipo + espacio de trabajo de tabla + símbolo de campo de la tabla. Esto no siempre es necesario, pero es más fácil eliminar el generado que escribirlo manualmente
- Eliminar registros duplicados de la tabla interna por campos es un generador muy simple y, en general, dicho código puede escribirse manualmente, pero si hay muchos campos, en mi opinión, es mejor usar esta plantilla
- Seleccione valores de referencia de la tabla de la base de datos : la plantilla descrita anteriormente
- Seleccionar valores de referencia : la plantilla le permite establecer valores de campo mediante una llamada a FM, subprogramas. En este caso, las llamadas se almacenan en caché.
- Seleccione valores de referencia del dominio : esta plantilla no tiene parámetros y se agregó para poder copiar este código en su programa
Creo que una descripción detallada del funcionamiento de cada plantilla no tiene sentido, ya que es más fácil ver el resultado de su trabajo en el
sitio . Cada plantilla tiene valores predeterminados para sus parámetros y si usted es un desarrollador de abap, comprenderá rápidamente el código.