Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-01-2008
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 261
Poder: 21
Carmelo Cash Va por buen camino
Refrescar un DBGrid y que el puntero siga apuntando donde estaba

Hola foro:

Estoy haciendo un formulario que tiene un DBGrid, conectado a un Datasourse y este a Query1
En el Query1tengo algo parecido a:

"Select Nombre, Telefono, ID_Cliente from Clientes order By Nombre"

Esto me muestra en el DBGrid la lista de Clientes.
Luego en el evento Dobleclick del DBGrid muestro un formulario que me permite
Modificar el teléfono mediante un Query que tiene

"Update Clientes set Telefono=:P_Telefono where ID_Cliente=:P_ID_Cliente"

El problema es que luego de actualizar el teléfono, y cerrar el formulario de modificación, el DBGrid me sigue mostrando el telefono viejo.

Entonces luego hago:
Query1.Close;
Query1.Open;
Y entonces, el telefono se ve bién, El problema es que el puntero del DBGrid se hubica en la primer posición.

La pregunta es:

Cómo Puedo guardar la posición del puntero del DBGrid y cómo hago para hacer que apunte nuevamente al volver a abrir el Query1?
Estoy utilizando InterBase y Delphi 7.

Desde ya muchas gracias a todos po su atención.
Responder Con Cita
  #2  
Antiguo 31-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Buscá la ayuda sobre las funciones para manipular bookmarks.

Su uso es mas o menos este:

Código Delphi [-]
var
  bkmk: Pointer;
begin
  bmkm := Query1.GetBookmark;
  try
    //hacer operaciones con el query
    Query1.GotoBookmark(bkmk);
  finally
    Query1.FreeBookmark(bkmk);
  end;
end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 31-01-2008
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 261
Poder: 21
Carmelo Cash Va por buen camino
Listo

Sí, la solución propuesta fué correcta.
Muchisimas gracias
Responder Con Cita
  #4  
Antiguo 09-04-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Question

Está muy bien, pero no sé si alguien haya dado solución a esto:
  1. Tengo un DBGrid que muestra resultados de una consulta a una base de datos Firebird.
  2. Necesito reorganizar los datos de la consulta (lo hago haciendo click sobre el título de la columna)
  3. Al dar click sobre el título de la columna modifico la cláusula ORDER BY de la consulta.
  4. Cierro la consulta y la abro nuevamente.
  5. Hasta aquí todo funciona muy bien.

Lo que sucede es que requiero que el cursor apunte al mismo registro en el cual me encontraba, para lo cual adopté primero esta solución:

Código:
// Antes de cerrar la consulta
Id := Query.FieldByName('Id').AsInteger;
...
// Después de abrir la consulta
Query.Locate('Id', Id, []);
, donde Id es una clave primaria.

Si la consulta retorna digamos unos mil registros, todo está bien, pero si la consulta es muy grande, al hacer el Locate puede suceder que el registro buscado esté casi al final o unos varios miles de registros después del primero, por lo cual el componente debe llevar al cliente los registros desde el primero hasta el registro buscado. Esto ocasiona demasiados "Fetch Next" que podrían ser miles, con las consecuencias consabidas: tráfico innecesario, y una demora sustancial que se puede contar en segundos y que podrían incluso llegar a minutos (me atrevo a decirlo por lo que tengo al frente).

Entonces decidí abortar este procedimiento. Cuál es la solución? Bueno, pues en este hilo se habla de usar Bookmarks, aunque claro está no para el mismo caso. Bueno, pues con estos, los Bookmarks, tenemos otro inconveniente, y es que prácticamente no sirven porque un Bookmark es un número de registro en el cliente (algo así como un RecNo o "registro número" N). Al dar click en la columna de título los registros devueltos vienen al cliente en un orden diferente, por lo que el registro número N (o en la posición N) ya no es el mismo de antes.

Observando el comportamiento del IBExpert para este caso idéntico, me doy cuenta de que esta aplicación ordena los registros y el cursor permanece en el mismo registro, sin demorarse prácticamente nada, lo cual quiere decir que en esta aplicación obviamente no se usa un Locate.

Entonces, cómo lo hacen?

