10/12/2005

Erro ao Tentar Comparar NewValue com OldValue

Oi gente!

Estou tentando fazer um LOG de NewValue e OldValue de um registro...

Este campo aí embaixo é um tipo definido como DATE no firebird.

se eu tentar... no evento do POST de um button....

showmessage(dm_usuario.cds_usuario.Delta.fieldbyname(´USU_TROCAR_SENHA_DATA_ATUAL´).OldValue);

recebo a mensagem -> ´Invalid Variant Operation´

hummm... Me parece que tem algo a ver quando o campo DATA esta com o VALOR ANTIGO em branco/vazio.

Eu preciso gravar somente os CAMPOS que foram modificados...
(os valores antigos e atuais)
durante uma operação de EDIÇÃO num único registro.

Estou tentando...

- Verificar se a tabela esta em EDIÇÃO antes do POST...
- Fazer um for do PRIMEIRO ao ULTIMO FIELD da tabela...
(todos os campos são da mesma tabela)
- Comparar se FIELD[X].OldValue é <> FIELD[X].NewValue....
- Gravar o NOME do CAMPO - VALOR ANTIGO - VALOR NOVO.

Alguem pode me sugerir como eu montar este LOG ???
Alguem tem aí um exemplo funcional ???

Valeu.


Userba

Respostas

10/12/2005

Khundalini

O uso das propriedades OldValue e NewValue só é válido nas seguintes condições:

1) Quando se estiver usando ClientDataSet;
2) Quando se estiver usando datasets do BDE que estejam com o recurso de CachedUpdates habilitado;
3) Quando se estiver usando os eventos OnReconcileError de um ClientDataSet ou OnUpdateError de um TDataSetProvider.

Sugiro que vc use a terceira abordagem. No eventos normais de um dataset (como o BeforePost), essas propriedades não possuem funcionalidade alguma. Maiores detalhes, leia o help do Delphi.

Sds,

Rubem Rocha
Manaus, AM


Responder Citar

10/12/2005

Userba

O uso das propriedades OldValue e NewValue só é válido nas seguintes condições: 1) Quando se estiver usando ClientDataSet; 2) Quando se estiver usando datasets do BDE que estejam com o recurso de CachedUpdates habilitado; 3) Quando se estiver usando os eventos OnReconcileError de um ClientDataSet ou OnUpdateError de um TDataSetProvider. Sugiro que vc use a terceira abordagem. No eventos normais de um dataset (como o BeforePost), essas propriedades não possuem funcionalidade alguma. Maiores detalhes, leia o help do Delphi. Sds, Rubem Rocha Manaus, AM


Olá Rubem!

Obrigado pelos seus esclarecimentos.

Mas... Eu estou tentando :) utilizar o DBExpress... (o conjunto de componentes e banco está na assinatura das minhas mensagens Ok?).

Quando o usuário clica em um botao que fará um POST e APPLYUPDATES(0)... Eu faço uma serie de verificações antes de consolidar as os 2 comandos.

* Geralmente eu testo o APPLYUPDATES... Ex: if dm_tal.cds_tal.upplyupdates(0) <> 0 then showmessage(´ocorreu algum erro´).

* Não estou utilizando formulario de reconciliação... Mas aproveito o evento (ReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);) para capturar o erro ocorrido e tratar/mostrar ao usuario... Ex ... MessageDlg(E.Message, mtError, [mbOk], 0);

Então... Achei estranho o que vc citou no ÍTEM 3... Já que... Eu consigo ver /capturar os OLDVALUE e NEWVALUE sem ser através dos eventos que vc citou.

Ex:

- Eu tenho 1 modulo de dados (dm_usuario) com um 1 clientdataset (cds_usuario) -> 1 provider -> 1 sqldataset.

- Digamos que o primeiro campo da tabela -> USUARIO tenha o nome (CHAVE) o segundo é (NOME) e este o usuário modificou ao editar o registro... o terceiro é (ENDEREÇO) e não foi modificado, etc.

- No clique de um button eu faço -> Ex: ShowMessage(dm_usuario.cds_usuario.fields[1].OldValeu + ´ - ´ + dm_usuario.cds_usuario.fields[1].NewValeu); e ... vejo normalmente as modificações feita pelo usuario :) o mesmo vale para os outros 2 campos.

Então... Estranho a sua afirmativa do ítem 3 acima não é :) ? Pois não se encaixa no meu procedimento descrito acima... e que está funcionando quase 100¬ :)... Pois o meu problema, não sei o porque... está ligado apenas ao OLD E NEWVALUE de campos tipo DATA... (Se estiverem preenchidos o OLD e o NEWVALEU... funciona certinho... Se o OLD ou NEWVALEU estiverem em branco dá erro)... Pode?

Você tem algum exemplo funcional que possa me passar, sobre a captura de OLD E NEWVALUES de qualquer tipo de campo... com CLIENTDATASET... nos eventos que vc descreveu? Se sim... Poderia me enviar por email para que eu desse uma analisada? Te agradeço desde já.

Se algum outro colega, puder me ceder algum trecho de um código que me auxilie a fazer um LOG de MODIFICAÇÕES (apenas na EDIÇÃO de UM REGISTRO) gravando (O NOME DO CAMPO, o VALOR ANTIGO e o VALOR NOVO), ficarei por demais grato.

Gente... Obrigado.


Responder Citar

11/12/2005

Adilsond

Experimente:

ShowMessage(VarToStr(dm_usuario.cds_usuario.Delta.fieldbyname(´USU_TROCAR_SENHA_DATA_ATUAL´).OldValue));


Responder Citar

11/12/2005

Caninha51

Cara, se eu fosse tu faria isso direto no banco, com triggers.


Responder Citar