Ir para conteúdo
Fórum Script Brasil
  • 0

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


LockSpy

Pergunta

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;

 

Editado por LockSpy
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

  • 0

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;

 

Editado por LockSpy
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...