Alterar campo de um DBF via sistema

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

Moderador: Moderadores

mimran
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 13 Jul 2020 07:12
Localização: Oregon, USA

Alterar campo de um DBF via sistema

Mensagem por mimran »

Altere a cadeia de conexão após a instalação do provedor VFP OLE DB.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Alterar campo de um DBF via sistema

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Alterar campo de um DBF via sistema

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder