| 
			
				|  | ActiveDelphi .: O site do programador Delphi! :.
 
 |  
 
	
		| Exibir mensagem anterior :: Exibir próxima mensagem |  
		| Autor | Mensagem |  
		| almir.jg Novato
 
  
 
 Registrado: Quarta-Feira, 3 de Março de 2004
 Mensagens: 87
 
 
 | 
			
				|  Enviada: Sex Mai 23, 2014 1:10 pm    Assunto: DBGRID com Saldo Anterior |   |  
				| 
 |  
				|  Ola para todos   
 Estou construindo um sistema financeiro, neste sistema tenho a conciliação bancária, para cada conta editada tenho um formulário onde são apresentados todos os lançamentos para cada conta, (data, historico, D/C e valor do lancamento). Me falta a coluna com o SALDO ATUAL. É ai que o "bicho pega". Vamos lá então:
 Não estou procurando aqui um calculo para se fazer o Saldo atual, nem criar uma stored procedure para construir esta funcionalidade mas sim, tentando entender "o como fazer" utilizando um CalcFieds, para que este saldo seja apresentado de forma dinamica.
 
  	  | Código: |  	  | procedure TFrmEditConta.qLctBeforeOpen(DataSet: TDataSet);
 begin
 vSaldo_Anterior := qrySLD_ABERTURA.AsCurrency;
 end;
 
 
 | 
 
  	  | Código: |  	  | procedure TFrmEditConta.qLctCalcFields(DataSet: TDataSet);
 begin
 qLctSaldo_Atual.Value := vSaldo_Anterior +     qLctVLR_MOVIMENTO.AsCurrency;
 vSaldo_Anterior := qLctSaldo_Atual.AsCurrency;
 end;
 
 | 
 1)Começo o procedimento criando uma variavel "SALDO ANTERIOR" e populo éla com o saldo desejado.
 2)Criei um campo (CALCULATED) tipo currency "SALDO_ATUAL" na query dos lançamentos.
 3)No CalcFields da query dos lançamentos efetuo o seguinte calculo:
 3.1) Populo o SALDO ATUAL com o valor do SALDO ANTERIOR + o VALOR DO MOVIMENTO.
 3.2) Em seguida repopulo o SALDO_ANTERIOR com o valor do SALDO_ATUAL, para que este saldo anterior possa ser utilizado na proxima linha.
 
 Até este momento tudo ocorreu perfeitamente "como manda o figurino".
 O problema esta quando faço a rolagem do GRID. A variavel SALDO_ANTERIOR perde seu valor e da um efeito em castata para todo o SALDO_ATUAL do GRID.
 
 
      Se alguem tiver uma  me avisem. 
 Algumas premissas para o que estou desenvolvendo:
 1. Tem que ser DBGRID.
 2. Tem que ser de forma dinamica.
 3. Não pode ser stored procedure (o sistema é multi banco)-(ai fica fácil).
 4. Não necessariamente tem que ser no CALCFIELDS.
 
 Talvez o meu entendimendo do funcionamento do CALCFIELDS não seja suficiente para esta implementação.
 
 Ajudas pequenas ou grandes serão bem vindas, só peço que atentem ao enunciado.
 
 Valew.
  |  |  
		| Voltar ao Topo |  |  
		|  |  
		| almir.jg Novato
 
  
 
 Registrado: Quarta-Feira, 3 de Março de 2004
 Mensagens: 87
 
 
 | 
			
				|  Enviada: Sex Mai 23, 2014 5:16 pm    Assunto: Complementando |   |  
				| 
 |  
				| Estou fazendo um estudo sobre o evento CALCFIELDS. Hoje passei a tarde lendo e procurando entendimento sobre o assunto, descobri algumas coisas interessantes que são: Propriedade do DATASET: AutoCalcFields = FALSE --> Determina quando e como o evento ONCALCFIELDS é acionado e, pode ser acionado quando:
 O conjunto de dados é aberto.
 O conjunto de dados é colocado em estado DSEDIT .
 Um registro é recuperado de um banco de dados
 
 AutoCalcFields=TRUE
 Quando o focomuda  de um controle visual para outro
 Quando reordenar a o grid
 Quando alterar a largura de uma coluna, etc.
 
 Se um aplicativo permite que os usuários alterem dados , OnCalcFields é freqüentemente acionado. Nestes casos, um aplicativo pode definir AutoCalcFields para False para reduzir a freqüência com que o evento ocorre OnCalcFields e com os quais a pesquisa valores são buscadas.
 
 CUIDADO: Não faça alterações no DATASET proprietário do CALCFIELDS (dentro dele) isto irá gerar uma chamada recursiva.
 
 
   
   
 Fonte: http://docwiki.embarcadero.com/Libraries/XE5/en/Data.DB.TDataSet.AutoCalcFields
 
 Bem hoje aprendi mais um pouco e resolvi compartilhar.
 
 Ainda não desisti de tentar obter o efeito desejado através deste evento.
 
 Escreva, coloque a sua mensagem.
  |  |  
		| Voltar ao Topo |  |  
		|  |  
		|  |  
  
	| 
 
 | Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido
 Editar Mensagens: Proibido.
 Excluir Mensagens: Proibido.
 Votar em Enquetes: Proibido.
 
 |  |