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
controle financeiro
Moderador: Moderadores
controle financeiro
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
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
controle financeiro
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
controle financeiro
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.
É 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.
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.
