Ordenando lo ya ordenado
¿Se puede ordenar el resultado devuelto por una consulta? Si está utilizando ADO, la respuesta
es afirmativa ... si se cumple una condición: el cursor debe almacenarse en el lado cliente y,
consecuentemente, tratarse de un cursor estático. Para un componente de tipo TADOQuery debemos comprobar primero el valor de las siguientes propiedades:
Propiedad |
Valor |
CursorLocation |
clUseClient |
CursorType |
ctStatic |
ADO implementa este tipo de cursores mediante una caché de registros que se sitúa en el lado del cliente. Naturalmente, cuando disponemos de caché podemos hacer maravillas con los datos recuperados: ordenarlos, filtrarlos, postergar las actualizaciones, etc.
En este momento, en particular, nos interesa la ordenación del resultado. La propiedad que necesitamos explotar se llama Sort, es de tipo WideString (cosas de COM) y permite que le asignemos una lista de nombres de columnas separados por comas. Tome buena nota: por comas, no por puntos y comas.
ADOQuery1.Sort := 'Apellidos,Nombre';
Pero hay más: también podemos ordenar descendentemente. Por ejemplo:
ADOQuery1.Sort := 'Apellidos,Salario DESC';
En la instrucción anterior, Apellidos se sigue ordenando de forma ascendente, pero las personas con el mismo apellido se ordenan a su vez por el orden decreciente de sus salarios. Aquí hay que tener un poco de cuidado: la cláusula DESC debe ponerse en mayúsculas, y estar separada del nombre del campo al que afecta por un espacio en blanco.
¿Qué utilidad puede tener todo esto? Se lo explicó mejor si le cuento qué me hizo escribir este truco:
Estaba escribiendo una aplicación ISAPI para Internet con SQL Server, y estaba retocando la consulta de búsqueda de productos por palabras claves. Suelo recurrir mucho a la cláusula top de la instrucción select, para limitar el número de registros que llegan al cliente. Por lo tanto, mi consulta de productos comienza más o menos así:
select top 50 *
from PRODUCTOS
where /* etc */
Cuando hay que presentar la primera página o grupo de registros de la búsqueda, o cuando se trata de obtener la página o grupo siguiente, la consulta en cuestión se ordena ascendentemente.
Pero cuando hay que obtener la última página o el grupo de registros anterior al grupo actual, es necesario que el servidor evalúe la consulta en orden descendente, para que la cláusula top pueda realizar su trabajo:
select top 50 *
from PRODUCTOS
where /* etc */
order by ProductName desc, ProductID desc
Sin embargo, cuando el resultado ya se encuentra en la caché cliente, debemos invertir el orden de los productos recuperados. Cuando uso MIDAS puedo lograrlo gracias a que el componente TClientDataSet permite ordenar sus registros a nuestro antojo. En la aplicación que os comento había decidido no utilizar MIDAS, para no complicar la configuración del servidor. Y mi tabla de salvación fue acordarme de la bendita propiedad Sort de los conjuntos de datos de ADO.
|