Fórum Dúvida sobre campos que acumulam valores - 4a. Tentativa #275564
05/04/2005
0
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
Curtir tópico
+ 0Posts
05/04/2005
Rjun
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
05/04/2005
Marcelo Saviski
Gostei + 0
05/04/2005
Alexsandro
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
05/04/2005
Catunda
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
05/04/2005
Rjun
Gostei + 0
05/04/2005
Edilcimar
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
05/04/2005
Alexsandro
Obrigado pelas dicas. mas ainda não sei em qual evento devo chamar as Queries que fazem a soma?
Obrg.
Alex
Gostei + 0
05/04/2005
Aroldo Zanela
É 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
05/04/2005
Alexsandro
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
05/04/2005
Rjun
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
05/04/2005
Alexsandro
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
05/04/2005
Rjun
Gostei + 0
05/04/2005
Rjun
Gostei + 0
05/04/2005
Alexsandro
Ou vou ter que tratar o BEFOREDELETE, BEFOREPOST, ETC. ETC.
oBRG.
Alex
Gostei + 0
05/04/2005
Rjun
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)