PDA

Ver la Versión Completa : Siguiente registro en un dbgrid


ArtPortEsp
10-08-2022, 00:13:36
Buenas:

quiero lograr algo que me imagino sera muy sencillo, pero estoy bloqueado....

Tengo una tabla filtrada con un query, en el proceso de edicion que estoy haciendo al aplicar los cambios a la tabla, el registro editado desaparece de los registros mostrados en el dbgrid (uso un Tquery.refresh), lo cual esta correcto, pero....

Lo que quiero hacer es que al "desaparecer" el registro del query, deberia quedar seleccionado el registro siguiente del dbgrid (cuando aplico el Tquery.refresh) me envia al primer registro.

Espero haber sido claro.

Gracias

ArtPortEsp
10-08-2022, 02:09:47
Buenas:

quiero lograr algo que me imagino sera muy sencillo, pero estoy bloqueado....

Tengo una tabla filtrada con un query, en el proceso de edicion que estoy haciendo al aplicar los cambios a la tabla, el registro editado desaparece de los registros mostrados en el dbgrid (uso un Tquery.refresh), lo cual esta correcto, pero....

Lo que quiero hacer es que al "desaparecer" el registro del query, deberia quedar seleccionado el registro siguiente del dbgrid (cuando aplico el Tquery.refresh) me envia al primer registro.

Espero haber sido claro.

Gracias

Por favor perdonen mi estupidez... acabo de redescubrir : GetBookmark/GotoBookmark

Neftali [Germán.Estévez]
10-08-2022, 12:02:46
Por favor perdonen mi estupidez... acabo de redescubrir : GetBookmark/GotoBookmark

Nada de estupidez, eso nos ha pasado a todos en algún momento (por desconocimiento).
La duda es si al posicionar el bookmark en el registro "que desaparece" cuando intentes volver a él con el GotoBookmark y no lo encuentre żdónde se posicionará?

Si no se posiciona en el siguiente, deberás posicionar con el GetBookmark inicialmente en el siguiente al que va a "desaparecer".

No se si me he explicado.... :o

newtron
11-08-2022, 09:03:28
Una pregunta tonta: żAl hacer el "refresh" para que desaparezca el registro editado los bookmark no cambian?

kuan-yiu
11-08-2022, 09:08:14
Yo en estos casos siempre uso locate y guardo la posición del siguiente (o sino existe del anterior).

duilioisola
11-08-2022, 12:21:57
Creo que depende de la implementación de Bookmark.


En algunos casos guarda el nro. de registro, por lo que mantiene la posición en el Grid, pero no necesariamente el registro de la base de datos.
En otros casos guarda algo relacionado con el registro de la base de datos, con lo que no necesariamente se posicionará en el mismo sitio en el grid.

En ambos casos si no se encuentra Bookmark dará un error (exception).

Yo suelo utilizar alguna de estas dos variantes para casos simples:

// Refresco tabla manteniendo posicion.
// Abro y cierro la tabla ya que Tabla.Refresh solo actualiza el registro actual
// Si la posicion no existe queda en el primer registro.
// Evito "exception", verificando si es válido
procedure RefrescaTabla(Tabla : TDataSet);
var
mark : TBookmark;
begin
with Tabla do
begin
mark := GetBookmark;
try
Close;
Open;
if BookmarkValid(mark) then
GotoBookmark(mark);
finally
FreeBookmark(mark);
end;
end;
end;


// Refresco tabla manteniendo posición.
// Abro y cierro la tabla ya que Tabla.Refresh solo actualiza el registro actual
// hay un error voy al último registro.
procedure RefrescaTabla(Tabla : TDataSet);
var
mark : TBookmark;
begin
with Tabla do
begin
mark := GetBookmark;
try
Close;
Open;
try
GotoBookmark(mark);
except
// Si falla voy al final
Last;
end;
finally
FreeBookmark(mark);
end;
end;
end;

Y esta variante cuando necesito mantener la posición del registro de la tabla SQL (no la posición en el grid.)

procedure Posicionar(DataSet: TDataSet; CampoId: string; Id: integer; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;
procedure Refrescar(DataSet: TDataSet; CampoId: string; Id: integer; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;
procedure Posicionar(DataSet: TDataSet; CampoId: string; Id: string; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;
procedure Refrescar(DataSet: TDataSet; CampoId: string; Id: string; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;

// Con esta implementación para el primer caso "Id: integer;"
procedure Refrescar(DataSet: TDataSet; CampoId: string; Id: integer; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;
begin
with DataSet do
begin
DisableControls;
try
// Cierro la tabla si esta abierta
if Active then
Close;

Posicionar(DataSet, CampoId, Id, Aproximada, DesdeElFinal);
finally
EnableControls;
end;
end;
end;

procedure Posicionar(DataSet: TDataSet; CampoId: string; Id: integer; Aproximada: boolean = False; DesdeElFinal: boolean = False); overload;
begin
with DataSet do
begin
DisableControls;
try
// Abro la tabla si esta cerrada
if not Active then
Open;

if Aproximada then
begin
if DesdeElFinal then
begin
// Encuentro el primero cuyo ID sea menor al parametro
Last;
while ((not BOF) and (FieldByName(CampoId).AsInteger > id)) do
Prior;
end
else
begin
// Encuentro el primero cuyo ID sea mayor al parametro
First;
while ((not EOF) and (FieldByName(CampoId).AsInteger < id)) do
Next;
end;
end
else
begin
if DesdeElFinal then
begin
Last;
// Encuentro el primero cuyo ID sea igual al parametro
while ((not BOF) and (FieldByName(CampoId).AsInteger <> id)) do
Prior;
end
else
begin
// Encuentro el primero cuyo ID sea igual al parametro
First;
while ((not EOF) and (FieldByName(CampoId).AsInteger <> id)) do
Next;
end;
end;
finally
EnableControls;
end;
end;
end;