Duvida SQL ( union all)
02/09/2004
0
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
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
02/09/2004
Emerson Nascimento
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]
02/09/2004
Dalri
Mesmo assi, obrigado pela dica.
02/09/2004
Dalri
Mesmo assi, obrigado pela dica.
02/09/2004
Renata
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+
02/09/2004
Renata
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+
02/09/2004
Paulo_amorim
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é+
02/09/2004
Dalri
Verificando melhor os campos da tabela descobri que havia uma diferença no tamanho entre dois campos. Foi so acertar e funcionou.
valeu mesmo.
Clique aqui para fazer login e interagir na Comunidade :)