MarianitoSAPO
14/12/10, 10:53:39
Tengo 3 tablas:
LFA1:
- lifnr (Clave)
- land1
- ...
LFB1:
- lifnr (Clave)
- bukrs (Clave)
- pernr
- ...
LFBK:
- lifnr (Clave)
- banks (Clave)
- bankl (Clave)
- bankn (Clave)
- bkont
- ...
lo que necesito es un
INNER JOIN entre LFA1 y LFB1 en lifnr
y ésta un LEFT OUTER JOIN con la LFBK en lifnr
Mi primera solución fue:
select lifnr land1 ....
from LFA1 as a INNER JOIN LFB1 as b on ....
OUTER JOIN ....
pero me dijeron que era ineficiente, que usara FOR ALL ENTRIES
entonces implementé lo siguiente:
SELECT lifnr land1 name1 name2 ktokk kunnr loevm
sperr stcd1 stcd2 vbund stceg profs
FROM lfa1
INTO TABLE i_aux1.
SELECT lifnr bukrs loevm sperr
FROM lfb1
INTO TABLE i_aux2
FOR ALL ENTRIES IN i_aux1
WHERE lifnr = i_aux1-lifnr.
SELECT lifnr banks bankl bankn bvtyp bkont
FROM lfbk
INTO TABLE i_aux3
FOR ALL ENTRIES IN i_aux2
WHERE lifnr = i_aux2-lifnr.
" EXTREMADAMENTE INEFECIENTE
LOOP AT i_aux1 INTO r_aux1.
r_maestros-lifnr = r_aux1-lifnr.
r_maestros-land1 = r_aux1-land1.
r_maestros-name1 = r_aux1-name1.
r_maestros-name2 = r_aux1-name2.
r_maestros-ktokk = r_aux1-ktokk.
r_maestros-kunnr = r_aux1-kunnr.
r_maestros-loevm = r_aux1-loevm.
r_maestros-sperr = r_aux1-sperr.
r_maestros-stcd1 = r_aux1-stcd1.
r_maestros-stcd2 = r_aux1-stcd2.
r_maestros-vbund = r_aux1-vbund.
r_maestros-stceg = r_aux1-stceg.
r_maestros-profs = r_aux1-profs.
"Usamos un loop ya que no accedemos mediante clave
LOOP AT i_aux2 INTO r_aux2 WHERE lifnr = r_aux1-lifnr.
r_maestros-bukrs = r_aux2-bukrs.
r_maestros-so_loevm = r_aux2-so_loevm.
r_maestros-so_sperr = r_aux2-so_sperr.
"Condicion LEFT OUTER JOIN
LOOP AT i_aux3 INTO r_aux3 WHERE lifnr = r_aux2-lifnr.
r_maestros-banks = r_aux3-banks.
r_maestros-bankl = r_aux3-bankl.
r_maestros-bankn = r_aux3-bankn.
r_maestros-bvtyp = r_aux3-bvtyp.
r_maestros-bkont = r_aux3-bkont.
" VER si este append no deberia ir tambien fuera de este loop
" en el caso de que no se ingrese a este LOOP
APPEND r_maestros TO i_maestros.
ENDLOOP.
ENDLOOP.
ENDLOOP.
El gran problema es que el campo lifnr
NO es clave de la tabla LFB1 por lo tanto debo
anidar un loop, y además para la condición
LEFT OUTER JOIN debo anidar otro loop
ya que lifnr tampoco es clave de LFBK.
Como imaginarán, esto tarda un poco mas que una
eternidad.
Existe una solución mas eficiente???, cuando usamos
FOR ALL ENTRIES y los campos que accedemos
no son claves (No podemos usar READ TABLE) y
por lo tanto debemos anidar loops.
Además de la ineficiencia, con la condición
LEFT OUTER JOIN se me plantéo que el APPEND
del loop mas interno debería hacer dentro
del loop si consiguió algún registro,
SINO fuera (con las campos NULL) si no consiguio
ningún registro.
Estaría bien, eso?
Saludos,
Gracias
LFA1:
- lifnr (Clave)
- land1
- ...
LFB1:
- lifnr (Clave)
- bukrs (Clave)
- pernr
- ...
LFBK:
- lifnr (Clave)
- banks (Clave)
- bankl (Clave)
- bankn (Clave)
- bkont
- ...
lo que necesito es un
INNER JOIN entre LFA1 y LFB1 en lifnr
y ésta un LEFT OUTER JOIN con la LFBK en lifnr
Mi primera solución fue:
select lifnr land1 ....
from LFA1 as a INNER JOIN LFB1 as b on ....
OUTER JOIN ....
pero me dijeron que era ineficiente, que usara FOR ALL ENTRIES
entonces implementé lo siguiente:
SELECT lifnr land1 name1 name2 ktokk kunnr loevm
sperr stcd1 stcd2 vbund stceg profs
FROM lfa1
INTO TABLE i_aux1.
SELECT lifnr bukrs loevm sperr
FROM lfb1
INTO TABLE i_aux2
FOR ALL ENTRIES IN i_aux1
WHERE lifnr = i_aux1-lifnr.
SELECT lifnr banks bankl bankn bvtyp bkont
FROM lfbk
INTO TABLE i_aux3
FOR ALL ENTRIES IN i_aux2
WHERE lifnr = i_aux2-lifnr.
" EXTREMADAMENTE INEFECIENTE
LOOP AT i_aux1 INTO r_aux1.
r_maestros-lifnr = r_aux1-lifnr.
r_maestros-land1 = r_aux1-land1.
r_maestros-name1 = r_aux1-name1.
r_maestros-name2 = r_aux1-name2.
r_maestros-ktokk = r_aux1-ktokk.
r_maestros-kunnr = r_aux1-kunnr.
r_maestros-loevm = r_aux1-loevm.
r_maestros-sperr = r_aux1-sperr.
r_maestros-stcd1 = r_aux1-stcd1.
r_maestros-stcd2 = r_aux1-stcd2.
r_maestros-vbund = r_aux1-vbund.
r_maestros-stceg = r_aux1-stceg.
r_maestros-profs = r_aux1-profs.
"Usamos un loop ya que no accedemos mediante clave
LOOP AT i_aux2 INTO r_aux2 WHERE lifnr = r_aux1-lifnr.
r_maestros-bukrs = r_aux2-bukrs.
r_maestros-so_loevm = r_aux2-so_loevm.
r_maestros-so_sperr = r_aux2-so_sperr.
"Condicion LEFT OUTER JOIN
LOOP AT i_aux3 INTO r_aux3 WHERE lifnr = r_aux2-lifnr.
r_maestros-banks = r_aux3-banks.
r_maestros-bankl = r_aux3-bankl.
r_maestros-bankn = r_aux3-bankn.
r_maestros-bvtyp = r_aux3-bvtyp.
r_maestros-bkont = r_aux3-bkont.
" VER si este append no deberia ir tambien fuera de este loop
" en el caso de que no se ingrese a este LOOP
APPEND r_maestros TO i_maestros.
ENDLOOP.
ENDLOOP.
ENDLOOP.
El gran problema es que el campo lifnr
NO es clave de la tabla LFB1 por lo tanto debo
anidar un loop, y además para la condición
LEFT OUTER JOIN debo anidar otro loop
ya que lifnr tampoco es clave de LFBK.
Como imaginarán, esto tarda un poco mas que una
eternidad.
Existe una solución mas eficiente???, cuando usamos
FOR ALL ENTRIES y los campos que accedemos
no son claves (No podemos usar READ TABLE) y
por lo tanto debemos anidar loops.
Además de la ineficiencia, con la condición
LEFT OUTER JOIN se me plantéo que el APPEND
del loop mas interno debería hacer dentro
del loop si consiguió algún registro,
SINO fuera (con las campos NULL) si no consiguio
ningún registro.
Estaría bien, eso?
Saludos,
Gracias