somar campos SQL

Delphi

20/10/2004

Olá
Tudo bem?
Tentaram me ajudar em outro forum e não conseguiram. Vou tentar agora neste fórum.
Eu tenho a query abaixo que mostra todos os títulos no grid e funciona.
DM1.IBQuery_cadcre.Close;
DM1.IBQuery_cadcre.SQL.Clear;
DM1.IBQuery_cadcre.SQL.Add(´Select *´);
DM1.IBQuery_cadcre.SQL.Add(´From CADCRE´);
DM1.IBQuery_cadcre.Open;
------------------------
Agora eu quero somar os valores de todos os títulos, mas me dá o seguinte erro:
ibquery_cadcre: Field ´CR1_COD_CLI´ not found
Este campo é o primeiro que está na query. Se eu remové-lo ou trocar de lugar irá
dar erro no que ficar em primeiro, por exemplo:
ibquery_cadcre: Field ´CR1_NRO_TIT´ not found
A query que estou usando é a seguinte.

var tot_vlr_tit : integer;
tot_vlr_tit := 0;
DM1.IBQuery_cadcre.Close;
DM1.IBQuery_cadcre.SQL.Clear;
DM1.IBQuery_cadcre.SQL.Add(´Select sum(CR1_VLR_TIT) as tot_vlr_tit´);
DM1.IBQuery_cadcre.SQL.Add(´From CADCRE´);
DM1.IBQuery_cadcre.SQL.Add(´group by CR1_VLR_TIT´);
DM1.IBQuery_cadcre.Open;
------------------------
Se eu usar a query abaixo me dá o seguinte erro:
SQL erro code: -104 invalid column reference

var tot_vlr_tit : integer;
tot_vlr_tit := 0;
DM1.IBQuery_cadcre.Close;
DM1.IBQuery_cadcre.SQL.Clear;
DM1.IBQuery_cadcre.SQL.Add(´Select CR1_COD_CLI, sum(CR1_VLR_TIT) as tot_vlr_tit´);
DM1.IBQuery_cadcre.SQL.Add(´group by CR1_VLR_TIT´);
DM1.IBQuery_cadcre.Open;

E se eu trocar ´Select CR1_COD_CLI,´
por ´Select *,´ dá erro:
SQL error code :-104 token unknow line 1 char 8 e uma vírgula na linha de baixo.
DM1.IBQuery_cadcre.SQL.Add(´Select *, sum(CR1_VLR_TIT) as tot_vlr_tit´);


Será que tem alguém que saiba qual o problema, porque eu já peguei exemplos nos foruns há algumas semanas e são todos parecidos com estas sintaxes.

Estou usando Delphi 7 Interbase 6
IBDatabase IBTransaction Datasource IBQuery IBUPDateSQL dentro do Data Module.

Desde já agradeço pela ajuda que receber.


Joao_schroeder

Joao_schroeder

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

20/10/2004

Colega,

No IB/FB todas as colunas presentes no SELECT obrigatoriamente devem estar no GROUP BY e vice-versa, por exemplo :
select  ID_CLIENTE, DATA_PEDIDO from PEDIDOS
group by ID_CLIENTE, DATA_PEDIDO

Se vc adicionasse somente a coluna ID_CLIENTE no GROUP BY ocorreria erro.
Esta regra, porém, não é válida colunas ´geradas´ a partir de funções como SUM, COUNT, etc...
Então, no mesmo exemplo acima poderia ser feito :
select  ID_CLIENTE, DATA_PEDIDO, sum(VLR_PEDIDO) as VALOR_TOTAL from PEDIDOS
group by ID_CLIENTE, DATA_PEDIDO

A coluna do SUM não precisa estar no GROUP BY.

Em relação à seus erros :
1. o primeiro erro é em relação ao GROUP BY, que mencionei acima. Vc está tentano agrupar por uma coluna que não está ´pura´ na select.
2. [b:93282731b1]select *, [/b:93282731b1] não é aceito realmente. Vc pode usar :
select <tabela>.*, <outros campos> from <tabelas>

Além disso, a não ser q tenha havido um erro de digitação, onde está o FROM na segunda query?

Também não entendi porque vc está criando e inicializando uma variável externa tot_vlr_tit : integer... a não ser que ela seja usada em um outro momento do código, dentro do contexto no select e open da query ela não tem nenhum função...

Creio que sua query seria :
select CR1_COD_CLI, sum(CR1_VLR_TIT) as TOT_VLR_TIT
from CADCRE
group by CR1_COD_CLI


Espero ter ajudado...
T+


GOSTEI 0
Adilsond

Adilsond

20/10/2004

Olá Tudo bem? Tentaram me ajudar em outro forum e não conseguiram. Vou tentar agora neste fórum. Eu tenho a query abaixo que mostra todos os títulos no grid e funciona. DM1.IBQuery_cadcre.Close; DM1.IBQuery_cadcre.SQL.Clear; DM1.IBQuery_cadcre.SQL.Add(´Select *´); DM1.IBQuery_cadcre.SQL.Add(´From CADCRE´); DM1.IBQuery_cadcre.Open;


Ésta query está ok. Nesta query voce deu um clique duplo sobre a mesma e adicionou os campos a mesma. Por isto está dando o erro a seguir.

