controle financeiro

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

controle financeiro

Mensagem por MARCELOG »

Olá pessoal,
estou concluindo um controle financeiro pessoal.
Ele utiliza contas/ categorias de origem e destino para apurar valores e saldos.
Entretanto, a cada lançamento (ou pesquisa) vai ser necessário percorrer toda a base de dados para estabelecer novos valores e saldos.
Gostaria de minimizar o custo do processamento.
Alguém tem alguma dica de como fazê-lo?

Desde já obrigado!

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

controle financeiro

Mensagem por HASA »

:))
Olá Marcelo, eu faço assim e tem funcionado BEM, caso melhore a função da um toque ai, ok :)Pos

Código: Selecionar todos


FUNCTION LANCA_BANCO( VER, CONTA, XTP , XPLAKA ) 

//  ver = dedito ou credito
// CONTA = conta corrente
// XTP = historico
// XPLAKA = uma referencia

*****
DBSELECTAREA("LANCTOS")
*****

DBAppend()
LANCTOS->DT          := CAIXA->DTBAIXA
LANCTOS->OPERACAO    := VER
LANCTOS->TP          := XTP
LANCTOS->VALOR       := CAIXA->VRPAGO
LANCTOS->HISTORICO   := CAIXA->CODIGO +" "+ SUBS( CAIXA->SACADO, 1, 28 )
LANCTOS->PLAKA       := XPLAKA
LANCTOS->CONTACORR   := CONTA
DBCOMMIT()
DBUnlock()

*****
DBSELECTAREA("LANCTOS")
*****
DBSETORDER( 1 )
SET FILTER TO LANCTOS->CONTACORR = PADR( CONTA, 13 )
DBGOTOP()
DBSEEK( PADR( CONTA , 13 ) + DTOS( CAIXA->DTBAIXA ) )

M->I_REG = RECNO()
*
* PEGO O SALDO ANTERIOR *
DBSKIP( -1 )

IF BOF()
   SAL_DO := 0
ELSE
   SAL_DO := LANCTOS->SALDO
ENDIF

* VOLTO PARA PUXAR O SALDO ATUAL *
*
GOTO M->I_REG

SAL_DO = IIF( LANCTOS->OPERACAO = 'C',( SAL_DO + LANCTOS->VALOR ), ( SAL_DO - LANCTOS->VALOR ) )

L=1

DO WHILE .NOT. EOF()
   *
   IF L=2
      SAL_DO = IIF( LANCTOS->OPERACAO = 'C',( SAL_DO + LANCTOS->VALOR ), ( SAL_DO - LANCTOS->VALOR ) )
   ENDIF
   *** Bloqueia registro na rede
   If BloqueiaRegistroNaRede( "LANCTOS" )
      REPLACE SALDO WITH SAL_DO
   ELSE
      LOOP
   ENDIF
   DBUnlock()
   L=2
   DBSKIP()
ENDDO

DBCOMMITALL()

SET FILTER TO

RETURN NIL

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

controle financeiro

Mensagem por rochinha »

Amiguinhos,

No meu caso houve uma necessidade de ter outro controle sobre os lançamentos e portanto criei o arquivo de saldos o qual contem todas as informações de cada conta como tipo(conta bancaria, conta de clientes, etc), dados de agencia, blablabla e saldos(real e conciliado)

Logico que existe a necessidade de percorrer os dados para um recalculo, mas ao filtrar os dados de uma certa conta voce já estará reduzindo o limite de registros.

Ainda no meu caso é efetuado uma abertura de caixa e fechamento diário, assim os recalculos trabalham sobre um leque menor.

A cada abertura, transporto o ultimo saldo e este tipo de registro fica como sendo de auditoria e não Débito ou Crédito.

Então dinamize a criação do indice, CONTA+DATA e faça uso intenso de filtragens com escopo.

Ao tocar no assunto me lembrei que esqueci de agregar ao meu indice a HORA na ordenação ficando, CONTA+DATA+HORA em cada lancamento.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

controle financeiro

Mensagem por Stanis Luksys »

Olá,

É por conta disso que muita empresas usam o conceito de saldos consolidados, fechamento diário, mensal, essas cosias.

Acho que uma boa idéia é ter uma outra tabela com todos os consolidados, por exemplo, você tem um campo de valor acumulado para tal conta, quando faz alguma operação nela, além de tudo que você faz hoje, neste campo você só incrementa o resultado desta operação, entendeu?

Você fica com um campo só que te da o saldo atual. Qualquer consulta rápida é nele que você busca. Se o sistema nao ficar caindo ou com bugs, vai ficar sempre atualizado. De tempo em tempo, por segurança, você executa uma rotina de recálculo, que reprocessa todos os itens e joga lá o valor. Cria um log com a diferença etc e tal.

Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Responder