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

(Resolvido) Recuperar Bookmark


renanbg

Pergunta

Estou tentando recuperar a posição do cursor após gravar um registro, mas da o erro "record not found"

 

Li alguns tópicos no forum da embarcadero e me parece que é normal o cursor se perder após um close/open no dataset.

Meu código está mais ou menos assim:

..
cds.Post;
cds.ApplyUpdates(0);

Posicao_Agenda := FrmDm.cdsAgenda.GetBookmark;

cds.Close;
//Aqui é executado um select que traz a agenda do dia
cds.Open;

//Aqui filtro para trazer somente os pacientes do horario
cds.filtered := True

FrmDm.cdsAgenda.GotoBookmark(Posicao_Agenda);
FrmDm.cdsAgenda.FreeBookmark(Posicao_Agenda);

Alguma sugestão de como recuperar a posição neste caso?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

O TBookMark obtém ou define o marcador atual em um conjunto
de dados. Um TBookMark marca um local em um conjunto de dados para
que um aplicativo possa retornar facilmente a esse local rapidamente.

Um aplicativo pode ler o TBookMark para recuperar o marcador associado
ao registro atual e pode alterar o registro atual no conjunto de dados,
atribuindo um valor de marcador salvo a essa propriedade.

Estou tentando recuperar a posição do cursor após gravar um registro

Use a propriedade Recno do ClientDataSet

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var Posicao_Agenda : integer;
begin
   ClientDataSet1.Edit;
   ClientDataSet1.Post;
   ClientDataSet1.ApplyUpdates(0);

   Posicao_Agenda := ClientDataSet1.RecNo;
   showmessage('Posicao_Agenda => ' + inttostr(Posicao_Agenda));

   ClientDataSet1.Close;

   ClientDataSet1.Open;
   showmessage('Abrir a Tabela na Posicao_Agenda => ' + inttostr(Posicao_Agenda));

   ClientDataSet1.RecNo := Posicao_Agenda;

end;

 

cds.Close;

//Aqui é executado um select que traz a agenda do dia

cds.Open;

A propria select traz todos os registros das agendas do dia que voce quiser , sem a necessidade de se usar o TBookMark

select * from tabela where  agenda_dia = '21/10/2018'

ou

///  usando parametro ( string ou date ) para passar o valor

select from tabela where agenda_dia = :Diag 

OBS: Se ainda assim quiser usar o TBookmark seria assim o seu uso

procedure TForm1.Button1Click(Sender: TObject);
var Posicao_Agenda : TBookMark;
begin
   ClientDataSet1.Edit;
   ClientDataSet1.Post;
   ClientDataSet1.ApplyUpdates(0);

   Posicao_Agenda := ClientDataSet1.GetBookmark;

   ClientDataSet1.Close;
   ///  Não usar select
   ClientDataSet1.Open;

   /// O cursor retorna para o registro guardado
   /// depois de fechar e abrir a tabela

   ClientDataSet1.GotoBookmark(Posicao_Agenda);

end;

Aviso:

   //// Somente liberar da memoria, depois do uso
   ClientDataSet1.FreeBookmark(Posicao_Agenda);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas. Usei o locate pra buscar o código recém gravado, mas as vezes da erro de invalid pointer operation.

Pior que não é sempre. 

O código ficou assim. E o erro só aconteceu depois que usei o Locate

var 
 Posicao_Horario : TBookmark; 
 Posicao_Agenda : Integer; 
