Duvida SQL ( union all)

02/09/2004

0

Estou tentando fazer a uniao entre duas tabelas (utilizo banco paradox) mas sempre da o mesmo erro:

Type mismatch in expression

Este e o codigo SQL que estou utilizando:

SQL.Add(´SELECT distinct V.cod_produto, P.Nome, P.Unidade, V.cod_sittrib,´);
SQL.Add(´V.Perc_IPI, V.Perc_icms, V.redu_icms, V.base_sub, V.Dt_Nota´);
SQL.Add(´FROM VENDITEM V, ACADPROD P WHERE´);
SQL.Add(´P.Codigo = V.Cod_Produto´);
SQL.Add(´AND V.Controle IN (´);
SQL.Add(´SELECT Controle FROM Venddevo WHERE´);
SQL.Add(´(dt_emiss BETWEEN :datahora_ini AND :datahora_fim) )´);

SQL.Add(´union all´);

SQL.Add(´SELECT distinct C.cod_produto, P.nome, P.unidade, C.cod_sittrib,´);
SQL.Add(´C.Perc_ipi, C.Perc_icms, C.redu_icms, C.dt_nota´);
SQL.Add(´FROM CompItem C, AcadProd P WHERE´);
SQL.Add(´P.Codigo = C.Cod_Produto´);
SQL.Add(´AND C.Nro_Nota IN (´);
SQL.Add(´SELECT Nro_Nota FROM LCompras WHERE´);
SQL.Add(´(dt_emiss BETWEEN :datahora_ini AND :datahora_fim) )´);


Dalri

Dalri

Responder

Posts

02/09/2004

Wolverine

   cQuery := "SELECT CC, SUM(ORC) AS ORC, SUM(COMPRMETIDO+acresc+VALJUR-DECRESC) AS COMPRMETIDO,  SUM(reali) as reali "
   cQuery += "FROM                                        "
   cQuery += "( " //orçado
   cQuery += "   SELECT ZI_CC AS CC, ZI_VALOR AS ORC, 0 AS  COMPRMETIDO, 0 AS VALJUR, 0 AS DECRESC, 0 as reali ,0 as acresc                               "
   cQuery += "   FROM SZI010 SZI"
   cQuery += "   WHERE "
   cQuery += "      zi_mesano>= ´" + cMesIniOrc + "´ and zi_mesano<= ´" + cMesFinOrc + "´ and "
   cQuery += "      zi_cc >= ´" + cCenCusIni + "´ and zi_cc <= ´" + cCenCusFin + "´ and "
   cQuery += "      zi_naturez >= ´" + cNatuInic + "´ and zi_naturez <= ´" + cNatuFina + "´ and "
   cQuery += "      SZI.D_E_L_E_T_<>´*´ "
   cQuery += "UNION ALL " // comprometido
   cQuery += "   SELECT E2_CC AS CC, 0 AS ORC, E2_VALOR AS COMPRMETIDO, E2_VALJUR AS VALJUR, E2_DECRESC AS DECRESC, 0 as reali, E2_ACRESC as acresc                               "
   cQuery += "   from SE2010 SE2 "
   cQuery += "   where "
   cQuery += "      E2_VENCREA >= ´" + dtos(dDataInic) + "´ and E2_VENCREA <= ´" + dtos(dDataFina)+"´ and  "
   cQuery += "      E2_CC >= ´" + cCenCusIni + "´ and E2_CC <= ´" + cCenCusFin + "´ and"
   cQuery += "      e2_naturez >= ´" + cNatuInic + "´ and e2_naturez <= ´" + cNatuFina + "´ and "
   cQuery += "      E2_FATURA <> ´NOTFAT´ and e2_filial = ´" + xFilial("SE2") + "´ AND "
   cQuery += "      SE2.D_E_L_E_T_<>´*´ "
   cQuery += "UNION ALL " //realizado
   cQuery += "   select E2_CC AS CC, 0 AS ORC, 0 AS COMPRMETIDO, 0 AS VALJUR, 0 AS DECRESC, E5_VALOR as reali, 0 as acresc "
   cQuery += "   from SE2010 SE2, SE5010 SE5  "
   cQuery += "   where "
   cQuery += "      E5_DATA >= ´" + dtos(dDataInic) + "´ and E5_DATA <= ´" + dtos(dDataFina)+"´ and "
   cQuery += "      E2_CC >= ´" + cCenCusIni + "´ and E2_CC <= ´" + cCenCusFin + "´ AND  "
   cQuery += "      e2_naturez >= ´" + cNatuInic + "´ and e2_naturez <= ´" + cNatuFina + "´ and "
   cQuery += "      E2_FATURA <> ´NOTFAT´ and e5_filial = ´" + xFilial("SE5") + "´ AND"
   cQuery += "      E2_FILIAL = E5_FILIAL and E2_PREFIXO = E5_PREFIXO and E2_NUM = E5_NUMERO and E2_PARCELA = E5_PARCELA and  "
   cQuery += "      E2_FORNECE = E5_CLIFOR and E2_LOJA = E5_LOJA and E5_RECPAG = ´P´ AND  "
   cQuery += "      E5_MOTBX in (´NOR´,´DEB´)  and E5_SITUACA <> ´C´ and "
   cQuery += "      SE5.D_E_L_E_T_<>´*´ and SE2.D_E_L_E_T_<>´*´ "
   cQuery += ")QURY1 "
   cQuery += "GROUP BY CC "
   cQuery += "order by CC " 



