La gestión de datos es el corazón de cualquier aplicación de bases de datos, y una tarea fundamental dentro de esta gestión es la ordenación. Poder presentar la información de manera organizada, ya sea alfabética, numérica o cronológicamente, es crucial para la usabilidad y la eficiencia. En el entorno de Visual FoxPro, un sistema de gestión de bases de datos relacional robusto y versátil, existen diversas formas de lograr esta organización. Si bien la ordenación de registros en tablas y cursores es una operación común y poderosa, la ordenación de datos almacenados en estructuras de memoria como los arrays también es una necesidad frecuente. Visual FoxPro ofrece funciones específicas para manejar arrays, y una de las más importantes y versátiles es la función ASORT().

Este artículo se sumergirá en el funcionamiento de ASORT(), explorando sus capacidades, parámetros y cómo aprovecharla al máximo. Aunque Visual FoxPro proporciona mecanismos para ordenar datos directamente en tablas (como las cláusulas ORDER BY en las sentencias SELECT o la creación de índices), ASORT() se enfoca exclusivamente en los arrays, ofreciendo un control granular sobre cómo se organizan los elementos dentro de estas estructuras de memoria.

- La Importancia de la Ordenación de Datos
- Ordenar Datos en Visual FoxPro: Más Allá de los Arrays
- El Comando Clave: ASORT() para Arrays
- Parámetros de ASORT(): Desglosando su Uso
- Tabla Resumen de Parámetros de ASORT()
- Ordenación de Arrays Unidimensionales y Bidimensionales
- La Naturaleza de la Ordenación en VFP: ¿Estable o Inestable?
- Ejemplos Prácticos de ASORT()
- Consideraciones Adicionales y Alternativas
- Preguntas Frecuentes sobre Ordenación con ASORT()
- Conclusión
La Importancia de la Ordenación de Datos
En cualquier aplicación, la forma en que se presentan los datos puede afectar drásticamente la experiencia del usuario y la capacidad de análisis. Datos desordenados son difíciles de navegar y comprender. La ordenación permite:
- Facilitar la búsqueda: Es más rápido encontrar un elemento en una lista ordenada.
- Mejorar la legibilidad: Presentar listas en un orden lógico (alfabético de nombres, cronológico de fechas, etc.) hace que la información sea más intuitiva.
- Agrupar elementos relacionados: Al ordenar por una clave, elementos con valores similares quedan contiguos.
- Realizar análisis secuenciales: Algunos algoritmos o reportes requieren que los datos estén en un orden específico.
En Visual FoxPro, ya sea que estés trabajando con información directamente de una tabla o con datos que has cargado previamente en un array para su procesamiento, la capacidad de ordenar es indispensable.
Ordenar Datos en Visual FoxPro: Más Allá de los Arrays
Antes de centrarnos en ASORT(), es útil reconocer que Visual FoxPro ofrece otras vías para ordenar datos, principalmente cuando se trata de tablas o cursores:
- Cláusula ORDER BY en SELECT: Permite recuperar datos de una tabla ya ordenados basándose en una o más columnas. Es ideal para consultas y reportes.
- Índices: Crean un orden lógico persistente (o temporal en cursores) sobre los datos de una tabla. Los índices son fundamentales para la velocidad de búsqueda y ordenación en tablas grandes. Se pueden crear índices sobre una o múltiples columnas.
Estos métodos son potentes para datos basados en disco o cursores temporales que representan conjuntos de registros. Sin embargo, cuando los datos ya residen en memoria dentro de un array, ASORT() se convierte en la herramienta principal.
El Comando Clave: ASORT() para Arrays
La función ASORT() es el comando fundamental en Visual FoxPro para reorganizar los elementos dentro de un array. Permite ordenar arrays unidimensionales o bidimensionales, ofreciendo flexibilidad en cuanto al rango de elementos a ordenar y el criterio (columna en arrays 2D). Su sintaxis es:
nSuccess = ASORT( ArrayName [, nStartPos [, nNumElems [, nSortOrder [, nCase ] ] ] ] )Analicemos cada uno de sus parámetros para entender cómo controlan el proceso de ordenación.
Parámetros de ASORT(): Desglosando su Uso
Comprender los parámetros de ASORT() es crucial para utilizar la función correctamente. A continuación, detallamos cada uno:
ArrayName
Este es el único parámetro obligatorio. Es simplemente el nombre del array que deseas ordenar. El array debe existir en el ámbito actual.
nStartPos
Este parámetro indica dónde comenzar el proceso de ordenación. Su comportamiento varía ligeramente dependiendo de si el array es unidimensional o bidimensional:
- Array Unidimensional: Especifica el índice del primer elemento a incluir en la ordenación. Si se omite o se usa un valor negativo (como -1, aunque otros valores negativos también funcionan de forma no documentada), la ordenación comienza desde el primer elemento (índice 1).
- Array Bidimensional: Aquí es donde se vuelve un poco más interesante. `nStartPos` debe ser el índice del elemento *en la columna que deseas ordenar*, en la fila donde deseas comenzar. Por ejemplo, en un array de 5 filas y 3 columnas, si quieres ordenar por la segunda columna empezando en la fila 1, `nStartPos` sería 2 (el índice del elemento en la posición [1, 2]). Si quieres empezar en la fila 4, `nStartPos` sería 11 (el índice del elemento en la posición [4, 2] - calculado como (4-1)*3 + 2). La función AELEMENT() puede ser útil para calcular este índice en arrays 2D.
Es importante notar que para especificar los siguientes parámetros (`nNumElems`, `nSortOrder`, `nCase`), debes proporcionar un valor para `nStartPos`, incluso si es 1 para ordenar desde el principio.
nNumElems
Este parámetro define cuántos elementos (o filas, en el caso de arrays 2D) se deben incluir en la ordenación, comenzando desde `nStartPos`.
- Array Unidimensional: Especifica el número de elementos a ordenar. Si se omite o se usa un valor negativo (como -1), la ordenación se extiende desde `nStartPos` hasta el final del array. La función ALEN() puede ayudarte a obtener el total de elementos si necesitas ordenar hasta el final y no quieres usar -1.
- Array Bidimensional: Especifica el número de *filas* a ordenar, comenzando desde la fila que contiene el elemento especificado por `nStartPos`. Si se omite o es negativo, ordena desde esa fila hasta la última fila del array.
Al igual que con `nStartPos`, para usar los parámetros subsiguientes, debes especificar `nNumElems`.
nSortOrder
Este parámetro determina la dirección de la ordenación:
- 0, Negativo, u Omitido: Ordenación en orden ascendente (A-Z, 0-9).
- Positivo: Ordenación en orden descendente (Z-A, 9-0).
¡Atención! Este parámetro es particularmente confuso porque un valor positivo indica orden descendente, lo cual es contraintuitivo para muchos programadores acostumbrados a otras convenciones. Este detalle es una fuente común de errores, e incluso la documentación oficial de Visual FoxPro tuvo errores al respecto en versiones anteriores. Siempre recuerda: Positivo = Descendente.
nCase
Este parámetro, disponible a partir de Visual FoxPro 7, controla si la ordenación distingue entre mayúsculas y minúsculas.
- 0 u Omitido: Realiza una ordenación sensible a mayúsculas y minúsculas (case-sensitive). 'A' es diferente de 'a'. El orden generalmente sigue el código ASCII.
- 1: Realiza una ordenación insensible a mayúsculas y minúsculas (case-insensitive). 'A' y 'a' se tratan como iguales para fines de ordenación.
Este parámetro es muy útil cuando se ordena texto donde la distinción entre mayúsculas y minúsculas no es relevante para el orden lógico.
Valor de Retorno: nSuccess
La función ASORT() devuelve un valor numérico:
- 1: Indica que la ordenación se realizó con éxito.
- -1: Indica que la ordenación no tuvo éxito. Según la documentación y la experiencia práctica, este resultado es extremadamente raro y rara vez se ve en condiciones normales de operación.
Tabla Resumen de Parámetros de ASORT()
| Parámetro | Tipo | Descripción | Valores Comunes |
|---|---|---|---|
ArrayName | Nombre | Nombre del array a ordenar. | Cualquier nombre de array válido. |
nStartPos | Numérico | Inicio de la ordenación (índice/columna). | 1 (inicio), >1 (posición específica), -1 (desde el principio). |
nNumElems | Numérico | Número de elementos/filas a ordenar. | >0 (cantidad específica), 0 o <0 (hasta el final). |
nSortOrder | Numérico | Dirección de la ordenación. | 0 o <0 (Ascendente), >0 (Descendente). |
nCase | Numérico | Sensibilidad a mayúsculas/minúsculas (VFP 7+). | 0 (Sensitive), 1 (Insensitive). |
Ordenación de Arrays Unidimensionales y Bidimensionales
ASORT() maneja de forma nativa ambos tipos de arrays. En un array unidimensional, la ordenación es directa sobre la secuencia de elementos. En un array bidimensional, la ordenación se basa en una columna específica. Cuando especificas `nStartPos` en un array 2D, Visual FoxPro identifica la columna que contiene ese elemento y usa los valores de esa columna en las filas especificadas (desde la fila de `nStartPos` por `nNumElems` filas) como criterio de ordenación. Las filas completas se mueven según el orden de los valores en esa columna.
Calcular `nStartPos` para arrays bidimensionales puede ser confuso. Recuerda que los elementos de un array 2D se almacenan lógicamente por filas. El índice de un elemento en la fila `r` y columna `c` de un array con `NumCols` columnas es `(r - 1) * NumCols + c`. Así, para ordenar por la columna `c` comenzando en la fila `r`, tu `nStartPos` sería `(r - 1) * NumCols + c`.
La Naturaleza de la Ordenación en VFP: ¿Estable o Inestable?
Un punto importante a tener en cuenta sobre ASORT() es que no realiza lo que se conoce como una ordenación estable. En una ordenación estable, si dos elementos tienen el mismo valor en la columna o criterio por el que estás ordenando, su orden relativo original se mantiene. Por ejemplo, si tienes una lista de personas ordenada por nombre, y luego la ordenas por apellido, una ordenación estable mantendría el orden original por nombre para todas las personas con el mismo apellido.
Visual FoxPro, al igual que muchos otros sistemas (a menudo por razones de rendimiento), utiliza un algoritmo de ordenación que no es estable. Esto significa que si ordenas un array 2D por una columna donde hay valores duplicados, el orden relativo de las filas con esos valores duplicados no está garantizado; puede cambiar aleatoriamente en cada ejecución de ASORT().

