Curso de dbExpress e DataSnap

Parte XVI – Save Point

Neste artigo veremos como usar o interessante recurso de SavePoint do ClientDataSet. Esse recursos permite que você “tire um foto” do atual status da memória do ClientDataSet, e recupere este status a qualquer momento. Você pode, por exemplo, salvar as atuais alterações do CDS em memória, fazer novas alterações e a seguir desfaze-las, voltando ao estado original previamente sinalizado. Imagine isso como uma espécie de transações em memória, com Rollback e Commit. Para ver como isso funciona na prática, preparei um exemplo interessante.

Coloque os componentes no formulário conforme mostrado na figura a seguir. Aqui colocamos um ClientDataSet, um DataSource e três Buttons. Dê um clique de direita no ClientDataSet, escolha Load from MyBase Table e abra o arquivo Customer.XML, localizado nos demos do Delphi, por padrão no diretório C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data. Arraste os TFields para o form para criar os controles Data-Aware.


O código DFM do form é mostrado a seguir:

object ClientDataSet1: TClientDataSet

 Active = True

 object ClientDataSet1CustNo: TFloatField

   FieldName = 'CustNo'

 end

 object ClientDataSet1Company: TStringField

   FieldName = 'Company'

   Size = 30

 end

 object ClientDataSet1Addr1: TStringField

   FieldName = 'Addr1'

   Size = 30

 end

 object ClientDataSet1Addr2: TStringField

   FieldName = 'Addr2'

   Size = 30

 end

 object ClientDataSet1City: TStringField

   FieldName = 'City'

   Size = 15

 end

 object ClientDataSet1State: TStringField

   FieldName = 'State'

 end

 object ClientDataSet1Zip: TStringField

   FieldName = 'Zip'

   Size = 10

 end

 object ClientDataSet1Country: TStringField

   FieldName = 'Country'

 end

 object ClientDataSet1Phone: TStringField

   FieldName = 'Phone'

   Size = 15

 end

 object ClientDataSet1FAX: TStringField

   FieldName = 'FAX'

   Size = 15

 end

 object ClientDataSet1TaxRate: TFloatField

   FieldName = 'TaxRate'

 end

 object ClientDataSet1Contact: TStringField

   FieldName = 'Contact'

 end

 object ClientDataSet1LastInvoiceDate: TDateTimeField

   FieldName = 'LastInvoiceDate'

 end

end

object DataSource1: TDataSource

 DataSet = ClientDataSet1

end

object DBGrid1: TDBGrid

 DataSource = DataSource1

end

object DBNavigator1: TDBNavigator

 DataSource = DataSource1

end

O código do botão SavePoint salve o estado atual do ClientDataSet:

procedure TFrmMain.BitBtn2Click(Sender: TObject);

begin

 MyPoint := ClientDataSet1.SavePoint;

end;

MyPoint é uma variável declara no form, com o seguinte tipo:

 public

   MyPoint : integer;

Para recuperar o estado, basta atribuir novamente essa propriedade ao SavePoint, observe (fizemos isso no outro botão):

procedure TFrmMain.BitBtn3Click(Sender: TObject);

begin

 ClientDataSet1.SavePoint := MyPoint;

end;

Para voltar ao último estado, chamamos o UndoLastChanges no botão de mesmo nome:

procedure TFrmMain.BitBtn1Click(Sender: TObject);

begin

 ClientDataSet1.UndoLastChange(true);

end;

Executando a aplicação, vamos fazer alguns testes para ver como recurso funciona. Altere o Company colocando “TESTE1” ao final, clique em Post no DBNavigator e a seguir no botão SavePoint. Seguindo os mesmos passos, altere para “TESTE2” e “TESTE3”, dando sempre um post e savepoint ao final.


Agora clique várias vezes no botão UnLastChanges e verifique que o estado atual de cada savepoint é recuperado a cada chamado a método, como transações de BD, porém, tudo em memória.


dbExpress, DataSnap e ClientDataSet: Técnicas Avançadas

Para mais informações sobre acesso a dados no Delphi e técnicas avançadas, sugiro a leitura do meu livro, “Delphi: Programação para Banco de Dados e Web”, como apoio para o aprendizado das tecnologias. Na obra mostro várias técnicas introdutórios e avançadas de desenvolvimento com ClientDataSet, dbExpress e DataSnap (multicamadas, incluindo SOAP e COM+).

Leia todos artigos da série