Verificar se o registro foi alterado

Firebird

19/08/2009

Olá galera do Firebird. Não sei se é nesse fórum ou de Delphi mas vamos lá. Tenho uma tela de cadastro de cliente com ClienteID e Nome, quando o usuário edita e grava é alterado o campo dtalt com a data do servidor e até ai tudo bem. A questão é que essa data é gravada independente se foi realmente alterado alguma coisa no registro, se simplesmente o usuário clicar em editar e depois gravar o campo dtalt vai ser gravado. Gostaria de saber se é possível gravar o dtalt se o registro foi realmente alterado em algum campo. Ex:
ClienteID Nome
27 Carlos

Se eu editar a alterar o nome para Carlos da Silva vai gravar o dtalt por que que realmente alterei o registro no campo Nome, mas se eu clicar em editar e gravar eu não alterei nada e nesse caso o campo dtalt não pode ser mudado.

Obrigado.


Developer1978

Developer1978

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

19/08/2009

a atribuição do campo Dtalt é feita no Delphi ?


GOSTEI 0
Developer1978

Developer1978

19/08/2009

a atribuição do campo Dtalt é feita no Delphi ?

Sim, no Delphi assim

procedure TFormCadCliente.btnGravarClick(Sender: TObject);
begin
if cdsCadClientes.State = dsEdit then
begin
cdsCadClienteDtAlt.AsDateTime := Lib001.ServerDate;
cdsCadClientes.Post;
cdsCadClientes.ApplyUpdates(0);
end;
end;

Conexão usando dbexpress com firebird e delphi 7


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/08/2009

pelo Delphi:
procedure TFormCadCliente.btnGravarClick(Sender: TObject);
begin
  if (cdsCadClientes.State = dsEdit) and
  (cdsCadClientesNome.OldValue <> cdsCadClientesNome.NewValue) then
    cdsCadClienteDtAlt.AsDateTime := Lib001.ServerDate;

  cdsCadClientes.Post;
  cdsCadClientes.ApplyUpdates(0);
end;


[size=18:faf2e754ce][b:faf2e754ce]ou[/b:faf2e754ce][/size:faf2e754ce] crie um TRIGGER para executar esta tarefa. caso opte pelo TRIGGER, não é necessário qualquer tratamento pelo Delphi.
CREATE OR ALTER TRIGGER ATU_CLI FOR CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.NOME <> old.NOME) then
    new.DTALT = current_date; -- ou current_timestamp, para data e hora
end



GOSTEI 0
Developer1978

Developer1978

19/08/2009

pelo Delphi:
procedure TFormCadCliente.btnGravarClick(Sender: TObject);
begin
  if (cdsCadClientes.State = dsEdit) and
  (cdsCadClientesNome.OldValue <> cdsCadClientesNome.NewValue) then
    cdsCadClienteDtAlt.AsDateTime := Lib001.ServerDate;

  cdsCadClientes.Post;
  cdsCadClientes.ApplyUpdates(0);
end;
[size=18:4404c0e9e2][b:4404c0e9e2]ou[/b:4404c0e9e2][/size:4404c0e9e2] crie um TRIGGER para executar esta tarefa. caso opte pelo TRIGGER, não é necessário qualquer tratamento pelo Delphi.
CREATE OR ALTER TRIGGER ATU_CLI FOR CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.NOME <> old.NOME) then
    new.DTALT = current_date; -- ou current_timestamp, para data e hora
end


No Delphi não rolou por que tenho que tirar o foco do componente que eu editeim mas vou criar a trigger via IBExpert para testar.


GOSTEI 0
Carlos Mazzi

Carlos Mazzi

19/08/2009

Resolvido ?
GOSTEI 0
Jordelino Santos

Jordelino Santos

19/08/2009

Resolvido. Obrigado.
GOSTEI 0
POSTAR