#1
|
|||
|
|||
Alternativa para select dentro de loop
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 |
#2
|
|||
|
|||
For All Entries
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! |
#3
|
|||
|
|||
Gracias!
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 *-> 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. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|