Página 2 de 2

Alterar campo de um DBF via sistema

Enviado: 21 Jul 2020 06:30
por mimran
Altere a cadeia de conexão após a instalação do provedor VFP OLE DB.

Alterar campo de um DBF via sistema

Enviado: 21 Jul 2020 14:34
por JoséQuintas
Itamar M. Lins Jr. escreveu:Eu nem sabia que era assim o VARIANTE. O campo aceita tudo, qualquer coisa: DATE/LOGICAL/NUMERIC/CHAR
Cheguei a ver isso na SIXCDX para o Clipper 5.2
Achei perigoso o uso, porque trata-se de um campo MEMO.
Ainda bem que nunca usei, porque teria acabado com o aplicativo obrigando MEMO.
No Harbour deve funcionar.
numero.png
Uma grande coincidência, exatamente do ponto flutuante.
Minha rotina de recálculo ficou demorada.

Motivo: PONTO FLUTUANTE

Número igual está dizendo que é diferente.

NÃO se trata de arredondamento em divisão/multiplicação, apenas a simples SOMA, com DUAS DECIMAIS.

Agora imagine um INT() multiplicando por 100, pode ser meio imprevisível, e dar diferença de 1.

Alterar campo de um DBF via sistema

Enviado: 21 Jul 2020 14:42
por JoséQuintas
Pensei que ia atrapalhar.
Alterei pra isto:

Código: Selecionar todos

IF Str( :Number( "BASALDO" ), 16, 2 ) != Str( nSaldo, 16, 2 )
Alterou de 5 minutos pra meio segundo !!!!!
Trocentas mil vezes mais rápido !!!!

É porque se for igual, não precisa gravar nada....

Foi uma grande coincidência, relacionada com isso dos números, que acabou de acontecer.

É o bancário que estou convertendo pra MySQL. A rotina foi esta:

Código: Selecionar todos

FUNCTION BARecalcula() // , dDataInicial, m_RecGeral )

   LOCAL cConta, cAplic, nSaldo, dBanco, dEmissao, cImpSld
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   Mensagem( "Recalculando" )
   WITH OBJECT cnSQL
      :cSQL := "SELECT BACONTA, BAAPLIC, IDBANCARIO, BADATBAN, BADATEMI, BAVALOR, BASALDO, BAIMPSLD" + ;
         " FROM JPBANCARIO" + ;
         " ORDER BY BACONTA, BAAPLIC, BADATBAN, BADATEMI, IDBANCARIO"
      :Execute()
      GrafTempo( "Fase1" )
      DO WHILE ! :Eof()
         cConta := :String( "BACONTA" )
         cAplic := :String( "BAAPLIC" )
         nSaldo := 0
         DO WHILE cConta == :String( "BACONTA" ) .AND. cAplic == :String( "BAAPLIC" ) .AND. ! :Eof()
            GrafTempo( :AbsolutePosition(), :RecordCount() )
            nSaldo += :Number( "BAVALOR" )
            IF Str( :Number( "BASALDO" ), 16, 2 ) != Str( nSaldo, 16, 2 )
               :QueryCreate()
               :QueryAdd( "BASALDO", nSaldo )
               Encontra( StrZero( :Number( "IDBANCARIO" ), 6 ), "jpbancario", "primary" )
               jpbancario->( :DBFQueryExecuteUpdate() )
               :QueryExecuteUpdate( "JPBANCARIO", "IDBANCARIO = " + NumberSQL( :Number( "IDBANCARIO" ) ) )
            ENDIF
            :MoveNext()
         ENDDO
      ENDDO
      :CloseRecordset()
      :cSQL := "SELECT BACONTA, BAAPLIC, IDBANCARIO, BADATBAN, BADATEMI, BAVALOR, BASALDO, BAIMPSLD" + ;
         " FROM JPBANCARIO" + ;
         " ORDER BY BACONTA DESC, BAAPLIC DESC, BADATBAN DESC, BADATEMI DESC, IDBANCARIO DESC"
      :Execute()
      GrafTempo( "Fase 2" )
      dBanco   := Ctod("")
      dEmissao := Ctod("")
      cConta   := :String( "BACONTA" )
      cAplic   := :String( "BAAPLIC" )
      DO WHILE ! :Eof()
         GrafTempo( :AbsolutePosition(), :RecordCount() )
         IF cConta != :String( "BACONTA" ) .OR. ;
            cAplic != :String( "BAAPLIC" ) .OR. ;
            dBanco != :Date( "BADATBAN" ) .OR. ;
            ( dBanco = Stod( "29991231" ) .AND. dEmissao != :Date( "BADATEMI" ) )
            cImpSld := "S"
         ELSE
            cImpSld := "N"
         ENDIF
         IF :Number( "BAVALOR" ) == 0
            cImpSld := "N"
         ENDIF
         IF :String( "BAIMPSLD" ) != cImpSld
            :QueryCreate()
            :QueryAdd( "BAIMPSLD", cImpSld )
            jpbancario->( Encontra( StrZero( :Number( "IDBANCARIO" ), 6 ), "jpbancario", "primary" ) )
            jpbancario->( :DBFQueryExecuteUpdate() )
            :QueryExecuteUpdate( "JPBANCARIO", "IDBANCARIO = " + NumberSQL( :Number( "IDBANCARIO" ) ) )
         ENDIF
         cConta   := :String( "BACONTA" )
         cAplic   := :String( "BAAPLIC" )
         dBanco   := :Date( "BADATBAN" )
         dEmissao := :Date( "BADATEMI" )
         :MoveNext()
      ENDDO
      :CloseRecordset()
   ENDWITH

   RETURN .T.