Fórum Modificar FDQuery para ter o registro antes da Edição #576740
09/03/2017
0
Boa noite, pessoal.
Preciso armazenar o registro de uma FDQuery antes de ser modificado e estou criando uma classe baseada em FDQuery para isso. Meu código está abaixo.
O problema é que estou recebendo erro de acesso a memória. Podem me ajudar?
Preciso armazenar o registro de uma FDQuery antes de ser modificado e estou criando uma classe baseada em FDQuery para isso. Meu código está abaixo.
O problema é que estou recebendo erro de acesso a memória. Podem me ajudar?
Unit capQuery;
interface
uses
FireDAC.Comp.Client, DBCommon, System.Classes,
System.SysUtils, Data.DB, Vcl.Dialogs;
//Copia do registro antes da edição
type
TDataRecord = array of record
FieldName : string;
FieldValue : string;
end;
type
TcapFDQuery = class(TFDQuery)
private
FOldRecord: TDataRecord;
function GetDataRecord(Value: TDataRecord):TDataRecord;
procedure SetDataRecord(Value: TDataRecord);
public
procedure AddDataRecord(DataSet: TDataSet);
property OldRecord: TDataRecord read FOldRecord write FOldRecord;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('capPack', [TcapFDQuery]);
end;
procedure TcapFDQuery.AddDataRecord(DataSet: TDataSet);
{Carrega e retorna o Record com os valores dos campos atuais}
var
i: Integer;
begin
if Assigned(DataSet) then
begin
FOldRecord := nil;
SetLength(FOldRecord, DataSet.FieldCount);
for i := 0 to DataSet.FieldCount - 1 do
begin
FOldRecord[i].FieldName := DataSet.Fields[i].FieldName;
FOldRecord[i].FieldValue := DataSet.Fields[i].AsString;
end;
end;
end;
function TcapFDQuery.GetDataRecord(Value: TDataRecord): TDataRecord;
begin
Result := Value;
end;
procedure TcapFDQuery.SetDataRecord(Value: TDataRecord);
begin
FOldRecord := Value;
end;
end.
Carlos Pereira
Curtir tópico
+ 0
Responder
Posts
10/03/2017
Carlos Pereira
Pessoal, consegui resolver. O problema não era da classe. Já resolvi.
Aproveito o ensejo para deixar essa classe como contribuição e para quem quiser usar, funciona com o evento before post da FDQuery.
Uso assim:
Aproveito o ensejo para deixar essa classe como contribuição e para quem quiser usar, funciona com o evento before post da FDQuery.
Uso assim:
Capturar o registro antes da alteração: EventoBeforePostprocedure TCustomInfoFrame.qryNavigatorBeforeEdit(DataSet: TDataSet); begin //Seta o registro atual para fazer log TcapFDQuery(DataSet).AddDataRecord(DataSet); end; EventoAfterPostfor x := 0 to (DataSet.FieldCount - 1) do if TcapFDQuery(DataSet).OldRecord[x].FieldValue <> DataSet.Fields[x].AsString then begin Grava o log... end;
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)