Página 1 de 1

E na última parte ..... bug?

Enviado: 10 Fev 2020 15:27
por JoséQuintas
nfnotfis.png
Está indicando que o conteúdo 57027 é diferente de 57027....
Comparar usando STR()... piorou....

Código: Selecionar todos

            CASE xField == "IDNOTFIS" .AND. xValue != StrZero( :Number( xField ), 6 )
               lOk := .F.
               SayScroll( jpnotfis->idNotFis + " - ID - [" + jpnotfis->idNotFis + "] - [" + StrZero( :Number( xField ), 6 ) + "]" )
Por mais que eu recompile, isso não entra no EXE....
Já apaguei o EXE, a pasta temporária com fontes C, etc, e o EXE não muda.

Mistérios....

Importante:
Além de comparar com StrZero(x, 6 ) TAMBÉM é pra mostrar com StrZero( x, 6 )

Parece meio esquisito, mas só resta reiniciar o Windows....

E na última parte ..... bug?

Enviado: 10 Fev 2020 15:44
por JoséQuintas
Sim... bug.... do programador....

Parecia certo, mas não estava...

Código: Selecionar todos

CASE xField == "IDNOTFIS" .AND. xValue != StrZero( :Number( xField ), 6 )
Isso fazia com que fosse usada outra condição, quando o número fosse igual.
Agora sim:

Código: Selecionar todos

            CASE xField == "IDNOTFIS"
               IF xValue != StrZero( :Number( xField ), 6 )
                  lOk := .F.
                  SayScroll( jpnotfis->idNotFis + " - ID - [" + jpnotfis->idNotFis + "] - [" + StrZero( :Number( xField ), 6 ) + "]" )
               ENDIF
Quando era igual, entrava na análise genérica como string.
Justo esse campo, é string no DBF e numérico no MySQL, por isso precisa comparar diferente.
E não dava erro ao entrar na validação como string.

Código: Selecionar todos

STATIC FUNCTION Update0210A()

   LOCAL xValue, xField, xType, nCont, lOk, nTotal
   LOCAL cnMySql := ADOClass():New( AppConexao() )

   IF AppConexao() == NIL
      RETURN NIL
   ENDIF
   SayScroll( "2020/02/10 Apagando DBF JPNOTFIS" )

   IF ! UseSoDbf( "jpnotfis", .T. )
      RETURN NIL
   ENDIF
   GrafTempo( "JPNOTFIS.DBF" )
   DO WHILE RecNo() < 1000 .AND. ! Eof()
      GrafTempo( RecNo(), LastRec() )
      WITH OBJECT cnMySql
         :cSql := "SELECT * FROM JPNOTFIS WHERE IDNOTFIS = " + StringSql( jpnotfis->IdNotFis )
         :Execute()
         lOK := .T.
         FOR nCont = 1 TO FCount()
            xValue := FieldGet( nCont )
            xField := Upper( FieldName( nCont ) )
            xType  := ValType( xValue )
            DO CASE
            CASE xField == "IDNOTFIS"
               IF xValue != StrZero( :Number( xField ), 6 )
                  lOk := .F.
                  SayScroll( jpnotfis->idNotFis + " - ID - [" + jpnotfis->idNotFis + "] - [" + StrZero( :Number( xField ), 6 ) + "]" )
               ENDIF
            CASE xType == "N"
               IF xValue != :Number( xField )
                  lOk := .F.
                  SayScroll( jpnotfis->idNotFis + " - " + xField + " - [" + Str( xValue ) + "] - [" + Str( :Number( xField ) ) + "]" )
               ENDIF
            CASE xType == "D"
               IF xValue != :Date( xField )
                  lOk := .F.
                  SayScroll( jpnotfis->idNotFis + " - " + xField + "- [" + Dtoc( xField ) + "] - [" + Dtoc( :Date( xField ) ) + "]" )
               ENDIF
            OTHERWISE
               IF Trim( xValue ) != :String( xField )
                  lOk := .F.
                  SayScroll( jpnotfis->idNotFis + " - " + xField + " - [" + xValue + "] - [" + :String( xField ) + "]" )
               ENDIF
            ENDCASE
            IF ! lOk
               EXIT
            ENDIF
         NEXT
         :CloseRecordset()
      ENDWITH
      IF lOK
         RecLock()
         DELETE
         RecUnlock()
      ENDIF
      SKIP
   ENDDO
   COUNT TO nTotal
   PACK
   CLOSE DATABASES
   SayScroll( "QT NFs Processadas " + Str( LastRec() - nTotal ) )
   Inkey(100)

   RETURN NIL
É um DBF que vou apagar.
Por precaução, antes de apagar de vez, estou comparando com o salvo no MySQL.

E na última parte ..... bug?

Enviado: 10 Fev 2020 16:18
por JoséQuintas
E mais outra alteração, pra comparar direito:

troquei x != y
por ! x == y

parece a mesma coisa, mas não é.

"ABA" = "A" retorna verdadeiro, enquanto "ABA" == "A" retorna falso

"ABA" != "A" retorna falso, enquanto ! "ABA" == "A" retorna verdadeiro

Só aproveitei que lembrei disso, pra também lembrar aos demais, pra não parecer mais outro bug... rs

E na última parte ..... bug?

Enviado: 11 Fev 2020 18:30
por asimoes
Isso vale para comparar número ?

E na última parte ..... bug?

Enviado: 12 Fev 2020 13:30
por rossine
Boa tarde,

Para comparar números eu bolei uma função.

Código: Selecionar todos

*************
function main
*************

local aRet

cls

nVar1 := 10.45
nVar2 := 10.453

? COMPARA_NUM( nVar1, nVar2, 10, 2, @aRet, 2 )

? hb_valtoexp(aRet)

nVar1 := 10.45
nVar2 := 10.457

? COMPARA_NUM( nVar1, nVar2, 10, 2, @aRet, 2 )

? hb_valtoexp(aRet)

return NIL

********************
function COMPARA_NUM( nNum1, nNum2, nInt, nDec, aRet, nRound )
********************

   __DefaultNIL( @nInt, 16 )
   __DefaultNIL( @nDec, 0 )
   __DefaultNIL( @nRound, 0 )

   if nRound = 0
      aRet := { strzero( nNum1, nInt, nDec ), strzero( nNum2, nInt, nDec ) }
   else
      aRet := { strzero( round( nNum1, nRound ), nInt, nDec ), strzero( round( nNum2, nRound ), nInt, nDec ) }
   endif

return iif( aRet[1] == aRet[2], .T., .F. )