GARANTIR DESCONTO

Fórum Dúvida sobre campos que acumulam valores - 4a. Tentativa #275564

05/04/2005

0

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


Alexsandro

Alexsandro

Responder

Posts

05/04/2005

Rjun

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.


Responder

Gostei + 0

05/04/2005

Marcelo Saviski

Se é a 4a. Tentativa, vc poderia ter postado uma resposta nos outros tópicos que criou, não precisava criar um novo


Responder

Gostei + 0

05/04/2005

Alexsandro

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


Responder

Gostei + 0

05/04/2005

Catunda

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....


Responder

Gostei + 0

05/04/2005

Rjun

Contador é uma variável qualquer que irá receber os valores que voce quer acumular.


Responder

Gostei + 0

05/04/2005

Edilcimar

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


Responder

Gostei + 0

05/04/2005

Alexsandro

Pessoal,

Obrigado pelas dicas. mas ainda não sei em qual evento devo chamar as Queries que fazem a soma?

Obrg.

Alex


Responder

Gostei + 0

05/04/2005

Aroldo Zanela

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.


Responder

Gostei + 0

05/04/2005

Alexsandro

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


Responder

Gostei + 0

05/04/2005

Rjun

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.


Responder

Gostei + 0

05/04/2005

Alexsandro

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


Responder

Gostei + 0

05/04/2005

Rjun

Que banco voce ta usando ?


Responder

Gostei + 0

05/04/2005

Rjun

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.


Responder

Gostei + 0

05/04/2005

Alexsandro

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


Responder

Gostei + 0

05/04/2005

Rjun

Voce pode criar uma função unica e chamar ela nesses eventos.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar