Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) CALCULAR SALDO COM O EVENTO ONCALCFIELDS


nilegor

Pergunta

Olá, preciso calcular o saldo conforme entradas e saidas anteriores, exemplo:

ENTRADA   SAIDA   SALDO
     100            0         100
      50             0         150
        0            20        130

Ou seja, preciso buscar o valor do saldo anterior e calcular o proximo saldo através da entrada e saida. Procurei inumeros exemplos na internet para poder fazer isso mas sem exito. Já pensei em utilizar uma trigger no banco, mas também encontrei dificuldades para buscar o valor do saldo anterior e ir calculando os proximos saldos. Por gentileza preciso de uma luz. Obrigado.

 

AVISO: dúvidas devem ser colocadas no forum principal ( Delphi ) e não no forum Tutoriais e Dicas ..ok ?

 

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Certo, mas utilizando o sum vou conseguir o valor do saldo de um dia, ok. Mas preciso que o calculo do proximo saldo seja o saldo anterior + entrada - saida do registro atual. Em um dia vai ter inumeras linhas com entrada e saida e o saldo atual de cada linha inserida no "caixa". Então acredito que seja mais facil utilzar o evento  onCalcFields do data set. Mas se for pra usar comando SQL, como pego o saldo anterior e faço o calculo para o dia atual ? Lembrando que toda a tabela será atualizado, pois se alterar algum registro no meio da tabela, todo o saldo abaixo vai ter que ser recalculado, linha a linha conforme as entradas e saida.

Link para o comentário
Compartilhar em outros sites

  • 0

Certo, mas utilizando o sum vou conseguir o valor do saldo de um dia, ok.

não necessariamente....( pode ser por períodos ) o exemplo que voce viu, foi usado data como parametro para efetuar a soma de um valor

voce tem valores de entrada e de saida, então creio que esses valores sejam efetuados por data, assim como, voce faz vendas, e coloca datas para identificar quando foram feitas.

se não quiser usar datas, voce pode pegar todos os registros que estão na tabela e somar tambem

SQL SUM() Syntax

SELECT SUM(column_name) FROM table_name;

 

exemplo:

Select sum (entrada) as ValorEntra from Tabela

nesse exemplo, vai ser somado todas as colunas do campo entrada da tabela e o valor será colocado em ValorEntra

OBS: me informe qual componente voce esta usando ( TQuery, IBQuery, ZQuery...etc ) e a versão do seu Delphi, para que eu possa te passar um exemplo prático.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, estou usando delphi xe6, firebird e componentes : sql_query + provider + clientDataSet + dataSource. O comando eu compreendi, sei como usar ele buscando como parametro uma data, mas veja na imagem em anexo, eu quero mostrar no grid para o usuario isso direto na tela, sem precisar gerar um relatório, se for alterado um valor de entrada ou saida em qualquer linha na tabela de movimentos (caixa do sistema), já seja recalculado o saldo de cada linha de cada data, (TODA A COLUNA SALDO). Qual seria a melhor forma de fazer isso ?

caixa.PNG

Link para o comentário
Compartilhar em outros sites

  • 0

Qual seria a melhor forma de fazer isso ?

SELECT DATA, ENTRADA, SAIDA, SUM(ENTRADA - SAIDA) AS SALDO
FROM TABELA
GROUP BY DATA, ENTRADA, SAIDA

OBS: o problema é que isso vai ser feito em cada linha de registro da tabela e vai acrescentar um campo na tabela chamado SALDO

No entanto o resultado seria:

100-----0------100

0------50------(-50)

100-----0----- 100

50------0------  50

50------0------ 50

então não ficaria como voce quer .... 

De forma análoga, ao select seria o uso do evento OnCalcFields, que seria assim: 

exemplo:

Query1SALDO.Value := Query1ENTRADA.Value - Query1SAIDA.Value

===============================================================

então uma solução seria voce colocar uma rotina num botão, para fazer uma varredura ( FOR ) nos registros que voce esta visualizando no DBgrid e ir somando o campo ENTRADA e ir subtraindo da soma do campo SAIDA

tipo assim:

procedure TForm1.Button1Click(Sender: TObject);
var i : integer; entra, sai : real;
begin

   entra := 0; sai := 0;
   Query1.Active := true;
   for i := 1 to Query1.RecordCount do
      begin
         entra := entra + Query1ENTRADA.Value;
         sai := sai + Query1SAIDA.Value;
         Query1.Edit;
         Query1SALDO.Value := entra - sai;

         // Query1.Post;   ///// usado se o campo SALDO existir na tabela
         Query1.Next;
      end;
end;

====================================================

voce pode tentar modificar o seu código com base nesse raciocinio

abraço

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Ok. Usando o evento no botão deu certo, calcula certinho, porém o data set vai até o fim fazendo o calculo e consequentemente o grid vai ao fim. Por tal motivo seria mais interesante utilizar o evento  OnCalcFields , pois ai se for alterado qualquer valor, acredito que não vá mecher o grid, ou vai também ? Pois colocando :

ClientDataSet_caixaSALDO.Value := ClientDataSet_caixaENTRADA.Value - ClientDataSet_caixaSAIDA.Value;   

.. Não soma o saldo anterior. No evento  OnCalcFields  não têm como buscar o saldo anterior para calcular o próximo saldo ? A dificuldade na verdade é usa o while no evento OnCalcFields  !

Link para o comentário
Compartilhar em outros sites

  • 0

.. Não soma o saldo anterior. No evento  OnCalcFields  não têm como buscar o saldo anterior para calcular o próximo saldo ? A dificuldade na verdade é usa o while no evento OnCalcFields  !

agora que voce mencionou é que me lembrei .. o evento OnCalcFields  funciona como um while e nesse caso voce pode fazer isso

crie um campo calculado na tabela ( SALDO ) 

var
  Form1: TForm1;
  ENT : REAL = 0;
  SAI : REAL = 0;
implementation

{$R *.dfm}

procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
   ENT := ENT + Query1ENTRADA.Value;
   SAI := SAI + Query1SAIDA.Value;
   Query1SALDO.Value := ENT - SAI;
end;

creio que dessa forma vai fazer como voce quer

abraço

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...