Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   DB2 (https://www.clubdelphi.com/foros/forumdisplay.php?f=33)
-   -   LEFT OUTER JOIN 1 tabla contra 6 mas (https://www.clubdelphi.com/foros/showthread.php?t=37980)

jjorell 28-11-2006 18:39:38

LEFT OUTER JOIN 1 tabla contra 6 mas
 
Hola! Espero alguien me puede ayudar a solucionar este problema.

Estoy haciendo un sistema en deplhi contra SQLServer 2005, pero los datos de origen los tomo del DB2. El sistema consiste en calcular la necesidad de Hilo a partir de la cantidad de tela acabada, pero para esto tengo que tener la relacion entre la tela acabada y la tela cruda, luego la tela acabada con el hilo, el problema esque la tela acabada puede relacionarse con varios crudo, es por esto que debo de hacer la siguiente query (la del problema).

Código SQL [-]
SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,
ROUND(SUM(COALESCE(E.DTNTKG,0)),2) CanDisponible,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,0 IdClientes,'Cliente',2006 Ano,2 IdPlanificacion 
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,TELACRUDA.MSTROLCR E ,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND A.CODMEZ * = E.DTCMEZ AND A.CODCRU * = E.DTCODI AND C.PGMESH=F.CMEZCL AND ((E.DTSTAT='') OR (E.DTSTAT='P'))
GROUP BY A.CODACA,B.TANOMT,A.CODMEZ,A.CODCRU,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )),
C.TCIDES, C.PGCODH,C.TCTITU,C.PGMESH,ROUND(C.PGPORC,2),C.TCORIG,C.TCDESC,C.TCIDCO,F.NMEZCL

Pero resulta que cuando aun no ha ingresado tela cruda en bodega (tabla TELACRUDA.MSTROLCR E) no esta registrada asi que no me realiza el Join, por esta razon he intendado hacerlo de la siguiente manera:

Código SQL [-]
SELECT Rela.IdProductos,Producto,CodMezcla,IdCrudo,Crudo, ROUND(SUM(COALESCE(Inve.DTNTKG,0)),2) CanDisponible,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,ProveedorHilo,Desc_Producto,TipPr  oceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion FROM
(SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,
LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,
C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,
0 IdClientes,'Cliente' Cliente,2006 Ano,2 IdPlanificacion 
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND C.PGMESH=F.CMEZCL
GROUP BY A.CODACA,B.TANOMT,A.CODMEZ,A.CODCRU,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )),
C.TCIDES, C.PGCODH,C.TCTITU,C.PGMESH,ROUND(C.PGPORC,2),C.TCORIG,C.TCDESC,C.TCIDCO,F.NMEZCL) Rela LEFT OUTER JOIN TELACRUDA.MSTROLCR Inve 
ON Rela.CodMezcla = Inve.DTCMEZ AND Rela.IdCrudo = Inve.DTCODI WHERE ((Inve .DTSTAT='') OR (Inve .DTSTAT='P'))

Sin ningun resultado positivo...solo el siguiente error:

la columna IDPRODUCTOS o expresion en la sentencia SELECT es invalida.

En SQL Server esto lo hubiese solucionado con *= y ya :D pero DB2 no lo acepta :(

Espero alguien pueda ayudarme o me de alguna idea sobre el mensaje (ya probe quitando ese campo y el error me persiste siempre en el campo que queda primero en la sentencia).

jjorell 28-11-2006 18:52:23

Faltaba el GROUP BY
 
Hola! ya solucione mi problema... resulta que se me olvido mover el group by afuera de la subconsulta, al final me queda asi :

Código SQL [-]
SELECT IdProductos,Producto,CodMezcla,IdCrudo,Crudo, ROUND(SUM(COALESCE(Inve.DTNTKG,0)),2) CanDisponible,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,ProveedorHilo,Desc_Producto,TipPr  oceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion FROM
(SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,
LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,
C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,
0 IdClientes,'Cliente' Cliente,2006 Ano,2 IdPlanificacion 
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND C.PGMESH=F.CMEZCL) Rela LEFT OUTER JOIN TELACRUDA.MSTROLCR Inve 
ON Rela.CodMezcla = Inve.DTCMEZ AND Rela.IdCrudo = Inve.DTCODI WHERE ((Inve .DTSTAT='') OR (Inve .DTSTAT='P')) 
GROUP BY IdProductos,Producto,CodMezcla,IdCrudo,Crudo,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,Pr  oveedorHilo,Desc_Producto,TipProceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion

Esta si me funciona bien ;)


La franja horaria es GMT +2. Ahora son las 22:19:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi