ABAP de manera Más eficiente para seleccionar un conjunto de datos condicionada a cada uno de los otros a partir de varias tablas

Tengo una tabla interna como:

TYPES: BEGIN OF gty_min_jobs,
            orgeh TYPE zgerpt_rnk_min-orgeh1,
            mnsty TYPE zgerpt_rnk_min-mnsty,
            mshort TYPE zgerpt_rnk_min-mshort,

            position TYPE hrp1001-sobid,
            job TYPE hrp1001-sobid,

            job_grade TYPE hrp9003-jobgr,
            scheme TYPE hrp9003-pg,
    END OF gty_min_jobs.

DATA: gt_min_jobs TYPE TABLE OF gty_min_jobs,
      gwa_min_jobs TYPE gty_min_jobs.

Necesito para rellenar esta tabla de 3 diferentes tablas de base de datos: zgerpt_rnk_min, hrp1001 y hrp9003.

Necesito:

SELECT orgeh msty mshort FROM zgerpt_rnk_min INTO gt_table1.

SELECT position FROM hrp1001 INTO gt_table2 
  FOR ALL ENTRIES IN gt_table1 
    WHERE objid = gt_table1-orgeh AND
               otype = 'O' AND
               sclas = 'S' AND
               begda LE p_keydt AND
               endda GE p_keydt AND
               plvar ='01' AND
               istat = '1' AND
       objid IN (pnpobjid).

SELECT job FROM hrp1001 INTO gt_table3 
  FOR ALL ENTRIES IN gt_table2 
    WHERE objid = gt_table2-position AND
             otype = 'S' AND
             sclas = 'C' AND
             begda LE p_keydt AND
             endda GE p_keydt.

SELECT job_grade scheme FROM hrp9003 INTO gt_table4 
  FOR ALL ENTRIES IN gt_table3
     WHERE objid =  gt_table3-job AND
        begda LE p_keydt AND
        endda GE p_keydt.

La combinación de mis datos en mi tabla interna utilizando varios bucles. ¿Cuál es la forma más eficiente de hacer esto? Es posible seleccionar todos los datos necesarios de una sola vez utilizando una combinación interna? Si es así ¿cómo puedo incorporar todos los DONDE las condiciones? Agradezco cualquier punteros!

  • Puede crear una vista de base de datos que contiene las tres tablas y su uso para la selección? Usted podría probar esto mediante SE16(n)…

1 Kommentar

  1. 4

    Lo que la forma más eficiente de hacer algo, no siempre es del todo evidente. Transacción SAT (o SE30 en los sistemas más antiguos) es una herramienta invaluable. Aquí usted puede probar el tiempo de ejecución de sus programas, para ver que las declaraciones son más eficientes, y también para ver donde los cuellos de botella en su programa. El también tiene un par de muy buenos consejos y trucos sobre el rendimiento:

    ABAP de manera Más eficiente para seleccionar un conjunto de datos condicionada a cada uno de los otros a partir de varias tablas

    Otra transacción que usted podría utilizar para medir su desempeño es ST05.

    La creación de una vista puede ser su mejor apuesta como VWEGERT sugerido. Manejo el hecho de que usted está seleccionando a partir de la misma tabla (HRP1001) dos veces probablemente sería más fácil en una vista.

    Para el motivo de la discusión, vamos a tratar de combinar sus instrucciones select en una sola seleccione:

    Los primeros 2 seleccione afirmaciones se combinan de la siguiente manera:

    SELECT t1~orgeh t1~msty t1~mshort t2~position
      INTO gt_my_combined_table
      FROM zgerpt_rnk_min as t1
      JOIN hrp1001 as t2
      ON   t1~orgeh = t2~objid
      WHERE t2~otype = 'O' AND
            t2~sclas = 'S' AND
            t2~begda LE p_keydt AND
            t2~endda GE p_keydt AND
            t2~plvar ='01' AND
            t2~istat = '1' AND
            t2~objid IN (pnpobjid).
    

    Agregando ahora en su 3º y 4º selecciona:

    SELECT t1~orgeh t1~msty t1~mshort t2~position t3~job t4~job_grade t4~scheme
      INTO gt_my_combined_table
      FROM zgerpt_rnk_min as t1
      JOIN hrp1001 as t2
      ON   t1~orgeh = t2~objid
      JOIN hrp1001 as t3
      ON   t2~position = t3~objid
      JOIN hrp9003
      ON   t3~job = t4~objid
      WHERE t2~otype = 'O' AND
            t2~sclas = 'S' AND
            t2~begda LE p_keydt AND
            t2~endda GE p_keydt AND
            t2~plvar ='01' AND
            t2~istat = '1' AND
            t2~objid IN (pnpobjid) AND
            t3~otype = 'S' AND
            t3~sclas = 'C' AND
            t3~begda LE p_keydt AND
            t3~endda GE p_keydt AND
            t4~begda LE p_keydt AND
            t4~endda GE p_keydt.
    

    Mi problema con este grotesco instrucción select sería que la base de datos en realidad podría confundirse en el que la clave o el índice a utilizar, lo que resulta en un recorrido secuencial que sería muy ineficiente. Yo también soy un poco incómodos en unirse en la misma tabla dos veces (aunque el compilador parece ser feliz con ella).

    • Gracias esti – he decidido mantenerlo simple de haber leído y tratado de la une, pero muy útil la info.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...