Tengo el siguiente código en un proyecto en el que estoy trabajando.¿Cuánto tiempo un marcador TDataset sigue siendo válido?
procedure TForm.EditBtnClick(Sender:TObject);
begin
// Mark is form variable. It's private
Mark = cdsMain.GetBookmark;
// blabalbal
.
.
.
end;
procedure TForm.OkBtnClick(Sender:TObject);
var
mistakes: Integer;
begin
//Validation stuff and transaction control
//removed to not clutter the code
If cdsMain.ChangeCount <> 0 then
mistakes := cdsMain.AppyUpdates(-1);
cdsMain.Refresh;
try
cdsMain.GotoBookmark(Mark);
// Yes, I know I would have to call FreeBookmark
// but I'm just reproducing
except
cdsMain.First;
end;
end;
En lo personal, yo no uso de marcadores mucho - excepto para cambiar la posición de un conjunto de datos donde sólo moví la posición del cursor (para crear un perfil, llenar una lista de cadenas, etc.). Si yo Refresh
, actualizo (especialmente cuando un filtro puede hacer que el registro sea invisible), reajuste (Close
/Open
) o cualquier operación que modifique los datos en el conjunto de datos, no uso marcadores. Prefiero Locate
en la clave principal (usando un TClientDataset
, por supuesto) o volver a consultar los parámetros.
¿Hasta cuándo es válido un marcador? Hasta un Refresh
? Hasta que se haga un Close
/Open
para volver a buscar los datos? ¿Dónde termina la zona segura?
Considere la posibilidad en la respuesta que estoy usando TClientDataset
con un TSQLQuery
(DbExpress).
Después de algunas experimentaciones, incluso BookmarkValid no es confiable. Ocurre cuando tiene un filtro activado en el conjunto de datos: devuelve verdadero incluso si el registro no coincide con la condición del filtro. El resultado final es lanzar una excepción. –