Página 1 de 1

Problema com Flagship

Enviado: 27 Jan 2019 21:04
por JoséQuintas
To falando que esse troço é esquisito....

É 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.

Código: Selecionar todos

#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.

Código: Selecionar todos

#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)

Problema com Flagship

Enviado: 27 Jan 2019 21:18
por JoséQuintas
Eureka, era aquilo mesmo! No Flagship não pode atualizar quando em Eof().

Mas aproveitando... a diferença entre Windows e Linux.
No Linux, trabalhar com DBF é bem mais rápido.
flagship.png

Problema com Flagship

Enviado: 27 Jan 2019 21:29
por JoséQuintas
flagship.png
No Flagship/Linux terminou em 11 minutos.
No Harbour/Windows, já se passaram 15 minutos e ainda vão mais 27 minutos.
O Linux está em uma máquina virtual, estou acessando remoto.
Já no Windows é local, máquina exclusiva.

Problema com Flagship

Enviado: 27 Jan 2019 21:50
por JoséQuintas
harbourlinux.png
Já que estava testando e tinha que aguardar terminar.....

Fiz um teste com Harbour no Microsoft Linux.

De 42 minutos pra 11 minutos a diferença já era grande....
Mas 1 único minuto... aí é pra ficar triste....

Exatamente mesmos arquivos no Windows 10, mesmos fontes, mesmo Harbour 3.4 - inclusive acesso simultâneo aos mesmos arquivos.
Um rodando no prompt Windows e outro no prompt Linux/Windows.
De 42 minutos pra 1 minuto.

Dá o que pensar....