versión 3
ORDER BY ({tabla}{; Campo{; > o <{; Campo2; > o <2; ...; CampoN; > o <N}{; *}}})
Parámetro | Tipo | Descripción | |
tabla | Tabla | Tabla para la cual ordenar los registros seleccionados o | |
Tabla por defecto si se omite | |||
Campo | Campo | Campo en el cual efectuar la ordenación para cada nivel | |
> o < | Sentido de la ordenación para cada nivel: | ||
> para orden ascendente o | |||
< para orden descendente | |||
* | Continua la bandera de ordenación |
Descripción
ORDER BY ordena (reordena) los registros de la selección actual de tabla para el proceso actual. Una vez efectuada la ordenación, el primer registro de la nueva selección actual se convierte en el registro actual.
Si omite el parámetro tabla, el comando se aplica a la tabla por defecto. Si no se ha definido una tabla por defecto, se genera un error.
Si no especifica el parámetro campo, ni los parámetros > o < o, ORDER BY muestra la caja de diálogo Ordenar de 4D para tabla. Esta es la caja de diálogo del editor:
Para mayor información sobre la utilización del editor de ordenación, consulte el Manual de diseño de 4D.
El usuario construye la ordenación, luego hace clic en el botón ordenar para realizar la ordenación. Si la ordenación se realiza correctamente, la variable OK toma el valor 1. Si el usuario hace clic en Cancelar, ORDER BY termina sin efectuar la ordenación, y la variable OK toma el valor 0 (cero).
Ejemplos
1. El siguiente ejemplo muestra la caja de diálogo Ordenar para la tabla [Productos]:
ORDER BY([Productos])
2. El siguiente ejemplo muestra la caja de diálogo Ordenar para la tabla por defecto (si ha sido definida):
ORDER BY
Si especifica los parámetros campo y > o < , la caja de diálogo estándar Ordenar no se presenta y la ordenación se define por programación. Puede ordenar la selección en uno o varios niveles. Para cada nivel de ordenación, usted especifica un campo en el parámetro campo y un orden en > o <. Si pasa el parámetro "mayor que" (>), el orden es ascendente. Si pasa el símbolo "menor que" (<), el orden es descendente.
Ejemplos
3. El ejemplo siguiente ordena la selección actual de [Productos] por nombre en orden ascendente:
ORDER BY([Productos];[Productos]Nombre;>)
4. El siguiente ejemplo ordena la selección actual de [Productos] por nombre en orden descendente:
ORDER BY([Productos];[Productos]Nombre;<)
5. La línea siguiente ordena la selección de [Productos] por tipo y precio en orden ascendente para ambos niveles:
ORDER BY([Productos];[Productos]Tipo;>;[Productos]Precio;>)
6. El siguiente ejemplo ordena la selección actual de [Productos] por tipo y precio en orden descendente para ambos niveles:
ORDER BY([Productos];[Productos]Tipo;<;[Productos]Precio;<)
7. El siguiente ejemplo ordena la selección actual de [Productos] por tipo en orden ascendente y por precio en orden descendente:
ORDER BY([Productos];[Productos]Tipo;>;[Productos]Precio;<)
8. El siguiente ejemplo ordena la selección actual de [Productos] por tipo en orden descendente y por precio en orden ascendente:
ORDER BY([Productos];[Productos]Tipo;<;[Productos]Precio;>)
Si omite el parámetro de ordenación > o <, por defecto el orden es ascendente.
Ejemplo
9. El siguiente ejemplo ordena la selección actual de [Productos] por nombre en orden ascendente:
ORDER BY([Productos];[Productos]Nombre)
Si sólo se especifica un campo (un nivel de ordenación) y está indexado, el índice se utiliza para la ordenación. Si el campo no está indexado o si hay más de un campo, la ordenación se lleva a cabo de manera secuencial. El campo puede pertenecer a la tabla de la selección que está siendo reordenada o a una tabla Uno relacionada con tabla para una relación automática. (Recuerde, la tabla a la cual se aplica ORDER BY debe ser la tabla Muchos). En este caso, la ordenación es siempre secuencial.
Ejemplos
10. El siguiente ejemplo efectúa una ordenación indexada si el campo [Productos]Nombre está indexado:
ORDER BY([Productos];[Productos]Nombre;>)
11. El siguiente ejemplo efectúa una ordenación secuencial, sin importar si los campos están indexados:
ORDER BY([Productos];[Productos]Tipo;>;[Productos]Precio;>)
12. El siguiente ejemplo efectúa una ordenación secuencial utilizando un campo relacionado:
ORDER BY([Facturas];[Empresas]Nombre;>) ` Las facturas son ordenadas alfabéticamente por el campo Nombre de la empresa
Para realizar ordenaciones múltiples (ordenación en múltiples campos), puede llamar ORDER BY tantas veces como sea necesario y especificar el parámetro opcional *, excepto para la última llamada a ORDER BY, la cual inicia la operación de ordenación real. Esta funcionalidad es útil para administrar ordenaciones múltiples en interfaces de usuario personalizadas.
Advertencia: con esta sintaxis, usted puede pasar únicamente un nivel de ordenación (campo) por línea de instrucción.
Ejemplo
13. En un formulario de salida mostrado en modo Aplicación, usted le permite a los usuarios ordenar una columna en orden creciente simplemente haciendo clic en el encabezado de la columna. Si el usuario mantiene presionada la tecla Mayús mientras hace clic en otros encabezados de columnas, la ordenación se lleva a cabo en varios niveles:
Cada encabezado de columna contiene un botón resaltado asociado con el siguiente método de objeto:
MULTINIVEL (->[CDs]Titulo) `Botón del encabezado de la columna título
Cada botón llama al método de proyecto MULTINIVEL pasando un puntero al campo de la columna correspondiente. El método de proyecto MULTINIVEL es el siguiente:
` Método de proyecto MULTINIVEL ` MULTINIVEL(Puntero) ` MULTINIVEL(->[Tabla]Campo) C_POINTER($1) `Nivel de ordenación (campo) C_LONGINT($lNivelNb) `Construcción de criterios If (Not(Shift down)) `Ordenación simple (un nivel) ARRAY POINTER(aPtrCampoOrden;1) aPtrCampoOrden{1}:=$1 Else $lNivelNb:=Find in array(aPtrCampoOrden;$1) `¿Ya está ordenado este campo? If ($lNivelNb<0) `Si no INSERT IN ARRAY(aPtrCampoOrden;Size of array(aPtrCampoOrden)+1;1) aPtrCampoOrden{Size of array(aPtrCampoOrden)}:=$1 End if End if `Ejecución de la ordenación $lNivelNb:=Size of array(aPtrCampoOrden) If ($lNivelNb>0) `Hay por lo menos un nivel de ordenación For ($i;1;$lNivelNb) ORDER BY([CDs];(aPtrCampoOrden{$i})->;>;*) `Construir la ordenación End for ORDER BY([CDs]) `No * termina la definición de la ordenación y comienza la operación de ordenación actual. End if
Sin importar cómo se defina la ordenación, si la operación de ordenación va a tomar algún tiempo, 4D muestra automáticamente un mensaje que contiene un termómetro de progresión. Estos mensajes pueden activarse y desactivarse utilizando los comandos MESSAGES ON y MESSAGES OFF. Si se muestra el termómetro de progreso, el usuario puede hacer clic en el botón Detener para interrumpir la ordenación. Si la ordenación se termina correctamente, OK toma el valor 1. De lo contrario, si la ordenación se interrumpe OK toma el valor 0 (cero).
Ver también