The multi-part identifier + SQL 2005 + Delphi 7

07/01/2011

0

Salve galera, tudo beleza?

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

Carlos Souza

Responder

Posts

07/01/2011

Emerson Nascimento

acho que você pode dar uma melhorada na sua instrução, de modo que fique mais fácil de entender e tenha melhor performance. veja se assim funciona:

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....


Responder

10/01/2011

Carlos Souza

Olá amigo ... obrigado pela sua resposta !!

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 !!
Responder

10/01/2011

Emerson Nascimento

acho que o driver pode estar se perdendo ao 'apelidar' as tabelas.

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....
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar