ainda estou adaptando, mas de um modo geral é salvar no array.
CREATE CLASS ADORecValueClass
VAR aValues
METHOD New( cnMySql )
METHOD WriteLog( cTable, cKeyName, xKeyValue )
ENDCLASS
METHOD New( cnMySql ) CLASS ADORecValueClass
LOCAL nCont
::aValues := {}
IF cnMySql != NIL
WITH OBJECT cnMySql
FOR nCont = 1 TO :FCount()
AAdd( ::aValues, :String( nCont - 1 ) )
NEXT
ENDWITH
ENDIF
RETURN SELF
METHOD WriteLog( cTable, cKeyName, xKeyValue ) CLASS ADORecValueClass
LOCAL nCont, cnMySql := ADOClass():New( AppConexao() )
IF AppConexao() == NIL
RETURN NIL
ENDIF
WITH OBJECT cnMySql
:cSql := "SELECT * FROM " + cTable + " WHERE " + cKeyName + " = " + NumberSql( xKeyValue )
:Execute()
IF ! :Eof()
FOR nCont = 1 TO :FCount()
IF ! "INFINC" $ :FName( nCont - 1 ) .AND. ! "INFALT" $ :FName( nCont - 1 ) ;
.AND. ! ::aValues[ nCont ] == :String( nCont - 1 )
GravaOcorrencia( cTable, StrZero( xKeyValue, 9 ), "ALTERADO " + :FName( nCont - 1 ) + ;
" de " + Transform( ::aValues[ nCont ], "" ) + ;
" para " + :String( nCont - 1 ) )
ENDIF
NEXT
ENDIF
:CloseRecordset()
ENDWITH
RETURN NIL
// Alterado pra usar com MySQL a partir de DBF
CREATE CLASS DBFRecValueClass
VAR aValues
METHOD WriteLog( xTable, xKey )
METHOD Init()
ENDCLASS
METHOD Init() CLASS DBFRecValueClass
LOCAL nCont
::aValues := {}
FOR nCont = 1 TO FCount()
Aadd( ::aValues, FieldGet( nCont ) )
NEXT
RETURN NIL
METHOD WriteLog( xTable, xKey ) CLASS DBFRecValueClass
LOCAL cAlias, cCodigo, nCont, cTexto
IF ! xTable == NIL .AND. ! xKey == NIL
FOR nCont = 1 TO FCount()
cTexto := ""
IF ::aValues[ nCont ] != FieldGet( nCont ) .AND. ! "INFINC" $ FieldName( nCont ) .AND. ! "INFALT" $ FieldName( nCont )
cTexto += FieldName( nCont ) + " DE " + Trim( Transform( ::aValues[ nCont ], "" ) )
cTexto += " PARA " + Trim( Transform( FieldGet( nCont ), "" ) )
GravaOcorrencia( Upper( xTable ), xKey, cTexto )
ENDIF
NEXT
RETURN NIL
ENDIF
cAlias := Lower( Alias() )
DO CASE
CASE cAlias == "jpcadastro" ; cCodigo := jpcadastro->idCadastro
CASE cAlias == "jpfinan" ; cCodigo := jpfinan->idFinan
CASE cAlias == "jpitem" ; cCodigo := jpitem->idProduto
CASE cAlias == "jppedido" ; cCodigo := jppedido->idPedido
OTHERWISE
cCodigo := ""
ENDCASE
IF Empty( cCodigo )
RETURN NIL
ENDIF
FOR nCont = 1 TO FCount()
cTexto := ""
IF ::aValues[ nCont ] != FieldGet( nCont ) .AND. ! "INFINC" $ FieldName( nCont ) .AND. ! "INFALT" $ FieldName( nCont )
cTexto += FieldName( nCont ) + " DE " + Trim( Transform( ::aValues[ nCont ], "" ) )
ENDIF
IF ! Empty( cTexto )
GravaOcorrencia( Upper( Alias() ), cCodigo , cTexto )
ENDIF
NEXT
RETURN NIL
Tenho em cada registro o INFINC e INFALT que é data de inclusão/alteração, então não comparo no log, senão sempre iria gravar.
Mas é como eu falei: cria um array antes, e compara com o array depois.