Dúvida sobre campos que acumulam valores - 4a. Tentativa
Oi Pessoal,
Bem essa é a qurta tentativa para tentar resolver um problema que estou tendo aqui com campos acumulativos. Por favor quem puder ajudar agradeço.
Tenho uma tela onde crio registros de despesas diárias. Alguns desses registros são pagos em Dinheiro, outros com cartão e outros com Cheque. O que tenho são três campo que somam o TOTAL DE DESPESAS em DINHEIRO, CARTÃO E CHEQUE do mês atual usando um campo como referência (vejam abaixo). Uso Access com ADO.
As dúvidas que tenho:
1) Entendo que terei que ler toda a tabela e, dependendo do tipo de pgamento somar os campos TOTAIS DINHEIRO, CHEQUE E CARTÃO. Faço isso mas sempre que vou incluir um novo registro ou excluir, ou até modificar um dos registros os TOTAIS não atualizam na tela. Só funciona se eu fechar e voltar para o fromulário. Vejo que não sei em que evento colocar a função para ter que atualizar sempre que modifico a tabela. Qual EVENTO DEVO TRATAR ISSO? será que tenho que dar um REFRESH ou coisa parecida?
2) Minha sgunda dúvida, no lugar de usar toda a rotina abaixo que faz essa soma e envia para campo TEDIT na tela, não seria melhor usar QUERIES? Mas em caso possitivo em que eventos eu chamo a query para sempre ter estes valores atualizado quando a tabela mudar algum valor?
Sei que ONCALCFIELDS não funciona pois esse recurso só afeta o registro atual, não TODA a tabela
Pessoal, VAMOS AJUDAR!!!!
Segue minha rotina:
procedure TDataMod.ADOTable_Despesas_DiariasCalcFields ????(DataSet: TDataSet);
// Este procedimento soma todosos campos de totais da Tela de Despesas Diárias
var cTotalDin, cTotalChq, cTotalCrd, cTotalDeb, cTotalGer: Currency;
begin
// Inicializa os contadores
cTotalDin := 0;
cTotalChq := 0;
cTotalCrd := 0;
cTotalDeb := 0;
cTotalGer := 0;
begin
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´DI´ then
begin
cTotalDin := cTotalDin + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
DataMod.ADOTable_Despesas_DiariasACM_TOT_DIN.AsCurrency :=
DataMod.ADOTable_Despesas_DiariasACM_TOT_DIN.AsCurrency +
+ DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´CC´ then
begin
cTotalCrd := cTotalCrd + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´CD´ then
begin
cTotalDeb := cTotalDeb + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
cTotalChq := cTotalChq + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end;
// Soma todos os campos e apresenta o total geral
cTotalGer := cTotalDin + cTotalCrd + cTotalDeb + cTotalChq;
// Atribue aos campos da Tela
Form_Despesas_Diarias.FTotDin.Text := FormatFloat(´#,0.00´,cTotalDin);
Form_Despesas_Diarias.FTotCheque.Text := FormatFloat(´#,0.00´,cTotalChq);
Form_Despesas_Diarias.FTotCarCred.Text := FormatFloat(´,0.00´,cTotalCrd);
Form_Despesas_Diarias.FTotCarDeb.Text := FormatFloat(´,0.00´,cTotalDeb);
Form_Despesas_Diarias.FTotalGer.Text := FormatFloat(´,0.00´,cTotalGer);
end;
Muito Obrg.
Alex
Bem essa é a qurta tentativa para tentar resolver um problema que estou tendo aqui com campos acumulativos. Por favor quem puder ajudar agradeço.
Tenho uma tela onde crio registros de despesas diárias. Alguns desses registros são pagos em Dinheiro, outros com cartão e outros com Cheque. O que tenho são três campo que somam o TOTAL DE DESPESAS em DINHEIRO, CARTÃO E CHEQUE do mês atual usando um campo como referência (vejam abaixo). Uso Access com ADO.
As dúvidas que tenho:
1) Entendo que terei que ler toda a tabela e, dependendo do tipo de pgamento somar os campos TOTAIS DINHEIRO, CHEQUE E CARTÃO. Faço isso mas sempre que vou incluir um novo registro ou excluir, ou até modificar um dos registros os TOTAIS não atualizam na tela. Só funciona se eu fechar e voltar para o fromulário. Vejo que não sei em que evento colocar a função para ter que atualizar sempre que modifico a tabela. Qual EVENTO DEVO TRATAR ISSO? será que tenho que dar um REFRESH ou coisa parecida?
2) Minha sgunda dúvida, no lugar de usar toda a rotina abaixo que faz essa soma e envia para campo TEDIT na tela, não seria melhor usar QUERIES? Mas em caso possitivo em que eventos eu chamo a query para sempre ter estes valores atualizado quando a tabela mudar algum valor?
Sei que ONCALCFIELDS não funciona pois esse recurso só afeta o registro atual, não TODA a tabela
Pessoal, VAMOS AJUDAR!!!!
Segue minha rotina:
procedure TDataMod.ADOTable_Despesas_DiariasCalcFields ????(DataSet: TDataSet);
// Este procedimento soma todosos campos de totais da Tela de Despesas Diárias
var cTotalDin, cTotalChq, cTotalCrd, cTotalDeb, cTotalGer: Currency;
begin
// Inicializa os contadores
cTotalDin := 0;
cTotalChq := 0;
cTotalCrd := 0;
cTotalDeb := 0;
cTotalGer := 0;
begin
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´DI´ then
begin
cTotalDin := cTotalDin + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
DataMod.ADOTable_Despesas_DiariasACM_TOT_DIN.AsCurrency :=
DataMod.ADOTable_Despesas_DiariasACM_TOT_DIN.AsCurrency +
+ DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´CC´ then
begin
cTotalCrd := cTotalCrd + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
if DataMod.ADOTable_Despesas_DiariasDES_TIPO.Text = ´CD´ then
begin
cTotalDeb := cTotalDeb + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end
else
cTotalChq := cTotalChq + DataMod.ADOTable_Despesas_DiariasDES_VALOR.Value;
end;
// Soma todos os campos e apresenta o total geral
cTotalGer := cTotalDin + cTotalCrd + cTotalDeb + cTotalChq;
// Atribue aos campos da Tela
Form_Despesas_Diarias.FTotDin.Text := FormatFloat(´#,0.00´,cTotalDin);
Form_Despesas_Diarias.FTotCheque.Text := FormatFloat(´#,0.00´,cTotalChq);
Form_Despesas_Diarias.FTotCarCred.Text := FormatFloat(´,0.00´,cTotalCrd);
Form_Despesas_Diarias.FTotCarDeb.Text := FormatFloat(´,0.00´,cTotalDeb);
Form_Despesas_Diarias.FTotalGer.Text := FormatFloat(´,0.00´,cTotalGer);
end;
Muito Obrg.
Alex
Alexsandro
Curtidas 0
Respostas
Rjun
05/04/2005
Por que você não cria contadores para guardar os valores dos pagamentos para cheque, cartão, etc. Então cada vez que houver uma inserção ou exclusão de registro na tabela, você atualiza as variaveis e muda os edits.
1) Crie os contadores;
2) Ler a tabela de pagamentos e atualize os contadores para cada tipo de pagamento;
3) Digamos que tenha entrado R$ 100,00 em dinheiro. Some 100 ao contador de dinheiro e exiba no edit. Grave o registro de 100 na tabela.
1) Crie os contadores;
2) Ler a tabela de pagamentos e atualize os contadores para cada tipo de pagamento;
3) Digamos que tenha entrado R$ 100,00 em dinheiro. Some 100 ao contador de dinheiro e exiba no edit. Grave o registro de 100 na tabela.
GOSTEI 0
Marcelo Saviski
05/04/2005
Se é a 4a. Tentativa, vc poderia ter postado uma resposta nos outros tópicos que criou, não precisava criar um novo
GOSTEI 0
Alexsandro
05/04/2005
OI Marcelo,
Fica dificil o pessoal ler quando uma mensagem tem muitas respostas e ainda não foi solucionada. Por isso ´REFORMULEI´ a mensagem e esqueci as anteriores. Citei que é minha ´quarta´ tentativa para ´sensibiliar´ os colaboradores. Realmente ainda não sei o que fazer para solucionar o problema. Agradeço qualquer dica.
O que são ´CONTADORES´? Como faço isso?
Obrg.
Alex
Fica dificil o pessoal ler quando uma mensagem tem muitas respostas e ainda não foi solucionada. Por isso ´REFORMULEI´ a mensagem e esqueci as anteriores. Citei que é minha ´quarta´ tentativa para ´sensibiliar´ os colaboradores. Realmente ainda não sei o que fazer para solucionar o problema. Agradeço qualquer dica.
O que são ´CONTADORES´? Como faço isso?
Obrg.
Alex
GOSTEI 0
Catunda
05/04/2005
Caro colega,
Quanto à sua primeira dúvida é bem melhor usar a query para somar.
select sum(VALOR) as total from TABELA where TIPO =:W1
onde: VALOR é o campo a ser somado;
TABELA é o nome da tabela;
TIPO é o campo que contem o tipo;
W1 é o parametro que vai receber o tipo a ser somado.
exemplo: o codigo abaixo soma os valores em dinheiro:
query1.close;
query1.params[0].asString:=´DI´;
query1.open;
Form_Despesas_Diarias.FTotDin.Text := FormatFloat(´#,0.00´,query1.fieldbyname(´total´).asCurrency);
query1.close;
Quanto à sua segunda dúvida não posso ajudar muito pq não costumo usar o access e ADO, mas posso lhe dizer que vc precisa mesmo é descobrir qual a melhor maneira de dar o Commit no Access com o ADO no evento AFTERPOST do componente em que vc está gravando na tabela.
Espero ter ajudado....
Quanto à sua primeira dúvida é bem melhor usar a query para somar.
select sum(VALOR) as total from TABELA where TIPO =:W1
onde: VALOR é o campo a ser somado;
TABELA é o nome da tabela;
TIPO é o campo que contem o tipo;
W1 é o parametro que vai receber o tipo a ser somado.
exemplo: o codigo abaixo soma os valores em dinheiro:
query1.close;
query1.params[0].asString:=´DI´;
query1.open;
Form_Despesas_Diarias.FTotDin.Text := FormatFloat(´#,0.00´,query1.fieldbyname(´total´).asCurrency);
query1.close;
Quanto à sua segunda dúvida não posso ajudar muito pq não costumo usar o access e ADO, mas posso lhe dizer que vc precisa mesmo é descobrir qual a melhor maneira de dar o Commit no Access com o ADO no evento AFTERPOST do componente em que vc está gravando na tabela.
Espero ter ajudado....
GOSTEI 0
Rjun
05/04/2005
Contador é uma variável qualquer que irá receber os valores que voce quer acumular.
GOSTEI 0
Edilcimar
05/04/2005
quando faço um banco de dados crio um campo chamado forma de pagamento, a qual poderá ser numérica ou string
ex: 1->pagamento em dinheiro
2->pagamento em cartão
3->pagamento em cheque
4-> venda crediário
5-> recebimento de crediário em dinheiro
6-> recebimento de crediário em cartão
7-> recebimento de crediário em cheque
8-> recebimento de crediário em duplicata, etc
depois na hora de fazer a verificação do que for vendido é só colocar dentro das variáveis de acordo com o número
if fieldbyname(´formapagamento´).value = 1 then
pagamentodinheiro := pagamentodinheiro + fieldbyname(´valorpago).value, etc
ex: 1->pagamento em dinheiro
2->pagamento em cartão
3->pagamento em cheque
4-> venda crediário
5-> recebimento de crediário em dinheiro
6-> recebimento de crediário em cartão
7-> recebimento de crediário em cheque
8-> recebimento de crediário em duplicata, etc
depois na hora de fazer a verificação do que for vendido é só colocar dentro das variáveis de acordo com o número
if fieldbyname(´formapagamento´).value = 1 then
pagamentodinheiro := pagamentodinheiro + fieldbyname(´valorpago).value, etc
GOSTEI 0
Alexsandro
05/04/2005
Pessoal,
Obrigado pelas dicas. mas ainda não sei em qual evento devo chamar as Queries que fazem a soma?
Obrg.
Alex
Obrigado pelas dicas. mas ainda não sei em qual evento devo chamar as Queries que fazem a soma?
Obrg.
Alex
GOSTEI 0
Aroldo Zanela
05/04/2005
Colega,
É por isso que não deve ficar abrindo várias threads para o mesmo assunto. Verifique todas, pois numa delas já foram respondidas todas estas questões.
É por isso que não deve ficar abrindo várias threads para o mesmo assunto. Verifique todas, pois numa delas já foram respondidas todas estas questões.
GOSTEI 0
Alexsandro
05/04/2005
Pessoal,
AS respostas enviadas anteriormente de usar determinado EVENTO não funcionaram. Sugeriram o evento ONDATACHANGE do DATASET. Não funciona pois a rotina é chamada várias vezes e ocorre estouro de pilha.
Agradeço uma sugestão que funcione, ou seja, onde eu possa colocar a rotina citada acima no início da questão.
Parecia ser uma coisa simples, criar 4 variaveis, ler a tabela e acumular, mas não está funcionando. Já tentei colocar em vários eventos mas uma hora funciona outra não.
JÁ TENTEI aggregate, ONCALCFIELDS e nenhum funcionou também.
Agradeço outras sugestões que possam resolver meu problema e dispenso críticas que não colaboram com nada.
Alex
AS respostas enviadas anteriormente de usar determinado EVENTO não funcionaram. Sugeriram o evento ONDATACHANGE do DATASET. Não funciona pois a rotina é chamada várias vezes e ocorre estouro de pilha.
Agradeço uma sugestão que funcione, ou seja, onde eu possa colocar a rotina citada acima no início da questão.
Parecia ser uma coisa simples, criar 4 variaveis, ler a tabela e acumular, mas não está funcionando. Já tentei colocar em vários eventos mas uma hora funciona outra não.
JÁ TENTEI aggregate, ONCALCFIELDS e nenhum funcionou também.
Agradeço outras sugestões que possam resolver meu problema e dispenso críticas que não colaboram com nada.
Alex
GOSTEI 0
Rjun
05/04/2005
Deixa ver se eu entendi. Voce que a cada inclusao, ler o arquivo e totalizar os campos ?
Não é mais facil voce ter variaveis que totalizem cada informacao e a cada post na tabela vc soma os valores q forem adicionados aos totalizadores.
Não é mais facil voce ter variaveis que totalizem cada informacao e a cada post na tabela vc soma os valores q forem adicionados aos totalizadores.
GOSTEI 0
Alexsandro
05/04/2005
OI Rjun,
Veja bem, além das inclusões e exclusões eu tenho que tratar as modificações certo?
Assim suponha que eu fizesse da seguinte forma: Usasse a rotina acima para somar quando vai apresentar o FORM a primeira vez. Legal funciona!!!
para inclusões eu usaria o EVENTO AFTERPOST e pegaria apenas o registro que está sendo incluído e atualiza o TOTAL correspodente.
Mas para exclusões e alterações eu não tenho o VALOR ANTERIOR para excluir do total ENTENDEU? Assim imaginei que fazer dessa forma é complicado.
Aparentemente colocar a rotina acima do ONCHANGEDATA deveria resolver TODOS os meus problemas mas aí é que está o ENGANO o evento ONDATACHANGE PODE SER CHAMADO MAIS DE UMA VEZ e não sei porque ficou em LOOP RECURSIVO, ou seja, alguma coisa que faço na tabela esta chamando a rotina e me parece que a rotina CHAMA O EVENTO ONDATACHANGE CAUSANDO O ESTOURO DE PILHA.
Por isso pensei: talvez usando QUERY (Com comandos SELECT SUM) e no evento ONDATACHANGE resolva.
sERÁ QUE RESOLVE?
Alex
Veja bem, além das inclusões e exclusões eu tenho que tratar as modificações certo?
Assim suponha que eu fizesse da seguinte forma: Usasse a rotina acima para somar quando vai apresentar o FORM a primeira vez. Legal funciona!!!
para inclusões eu usaria o EVENTO AFTERPOST e pegaria apenas o registro que está sendo incluído e atualiza o TOTAL correspodente.
Mas para exclusões e alterações eu não tenho o VALOR ANTERIOR para excluir do total ENTENDEU? Assim imaginei que fazer dessa forma é complicado.
Aparentemente colocar a rotina acima do ONCHANGEDATA deveria resolver TODOS os meus problemas mas aí é que está o ENGANO o evento ONDATACHANGE PODE SER CHAMADO MAIS DE UMA VEZ e não sei porque ficou em LOOP RECURSIVO, ou seja, alguma coisa que faço na tabela esta chamando a rotina e me parece que a rotina CHAMA O EVENTO ONDATACHANGE CAUSANDO O ESTOURO DE PILHA.
Por isso pensei: talvez usando QUERY (Com comandos SELECT SUM) e no evento ONDATACHANGE resolva.
sERÁ QUE RESOLVE?
Alex
GOSTEI 0
Rjun
05/04/2005
Que banco voce ta usando ?
GOSTEI 0
Rjun
05/04/2005
Esquece o ultimo post. Se voce vai alterar ou excluir o registro o processo é o mesmo. Vc pega o valor que vai ser alterado e diminui do total. Ai depois e so acrescentar o valor novo. E na exclusão e so pegar o valor q vai se eliminado e diminui do total.
GOSTEI 0
Alexsandro
05/04/2005
legal, pensei em fazer isso. Só gostaria de saber em que EVENTO(S) eu trato tudo isso? É possível fazer tudo isso em um único evento.???
Ou vou ter que tratar o BEFOREDELETE, BEFOREPOST, ETC. ETC.
oBRG.
Alex
Ou vou ter que tratar o BEFOREDELETE, BEFOREPOST, ETC. ETC.
oBRG.
Alex
GOSTEI 0
Rjun
05/04/2005
Voce pode criar uma função unica e chamar ela nesses eventos.
GOSTEI 0
Alexsandro
05/04/2005
Oi Rjun,
Criei uma procedure publica que verifica qual o status do Dataset: STATE, mas o problema é que não existe uma propriedade que indica exclusão. assim como vou saber se houve exclusão para excluir a despesas que foi eliminada do total? Tenho que salvar este valor em uma variavel publica certo? Como faço isso?
Alex
Criei uma procedure publica que verifica qual o status do Dataset: STATE, mas o problema é que não existe uma propriedade que indica exclusão. assim como vou saber se houve exclusão para excluir a despesas que foi eliminada do total? Tenho que salvar este valor em uma variavel publica certo? Como faço isso?
Alex
GOSTEI 0
Rjun
05/04/2005
Penso que voce poderia criar uma funcao e que nela vc passasse um parametro que indicasse o tipo de operacao. Ai no evento BeforeDelete vc chama a funcao passando o tipo de operacao, no caso, exclusao.
GOSTEI 0
Aroldo Zanela
05/04/2005
Colega,
Com o apoio do Power Designer, fiz um modelo para testes. Gerei o seguinte script para o Firebird:
Com o apoio do DeveleporTeam (Meu Gerador de Sistemas), fiz um protótipo:
Adicionei uma Query nomeada de qTotais, contento:
No manipulador de eventos OnDataChange do DataDource utilizado para registrar os dados, adicionei o seguinte código:
Coloque uma dbGris num canto para ficar exibindo os totais.
Está tudo funcionando. Se quiser, me informe seu e-mail que te mando os fontes e o banco (cd.fdb) utilizado para o teste. É necessário ter o Firebird 1.52 instalado para conferir (www.firebase.com.br)
Com o apoio do Power Designer, fiz um modelo para testes. Gerei o seguinte script para o Firebird:
drop table DESPESAS; drop table FORMAS_DE_PAGAMENTO; /*==============================================================*/ /* Table: DESPESAS */ /*==============================================================*/ create table DESPESAS ( DES_ID INTEGER not null, FPG_ID INTEGER, DES_DATA DATE, DES_VALOR NUMERIC(15,2), constraint PK_DESPESAS primary key (DES_ID) ); /*==============================================================*/ /* Table: FORMAS_DE_PAGAMENTO */ /*==============================================================*/ create table FORMAS_DE_PAGAMENTO ( FPG_ID INTEGER not null, FPG_DESCRICAO VARCHAR(40), constraint PK_FORMAS_DE_PAGAMENTO primary key (FPG_ID) ); alter table DESPESAS add constraint FK_DESPESAS_RELATIONS_FORMAS_D foreign key (FPG_ID) references FORMAS_DE_PAGAMENTO (FPG_ID);
Com o apoio do DeveleporTeam (Meu Gerador de Sistemas), fiz um protótipo:
Adicionei uma Query nomeada de qTotais, contento:
select FPG.FPG_DESCRICAO, SUM(DES.DES_VALOR) TOTAL from FORMAS_DE_PAGAMENTO FPG inner join DESPESAS DES on (DES.FPG_ID = FPG.FPG_ID) GROUP BY FPG.FPG_DESCRICAO
No manipulador de eventos OnDataChange do DataDource utilizado para registrar os dados, adicionei o seguinte código:
qTotais.Close; qTotais.Open;
Coloque uma dbGris num canto para ficar exibindo os totais.
Está tudo funcionando. Se quiser, me informe seu e-mail que te mando os fontes e o banco (cd.fdb) utilizado para o teste. É necessário ter o Firebird 1.52 instalado para conferir (www.firebase.com.br)
GOSTEI 0
Alexsandro
05/04/2005
Oi Amigo,
Obrigado por seu esforço em me ajudar e de todos os outros que colaboram de alguma forma. Em uma das mensagens coloquei que a dificuldade de usar o método QUERY com ONCHANGE é que parece que este método pode ser chamado mais de uma vez em uma atualização prejudicando a performance. Mas estou revendo a rotina e quando eu terminar vou postar aqui ok.
Muito Obrg.
Alex
Obrigado por seu esforço em me ajudar e de todos os outros que colaboram de alguma forma. Em uma das mensagens coloquei que a dificuldade de usar o método QUERY com ONCHANGE é que parece que este método pode ser chamado mais de uma vez em uma atualização prejudicando a performance. Mas estou revendo a rotina e quando eu terminar vou postar aqui ok.
Muito Obrg.
Alex
GOSTEI 0
Alexsandro
05/04/2005
Oi Aroldo e demais colegas,
Crei uma rotina em que uso uma Query conforme segue no código abaixo e para cada comand SELECT que soma os registros, SEJA, despesas em DINHEIRO, CHEQUE, CARTÃO DE CRÉDITO OU CARTÃO DE DÉBITO movo o valor obtido em SOMA para o EDIT no Formulário.
Infelizmente não funcionou. Em todos os campos está retornando R$ 0,00
Alguém poderia ajudar?
Segue o código:
procedure TDataMod_Tables.AtualizarTotais;
begin
// Verifica se a Conta Pai já está cadastrada
with DataMod_Tables.ADOQuery_Soma_Totais_Despesas do
begin
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Dinheiro
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´DI´´);
Open;
Form_Despesas_Diarias.FTotDin.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cheque
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CH´´);
Open;
Form_Despesas_Diarias.FTotCheque.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cartão de Crédito
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CC´´);
Open;
Form_Despesas_Diarias.FTotCarCred.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cartão de Débito
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CD´´);
Open;
Form_Despesas_Diarias.FTotCarDeb.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
end;
end;
Alexsandro
Crei uma rotina em que uso uma Query conforme segue no código abaixo e para cada comand SELECT que soma os registros, SEJA, despesas em DINHEIRO, CHEQUE, CARTÃO DE CRÉDITO OU CARTÃO DE DÉBITO movo o valor obtido em SOMA para o EDIT no Formulário.
Infelizmente não funcionou. Em todos os campos está retornando R$ 0,00
Alguém poderia ajudar?
Segue o código:
procedure TDataMod_Tables.AtualizarTotais;
begin
// Verifica se a Conta Pai já está cadastrada
with DataMod_Tables.ADOQuery_Soma_Totais_Despesas do
begin
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Dinheiro
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´DI´´);
Open;
Form_Despesas_Diarias.FTotDin.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cheque
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CH´´);
Open;
Form_Despesas_Diarias.FTotCheque.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cartão de Crédito
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CC´´);
Open;
Form_Despesas_Diarias.FTotCarCred.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
Close;
SQL.Clear;
// Obtem todas as somas de valores de Operações feitas com Cartão de Débito
SQL.Add(´SELECT SUM(DES_VALOR) AS soma FROM Despesas_Diarias WHERE DES_TIPO=:´CD´´);
Open;
Form_Despesas_Diarias.FTotCarDeb.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2);
end;
end;
Alexsandro
GOSTEI 0
Rjun
05/04/2005
Oq vc ta usando ? DBEXpress / ADO/ BDE ? Q banco q é ?
GOSTEI 0
Rjun
05/04/2005
Tira os dois pontos depois do =.
GOSTEI 0
Alexsandro
05/04/2005
Obrigado Rjun,
Foi só tirar os ´:´ que funcionou (parece bobagem, mas como vocês sabem a gente fica ´cego´).
Só que agora tem outro problema: Quando vou executar a Query minha tabela está FILTRADA, ou seja, o usuário só ´enxerga´ registros do Mês corrente. Observei que o QUERY está somando TUDO, inclusive os registros do mês passado. Tem como eu resolver este problema?
ou vou ter que colocar mais uma condição no WHERE?
Muito Obrigado,
Alex
Foi só tirar os ´:´ que funcionou (parece bobagem, mas como vocês sabem a gente fica ´cego´).
Só que agora tem outro problema: Quando vou executar a Query minha tabela está FILTRADA, ou seja, o usuário só ´enxerga´ registros do Mês corrente. Observei que o QUERY está somando TUDO, inclusive os registros do mês passado. Tem como eu resolver este problema?
ou vou ter que colocar mais uma condição no WHERE?
Muito Obrigado,
Alex
GOSTEI 0
Aroldo Zanela
05/04/2005
Colega,
Desculpe a insistência, mas tem certeza que não quer ver o projeto que montei para o seu caso? Acredite, as únicas linhas de código que você vair precisar no Delphi são 4 (quatro):
Honestamente, você está trilhando um caminho mais complexo que o necessário e de menor performance da aplicação.
Quanto a sua pergunta, a resposta é SIM, é necessário utilizar uma restrição de datas na cláusula Where.
Desculpe a insistência, mas tem certeza que não quer ver o projeto que montei para o seu caso? Acredite, as únicas linhas de código que você vair precisar no Delphi são 4 (quatro):
Query.Close; Query.ParamByName(´DataINI´).AsDate := dtpInicio.Date; Query.ParamByName(´DataFIM´).AsDate := dtpTermino.Date; Query.Open;
Honestamente, você está trilhando um caminho mais complexo que o necessário e de menor performance da aplicação.
Quanto a sua pergunta, a resposta é SIM, é necessário utilizar uma restrição de datas na cláusula Where.
GOSTEI 0
Alexsandro
05/04/2005
Oi Aroldo,
Agradeço seu esforço e na realidade estou trilhando a sua SUGESTÃO. No meu caso nao uso firebird, mas Access com ADO (prá iniciante tá bom, rs rs rs). Conforme você sugeriu mudei toda a rotina para QUERY e tentei usar o evento ONDATACHANGE, mas nao funcionou pois no moemnto de criar o Data Module (onde esta a rotina) o evento é chamado e ocorre erro pois como o FORM DE DESPESAS ainda não foi criado ele não consegue atribuir ao campo LABEL. Mudei para o evento AFTERPOST e parece que funciona legal. Só acho que vou precisar chamar tambepm no AFTER DELETE para tratar as DELEÇÕES.
Fiquei com uma dúvida: Você cita questões de performance. Quer dizer que da forma como montei acima não está muito eficiente? Você poderia me sugerir ajuestes para melhorar a eficiência?
Muio Obrigado, estou chegando lá (rs rs)
Alex
Agradeço seu esforço e na realidade estou trilhando a sua SUGESTÃO. No meu caso nao uso firebird, mas Access com ADO (prá iniciante tá bom, rs rs rs). Conforme você sugeriu mudei toda a rotina para QUERY e tentei usar o evento ONDATACHANGE, mas nao funcionou pois no moemnto de criar o Data Module (onde esta a rotina) o evento é chamado e ocorre erro pois como o FORM DE DESPESAS ainda não foi criado ele não consegue atribuir ao campo LABEL. Mudei para o evento AFTERPOST e parece que funciona legal. Só acho que vou precisar chamar tambepm no AFTER DELETE para tratar as DELEÇÕES.
Fiquei com uma dúvida: Você cita questões de performance. Quer dizer que da forma como montei acima não está muito eficiente? Você poderia me sugerir ajuestes para melhorar a eficiência?
Muio Obrigado, estou chegando lá (rs rs)
Alex
GOSTEI 0
Aroldo Zanela
05/04/2005
Colega,
Você está abrindo e fechando a Query excessivamente, o que degrada em muito a performance de sua aplicação. Quanto ao uso do Firebird ainda acho mais recomendável para você, mesmo estando aprendendo, pois lhe colocará mais próximo de desenvolver aplicações corporativas.
Você está abrindo e fechando a Query excessivamente, o que degrada em muito a performance de sua aplicação. Quanto ao uso do Firebird ainda acho mais recomendável para você, mesmo estando aprendendo, pois lhe colocará mais próximo de desenvolver aplicações corporativas.
GOSTEI 0
Aroldo Zanela
05/04/2005
Conforme você sugeriu mudei toda a rotina para QUERY e tentei usar o evento ONDATACHANGE, mas nao funcionou pois no moemnto de criar o Data Module (onde esta a rotina) o evento é chamado e ocorre erro pois como o FORM DE DESPESAS ainda não foi criado ele não consegue atribuir ao campo LABEL. Mudei para o evento AFTERPOST e parece que funciona legal. Só acho que vou precisar chamar tambepm no AFTER DELETE para tratar as DELEÇÕES.
Alex
Colega,
Mantenha no OnDataChange mesmo e coloque o código dentro de um bloco protegido.
Exemplo:
Try procedimentos... except // exceção silenciosa end;
GOSTEI 0
Alexsandro
05/04/2005
Oi Aroldo,
Primeiramente muito obrigado por tudo. Sei que meu código não é dos melhores, mas para um leigo de apenas 1 mês de delphi e por apenas 1 hora ou duas horas ao dia até que está bom não é??? rs rs rs. O melor de tudo é que está funcionando. FINALMENTE consegui fazer a tela apresentar o total do mês gasto em Dinheiro, Cheque, etc. etc.
Tenho planos de daqui a alguns meses modificar este sisteminha que estou fazendo para usar o FIREBIRD, mas no momento quero evitar começar do ZERO, pois já fiz muita coisa entende? A princípio este sisteminha vai ser usado em um Desktop para que a Secretária de um dos executivos da minha empresa possa fazer um controle de Despesas de Viagens e como não precisa de Rede optei pelo Access com ADO. Em Junho, depois de entregar o Sisteminha, vou começar a mudar para o Firebird.
Por isso se você tiver alguma dica de como posso melhorar o código abaixo mas continuando com Access x ADO.
Sobre a sua dica do ONDATACHAGE me perdoe minha ignorância, mas
como SOU MUITO LEIGO, não sei como implementar esta exceção, você poderia me dar mais detalhes? Hoje a rotina abaixo está sendo chamada nos eventos AFTERDELETE e AFTERPOST.
Abaixo segue como o código está funcionando. Espero que possa ajudar outros. São quatro campos na tela do tipo TEDIT que ACUMULAM o total de despesas em DInheiro, Cheque, Cartão de Crédito e Cartão de Débito.
Basicamente criei uma QUERY e passo parâmetros:
Primeiramente muito obrigado por tudo. Sei que meu código não é dos melhores, mas para um leigo de apenas 1 mês de delphi e por apenas 1 hora ou duas horas ao dia até que está bom não é??? rs rs rs. O melor de tudo é que está funcionando. FINALMENTE consegui fazer a tela apresentar o total do mês gasto em Dinheiro, Cheque, etc. etc.
Tenho planos de daqui a alguns meses modificar este sisteminha que estou fazendo para usar o FIREBIRD, mas no momento quero evitar começar do ZERO, pois já fiz muita coisa entende? A princípio este sisteminha vai ser usado em um Desktop para que a Secretária de um dos executivos da minha empresa possa fazer um controle de Despesas de Viagens e como não precisa de Rede optei pelo Access com ADO. Em Junho, depois de entregar o Sisteminha, vou começar a mudar para o Firebird.
Por isso se você tiver alguma dica de como posso melhorar o código abaixo mas continuando com Access x ADO.
Sobre a sua dica do ONDATACHAGE me perdoe minha ignorância, mas
como SOU MUITO LEIGO, não sei como implementar esta exceção, você poderia me dar mais detalhes? Hoje a rotina abaixo está sendo chamada nos eventos AFTERDELETE e AFTERPOST.
Abaixo segue como o código está funcionando. Espero que possa ajudar outros. São quatro campos na tela do tipo TEDIT que ACUMULAM o total de despesas em DInheiro, Cheque, Cartão de Crédito e Cartão de Débito.
Basicamente criei uma QUERY e passo parâmetros:
procedure TDataMod_Tables.AtualizarTotais; begin // Verifica se a Conta Pai já está cadastrada with DataMod_Tables.ADOQuery_Soma_Totais_Despesas do begin Close; // Obtem todas as somas de valores de Operações feitas com Dinheiro Parameters.ParamByName(´TipoDoc´).Value := ´DI´; Open; Form_Despesas_Diarias.FTotDin.Text := FloatToStrF(FieldByName(´SOMA´).AsFloat,ffCurrency,12,2); Close; // Obtem todas as somas de valores de Operações feitas com Cheque Parameters.ParamByName(´TipoDoc´).Value := ´CH´; Open; Form_Despesas_Diarias.FTotCheque.Text := FloatToStrF(FieldByName(´SOMA´).AsFloat,ffCurrency,12,2); Close; // Obtem todas as somas de valores de Operações feitas com Cartão de Crédito Parameters.ParamByName(´TipoDoc´).Value := ´CC´; Open; Form_Despesas_Diarias.FTotCarCred.Text := FloatToStrF(FieldByName(´SOMA´).AsFloat,ffCurrency,12,2); Close; // Obtem todas as somas de valores de Operações feitas com Cartão de Débito Parameters.ParamByName(´TipoDoc´).Value := ´CD´; Open; Form_Despesas_Diarias.FTotCarDeb.Text := FloatToStrF(FieldByName(´soma´).AsFloat,ffCurrency,12,2); end; end;
GOSTEI 0