Duvida SQL ( union all)

02/09/2004

1

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) )´);


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
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
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira