Jump to content
Fórum Script Brasil
  • 0

(Resolvido)(Delphi) Percorrer o ClientDataSet até o Pointer do BookMark que foi salvo


Question

Olá tenho a seguinte situação:

Tenho um ClientDataSet onde ele está sendo percorrido e irá parar em um ponto aleatório onde o bookmark vai salvar o ponteiro.

Após isso eu gostaria de recomeçar a percorrer o ClientDataSet desde o first, porém agora até onde o bookmark salvou o ponteiro.

Algo do tipo "o código é só um exemplo"

ClientDataSet.First;

while ClientDataSet.ponteiro <> bookmark.ponteiro do
begin
	//codigo
	ClientDataSet.Next;
end;

 

Edited by LockSpy
Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 1
  • 0

Já havia feito bastante busca a respeito mas não encontrei nada sobre como fazer um ClientDataSet percorrer até o ponteiro salvo no bookmark.

Mas acho melhor então utilizar o RecNo mesmo, assim eu gravo o número da linha que parou e depois percorro até ela.

Obrigado Jhonas!

Link to post
Share on other sites
  • 0

Acho que o que voce esta querendo é isso

 

VAR CONT : INTEGER;
begin
   cont := 0;
   With Dbgrid1 do
   Begin
     if SelectedRows.Count = 0 then
        begin
           MessageDlg('OPERAÇÃO ANULADA! '+ #13 + #13 +
                      'SELECIONE OS REGISTROS.' , mtInformation, [mbOK], 0);

           DBGrid1.SetFocus;
           Exit;
        end;
   end;


   for cont:= 0 to Pred(DBGrid1.SelectedRows.Count) do
       DBGrid1.Datasource.Dataset.Bookmark:= DBGrid1.SelectedRows[cont];


end;

OBS: Voce pode armazenar o ultimo RecNo do registro, quando o bookmark chegar ao fim da seleção

abraço

 

Link to post
Share on other sites
  • 0
Posted (edited)

Então na verdade seria mais ou menos isso aqui:

Tenho um ClientDataSet com 10 registros. Utilizando um RecNo o que eu quero fazer é este código:

VAR
	I, countRecNo : Integer;

I := 0;

ClientDataSet.First;

//Irá percorrer o ClientDataSet com 10 registros
While not ClientDataSet.Eof do 
begin
	Inc(I);
	
	if	I = 5 then //No 5 registro ele irá parar
	begin
		countRecNo := ClientDataSet.RecNo;
		break;
	end;

	ClientDataSet.Next;
end;

ClientDataSet.First;

//Irá percorrer o ClientDataSet novamente desde o primeiro até onde parou que seria o 5, 
//para efetuar operações de rollback apagar alguns dados etc.
While ClientDataSet.RecNo <> countRecNo do 
begin
	ClientDataSet.Delete; //Ira apagar da primeira linha até onde parou.
	ClientDataSet.Next;
end;

Nesse caso com RecNo Eu vejo funcionando mais ou menos dessa forma, a minha idéia a principio era usar o BookMark, porém ai que está a questão que eu não sei como fazer isso em vez de utilizar o RecNo utilizar o BookMark para percorrer. Ex:

VAR
	I : Integer;
	bookmark: TBookMark;

I := 0;

ClientDataSet.First;

//Irá percorrer o ClientDataSet com 10 registros
While not ClientDataSet.Eof do 
begin
	Inc(I);
	
	if	I = 5 then //No 5 registro ele irá parar
	begin
		bookmark := ClientDataSet.GetBookmark;
		break;
	end;

	ClientDataSet.Next;
end;

ClientDataSet.First;

//Irá percorrer o ClientDataSet novamente desde o primeiro até onde parou que seria o 5, para efetuar operações de rollback apagar alguns dados etc.
While ClientDataSet.RecNo <> bookmark.RecNo do //Eu sei que não é assim, pois é isso que eu não sei fazer e nem sei se é possível. 
begin
	ClientDataSet.Delete; //Ira apagar da primeira linha até onde parou.
	ClientDataSet.Next;
end;

 

Edited by LockSpy
Link to post
Share on other sites
  • 0

Imagine uma tabela com os registros

Me mostra  com um exemplo simples, como voce quer fazer com os registros

Se eu entender a sua ideia posso te dar uma sugestão melhor

Link to post
Share on other sites
  • 0

Imaginamos uma tabela cliente com os seguintes dados

Tabela Cliente

código 1 nome João

código 2 nome Marcos

código 3 nome Lauro

código 4 nome Joyce

código 5 nome Jéssica

 

E uma tabela Pessoas com os seguintes dados

Tabela Pessoas - Dados já existentes

código 6 nome Marcela

código 7 nome Luidi

 

Agora irei percorrer e copiar os dados da tabela Cliente para a tabela Pessoas, porém irá "acontecer uma falha" e por conta disso em vez de copiar os 5 dados da tabela cliente, irá copiar somente até o Lauro, faltando a Joyce e a Jéssica.

Tabela Pessoas - Dados já existentes

código 6 nome Marcela

código 7 nome Luidi

código 1 nome João

código 2 nome Marcos

código 3 nome Lauro

 

Devido a esse erro preciso desfazer o que foi copiado sem apagar os registros que já existiam. Ou seja, deve ficar assim novamente:

Tabela Pessoas - Dados já existentes

código 6 nome Marcela

código 7 nome Luidi

 

Para isso preciso saber até onde a tabela Cliente foi percorrida, e percorrer a mesma coisa e ir deletando os dados que foram copiados na tabela pessoas.

Tabela Cliente

código 1 nome João

código 2 nome Marcos

código 3 nome Lauro - Foi percorrido até aqui, então o loop e o delete tem que ser até aqui.

 

Simulando um rollback

Link to post
Share on other sites
  • 0

ok.. se entendi direito, voce quer copiar  os dados da tabela clientes para a tabela pessoas.

voce não precisa deletar os registros da tabela pessoas ... bastara apenas que, durante a leitura da tabela clientes, faça uma comparação de registros entre essa tabela e a tabela pessoas.

se o registro da tabela clientes, já existir na tabela pessoas, não faz nada e vai para a leitura do proximo registro.

se o registro da tabela clientes não existir na tabela pessoas, então voce copia ( insere ) o registro na tabela pessoas

Exemplo baseado no seu relato:

Nesse caso voce deve fazer uso do comando Select  no componente de acesso a tabela

exemplo:

Select * from Pessoas where Codigo = :NCod

procedure TForm1.Button1Click(Sender: TObject);
var X : integer; 
begin
   if MessageDlg('DESEJA ATUALIZAR A LISTA DE PESSOAS ?' ,mtConfirmation, [mbYes, mbNo], 0) = mrYes then
     begin

         Clientes.Active := false; /// componente QUERY / IBQUery 
         CDS_Clientes.Active := false;  /// componente ClientDataSet
         Clientes.Active := true;
         CDS_Clientes.Active := true;
         CDS_Clientes.Refresh;

         for x := 1 to CDS_Clientes.RecordCount do
         BEGIN

            // FAZER A PESQUISA NA TABELA PELO CODIGO 

            Pessoas.Active := false;
            CDS_Pessoas.Active := false;
            CDS_Pessoas.Params[0].AsString := trim(CDS_ClientesCODIGO.Value);
            Pessoas.Active := true;
            CDS_Pessoas.Active := true;
            CDS_Pessoas.Refresh;

            if CDS_Pessoas.RecordCount <> 0 then
               begin

                  // SE EXISTIR A PESSOA NA TABELA PESSOAS
                  // NÃO FAZ NADA

               end
            ELSE
               BEGIN
                  ////   SE NÃO EXISTIR A PESSOA NA TABELA PESSOAS
                  ////   COPIAR O REGISTRO
                  CDS_Pessoas.Last;
                  CDS_Pessoas.Append;
                  CDS_Pessoas.Edit;

                  CDS_PessoasCODIGO.Value := CDS_ClientesCODIGO.Value;
                  CDS_PessoasNOME.Value := CDS_ClientesNOME.Value;

                  CDS_Pessoas.Post;
                  CDS_Pessoas.ApplyUpdates(-1);
                  CDS_Pessoas.Refresh;

               END;
            CDS_Clientes.Next;
         END;
end;

Isso é bem nais simples do que voce esta querendo fazer.

abraço

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      149405
    • Total Posts
      645894
×
×
  • Create New...