Ver Mensaje Individual
  #4  
Antiguo 09-04-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Reputación: 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