Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Dudas sobre Bookmarks (https://www.clubdelphi.com/foros/showthread.php?t=11758)

Lepe 24-06-2004 17:24:46

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 :confused: )

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

delphi.com.ar 24-06-2004 17:46:29

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!

roman 24-06-2004 17:59:54

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

roman 24-06-2004 18:02:12

Bueno, pero en la siguiente parte de la prueba basta regresar al índice anterior para poder usar el Bookmark. :rolleyes:

// Saludos

Lepe 24-06-2004 18:11:10

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

Lepe 24-06-2004 18:14:38

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. :rolleyes:

Pues a mi me seguía dando problemas, miraré detenidamente el tema y os cuento.

Lepe 24-06-2004 18:59:41

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!!!

Lepe 01-07-2004 13:08:15

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 :(


La franja horaria es GMT +2. Ahora son las 14:45:19.

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