Agora eu quero somar os valores de todos os títulos, mas me dá o seguinte erro: ibquery_cadcre: Field ´CR1_COD_CLI´ not found Este campo é o primeiro que está na query. Se eu remové-lo ou trocar de lugar irá dar erro no que ficar em primeiro, por exemplo: ibquery_cadcre: Field ´CR1_NRO_TIT´ not found A query que estou usando é a seguinte. var tot_vlr_tit : integer; tot_vlr_tit := 0; DM1.IBQuery_cadcre.Close; DM1.IBQuery_cadcre.SQL.Clear; DM1.IBQuery_cadcre.SQL.Add(´Select sum(CR1_VLR_TIT) as tot_vlr_tit´); DM1.IBQuery_cadcre.SQL.Add(´From CADCRE´); DM1.IBQuery_cadcre.SQL.Add(´group by CR1_VLR_TIT´); DM1.IBQuery_cadcre.Open;


Voce está utilizando a mesma query do primeiro comando e como todos os campos estão definidos para a mesma e voce não os está selecionando neste comando, ocorrerá o erro. Crie uma nova query para executar este comando. Outra coisa, como voce está selecionando apenas o Sum(coluna) não precisa fazer o group by.

Se eu usar a query abaixo me dá o seguinte erro: SQL erro code: -104 invalid column reference var tot_vlr_tit : integer; tot_vlr_tit := 0; DM1.IBQuery_cadcre.Close; DM1.IBQuery_cadcre.SQL.Clear; DM1.IBQuery_cadcre.SQL.Add(´Select CR1_COD_CLI, sum(CR1_VLR_TIT) as tot_vlr_tit´); DM1.IBQuery_cadcre.SQL.Add(´group by CR1_VLR_TIT´); DM1.IBQuery_cadcre.Open; E se eu trocar ´Select CR1_COD_CLI,´ por ´Select *,´ dá erro: SQL error code :-104 token unknow line 1 char 8 e uma vírgula na linha de baixo. DM1.IBQuery_cadcre.SQL.Add(´Select *, sum(CR1_VLR_TIT) as tot_vlr_tit´);


Nesta query dará o mesmo problema, pois todos os campos estão definidos para a mesma. Crie uma nova query para este comando ou utilize a query anterior. Com relação a sua query faça:

select cr1_cod_cli, sum(cr1_vlr_tit) as tot_vlr_tit
from cadcre
group by cr1_cod_cli



GOSTEI 0
Paulo_amorim

Paulo_amorim

20/10/2004

Olá

Colega, No IB/FB todas as colunas presentes no SELECT obrigatoriamente devem estar no GROUP BY e vice-versa


Creio que o 2k resolveu a questão, mas pra não perder a viagem vale dizer que isso eh princípio de SQL, e não do FB...
A questão eh que ele não pode mostrar coisas que não estão no group by pois o ResultSet não ficaria correto

Até+


GOSTEI 0
Joao_schroeder

Joao_schroeder

20/10/2004

Olá
Tudo bem?

Quero agradecer a ajuda de vocês, principalmente porque foi bem detalhada. Foi uma verdadeira aula. Se não fosse isso acho que não conseguiria fazer.

Agora não está mais dando erro e está mostrando os dados no grid, mas não está fazendo o somatório.

Os campos já iniciam com valor zerado, menos o tot_vlr_tit que já vem carregado com um valor absurdo. É por isso que eu estava inicializando esta variável, mas ela só é usada aqui. Não entendo o porque disso.

Estou enviando abaixo todo o código para ver se consegue descobrir o erro. Ou tem que se fazer mais alguma coisa em outro lugar.

Desde já agradeço a ajuda que me derem.

var
data : TDate;
tot_vlr_tit : integer;
tot_vlr_pago: integer;
tot_vlr_juro: integer;
tot_nro_tit : integer;
begin
DM1.IBQuery_cadcre.Close;
DM1.IBQuery_cadcre.SQL.Clear;
DM1.IBQuery_cadcre.SQL.Add(´Select CADCRE.*,´);
DM1.IBQuery_cadcre.SQL.Add(´count (CR1_NRO_TIT) as TOT_NRO_TIT,´);
DM1.IBQuery_cadcre.SQL.Add(´sum (CR1_VLR_TIT) as TOT_VLR_TIT,´);
DM1.IBQuery_cadcre.SQL.Add(´sum (CR1_VLR_PAGO) as TOT_VLR_PAGO,´);
DM1.IBQuery_cadcre.SQL.Add(´sum (CR1_VLR_JURO) as TOT_VLR_JURO´);
DM1.IBQuery_cadcre.SQL.Add(´From CADCRE´);

DM1.IBQuery_cadcre.SQL.Add(´Where CR1_COD_CLI = ´+Edit1.text+´´);
DM1.IBQuery_cadcre.SQL.Add(´group by CR1_COD_CLI, CR1_NRO_TIT, CR1_PARCELA, CR1_NRO_DOC,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_DT_EMIS, CR1_DT_VCTO, CR1_DT_MOV,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_PORTADOR, CR1_POSICAO, CR1_TP_TIT, CR1_COD_MOV, CR1_COD_REP, CR1_ULT_HIST,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_VLR_TIT, CR1_VLR_PAGO, CR1_VLR_JURO, CR1_VLR_DCTO, CR1_VLR_COMIS,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_OBSERV´);
DM1.IBQuery_cadcre.SQL.Add(´Order by CR1_NRO_TIT, CR1_PARCELA´);

DM1.IBQuery_cadcre.Open;


GOSTEI 0
POSTAR