PD 1. Estoy usando los MDO, y NO quisiera usar una TClientDataSet. Específicamente trabajo con un TMDOQuery. El TMDODataSet presentó problemas con el Locate y con el GotoBookmark.

PD 2. Quise realizar esta consulta en este hilo porque está relacionada con el título del mismo (cambiando el orden de los registros). No se si este hilo debiera pertenecer a los hilos de InterBase & Firebird, pero como involucra componentes... bueno, el caso es que ya estaba creado.

Si alguien ha trabajado en este caso, ya saben, gracias por sus comentarios al respecto.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.

Última edición por mlara fecha: 09-04-2008 a las 19:49:52.
Responder Con Cita
  #5  
Antiguo 10-04-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Exclamation Alto en el camino!

A veces no me siento muy bien. Me pregunto si sólo a mí me pasan algunas cosas, o si sólo yo decido adoptar ciertas soluciones que parecieran no ser muy adecuadas. Pero resulta que mis clientes trabajan sobre rejillas que muestran todos los datos de una consulta... están acostumbrados a ello porque vienen trabajando algunos desde hace años con versiones previas del mismo producto (pero que usan tecnología obsoleta). Entonces debo proporcionarles una nueva versión del producto, que adopte nueva tecnología, y que brinde la misma funcionalidad, especialmente para que ellos puedan realizar:
  1. Búsquedas parciales con la posibilidad de mirar los registros anteriores y posteriores.
  2. Filtros con base en las propiedades de los registros.
  3. Selección de registros no consecutivos en la rejilla para realizar operaciones con estos registros.
  4. Impresiones de todos los registros organizados por alguna de sus columnas.

Esto entre muchas otras posibilidades (por favor no sugieran cambiar el diseño, en serio no es adecuado). Bueno, todo en realidad funcionaba bien con pocos registros, pero cuando hice pruebas con consultas de varios miles de registros, incluso ya con mil registros, ejecutar un Locate es traumático. En entornos de producción se realizan filtros y se organizan los registros muchas veces. Como mencioné en otro hilo, no tuve inconvenientes con estas acciones cuando trabajaba con Paradox, pero resulta que sí los tengo al trabajar con Firebird.

Me pregunto si alguien ha trabajado a fondo estos asuntos...

... de ser así, ya saben. Muchas gracias por sus comentarios, sugerencias, recomendaciones, indicaciones, etc.

Este es otro hilo que, a mi manera de ver, trata el mismo asunto:

http://www.clubdelphi.com/foros/showthread.php?t=54209
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #6  
Antiguo 10-04-2008
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 mlara Ver Mensaje
...resulta que mis clientes trabajan sobre rejillas que muestran todos los datos de una consulta... están acostumbrados a ello porque vienen trabajando algunos desde hace años con versiones previas del mismo producto
En ese caso creo que la solución ya casi la tienes.
Si los clientes ya cargan todos los datos (no discutimos si eso está mejor o peor, ya que comentas que eso es así desde siempre) en tu caso el tema de la ordenación creo que deberías hacerla en memoria, en lugar de volver a lanzar la consulta y hacer la búsqueda posterior con locate.

Se me ocurre que puedes hacerla con un componente intermedio, como ya has comentado anteriormente, sea TClientDataSet u algun otro similar que te gestione esa carga en memoria o si no deseas ese componente te queda la solución de algun Grid que te lo haga; Ahora mismo estoy pensando en el Grid de las Quantum, que hace la función de Grid y de ese componente intermedio, almacenando TODOS los registros en memoria, por lo tanto las reordenaciones posteriores, agrupaciones, filtros y demás operaciones son casi inmediatos, puesto que todos los resultados ya están cargados y se gestionan el local.
__________________
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
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
refrescar DBGrid de base modificada emeceuy Conexión con bases de datos 4 23-09-2007 01:33:10
Refrescar datos de un DBGrid Durbed Conexión con bases de datos 3 29-01-2007 16:39:05
refrescar dbgrid que usa dbexpress chux Conexión con bases de datos 2 22-05-2006 17:31:06
¿informe de Crystal apuntando a diferentes usuarios de oracle? dnieto Varios 0 30-09-2005 13:21:33
Refrescar un query para un DBGrid neon OOP 4 19-08-2004 17:06:39


La franja horaria es GMT +2. Ahora son las 14:32:25.


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