begin 
  if not FrmDm.trFisio.InTransaction then //Inicia a transação 
    FrmDm.trFisio.StartTransaction; 

  try 
    //Gravando na AGENDA 
    if not FrmDm.cdsAgenda.Active then 
       FrmDm.cdsAgenda.Open; 
    .... 
    .... 
    FrmDm.cdsAgenda.Post; 
    FrmDm.cdsAgenda.ApplyUpdates(0); 

    //Armazena o codigo do registro recem incluido 
    Posicao_Agenda := FrmDm.cdsAgendaCODIGO.AsInteger; 

    //Gravando na CONTAS A RECEBER 
       .... 
       .... 
      FrmDm.cdsContasReceber.Post; 
      FrmDm.cdsContasReceber.ApplyUpdates(0); 

    //Inicia a gravação da PRODUCAO 
       .... 
       .... 
      FrmDm.qrProducao.Post; 


    //Grava fisicamente no banco 
    FrmDm.trFisio.CommitRetaining; 

    //fecha a tabela 
    FrmDm.cdsContasReceber.Close; 

    //Pega a posição atual do cursor dos horarios 
    Posicao_Horario := FrmAgenda.cdsHorarios.GetBookmark; 

    //Refaz busca dos pacientes do dia 
    Frmdm.cdsAgenda.Close; 
    Select * from agenda where data = hoje 
    Frmdm.cdsAgenda.Open; 

    //Volta o cursor dos horarios ao lugar que estava 
    FrmAgenda.cdsHorarios.GotoBookmark(Posicao_Horario); 
    FrmAgenda.cdsHorarios.FreeBookmark(Posicao_Horario); 

    //Carrega os pacientes do horario 
    Aqui apenas um filter mostra os pacientes do horario selecionado em cdshorarios 

    //Volta o cursor da agenda ao lugar que estava 
    Frmdm.cdsAgenda.Locate('CODIGO', Posicao_Agenda, []); 

    Application.MessageBox(PCHAR('Agendamento realizado com sucesso!'), 'Fisio Soft RM', MB_ICONINFORMATION + MB_OK); 
    FrmAgendamento.Close; 

  except on e : exception do 
    begin 
      FrmDm.trFisio.RollbackRetaining; 
      Application.MessageBox(PChar('Ocorreu o seguinte erro: '+#13+#13+ e.message +#13+#13+'Nenhuma alteração foi realizada.'), 'Fisio Soft RM', MB_ICONERROR + MB_OK); 
      FrmAgenda.CalendarioClick(Sender); 

      //Volta o cursor ao lugar que estava antes 
      FrmAgenda.cdsHorarios.GotoBookmark(Posicao_Horario); 
      FrmAgenda.cdsHorarios.FreeBookmark(Posicao_Horario); 

      // Carrega os pacientes do horario 
      FrmAgenda.ExibirPacientesDoHorario; 

      FrmAgendamento.Close; 
    end;

 

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

  • 0

como disse, prefira usar o select em lugar do Locate e o TBookMark

Select * from agenda where data = hoje 

Não vi aonde voce coloca esse código, pois ele deveria estar dentro de uma query e se hoje é uma variavel, esse select nem funcionaria assim.

Se é um sistema de agenda que esta fazendo, a select faz tudo o que voce esta querendo...

tanto na gravação como na pesquisa.

veja alguns exemplos de uso de uma select dentro de uma query

https://www.google.com.br/search?source=hp&ei=LMbtWpvPMsqrwgTIybCgCA&q=query+select+delphi&o que=select+dephi&gs_l=psy-ab.1.3.0i13k1j0i13i5i30k1l5j0i13i5i10i30k1j0i13i5i30k1l2j0i13i5i10i30k1.1269.3555.0.8507.12.12.0.0.0.0.162.1414.0j12.12.0....0...1c.1.64.psy-ab..0.12.1409...0j0i131k1j0i22i30k1.0.u9jTGKUT8J8

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

amigo, fiz um sistema de agenda médica para um hospital, e utilizei somente select, tanto para pesquisa como para gravação de registros.

só para te dar uma ideia... o meu select seleciona todos os médicos que tem agenda em determinado dia e coloca em um dbgrid ....  depois seleciono atraves de outra select  nesse dbgrid o medico que eu quero ... e desse medico,  consigo  todos os pacientes dele com os seus respectivos horarios, sem a necessidade de usar locate ou um filter.

tudo depende de como voce montou as suas tabelas.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

A minha agenda é para fisioterapia e tem mais de um paciente por horario. Por isso o filter.

Então o primeiro select traz os pacientes do dia, em seguida carrego num dbgrid os horarios da clinica.

Daí ai clicar no horario, o filter busca os pacientes daquele horario.

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
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...