isso é um exemplo (ñ esta no delphi (Protheus microsiga)), funciona prefeitamente, lembro q tds os itens selecionados tem q ser iquais em tds os select´s
execute a sua query fora do delphi, use o sql maneger, dai fica mais rapido vc achar e resolver os problemas e depois é so passar para o delphi, blz


Responder

02/09/2004

Emerson Nascimento

SQL.Add(´SELECT distinct V.cod_produto, P.Nome, P.Unidade, V.cod_sittrib,´);
SQL.Add(´V.Perc_IPI, V.Perc_icms, V.redu_icms, V.base_sub, V.Dt_Nota´);
SQL.Add(´FROM VENDITEM V, ACADPROD P WHERE´);
SQL.Add(´P.Codigo = V.Cod_Produto´);
SQL.Add(´AND V.Controle IN (´);
SQL.Add(´SELECT Controle FROM Venddevo WHERE´);
SQL.Add(´(dt_emiss BETWEEN :datahora_ini AND :datahora_fim) )´);

SQL.Add(´union all´);

SQL.Add(´SELECT distinct C.cod_produto, P.nome, P.unidade, C.cod_sittrib,´);
SQL.Add(´C.Perc_ipi, C.Perc_icms, C.redu_icms, C.dt_nota´); [color=red:a002a16f31][b:a002a16f31]<-- aqui está o erro[/b:a002a16f31][/color:a002a16f31]
SQL.Add(´FROM CompItem C, AcadProd P WHERE´);
SQL.Add(´P.Codigo = C.Cod_Produto´);
SQL.Add(´AND C.Nro_Nota IN (´);
SQL.Add(´SELECT Nro_Nota FROM LCompras WHERE´);
SQL.Add(´(dt_emiss BETWEEN :datahora_ini AND :datahora_fim) )´);

[b:a002a16f31]na linha assinalada está faltando o campo silimar ao V.base_sub da primeira instrução[/b:a002a16f31]


Responder

02/09/2004

Dalri

Ja havia localizado este erro e corrigi. acertei as duas tabelas mas o erro persiste. estou tentando usar o SQL monitor para tentar ver o erro. Nao esta facil.

Mesmo assi, obrigado pela dica.


Responder

02/09/2004

Dalri

Ja havia localizado este erro e corrigi. acertei as duas tabelas mas o erro persiste. estou tentando usar o SQL monitor para tentar ver o erro. Nao esta facil.

Mesmo assi, obrigado pela dica.


Responder

02/09/2004

Renata

Olha... não tenho certeza, mas acho que que vc. não deveria usar o msm. alias (P) para a tabela AcadProd nos dois selects.

Outra coisa, verifique se os campos equivalentes nos dois selects tem não só mesmo tipo como também o mesmo tamanho. O simples fato de em um deles o tamanho ser 10 e no outro 11 já é suficiente pra não funcionar. Apesar de que, a mensagem de erro que vc. edscreveu normalmente ocorre por tipos de dados diferentes.


T+


Responder

02/09/2004

Renata

Olha... não tenho certeza, mas acho que que vc. não deveria usar o msm. alias (P) para a tabela AcadProd nos dois selects.

Outra coisa, verifique se os campos equivalentes nos dois selects tem não só mesmo tipo como também o mesmo tamanho. O simples fato de em um deles o tamanho ser 10 e no outro 11 já é suficiente pra não funcionar. Apesar de que, a mensagem de erro que vc. edscreveu normalmente ocorre por tipos de dados diferentes.


T+


Responder

02/09/2004

Paulo_amorim

Olá

Como são muitos campos na query vc pode acabar se perdendo...

Minha sugestão eh que vc reduza esse UNION pra 1 ou 2 campos só pra testar a união em si.
Funcionando, pode-se ir adicionando campos gradativamente até ter a pesquisa completa. Isso te dá mais segurança e garantia quando for comparar os 2 selects...

Espero que ajude
Até+


Responder

02/09/2004

Dalri

Obrigado RENATA.

Verificando melhor os campos da tabela descobri que havia uma diferença no tamanho entre dois campos. Foi so acertar e funcionou.

valeu mesmo.


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