Fórum não soma variáveis definidas no SUM #255588
22/10/2004
0
Tudo bem?
Com esta query está mostrando os dados no grid, mas não está fazendo o somatório das variáveis que estão no sum e no count.
Os campos já iniciam com valor zerado, menos o tot_vlr_tit que já vem carregado com um valor absurdo.
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_VLR_TIT, CR1_VLR_PAGO, CR1_VLR_JURO, CR1_VLR_DCTO, CR1_VLR_COMIS,´);
DM1.IBQuery_cadcre.SQL.Add(´Order by CR1_NRO_TIT, CR1_PARCELA´);
DM1.IBQuery_cadcre.Open;
Joao_schroeder
Curtir tópico
+ 0Posts
22/10/2004
Crpavao
não tem nada a ver com aquelas que vc está usando na Query. São variáveis distintas.
Qdo vc quiser referir às variaveis utilizadas na Query use-as da seguinte maneira
DM1.IBQuery_cadcre.fieldbyname(´TOT_...´).Value.
Gostei + 0
22/10/2004
Joao_schroeder
Tudo bem?
Não entendi o que quiseste dizer. Já que não é certo definir estas
variáveis na var eu criei campos na query como sendo calculate, porque
de outro jeito dá erro.
Fiz isto, colocando um campo que já é da tabela
DM1.IBQuery_cadcre.SQL.Add(´sum (CR1_VLR_TIT) as cr1_vlr_dcto,´);
e fiz isto colocando um campo que criei como calculate
DM1.IBQuery_cadcre.SQL.Add(´sum (CR1_VLR_TIT) as tot_vlr_tit,´);
Não somou nem nas colunas.
Se eu for no IBCONSOLE e fizer a sintaxe abaixo me mostra a soma de
cr1_vlr_tit em uma célula do campo cr1_vlr_dcto(campo só para teste)
select sum (cr1_vlr_tit) as cr1_vlr_dcto from cadcre
mas não consigo fazer no delphi.
A sintaxe que tu deste eu uso para mostrar no edit, mas vai mostrar
somente o primeiro registro do campo que eu definir.
Eu já sei fazer alguma coisa, mas eu sou novato, isto é novo para mim,
será que poderiam explicar mais detalhadamente para mim.
O que eu quero fazer fazer é mostrar no grid todos os títulos com seus
dados e nos edits mostrar os totais.
Desde já fico muito grato.
Gostei + 0
22/10/2004
Vinicius2k
Deixe-me tentar detalhar para vc :
1. Retire aquelas variáveis pq não tem função nenhuma neste contexto.
2. Não use CADCRE.*, use a lista de campos que vc quer na SELECT e as repita no GROUP BY.
3. As colunas das funções agregadas não precisam estar no GROUP BY.
Creio que o código seria este, ou pelo menos parecido com este :
with DM1.IBQuery_cadcre do begin Close; SQL.Clear; // aqui só as colunas que vc necessita e que vc deseje agrupar. SQL.Add(´select CR1_COD_CLI, CR1_NRO_TIT, CR1_PARCELA,´); // aqui as colunas com as funções SQL.Add(´count (CR1_NRO_TIT) as TOT_NRO_TIT,´); SQL.Add(´sum (CR1_VLR_TIT) as TOT_VLR_TIT,´); SQL.Add(´sum (CR1_VLR_PAGO) as TOT_VLR_PAGO,´); SQL.Add(´sum (CR1_VLR_JURO) as TOT_VLR_JURO´); SQL.Add(´from CADCRE´); SQL.Add(´where CR1_COD_CLI = ´+Edit1.text+´´); // aqui as mesmas colunas da SELECT. SQL.Add(´group by CR1_COD_CLI, CR1_NRO_TIT, CR1_PARCELA´); SQL.Add(´Order by CR1_NRO_TIT, CR1_PARCELA´); Open; end;
T+
Gostei + 0
22/10/2004
Joao_schroeder
Agradeço muito a sua ajuda, mas ainda não entendi aonde vou declarar as variáveis que terão os totais, porque na hora de colocar no edit vai dar erro de identificador não declarado.
Desde já agradeço novamente pelo apoio.
Gostei + 0
22/10/2004
Vinicius2k
Se vc exemplificar, como deseja que seja o resultado da query fica mais fácil lhe ajudar...
T+
Gostei + 0
23/10/2004
Joao_schroeder
Tudo bem?
O comando que enviaste funciona no ibconsole. mostra assim.
cr1_cod_cli cr1_nro_tit cr1_parcela tot_nro_tit tot_vlr_tit tot_vlr_pago tot_vlr_juro
________1________1________1________1______100________10_________0
________1________2________1________1______200________20_________0
________1________3________1________1_____1000_______100_________0
________1________4________1________1______100________10_________0
O tot_vlr_tit e tot_vlr_pago mostram o mesmo valor de cr1_vlr_tit cr1_vlr_pago e no
count do tot_nro_tit mostra 1 título para cada título.
------------------
Aqui está o dbgrid onde todos são variáveis da tabela
cr1_nro_tit cr1_parcela CR1_nro_tit CR1_vlr_tit CR1_vlr_pago CR1_vlr_juro
________1________1_________1______100_________10__________0
________2________1_________1______200_________20__________0
________3________1_________1_____1000________100__________0
________4________1_________1______100_________10__________0
Na query estão os seguintes campos:
cr1_cod_cli cr1_nro_tit cr1_parcela CR1_nro_tit CR1_vlr_tit CR1_vlr_pago CR1_vlr_juro.
Mas no delphi se eu não fizer a select assim dá erro dizendo que não encontrou o CR1_VLR_TIT, acredito que seja porque os campos de valores estão no dbgrid.
DM1.IBQuery_cadcre.SQL.Add(´Select CR1_COD_CLI, CR1_NRO_TIT, CR1_PARCELA,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_VLR_TIT, CR1_VLR_PAGO, CR1_VLR_JURO,´);
e se eu não colocar no group by os valores dá erro de invalid column reference.
DM1.IBQuery_cadcre.SQL.Add(´group by CR1_COD_CLI, CR1_NRO_TIT, CR1_PARCELA,´);
DM1.IBQuery_cadcre.SQL.Add(´CR1_VLR_TIT, CR1_VLR_PAGO, CR1_VLR_JURO´);
O que eu quero é mostrar nos edits os totais de:
cr1_nro_tit que é ___4
cr1_vlr_tit que é _1400
cr1_vlr_pago que é 140
cr1_vlr_juro que é __0
Assim como esse comando irá mostrar o valor da primeira linha do dbgrid
Edit4.Text:=DM1.IBQuery_cadcre.FieldValues[´Cr1_vlr_tit´];
eu gostaria que um comando deste tipo mostrasse o total de todos os títulos
Edit4.Text:=TOT_VLR_TIT;
mas neste caso dá erro de undeclared identifier ´tot_vlr_tit´.
Pelo que andei pesquisando por aí, imaginei que é isso que esses comandos SQL fazem. Estou enganado? Como é que tu fazes para mostrar estes totais?
Outra dúvida que surgiu.
Para que estes comandos funcionassem eu tive que fazer uma limpa no componente ibquery, porque esta mesma query é usada no cadastro do título.
Como é que vocês trabalham? Colocam uma query geral no datamodule e quando necessário fazem uma específica dentro do form ou até mesmo outra no datamodule?
Muito obrigado pela força que estás me dando e me desculpa pela ignorância que aparento, mas é que eu estou aprendendo sozinho só com um curso básico que eu fiz no início e agora com dicas, exemplos e lendo e fazendo pesquisa nos foruns para guardar perguntas e respostas que eu ache que em breve eu vou precisar.
Um abraço
Gostei + 0
23/10/2004
Vinicius2k
Antes de mais nada, vou lhe demonstrar de forma simples o que é um GROUP BY, pq desconfio que não seja isso que vc quer, apesar de estar usando.
Suponhamos uma tabela com os dados:
Cliente Pedido Data Valor -------------------------------- 1 1 01/10/2004 100,00 1 2 01/10/2004 200,00 2 3 02/10/2004 300,00 3 4 03/10/2004 400,00 3 5 04/10/2004 500,00
Se executarmos uma query assim :
select Cliente, Data, sum(Valor) as ValorTotal group by Cliente, Data
O resultado da consulta seria:
Cliente Data ValorTotal ------------------------------ 1 01/10/2004 300,00 2 02/10/2004 300,00 3 03/10/2004 400,00 3 04/10/2004 500,00
Percebeu que o cliente 1, no no dia 01/10 efetuou dois pedidos, então foi agrupado em apenas um registro (pq eu indiquei um agrupamento por Cliente e Data) com e seu valores foram agregados pela função SUM ?
Na mesma tabela, se executássemos a seguite query :
select Cliente, sum(Valor) as ValorTotal group by Cliente
O resultado da consulta seria:
Cliente ValorTotal ------------------- 1 300,00 2 300,00 3 900,00
Nesta eu quiz apenas um somatório dos Valores dos pedidos agrupados por cliente.
Nestes dois casos, os totais virão como colunas própria query. Como se fossem colunas originais da própria tabela...
Se eu executasse a query :
select Cliente, Pedido, Data, sum(Valor) as ValorTotal group by Cliente, Pedido, Data
O resultado seria :
Cliente Pedido Data ValorTotal ------------------------------------- 1 1 01/10/2004 100,00 1 2 01/10/2004 200,00 2 3 02/10/2004 300,00 3 4 03/10/2004 400,00 3 5 04/10/2004 500,00
Ou seja, linhas idênticas aos dados originais, pq eu pedi que agrupasse por todas as colunas e nenhum dos registros é exatamente idêntico aos outros (o número do Pedido é diferente em todos).
Entendeu como funciona um GROUP BY? É isso realmente que vc quer?
Um GROUP BY é um agrupamento de registros por coincidência entre as colunas que vc determina. E todos as colunas que vc colocar na cláusula SELECT deverão estar presentes na cláusula GROUP BY.
E o COUNT estará também atrelado ao GROUP BY, ou seja se não houver nenhum agrupamento, a contagem vai ser sempre 1.
Como eu disse acima, os valores totais virão como colunas da própria query então vc ira manipulá-los para exibição em outros controles exatamente como manipularia uma coluna da tabela, ou seja:
Edit4.Text:= DM1.IBQuery_cadcre.FieldValues[´TOT_VLR_TIT´];
Isto depende da situação e muitos colegas trabalham de forma diferente... Eu, costumo ter uma ou duas queries vazias no DataModule, que recebem instruções dinamicamente para estes casos, mas é questão de escolha...
Vc não precisa se desculpar... estamos todos aqui aprendendo. Mas se me permitir um conselho, procure material sobre SQL, que pelo que vejo vc ainda não domina muito bem. Entenda bem os fundamentos e para que serve cada instrução.
T+
Gostei + 0
24/10/2004
Joao_schroeder
Tudo bem?
Está valendo demais o apoio que estás me dando.
O que eu fiz agora é ter duas querys. Uma com todos os campos no datamodule e outra no form somente com os campos que eu quero. Assim irá mostrar os títulos no grid e os totais nos edits.
Estou usando a query abaixo para mostrar no grid todos os títulos do cliente com mais alguns dados da tabela.
Mostra corretamente e no componente ibquery estão todos os campos da tabela.
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.SQL.Add(´Where CR1_COD_CLI = ´+Edit1.text+´´); DM1.IBQuery_cadcre.SQL.Add(´Order by CR1_NRO_TIT, CR1_PARCELA´);
E coloquei no form um datasource e um ibquery ligados ao database e transaction que estão no datamodule. Porque o que eu quero é o primeiro exemplo onde mostra os totais por cliente, só que usando a claúsula Where como no código acima.
Coloquei no grid o CR1_COD_CLI e CR1_VLR_TIT
Todas abaixo funcionam no IBCONSOLE. Mas nem todas no Delphi
As duas abaixo funcionam.
ibquery1.sql.Add(´select * from CADCRE´); ibquery1.sql.Add(´select CR1_COD_CLI, CR1_VLR_TIT from CADCRE group by CR1_COD_CLI, CR1_VLR_TIT´);
No código abaixo só está na query o CR1_COD_CLI. Funciona. Mas se colocar na query o CR1_VLR_TIT dá erro dizendo que na query1 o campo CR1_VLR_TIT não foi encontrado.
ibquery1.sql.Add(´select CR1_COD_CLI from CADCRE group by CR1_COD_CLI´);
Neste abaixo diz que não encontrou CR1_COD_CLI e depois que retiro não encontra CR1_VLR_TIT
ibquery1.sql.Add(´select sum (CR1_VLR_TIT) as TOT_VLR_TIT from CADCRE´);
Nas duas abaixo não encontra o CR1_VLR_TIT
ibquery1.sql.Add(´select CR1_COD_CLI, sum(CR1_VLR_TIT) as TOT_VLR_TIT from CADCRE group by CR1_COD_CLI´); ibquery1.sql.Add(´select CR1_COD_CLI, sum(CR1_VLR_TIT) from CADCRE group by CR1_COD_CLI´);
Não entendo porque é que alguns casos ela encontra o CR1_VLR_TIT e em outras não encontra.
O que é que eu ainda estou fazendo de errado?
Estou muito agradecido com a ajuda que estás me dando.
Gostei + 0
24/10/2004
Vinicius2k
ibquery1.sql.Add(´select CR1_COD_CLI from CADCRE group by CR1_COD_CLI´);
Bem, lembrando da regra para o GROUP BY, se vc colocar CR1_VLR_TIT na cláusula SELECT vc deve colocá-la também no GROUP BY a não ser que seja sum(CR1_VLR_TIT). Vc respeitou essa regra para inclusão desta outra coluna?
ibquery1.sql.Add(´select sum (CR1_VLR_TIT) as TOT_VLR_TIT from CADCRE´);
ibquery1.sql.Add(´select CR1_COD_CLI, sum(CR1_VLR_TIT) as TOT_VLR_TIT from CADCRE group by CR1_COD_CLI´); ibquery1.sql.Add(´select CR1_COD_CLI, sum(CR1_VLR_TIT) from CADCRE group by CR1_COD_CLI´);
Aqui o que está me parecendo é o que vc cria a primeira query e adiciona os TFields, que estão associados a determinadas colunas da query, mas se vc mudar a query para q traga outras colunas, ou mesmo não conter uma coluna que continha na primeira, vc deve retirar os TFields que não existem mais... vc está se lembrando disso?
Se todas as instruções estão sendo executadas corretamente, e lhe dando o retorno que vc deseja dentro do Front-End (IBConsole), o problema é dentro da aplicação, possivelmente, tentativa de leitura de um coluna que na query não existe...
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)