LockSpy Postado Maio 14, 2021 Denunciar Share Postado Maio 14, 2021 (editado) 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 Maio 14, 2021 por LockSpy Citar Link para o comentário Compartilhar em outros sites More sharing options...
1 Jhonas Postado Maio 14, 2021 Denunciar Share Postado Maio 14, 2021 Voce vai encontrar a resposta em um desses links https://www.google.com.br/search?q=como+usar+bookmarks+delphi&ei=932eYNSqKeXK1sQPs5WeqAQ&o que=como+usar+bookmarks+delphi&gs_lcp=Cgdnd3Mtd2l6EANQAFgAYJETaABwAngAgAEAiAEAkgEAmAEAqgEHZ3dzLXdpesABAQ&sclient=gws-wiz&ved=0ahUKEwiUgvKspsnwAhVlpZUCHbOKB0UQ4dUDCA0&uact=5 ou https://forum.scriptbrasil.com.br/topic/188744-recuperar-bookmark/ abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 LockSpy Postado Maio 14, 2021 Autor Denunciar Share Postado Maio 14, 2021 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 14, 2021 Denunciar Share Postado Maio 14, 2021 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 LockSpy Postado Maio 14, 2021 Autor Denunciar Share Postado Maio 14, 2021 (editado) 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 Maio 14, 2021 por LockSpy Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 14, 2021 Denunciar Share Postado Maio 14, 2021 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 LockSpy Postado Maio 14, 2021 Autor Denunciar Share Postado Maio 14, 2021 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 14, 2021 Denunciar Share Postado Maio 14, 2021 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
LockSpy
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;
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados
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.