The multi-part identifier + SQL 2005 + Delphi 7
07/01/2011
0
Seguinte, estou usando o SQL Server 2005 com o Delphi 7 e executando o seguinte SQL via Delphi com o DBExpress:
SELECT
MC.MAPC_COD,
E.EMP_NOME AS EMPRESA,
MC.COMD_COD,
CD.EMP_COD,
MC.MAPC_DIAS,
MC.MAPC_MESANO,
MC.MAPC_01, MC.MAPC_02, MC.MAPC_03, MC.MAPC_04, MC.MAPC_05, MC.MAPC_06, MC.MAPC_07, MC.MAPC_08, MC.MAPC_09, MC.MAPC_10, MC.MAPC_11, MC.MAPC_12, MC.MAPC_13, MC.MAPC_14, MC.MAPC_15, MC.MAPC_16, MC.MAPC_17, MC.MAPC_18, MC.MAPC_19, MC.MAPC_20, MC.MAPC_21, MC.MAPC_22, MC.MAPC_23, MC.MAPC_24, MC.MAPC_25, MC.MAPC_26, MC.MAPC_27, MC.MAPC_28, MC.MAPC_29, MC.MAPC_30, MC.MAPC_31,
MC.MAPC_STATUS,
CD.COMD_HORA_VENCIMENTO,
(SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC
INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD
LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD
WHERE OC.MAPC_COD = MC.MAPC_COD
AND D.DPO_CAUSA_IMPACTO = 'S'
AND O.OCO_DATA_INICIO = '11/01/2010') AS OCO_01, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/02/2010') AS OCO_02, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/03/2010') AS OCO_03, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/04/2010') AS OCO_04, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/05/2010') AS OCO_05, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/06/2010') AS OCO_06, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/07/2010') AS OCO_07, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/08/2010') AS OCO_08, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/09/2010') AS OCO_09, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/10/2010') AS OCO_10, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/11/2010') AS OCO_11, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/12/2010') AS OCO_12, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/13/2010') AS OCO_13, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/14/2010') AS OCO_14, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/15/2010') AS OCO_15, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/16/2010') AS OCO_16, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/17/2010') AS OCO_17, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/18/2010') AS OCO_18, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/19/2010') AS OCO_19, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/20/2010') AS OCO_20, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/21/2010') AS OCO_21, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/22/2010') AS OCO_22, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/23/2010') AS OCO_23, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/24/2010') AS OCO_24, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/25/2010') AS OCO_25, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/26/2010') AS OCO_26, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/27/2010') AS OCO_27, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/28/2010') AS OCO_28, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/29/2010') AS OCO_29, (SELECT COUNT(OC.OCO_COD) FROM TOCORRENCIA_COMPROMETIMENTO OC INNER JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD LEFT OUTER JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD WHERE OC.MAPC_COD = MC.MAPC_COD AND D.DPO_CAUSA_IMPACTO = 'S' AND O.OCO_DATA_INICIO = '11/30/2010') AS OCO_30 ,C.COM_NOME AS COMPROMETIMENTO
FROM TMAPACOMPROMET MC
LEFT OUTER JOIN TCOMPROMETIMENTO_DET CD ON CD.COMD_COD = MC.COMD_COD
LEFT OUTER JOIN TCOMPROMETIMENTO C ON C.COM_COD = CD.COM_COD
LEFT OUTER JOIN TTIPO_COMPROMETIMENTO TC ON TC.TCO_COD = C.TCO_COD
LEFT OUTER JOIN TAREA A ON A.ARE_COD = C.ARE_COD
LEFT OUTER JOIN TAREA AD ON AD.ARE_COD = CD.ARE_COD_DET
LEFT OUTER JOIN TSUBAREA S ON S.SARE_COD = C.SARE_COD
LEFT OUTER JOIN TSUBAREA SD ON SD.SARE_COD = CD.SARE_COD_DET
LEFT OUTER JOIN TEMPRESAW E ON E.EMP_COD = CD.EMP_COD
LEFT OUTER JOIN TGRUPO_DET_EMPRESAS P ON P.EMP_COD = E.EMP_COD
LEFT OUTER JOIN TGRUPO_EMPRESAS P1 ON P1.GRE_COD = P.GRE_COD
LEFT OUTER JOIN TGRP_ECONOMICO G ON G.GRPE_COD = E.GRPE_COD
LEFT OUTER JOIN TCATEGORIA T ON T.CAT_DESCRICAO = G.CAT_DESCRICAO
WHERE (MC.MAPC_MESANO = :MAPC_MESANO)
AND (G.GRPE_COD = :GRPE_COD)
AND (C.TCO_COD = :TCO_COD)
Ele me retorna a mensagem: SQL Server Error: SQL State: 42000, SQL Error Code: 4104 The multi-part identifier "C.TCO_COD" could not be bound
Se pegar o SQL e jogar no SQL Management Studio e rodar, eu elimino os parâmetros e todo o SQL tranquilo sem erro.
O que pode ser??
Alguem tem idéia??
Abs.
Carlos Souza
Posts
07/01/2011
Emerson Nascimento
SELECT
CD.EMP_COD,
E.EMP_NOME AS EMPRESA,
CD.COMD_HORA_VENCIMENTO,
TAB.*,
C.COM_NOME AS COMPROMETIMENTO
FROM
(SELECT
MC.MAPC_COD,
MC.COMD_COD,
MC.MAPC_DIAS,
MC.MAPC_MESANO,
MC.MAPC_01, MC.MAPC_02, MC.MAPC_03, MC.MAPC_04, MC.MAPC_05, MC.MAPC_06, MC.MAPC_07,
MC.MAPC_08, MC.MAPC_09, MC.MAPC_10, MC.MAPC_11, MC.MAPC_12, MC.MAPC_13, MC.MAPC_14,
MC.MAPC_15, MC.MAPC_16, MC.MAPC_17, MC.MAPC_18, MC.MAPC_19, MC.MAPC_20, MC.MAPC_21,
MC.MAPC_22, MC.MAPC_23, MC.MAPC_24, MC.MAPC_25, MC.MAPC_26, MC.MAPC_27, MC.MAPC_28,
MC.MAPC_29, MC.MAPC_30, MC.MAPC_31,
MC.MAPC_STATUS,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 1 THEN 1 ELSE 0 END) AS OCO_01,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 2 THEN 1 ELSE 0 END) AS OCO_02,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 3 THEN 1 ELSE 0 END) AS OCO_03,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 4 THEN 1 ELSE 0 END) AS OCO_04,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 5 THEN 1 ELSE 0 END) AS OCO_05,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 6 THEN 1 ELSE 0 END) AS OCO_06,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 7 THEN 1 ELSE 0 END) AS OCO_07,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 8 THEN 1 ELSE 0 END) AS OCO_08,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 9 THEN 1 ELSE 0 END) AS OCO_09,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 10 THEN 1 ELSE 0 END) AS OCO_10,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 11 THEN 1 ELSE 0 END) AS OCO_11,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 12 THEN 1 ELSE 0 END) AS OCO_12,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 13 THEN 1 ELSE 0 END) AS OCO_13,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 14 THEN 1 ELSE 0 END) AS OCO_14,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 15 THEN 1 ELSE 0 END) AS OCO_15,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 16 THEN 1 ELSE 0 END) AS OCO_16,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 17 THEN 1 ELSE 0 END) AS OCO_17,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 18 THEN 1 ELSE 0 END) AS OCO_18,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 19 THEN 1 ELSE 0 END) AS OCO_19,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 20 THEN 1 ELSE 0 END) AS OCO_20,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 21 THEN 1 ELSE 0 END) AS OCO_21,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 22 THEN 1 ELSE 0 END) AS OCO_22,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 23 THEN 1 ELSE 0 END) AS OCO_23,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 24 THEN 1 ELSE 0 END) AS OCO_24,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 25 THEN 1 ELSE 0 END) AS OCO_25,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 26 THEN 1 ELSE 0 END) AS OCO_26,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 27 THEN 1 ELSE 0 END) AS OCO_27,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 28 THEN 1 ELSE 0 END) AS OCO_28,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 29 THEN 1 ELSE 0 END) AS OCO_29,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 30 THEN 1 ELSE 0 END) AS OCO_30,
SUM(CASE WHEN COALESCE(DAY(O.OCO_DATA_INICIO),0) = 31 THEN 1 ELSE 0 END) AS OCO_31
FROM TMAPACOMPROMET MC
LEFT JOIN TOCORRENCIA_COMPROMETIMENTO OC ON OC.MAPC_COD = MC.MAPC_COD
LEFT JOIN TOCORRENCIA O ON O.OCO_COD = OC.OCO_COD
AND YEAR(O.OCO_DATA_INICIO) = 2010
AND MONTH(O.OCO_DATA_INICIO) = 11
LEFT JOIN TDET_TIPO_OCORRENCIA D ON D.DTO_COD = O.DTO_COD
AND D.DPO_CAUSA_IMPACTO = 'S'
WHERE
(MC.MAPC_MESANO = :MAPC_MESANO)
GROUP BY
MC.MAPC_COD,
MC.COMD_COD,
MC.MAPC_DIAS,
MC.MAPC_MESANO,
MC.MAPC_01, MC.MAPC_02, MC.MAPC_03, MC.MAPC_04, MC.MAPC_05, MC.MAPC_06, MC.MAPC_07,
MC.MAPC_08, MC.MAPC_09, MC.MAPC_10, MC.MAPC_11, MC.MAPC_12, MC.MAPC_13, MC.MAPC_14,
MC.MAPC_15, MC.MAPC_16, MC.MAPC_17, MC.MAPC_18, MC.MAPC_19, MC.MAPC_20, MC.MAPC_21,
MC.MAPC_22, MC.MAPC_23, MC.MAPC_24, MC.MAPC_25, MC.MAPC_26, MC.MAPC_27, MC.MAPC_28,
MC.MAPC_29, MC.MAPC_30, MC.MAPC_31,
MC.MAPC_STATUS
) TAB
LEFT OUTER JOIN TCOMPROMETIMENTO_DET CD ON CD.COMD_COD = TAB.COMD_COD
LEFT OUTER JOIN TCOMPROMETIMENTO C ON C.COM_COD = CD.COM_COD
LEFT OUTER JOIN TTIPO_COMPROMETIMENTO TC ON TC.TCO_COD = C.TCO_COD
LEFT OUTER JOIN TAREA A ON A.ARE_COD = C.ARE_COD
LEFT OUTER JOIN TAREA AD ON AD.ARE_COD = CD.ARE_COD_DET
LEFT OUTER JOIN TSUBAREA S ON S.SARE_COD = C.SARE_COD
LEFT OUTER JOIN TSUBAREA SD ON SD.SARE_COD = CD.SARE_COD_DET
LEFT OUTER JOIN TEMPRESAW E ON E.EMP_COD = CD.EMP_COD
LEFT OUTER JOIN TGRUPO_DET_EMPRESAS P ON P.EMP_COD = E.EMP_COD
LEFT OUTER JOIN TGRUPO_EMPRESAS P1 ON P1.GRE_COD = P.GRE_COD
LEFT OUTER JOIN TGRP_ECONOMICO G ON G.GRPE_COD = E.GRPE_COD
LEFT OUTER JOIN TCATEGORIA T ON T.CAT_DESCRICAO = G.CAT_DESCRICAO
WHERE
(G.GRPE_COD = :GRPE_COD) AND (C.TCO_COD = :TCO_COD)
- o uso do case elimina as 30 subselects. isso deve melhorar um pouco a performance, além do que o uso da instrução sum() - na minha opinião - torna a instrução mais legível.
- o uso da coalesce() é só para garantir, no caso de algum dos dias não ter qualquer ocorrência.
- se funcionar da forma como está, basta trocar o mês e o ano (em vermelho) e a instrução funcionará, independente de o mês ter 28, 30 ou 31 dias. você poderá alterar essa forma que eu fiz para que seja usado o conteúdo de :MAPC_MESANO, em vez de indicar explicitamente o ano e o mês.
talvez haja algum erro de sintaxe, pois fiz toda a instrução no bloco de notas....
10/01/2011
Carlos Souza
Achei muito bom esta outra forma de organizar esta consulta !! Como estou migrando de base de dados Firebird para SQL Server ainda não sei usar bem todos os recursos fornecidos pelo SQL Server.. !!
Mas pelo que estou vendo o problema esta na execução da instrução do comando via Delphi.
Tenho percebido os problemas que o DBExpress enfrenta com o SQL Server e estou sofrendo muito com isso, mas o grande problema é que estou migrando uma aplicação de Firebird para SQL Server e o intuito é que se mecha o menos possível na aplicação para facilitar a migração por isso estou buscando soluções via aplicação para resolução, caso contrário, seria necessário um esforço muito grande de migração.
Acho que realmente se trata de um BUG do DBExpress com relação ao SELECT com o uso de PARÂMETRO, porque o SQL roda normalmente sendo executado direto no banco sem a utilização de parâmetros, e via delphi, o mesmo é executado sem erros quando elimino os parâmetros do SQL passando os valores direto no SQL.
Acho que são incompatibilidades que o DBExpress tem e isso esta me tirando o sono ... !!
Se alguem pude ajudar agradeço.
Valeu !!
10/01/2011
Emerson Nascimento
tente trocar o apelido C para CM, por exemplo.
então:
LEFT OUTER JOIN TCOMPROMETIMENTO C ON C.COM_COD = CD.COM_COD
LEFT OUTER JOIN TTIPO_COMPROMETIMENTO TC ON TC.TCO_COD = C.TCO_COD
fica:
LEFT OUTER JOIN TCOMPROMETIMENTO CM ON CM.COM_COD = CD.COM_COD
LEFT OUTER JOIN TTIPO_COMPROMETIMENTO TC ON TC.TCO_COD = CM.TCO_COD
e nos demais pontos onde C é referenciada.
veja se surte algum efeito.
não custa tentar....
Clique aqui para fazer login e interagir na Comunidade :)