Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #6  
Antiguo 11-08-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 06:26:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi