Somar Itens DbGrid Automaticamente

Delphi

07/07/2005

Oi pessoal!
Tenho um dbgrid com os itens da venda e tenho um edit com o total da venda. Gostaria que fosse mostrado na tela no edit total da venda a soma de todos os itens do dbgrid. Exemplo: A venda começa zerada e toda vez que o usuario vai acrescentando itens no grid o campo valor total vai sendo atualizado. Hoje so faço isso no momento que o usuario salva, porque ai chamo uma procedure que faz esse calculo pra mim, mas o ideal seria que aparecesse pra ele na hora que ele vai vendendo..
Agradeço desde já.


Tcarvalho

Tcarvalho

Curtidas 0

Respostas

Eixox

Eixox

07/07/2005

Crie uma SQL mais ou menos assim:

  SELECT SUM(CampoQueTemOTotal), COUNT(CódigoMestre) 
  FROM TabelaDetalhes  //Que contém os itens da venda
  WHERE CódigoDoPedido = :CódigoMestre


O que vai acontecer é o seguite:

1 - Quando você abrir o pedido de venda, jogue o valor para essa consulta
2 - Essa consulta deve ser executada toda a vez que um usuário executar uma tarefa de inclusão e exclusão.

Nos três eventos da tabela (AfterDelete, AfterPost) execute a consulta da seguinte forma
   SQLTotalDaVenda.Active := False;
   SQLTotalDaVenda.Params(´CódigoMestre´).AsInterger := TaTabelaMestreCODIGOMASTER.Value;
   SQLTotalDaVenda.Active := True;


Acho que isso resolve teu problema.
Quando fechar o pedido não esqueçe de fechar a consulta. Para colocar no form você sabe como faz né - isso é o básico.

Eixox -|-


GOSTEI 0
Tcarvalho

Tcarvalho

07/07/2005

Bom dia!
Obrigado pela atenção amigo, mas desse jeito que vc disse so funciona se ja houver dados na venda. O que eu queria eh no momento de que o usuario começa a vender, mas ainda nao finalizou a venda, quando ele for escolhendo os itens o valor total seja incrementado...Tipo um supermercado, sabe??Quando vc vai no caixa e a medida que os produtos vao sendo incluidos na venda, aparece o total ate aquele momento.
Ex: Item 1 = 10,00 - Total = 10,00
Item 2 = 5,00 - Total = 15,00
Item 3 = 20,0 - Total = 35,00

Agradeço novamente a atenção

T+


GOSTEI 0
Eixox

Eixox

07/07/2005

O negócio é o seguinte:

Quando você começa a fazer uma venda, não existe nenhum dado na tabela. Isso quer dizer que o valor que será mostrado para seu cliente será R$ 0,00.

Quando o primeiro item for registrado (inserido) na tabela de detalhes ele começa a somar. Da forma que você quer. Igual ao supermercado. No supermercado, existe um outro problema que, os itens não são enviados diretamente para impressora por causa da encrenca do estorno. Após a impressão no ECF para estornar o produto é uma caixa de abelha.

O que acontece então, quando todos os itens são vendidos, eles passam a ser retirados automaticamente do estoque e segue para a posterior impressão no ECF.

No seu caso, o que você solicitou foi o que eu enviei para você. Você abre o pedido de compra e ele calcula automaticamente o total de todos os produtos. Se você quer fazer isso com os itens, só vai atrasar a sua vida - tipo Registra a quantidade depois o valor e finalizar com o cálculo de quantidade X valorUnitário e depois Somatiza tudo.

Veja bem o que você falou:

´ Exemplo: A venda começa zerada e toda vez que o usuario vai acrescentando itens no grid o campo valor total vai sendo atualizado. Hoje so faço isso no momento que o usuario salva, porque ai chamo uma procedure que faz esse calculo pra mim, mas o ideal seria que aparecesse pra ele na hora que ele vai vendendo.´


Um elemento só pode ser contabilizado no momento efetivo da transação e não por uma questão temporal. Até porque pode gerar um falso resultado para o seu cliente. Dá a impressão de que alguma coisa está errada.

Da forma como lhe passei, acredito que é a forma que a grande maioria faz.

Eixo x -|-


GOSTEI 0
Silviogs

Silviogs

07/07/2005

Olá

já fiz uma vez, tente desta maneira.


procedure TFmCadPedidos.AtualizaTotaisItems;
var
SomaItems, SomaDesconto : Real;
RecAnterior : TBookmark;
begin
   Recanterior := DataModule1.Items.GetBookmark;
   DataModule1.Items.Disablecontrols;
   try
      DataModule1.Items.First;
      SomaItems := 0;
      SomaDesconto := 0;
      while not DataModule1.Items.Eof do begin
         SomaItems := SomaItems + DataModule1.ItemsValorTotal.Value;
         SomaDesconto := SomaDesconto + DataModule1.ItemsDesconto.Value;
         DataModule1.Items.Next;
      end;
      DataModule1.Pedidos.Edit;
      DataModule1.PedidosTotalItens.Value    := SomaItems;
      DataModule1.PedidosTotalDesconto.Value := SomaDesconto;
      DataModule1.PedidosTotalPago.Value     := SomaItems - SomaDesconto;
   finally
      DataModule1.Items.Enablecontrols;
      if RecAnterior <> nil then begin
         DataModule1.Items.GotoBookmark(RecAnterior);
         DataModule1.Items.FreeBookmark(RecAnterior);
      end;
   end;
   DataModule1.Items.First;
end;


todas as vezes que era confirmado o item para o pedido ou venda executava esta rotina.

Atenciosamente

Silvio Guedes


GOSTEI 0
POSTAR