PDA

Ver la Versión Completa : Alternativa para select dentro de loop


Vanaleon
23/09/15, 22:23:51
Hola gente!

Aun soy muy nuevo en esto de abap y quisiera mejorar el rendimiento de mi programa, el caso es que tengo un select dentro de un loop pero no tengo idea de cual seria una alternativa para realizar lo mismo pero con un mejor performance.

*-> Loop para separar Deducciones por cc-nomina
LOOP AT tl_t596jd INTO sl_t596jd.
LOOP AT tl_rt INTO sl_rt WHERE lgart = sl_t596jd-lgart.
*-> Select para obtener las descripciones de los CC-nomina
SELECT SINGLE lgtxt
INTO sl_deduc-descrip FROM t512t
WHERE sprsl = sy-langu
AND molga = vl_molga
AND lgart = sl_rt-lgart.
*-> Llena la tabla de deducciones
sl_deduc-tipo = sl_t596jd-sumlg(3).
sl_deduc-clave = sl_rt-lgart.
sl_deduc-exento = sl_rt-betrg.
APPEND sl_deduc TO tl_deduc.
ENDLOOP.
ENDLOOP.

Esto es la parte de mi codigo que me gustaria mejorar, espero me puedan apoyar estoy un poco perdido.

Ejemplos con codigo seria lo mejor! :) Saludos

JOrozco
24/09/15, 15:13:54
Hola.

Lo que yo haría sería en los LOOP's, usar field-symbols, para que fuera más rápido cada ciclo, posterior, el SELECT lo haría fuera de los dos LOOP's, esto usando la sentencia FOR ALL ENTRIES.

Me crearía una tabla interna tipo HASHED con las llaves molga y lgart, en tu select veo que molga la usas fija, si siempre es la misma para todos puedes hacerlo sólo por lgart, si no ps si usa ambos campos. Así quedaría el SELECT mas o menos:

"Se eliminan duplicados para optimizar el SELECT con FOR ALL ENTRIES.
DATA: tl_copia LIKE tl_rt.
tl_copia[] = tl_rt[].
DELETE ADJACENT DUPLICATES FROM tl_copia COMPARING lgart.

SELECT molga
lgart
lgtxt
INTO TABLE tl_t512t
FROM t512t
FOR ALL ENTRIES IN tl_copia
WHERE sprsl = sy-langu
AND molga = vl_molga
AND lgart = tl_copia-lgart.

Después ya vendrían tus LOOPS(con field-symbol), y en dónde tienes el
select single ahorita, cambiarías eso por un:

"Añadir la condición del campo MOLGA en caso de ser necesaria.
READ TABLE tl_t512t ASSING <sl_t512t> WITH TABLE KEY lgart = sl_rt-lgart.

Espero con esto darte una idea más o menos clara. Lo hice sobre la marcha así que espero que si me haya dado a entender.

Saludos y suerte!

Vanaleon
24/09/15, 18:26:23
Hola Muchas gracias al final utilice la idea que me diste del read table y sa que el select del loop.

Por si a alguien le sirve anexo el codigo final :D

*-> Select trae toda la tabla con las descripciones de los CC-nomina
SELECT *
FROM t512t
INTO TABLE tl_desc
WHERE sprsl = sy-langu
AND molga = vl_molga.
IF sy-subrc EQ 0.
SORT tl_desc BY lgart ASCENDING. "Ordena la tabla con las descripciones de los CC-nomina
ENDIF.

*-> Loop para separar Deducciones por cc-nomina
LOOP AT tl_t596jd INTO sl_t596jd.
LOOP AT tl_rt INTO sl_rt WHERE lgart = sl_t596jd-lgart.
*-> Read Table para obtener las descripciones de los CC-nomina
READ TABLE tl_desc INTO sl_desc
WITH KEY lgart = sl_rt-lgart BINARY SEARCH.
IF sy-subrc EQ 0.
sl_deduc-descrip = sl_desc-lgtxt.
ENDIF.
*-> Llena la tabla de deducciones
sl_deduc-tipo = sl_t596jd-sumlg(3).
sl_deduc-clave = sl_rt-lgart.
sl_deduc-exento = sl_rt-betrg.
APPEND sl_deduc TO tl_deduc.
ENDLOOP.
ENDLOOP.


Saludos.