|
#1
|
|||
|
|||
¿Compruebas que el primer SELECT devuelva datos antes de ejecutar el FOR ALL ENTRIES? En caso de no hacerlo, si no hay datos el programa baja TODA LA TABLA, ignorando totalmente el WHERE... a partir de ahí, todo se va al carajo.
La elección entre JOIN, FOR ALL ENTRIES y subqueries (LOOP-SELECT) debe hacerse con cuidado, y teniendo en cuenta muchos factores, como el tamaño de las tablas, los índices utilizables, la velocidad y la carga del servidor de datos... En tu caso yo haría una tercera prueba: INNER JOIN + FOR ALL ENTRIES.
__________________
"Porque algunos sabemos que somos parte del problema"
|
#2
|
|||
|
|||
Hola MarianitoSAPO...
LIFNR si es llave en las tres tablas... y a menos que tengan activos índices diferentes, si puedes usar ese campo como llave y hasta me atrevería a decirte que sería mucho mas rápido un INNER JOIN. Por otro lado, es REGLA INVIOLABLE asegurarse SIEMPRE antes de hacer un FOR ALL ENTRIES que la tabla usada para ello no venga VACÍA!!! Y por último, el código está muy mal hecho!!! No hay ninguna necesidad de usar esos LOOPS anidados!!! No necesitas usar ese AUX2 para hacerle ese LOOP a AUX3 ya que el LIFNR es el mismo en todas desde AUX1. por lo tanto podrías dejarlo así: LOOP AUX1. LOOP AUX2 WHERE LIFNR = AUX1-LIFNR ENDLOOP. LOOP AUX3 WHERE LIFNR = AUX1-LIFNR ENDLOOP. ENDLOOP. Además, podrías hacerle un SORT a todas tus tablas por el campo LIFNR antes de hacer los LOOP's e ir borrando los registros ya leídos para ir reduciendo el tamaño de las tablas internas: SORT: AUX1, AUX2, AUX3 by LIFNR. LOOP a AUX1. LOOP a AUX2 WHERE LIFNR = AUX1-LIFNR. <Realiza operaciones> DELETE AUX2. ENDLOOP. LOOP a AUX3 WHERE LIFNR = AUX1-LIFNR <Realiza operaciones> DELETE AUX3. ENDLOOP. ENDLOOP. Y si aún quieres mas velocidad, entónces mete tus tablas y tus work areas en FIELD-SYMBOLS y has los LOOPS con ellos: FIELD-SYMBOLS: <AUX1> like aux1, <W_AUX1> like line of aux1, <AUX2> like aux2, <W_AUX2> like line of aux2, <AUX3> like aux3, <W_AUX3> like line of aux3. ASSIGN: aux1 TO <AUX1>, aux2 TO <AUX2>, aux3 TO <AUX3>. LOOP AT <AUX1> ASSIGNING <W_AUX1>. LOOP AT <AUX2> ASSIGNING <W_AUX2>. <Realiza operaciones> DELETE <AUX2>. ENDLOOP. LOOP AT <AUX3> ASSIGNING <W_AUX3>. <Realiza operaciones> DELETE <AUX3>. ENDLOOP. ENDLOOP. Saludos!!! |
Herramientas | Buscar en Tema |
Desplegado | |
|
|