GARANTIR DESCONTO

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?


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

Carlos Pereira

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:


Capturar o registro antes da alteração: 
Evento 
BeforePost
procedure TCustomInfoFrame.qryNavigatorBeforeEdit(DataSet: TDataSet); begin //Seta o registro atual para fazer log TcapFDQuery(DataSet).AddDataRecord(DataSet); end; Evento
AfterPost
for 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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar