PDA

Ver la Versión Completa : left partout


juanki
22/11/10, 08:57:29
Buenas, soy nuevo en ABAP y mi pregunta es la siguiente:
Quiero sacar información de las tablas EBAN, EBKN, EKPO Y EKBE. La idea es sacar todas las solicitudes de pedido en un rango de dos fechas (que meta el usuario). A partir de ahí quiero saber la imputación, si tienen pedido o no (saldría los datos de la ekpo en blanco) y todos los registros del historial de pedido. Intento hacer un inner join entre EBAN y EBKN y luego dos left partout contra la ekpo y la ekbe pero el sistema no me deja. En cualquier caso he hecho las dos primeras uniones con las tablas EBAN, EBKN y EKPO y lo he metido en una tabla interna. ¿Cuál sería la mejor manera de unir esta tabla interna contra la EKBE para otener una tabla con todos los registros que necesito?, ¿Por qué no deja hacer más de un left outer join?.

agv1976
22/11/10, 13:54:05
No entiendo muy bien tu pregunta, yo haria un inner-join entre la ekpo-ekko, con esa tabla interna procesaria mis datos, cargaria las otras tablas internas de las que quiero obtener informacion, por ej.

Inner-Join ekpo-ekko, cargo en mi tabla interna it_tabla,

Cargos tablas internas, imputaciones, datos del pedido, las que sean

Loop at it_tabla.

Dentro de este loop, hago read table a las otras tablas internas,

Cargo esta informacion en la principal, it_princ,

Endloop.

No se si me explique bien, si tienes dudsa me dices

juanki
23/11/10, 14:53:16
Gracias agv1976.
Ya he creado las dos tablas internas, una con datos de EBAN, EBKN y EKPO y ok, la segunda con datos de historial de pedido EKBE y ok. La idea es hacer un partout entre las dos tablas internas (que no se puede hacer) y para ello intento hacer lo que me comentabas ayer pero evidentemente algo no hago bien. Ahí va el código:
SORT ITAB_EBAN BY EBELN EBELP.
SORT ITAB_EKBE BY EBELN EBELP.

LOOP AT ITAB_EBAN.
MOVE ITAB_EBAN-EBELN TO ZEBELN.
MOVE ITAB_EBAN-EBELP TO ZEBELP.

IF SY-SUBRC = 0.

LOOP AT ITAB_EKBE where EBELN = ZEBELN AND
EBELP = ZEBELP.
MOVE-CORRESPONDING: ITAB_EBAN TO ITAB_TOTAL,
ITAB_EKBE TO ITAB_TOTAL.
APPEND ITAB_TOTAL.

ENDLOOP.
ELSE.
MOVE-CORRESPONDING: ITAB_EBAN TO ITAB_TOTAL.
APPEND ITAB_TOTAL.
ENDIF.

ENDLOOP.
Nunca se mete por el segundo loop. Entiendo que algo estoy haciendo mal. Necesito ayuda urgente por favor.
Gracias

jtristan
24/11/10, 05:42:01
Si ya tienes la tabla interna, y sólo te queda unirla con la de histórico, podrías hacer un for all entries in.

Si nunca está entrando en el segundo loop, es que la tabla ITAB_EBAN no tiene el pedido y la posición. Podrías debuggear y comprobar los valores de esta tabla. En cualquier caso, no haría un sy-subrc, comprobaría directamente que los dos campos tengan valores
if ZEBELN is not initial and ZEBELP is not initial.

Ya nos contarás.
Un saludo.

agv1976
24/11/10, 08:57:03
No puedes poner un loop y dentro un IF, haz como te dije inner-join ekko-ekpo, cargas las otras tablas, pero solo utiliza un loop, el for all entries como te comenta el compañero es muy util, si no sabes utilizarlo me dices

jtristan
24/11/10, 10:10:23
Hola agv1976,

no entiendo el porqué no puede poner un loop dentro de un if. El código de ejemplo lo veo válido, lo único sería saber qué es lo que tiene la tabla del primer loop para que nunca entre en la condición del if.

Un saludo.

agv1976
26/11/10, 08:40:26
Hombre como poner se puede poner, como un select endselect, pero no lo veo muy operativo eso, ese codigo es un poco ilegible, yo en cinco años que llevo en sap nunca utilice eso y me fue bien, si bien esta, pero la forma que le dije de hacerlo es mucho mejor, pero ya te digo cada maestrillo tiene su librillo

jtristan
26/11/10, 11:54:09
agv1976, ok, te había entendido que igual había algún problema de sintaxis que lo impidiese hacer.
Si, está claro que es mejor traer los datos ya procesados a nivel de b.d. que tener que tratarlos en el código, siempre que se pueda.

Un saludo.