É uma rotina meio básica.
Tem um arquivo com contas, e outra com movimentação.
A rotina vai recalcular os saldos.
Esta funciona, pego uma conta de cada vez do cadastro de contas, pesquiso na movimentação pra fazer os cálculos.
#include "inkey.ch"
FUNCTION f_orgCx()
LOCAL nSaldo, cConta, nKey := 0
IF ! MsgNoYes( "Processo demorado. Confirma recalculo?" )
RETURN NIL
ENDIF
IF ! AbreArquivos( "BCAIX", "BMVCX" )
RETURN NIL
ENDIF
Mensagem( "Recalculando" )
SELECT BMVCX
SET ORDER TO 4
SELECT BCAIX
GOTO TOP
DO WHILE nKey != K_ESC .AND. ! Eof()
nSaldo := BCAIX->VALOR_INI
SELECT BMVCX
SEEK BCAIX->Cd_Caixa
DO WHILE nKey != K_ESC .AND. BCAIX->Cd_Caixa == BMVCX->Cd_Caixa .AND. ! Eof()
nKey := Inkey()
nSaldo := nSaldo + iif( BMVCX->Flag == "C", BMVCX->Lan_Valor, 0 ) - iif( BMVCX->Flag == "D", BMVCX->Lan_Valor, 0 )
IF BMVCX->Vl_Saldo != nSaldo // tentar agilizar
BMVCX->( RecLock() )
REPLACE BMVCX->Vl_Saldo WITH nSaldo
BMVCX->( RecUnlock() )
ENDIF
SKIP
ENDDO
SELECT BCAIX
RecLock()
REPLACE ;
BCAIX->Vl_Saldo WITH nSaldo, ;
BCAIX->Dt_Saldo WITH Date()
RecUnlock()
SKIP
ENDDO
CLOSE DATABASES
MsgExclamation( "Recalculo Efetuado" )
RETURN NIL
Pra colocar gráfico de tempo, coloquei pra processar pelo arquivo de movimentação.
#include "inkey.ch"
FUNCTION f_orgCx()
LOCAL nSaldo, cConta, nKey := 0
IF ! MsgNoYes( "Confirma recalcular caixa?" )
RETURN NIL
ENDIF
IF ! AbreArquivos( "BCAIX", "BMVCX" )
RETURN NIL
ENDIF
SELECT BMVCX
bmvcx->( dbSetOrder(4) )
bmvcx->( dbGoTop() )
nAtual := 0
nTotal := bmvcx->( LastRec() )
SayScroll( "Iniciando do while" )
SayScroll("")
DO WHILE nKey != K_ESC .AND. ! bmvcx->( Eof() )
cConta := BMVCX->cd_Caixa
BCAIX->( dbSeek( BMVCX->cd_Caixa ) )
nSaldo := BCAIX->VALOR_INI
SayScroll( "Conta " + cConta )
SayScroll("")
SayScroll( "vai iniciar o do while" )
SayScroll("")
DO WHILE nKey != K_ESC .AND. cConta == BMVCX->Cd_Caixa .AND. ! BMVCX->( Eof() )
SayScroll( "dentro do do while" )
SayScroll( "data " + Dtoc( BMVCX->Data ) + " " + Str( BMVCX->( RecNo() ) ) )
SayScroll("")
nKey := Inkey()
nSaldo := nSaldo + iif( BMVCX->Flag == "C", BMVCX->Lan_Valor, 0 ) - iif( BMVCX->Flag == "D", BMVCX->Lan_Valor, 0 )
IF BMVCX->Vl_Saldo != nSaldo // tentar agilizar
BMVCX->( RecLock() )
REPLACE BMVCX->Vl_Saldo WITH nSaldo
BMVCX->( RecUnlock() )
ENDIF
BMVCX->( dbSkip() )
ENDDO
SELECT BCAIX
BCAIX->( RecLock() )
REPLACE ;
BCAIX->Vl_Saldo WITH nSaldo, ;
BCAIX->Dt_Saldo WITH Date()
BCAIX->( RecUnlock() )
SELECT BMVCX
ENDDO
CLOSE DATABASES
MsgExclamation( "Recalculo Efetuado" )
RETURN NIL
Coloquei várias mensagens pra tentar descobrir o problema.
Não entra no DO WHILE, dá erro fatal e o Flagship aborta, sem referência aonde foi o erro.
Durante o post pensei numa possibilidade.... atualizar saldo de conta que não existe no cadastro.....
Nota:
No Harbour sem problemas, o erro é só no Flagship (Pelo menos esta versão antiga, deveria se chamar FlagSHIT)