Alternativa para select dentro de loop

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Vanaleon
    Junior Member
    • jul
    • 6

    #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
  • JOrozco
    Junior Member
    • nov
    • 10

    #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!

    Comentario

    • Vanaleon
      Junior Member
      • jul
      • 6

      #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.

      Comentario

      Trabajando...