Foro de programación ABAP
SAP / ABAP => Programación ABAP => Mensaje iniciado por: CALVINAHOBBES en 22 de Octubre de 2007, 09:51:34 pm
-
DE ANTEMANO GRACIAS LAURA POR TU INDICACIÓN DE " ' "
QUIERO RELACIONAR VARIAS TABLAS, INTENTO UTILIZAR SELECT INNER JOIN PERO LOS MANUALES QUE TENGO NO SON MUY CLAROS Y GENERO MUCHOS ERRORES DE SINTAXIS, SI ALGUNO ME PUEDE AYUDAR CON EJEMPLOS ESTARIA MUY BIEN. ???
-
Hola, aquí te dejo un INNER JOIN sencillo de cabecera y posición con las tablas LIKP y LIPS.
SELECT lips~vtweg lips~prodh lips~lfimg lips~brgew lips~ntgew
lips~volum likp~vkorg likp~vkbur likp~bzirk likp~vstel
likp~vbeln likp~lfart likp~kunnr likp~kunag likp~ernam
likp~inco1 likp~sdabw likp~erdat likp~lfdat likp~wadat_ist
likp~podat lips~posnr lips~matnr lips~vrkme lips~gewei
lips~voleh lips~handle lips~meins
INTO (lips-vtweg , lips-prodh , lips-lfimg , lips-brgew , lips-ntgew ,
lips-volum , likp-vkorg , likp-vkbur , likp-bzirk , likp-vstel ,
likp-vbeln , likp-lfart , likp-kunnr , likp-kunag , likp-ernam ,
likp-inco1 , likp-sdabw , likp-erdat , likp-lfdat ,
likp-wadat_ist , likp-podat , lips-posnr , lips-matnr ,
lips-vrkme , lips-gewei , lips-voleh , lips-handle , lips-meins)
FROM likp INNER JOIN lips ON likp~vbeln = lips~vbeln
WHERE likp~vkorg IN p_vkorg AND
likp~vkbur IN p_vkbur AND
likp~bzirk IN p_bzirk AND
likp~vstel IN p_vstel AND
likp~vbeln IN p_vbeln AND
likp~lfart IN p_lfart AND
likp~kunnr IN p_kunnr AND
likp~kunag IN p_kunag AND
lips~matnr IN p_matnr AND
likp~erdat IN p_erdat AND
likp~lfdat IN p_lfdat AND
likp~wadat_ist IN p_wadat AND
likp~podat IN p_podat.
MOVE lips-vtweg TO itab-vtweg.
MOVE lips-prodh(2) TO itab-prodh1.
MOVE lips-prodh(5) TO itab-prodh2.
MOVE lips-prodh(7) TO itab-prodh3.
MOVE lips-prodh TO itab-prodh.
MOVE lips-brgew TO itab-brgew.
MOVE lips-ntgew TO itab-ntgew.
MOVE lips-volum TO itab-volum.
MOVE likp-vkorg TO itab-vkorg.
MOVE likp-vkbur TO itab-vkbur.
MOVE likp-bzirk TO itab-bzirk.
MOVE likp-vstel TO itab-vstel.
MOVE likp-vbeln TO itab-vbeln.
MOVE likp-lfart TO itab-lfart.
MOVE likp-kunnr TO itab-kunnr.
MOVE likp-kunag TO itab-kunag.
MOVE likp-ernam TO itab-ernam.
MOVE likp-inco1 TO itab-inco1.
MOVE likp-sdabw TO itab-sdabw.
MOVE likp-erdat TO itab-erdat.
MOVE likp-lfdat TO itab-lfdat.
MOVE likp-wadat_ist TO itab-wadat_ist.
MOVE likp-podat TO itab-podat.
MOVE lips-posnr TO itab-posnr.
MOVE lips-matnr TO itab-matnr.
MOVE lips-vrkme TO itab-vrkme.
MOVE lips-voleh TO itab-voleh.
MOVE lips-gewei TO itab-gewei.
MOVE lips-handle TO itab-handle.
MOVE lips-meins TO itab-meins.
-
Nuria Tu ejemplo me ha servido aunque a la hora de colocar un count mi código genera problemas.
Esto es lo que debo hacer:
Se dispone de las siguientes tablas:
ZMEMPLEADO: DNI, Nombre
ZMTRABAJO: Empleado, id_Proyecto
ZMPROYECTO: Id_proyecto, Nombre_proy, Horas
Un empleado puede estar una o más asignaciones a proyectos y un proyecto puede tener una o más asignaciones a empleados.
Se debe hacer un listado del DNI y nombre de cada empleado, junto con el número de proyectos que tiene asignado, siempre y cuando estos proyectos superen las 20horas.
Lo que hago es lo siguiente:
genero las tablas, las claves foraneas , introduzco datos etc.
codigo:
REPORT zempleado.
TABLES: zempleado,
ztrabajo,
zproyecto.
DATA: BEGIN OF zint OCCURS 0,
nombre LIKE zempleado-nombre,
dni_empleado LIKE ztrabajo-dni_empleado,
id_proyecto LIKE ztrabajo-id_proyecto,
horas LIKE zproyecto,
END OF zint.
DATA: count TYPE i.
SELECT zempleado~nombre
ztrabajo~dni_empleado
***** COUNT(ZTRABAJO-ID_PROYECTO) SURGE ERRORES *****
INTO CORRESPONDING FIELDS OF TABLE zint
FROM ztrabajo INNER JOIN zempleado
ON ztrabajo~dni_empleado = zempleado~dni_empleado
INNER JOIN zproyecto
ON ztrabajo~id_proyecto = zproyecto~id_proyecto
WHERE zproyecto~horas > 20.
PERFORM write.
FORM write.
LOOP AT zint.
WRITE: /3 zint-nombre, 12 zint-dni_empleado.
ENDLOOP.
ENDFORM.
*************************************************
ESTE CODIGO ME LISTA LOS DNI Y NOMBRES DE EMPLEADOS CON PROYECTOS > 20 HORAS, SIN AGRUPARLOS.
PERO CUANDO INTENTO COLOCAR EL COUNT O UN GROUP BY EL CODIGO GENERA ERROR.
AYUDADME :(
-
BUENO LO HE RESUELTO PERO SIN PODR UTILIZAR TABLAS INTERNAS Y ESO ES LO QUE ME MOLESTA.
SOLUCION:
REPORT ZMENDRUZCO.
TABLES: ZTRABAJO,
ZEMPLEADO,
ZPROYECTO.
DATA: COUNT TYPE I.
DATA: DNI LIKE ZTRABAJO-DNI_EMPLEADO,
NAME LIKE ZEMPLEADO-NOMBRE,
ID LIKE ZTRABAJO-ID_PROYECTO.
SELECT
ZTRABAJO~DNI_EMPLEADO
ZEMPLEADO~NOMBRE
COUNT(*)
INTO (DNI, NAME, COUNT)
FROM ZTRABAJO
JOIN ZPROYECTO ON ZTRABAJO~ID_PROYECTO = ZPROYECTO~ID_PROYECTO
JOIN ZEMPLEADO ON ZTRABAJO~DNI_EMPLEADO = ZEMPLEADO~DNI_EMPLEADO
WHERE
ZPROYECTO~HORAS > 20
GROUP BY ZTRABAJO~DNI_EMPLEADO ZEMPLEADO~NOMBRE.
WRITE: / DNI, NAME, COUNT.
ENDSELECT.