Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Siguiente registro en un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=95784)

ArtPortEsp 10-08-2022 00:13:36

Siguiente registro en un dbgrid
 
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

Cita:

Empezado por ArtPortEsp (Mensaje 547871)
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

Cita:

Empezado por ArtPortEsp (Mensaje 547873)
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:
Código Delphi [-]
// 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;

Código Delphi [-]
// 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.)
Código Delphi [-]
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;


La franja horaria es GMT +2. Ahora son las 22:30:08.

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