Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-06-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Dudas sobre Bookmarks

LLevo bastante tiempo mirando toda la ayuda sobre los Bookmarks, y solo dice que cada descendiente de Dataset lo implementa de una forma distinta, pero no dice como!!
Trabajo con tablas paradox y BDE, obviamente si borro un registro el Bookmark se irá a tomar paseo. Pero,

1- ¿Si cambio el indice activo de la tabla tambien se pierde? (segun mis pruebas si )

2- Existe alguna forma de apuntar a un registro independientemente del indice y poder acceder a él?

3- En que otras circunstancias se pierde la validez de un Bookmark ??

Gracias de antemano por sacarme de este lio mas grande

Saludos
Responder Con Cita
  #2  
Antiguo 24-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Simplemente puedes guardar en una variable del tipo TBookmark el puntero al registo que desees, y luego puedes acceder directamente a este registro mediante él método GotoBookmark.

Este ejemplo lo saqué de la ayuda de Delphi 5:
Código Delphi [-]
procedure TForm1.CopyDataClick(Sender: TObject);

var
   SavePlace: TBookmark;
   PrevValue: Variant;
begin
   with Table1 do
   begin
    { get a bookmark so that we can return to the same record }
    SavePlace := GetBookmark;

    { move to prior record}

    FindPrior; 

    { get the value }

    PrevValue := Fields[0].Value;

    {Move back to the bookmark 

    this may not be the next record anymore 
    if something else is changing the dataset asynchronously }
    GotoBookmark(SavePlace);
    { Set the value }
    Fields[0].Value := PrevValue;
    { Free the bookmark }
    FreeBookmark(SavePlace);
  end;

end;

Otra opción es usar un TBookmarkStr:
Código Delphi [-]
var
  Bookmark: TBookmarkStr;
begin
  Bookmark := DataSet.Bookmark;
  try
    DataSet.First;
    while not DataSet.EOF do
    begin
      ...
      DataSet.Next;
    end;
  finally
    DataSet.Bookmark := Bookmark;
  end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 24-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Simplemente puedes guardar en una variable del tipo TBookmark el puntero al registo que desees, y luego puedes acceder directamente a este registro mediante él método GotoBookmark.
El problema me parece es que Lepe quisiera preservar la ubicación de un registro incluso si se cambia el índice activo de la tabla. En la prueba que acabo de hacer el Bookmar efectivamente se pierde si se cambia el índice.

// Saludos
Responder Con Cita
  #4  
Antiguo 24-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno, pero en la siguiente parte de la prueba basta regresar al índice anterior para poder usar el Bookmark.

// Saludos
Responder Con Cita
  #5  
Antiguo 24-06-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Gracias por responder delphi.com.ar, y sobre todo por la rapidez.

El problema viene cuando guardo el bookmark, cambio el indice de la tabla y despues restauro el bookmark, en este punto me lanza una Excepcion 'Key/Record deleted' por lo que supongo que el bookmark está asociado al indice de la tabla, en lugar de al registro físico.

Mi intención era guardar en la propiedad Objects de un TCheckListbox un bookmark al registro que representa. Había probado de las 2 formas que propones:

- Creando ( y liberando despues) el bookmark obtenido con GetBookmark y FreeBookmark.
- Usando la propiedad Bookmark del Dataset.

De ambas formas me sale la excepción antes comentada, ya que la tabla tiene varios indices definidos y el usuario lo puede cambiar.

He mirado el código de la VCL de estos métodos y propiedades... pero no tardo mucho en perderme . Por eso preguntaba si hay forma de apuntar a un registro sin importar el índice activo.

Explicado mejor el tema a ver si hay sugerencias.... Saludos
Responder Con Cita
  #6  
Antiguo 24-06-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
ups, Román se me ha adelantado mientras repondía.

Cita:
Empezado por roman
Bueno, pero en la siguiente parte de la prueba basta regresar al índice anterior para poder usar el Bookmark.
Pues a mi me seguía dando problemas, miraré detenidamente el tema y os cuento.
Responder Con Cita
  #7  
Antiguo 24-06-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues sip, Roman tenía razón, funciona muy bien, había dejado una linea por ahí suelta que modificaba el indice.

Gracias Roman y delphi.com.ar!!!
Responder Con Cita
  #8  
Antiguo 01-07-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Reabro este hilo despues de haber realizado 1001 pruebas y muy a pesar mio tengo que decir que la idea de guardar un Bookmark no funciona.

Incluso sin modificar el índice activo de la tabla me ha dado el dichosito error 'Key/Record deleted', y hasta ahora, todavía no he podido averiguar la "vida" de un bookmark, cuando es válido y cuando no. Existe la funcion BookmarkValid(...) pero no dice por qué deja de ser válido, y eso precisamente es lo que necesito saber.

En toda la documentación que he visto, siempre usa un Bookmark en un Try .. Finally y no da problemas.

La idea de guardarlo para tener un "acceso rápido", al menos en tablas paradox y BDE, la desaconsejo.

SOLUCIÓN: hacer un Locate cuando se necesite acceder al registro
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:41:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi