Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-08-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 10-08-2022
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 151
Poder: 7
ArtPortEsp Va por buen camino
Cita:
Empezado por ArtPortEsp Ver Mensaje
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
Responder Con Cita
  #3  
Antiguo 10-08-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ArtPortEsp Ver Mensaje
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....
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 11-08-2022
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.470
Poder: 21
newtron Va camino a la fama
Una pregunta tonta: ¿Al hacer el "refresh" para que desaparezca el registro editado los bookmark no cambian?
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 11-08-2022
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Yo en estos casos siempre uso locate y guardo la posición del siguiente (o sino existe del anterior).
Responder Con Cita
  #6  
Antiguo 11-08-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener siguiente registro acces maxi915 Tablas planas 3 05-07-2014 06:10:21
Buscar siguiente registro con F3 en un DBGrid usando Locate cubanbaker Conexión con bases de datos 12 21-09-2011 21:50:10
Registro siguiente agustin173 Varios 4 05-10-2010 00:54:29
Key violation. Continuar con siguiente registro CHiCoLiTa Conexión con bases de datos 11 14-02-2007 21:48:37
siguiente registro (mysql) Cosgaya PHP 2 11-07-2006 00:59:40


La franja horaria es GMT +2. Ahora son las 12:21:20.


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