¿Cuándo importa esto? Principalmente cuando necesitas ordenar por múltiples criterios. Si quisieras ordenar un array de personas primero por apellido y luego por nombre, una ordenación estable te permitiría aplicar ASORT() primero por nombre y luego por apellido, obteniendo el resultado deseado. Con la ordenación inestable de VFP, este enfoque no funciona de manera confiable.
La solución recomendada en Visual FoxPro para realizar una ordenación estable o una ordenación por múltiples columnas (criterios) es utilizar un cursor y un índice. Puedes copiar los datos del array a un cursor temporal y luego crear un índice sobre las columnas deseadas (por ejemplo, INDEX ON Apellido + Nombre TAG FullName). Al navegar el cursor por este índice, los datos estarán ordenados de manera estable por ambos criterios.
Ejemplos Prácticos de ASORT()
Veamos algunos ejemplos de cómo usar ASORT(), basados en el patrón común de llenar un array con ADIR() (que lista archivos) y luego ordenarlo de diferentes maneras.
* Creamos un array con la lista de archivos .DBF
LOCAL aFiles[1]
ADIR( aFiles, "*.DBF")
* Ordenar el array completo en orden ascendente por nombre (columna 1)
* Los parámetros nStartPos, nNumElems, nSortOrder se omiten,
* usando sus valores por defecto (1, -1, 0)
ASORT( aFiles)
DISPLAY MEMORY LIKE aFiles
* Ordenar el array completo en orden descendente por nombre (columna 1)
* Especificamos 1 para nStartPos, -1 para nNumElems (todo el array),
* y 1 para nSortOrder (descendente)
ASORT( aFiles, 1, -1, 1)
DISPLAY MEMORY LIKE aFiles
* Ordenar el array completo en orden ascendente por tamaño (columna 2)
* Especificamos 2 para nStartPos (la columna 2, fila 1).
* nNumElems y nSortOrder se omiten (todo el array, ascendente).
ASORT( aFiles, 2)
DISPLAY MEMORY LIKE aFiles
* Ordenar las primeras 3 filas por fecha/hora (columna 3)
* Especificamos 3 para nStartPos (columna 3, fila 1),
* y 3 para nNumElems (las primeras 3 filas).
* nSortOrder se omite (ascendente).
ASORT( aFiles, 3, 3)
DISPLAY MEMORY LIKE aFiles
* Ordenar 5 filas comenzando desde la fila 4 por fecha/hora (columna 3)
* La fila 4 en la columna 3 tiene el índice (4-1)*4 + 3 = 15 (si ADIR crea 4 columnas)
* ADIR crea 5 columnas (nombre, tamaño, fecha, hora, atributos), así que el índice es (4-1)*5 + 3 = 18.
* Especificamos 18 para nStartPos (columna 3, fila 4)
* y 5 para nNumElems (5 filas a partir de la fila 4).
* nSortOrder se omite (ascendente).
ADIR( aFiles, "*.DBF") && Recargar el array si fue modificado por el ejemplo anterior
ASORT( aFiles, 18, 5)
DISPLAY MEMORY LIKE aFiles
* Ejemplo con ordenación insensible a mayúsculas/minúsculas (VFP 7+)
* ADIR con el flag 1 para mantener mayúsculas/minúsculas originales
ADIR( aFiles, "*.DBF", "*.*", 1)
* Ordenar todo el array (nStartPos -1, nNumElems -1)
* en orden ascendente (nSortOrder -1)
* de forma insensible a mayúsculas/minúsculas (nCase 1)
ASORT( aFiles, -1, -1, -1, 1)
DISPLAY MEMORY LIKE aFiles
Estos ejemplos ilustran cómo jugar con los parámetros `nStartPos`, `nNumElems`, `nSortOrder` y `nCase` para lograr diferentes resultados de ordenación en arrays bidimensionales como los que produce ADIR().
Consideraciones Adicionales y Alternativas
Aunque ASORT() es muy eficiente para ordenar arrays en memoria, es importante elegir la herramienta adecuada para la tarea. Si tus datos ya están en una tabla y solo necesitas mostrarlos ordenados o procesarlos secuencialmente, usar ORDER BY en SELECT o trabajar con índices en la tabla es generalmente más eficiente que cargar todos los datos en un array y luego ordenarlo con ASORT(), especialmente con grandes volúmenes de datos.
ASORT() brilla cuando ya tienes los datos en un array, quizás porque los has recopilado de múltiples fuentes, los has transformado, o son el resultado de cálculos intermedios. En estos escenarios, ASORT() es la forma más directa de organizar esa información en memoria.
Preguntas Frecuentes sobre Ordenación con ASORT()
Aquí respondemos algunas preguntas comunes que pueden surgir al usar ASORT().
¿Puede ASORT() ordenar arrays con diferentes tipos de datos?
Sí, ASORT() puede ordenar arrays que contienen diferentes tipos de datos, pero la ordenación se realiza basándose en reglas de comparación de tipos de datos de Visual FoxPro. Por ejemplo, los números se ordenan numéricamente, las cadenas alfabéticamente, las fechas cronológicamente, etc. Si una columna en un array bidimensional contiene tipos de datos mixtos, el comportamiento de ordenación puede ser menos predecible, aunque VFP intentará comparar los valores según sus reglas internas de coerción de tipos. Es ideal que la columna por la que ordenas contenga datos del mismo tipo.
¿Cómo afecta el rendimiento ASORT() con arrays muy grandes?
ASORT() es una función nativa y está optimizada para el rendimiento. Sin embargo, ordenar arrays muy grandes (miles o millones de elementos/filas) consumirá tiempo de procesamiento y memoria. La eficiencia exacta dependerá de la cantidad de datos y de la complejidad de las comparaciones (por ejemplo, cadenas largas). Para volúmenes de datos extremadamente grandes que provienen de tablas, usar índices en tablas o cursores suele ser más escalable.
¿Puedo ordenar un array por múltiples columnas con ASORT()?
No directamente en una sola llamada de ASORT() de manera estable. Como se mencionó, ASORT() ordena basándose en una sola columna (o la secuencia completa en 1D) y no es estable. Para ordenar por múltiples criterios (ej. Apellido, luego Nombre), la técnica estándar en VFP es usar un cursor temporal, copiar los datos del array a él, y luego crear un índice compuesto sobre las columnas deseadas.
¿Hay otras funciones de ordenación de arrays en VFP?
ASORT() es la función principal y más versátil para ordenar arrays completos o partes de ellos. No hay otras funciones nativas de alto nivel específicamente diseñadas para ordenar arrays completos con la misma flexibilidad de ASORT(). Otras funciones como ASCAN() pueden buscar elementos, pero no reordenan el array.
¿Qué pasa si el array contiene valores .NULL.?
Visual FoxPro maneja los valores .NULL. en las ordenaciones. Generalmente, los valores .NULL. se tratan como los valores más bajos o más altos dependiendo de la operación y la configuración, pero en el contexto de ASORT(), tienden a agruparse al principio o al final del array ordenado. Es buena práctica manejar o filtrar valores .NULL. si su posición en el array ordenado es crítica.
Conclusión
La función ASORT() es una herramienta esencial en la caja de herramientas de cualquier desarrollador de Visual FoxPro que trabaje con arrays. Permite organizar los datos en memoria de forma eficiente y flexible, controlando el rango, la dirección y la sensibilidad a mayúsculas/minúsculas de la ordenación. Aunque presenta la peculiaridad de su parámetro `nSortOrder` y no realiza una ordenación estable, comprender sus parámetros y su comportamiento es clave para manipular arrays de manera efectiva. Para ordenaciones complejas o con grandes volúmenes de datos de tablas, considera siempre la alternativa de usar cursores e índices. Dominar ASORT() te permitirá gestionar y presentar tus datos en array de la forma más útil y organizada posible.
Si quieres conocer otros artículos parecidos a Ordenar Datos en Visual FoxPro: ASORT() al Detalle puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL