Ordenar datos en aplicaciones internacionales
Después de crear una tabla de datos internacionales, compruebe si la aplicación ordena correctamente los datos. El modo en que se ordenan los datos depende de la página de códigos asociada a la tabla, ya que especifica el orden o las secuencias de ordenación disponibles.
Descripción de los tipos de ordenación
Los tipos de ordenación incorporan las reglas de ordenación de distintas configuraciones regionales, lo que permite ordenar correctamente los datos en esos idiomas. En Visual FoxPro, el orden actual determina los resultados de comparaciones entre expresiones de caracteres y el orden en el que los registros aparecen en tablas indizadas u ordenadas.
Nota La clasificación funciona de forma diferente en entornos de caracteres codificados en dos bytes (DBCS).
Utilice el orden adecuado, ya que cada orden produce resultados distintos, como se muestra en la tabla siguiente.
Unsorted (sin ordenar) | Machine (máquina) | General | Spanish (español) |
---|---|---|---|
!@#$ | Espacio | espacio | Espacio |
1234 | !@#$ | !@#$ | !@#$ |
espacio | 1234 | 1234 | 1234 |
Caesar | Caesar | äa | Äa |
cæsar | Car | ab | Ab |
Strasse | Char | äb | Äb |
straße | Czech | Caesar | Caesar |
Car | Strasse | cæsar | Cæsar |
Char | Ab | Car | Car |
Czech | Cæsar | Çar | Çar |
ab | Straße | Char | Czech |
Çar | Çar | Czech | Char |
äa | Äa | Strasse | Strasse |
äb | Äb | straße | Straße |
Directrices para ordenar
Tenga en cuenta estas directrices a la hora de elegir un orden:
- Evite el orden Machine si desea ordenar correctamente los caracteres internacionales, ya que Machine ordena los caracteres internacionales según el orden ASCII. Por ejemplo
Çar
va detrás destraße
. - Los caracteres con marcas diacríticas se ordenan de forma distinta que los caracteres sin estas marcas. Por ejemplo, en los tipos de ordenación General y español
äa
se ordena antes queab
peroab
va antes queäb
. - Los caracteres del tipo
ß
se ordenan igual que los caracteres ampliados equivalentes. Por ejemplo,straße
se ordena igual queStrasse
, ycæsar
igual queCaesar
. - En algunos idiomas, dos caracteres se ordenan como un único carácter. Por ejemplo, en español, la
Ch
deChar
se ordena como si fuera un carácter entreC
yD
.
En las secciones siguientes se describe cómo especificar ordenaciones, comprobar el orden actual y reconocer sus resultados.
Especificar un orden
Puede especificar un orden para los campos del tipo Character que empleará en operaciones posteriores de indización y ordenación.
Para especificar un orden
En el menú Herramientas, elija Opciones.
Seleccione la ficha Datos.
En el cuadro Secuencia de ordenación, seleccione el orden correspondiente.
Si desea guardar esta configuración para futuras sesiones de Visual FoxPro, elija Establecer como predeterminado.
Sugerencia También puede especificar el orden con el comando SET COLLATE TO o con la instrucción COLLATE en el archivo Config.fpw. Para obtener más detalles acerca de Config.fpw, consulte Configurar Visual FoxPro.
El orden actual no afecta a los índices creados anteriormente, aunque sí afecta a los resultados de comparaciones y comandos como SEEK y SELECT - SQL.
Puede cambiar el orden en cualquier momento. Por ejemplo, después de abrir una tabla de clientes, puede crear etiquetas de índice que representen distintos tipos de ordenación, como se muestra en el código siguiente. A continuación, puede cambiar el orden utilizando simplemente una etiqueta distinta:
USE customer
SET COLLATE TO "GENERAL"
INDEX ON fname TAG mygeneral ADDITIVE
SET COLLATE TO "MACHINE"
INDEX ON custid TAG mymachine ADDITIVE
SET COLLATE TO "DUTCH"
INDEX ON lname TAG mydutch ADDITIVE
Nota El orden de un índice anula el orden actual.
La página de códigos actual determina qué tipos de ordenación hay disponibles. Si utiliza SET COLLATE para especificar un orden no admitido por la página de códigos actual, Visual FoxPro generará un error. Asimismo, si especifica en Config.fpw un orden no admitido en la página de códigos actual, se usará de forma predeterminada el orden Machine.
Comprobar el orden
Para determinar el orden actual, utilice la función SET ('COLLATE'). Por ejemplo, puede guardar el orden actual, establecerlo en Machine, realizar los trabajos necesarios y, a continuación, restaurar el orden original mediante el código siguiente:
cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
* code that requires the Machine sort order
SET COLLATE TO cCurrentOrder && return to the previous sort order
Además, puede determinar el orden de un índice o una etiqueta de índice utilizando la función IDXCOLLATE( ).
Reconocer los resultados de los tipos de ordenación
El orden afecta a los resultados de la comparación de cadenas, SEEK, y SELECT - SQL, como se describe en las secciones siguientes.
Comparar cadenas
Todos los tipos de ordenación, salvo Machine y Unique Weight, ignoran el uso de mayúsculas o minúsculas. Esto significa que no es necesario utilizar UPPER( ) en las expresiones de índice.
El orden actual afecta a las comparaciones de cadenas. Por ejemplo, si establece el orden en General, las instrucciones siguientes devolverán verdadero (.T.):
?"A" = "a"
?"Straße"="Strasse"
?"æ" = "ae"
Sin embargo, cuando utilice el orden Machine, todas estas instrucciones devolverán falso (.F.), porque se ha especificado que las cadenas coincidan en una comparación exacta, byte a byte.
El operador de comparación de cadenas de caracteres (= =) proporciona el mismo resultado cuando se compara por valor que cuando se compara con el orden Machine. Por ejemplo, la instrucción siguiente devuelve falso (.F.):
? "Straße" == "Strasse"
Nota Visual FoxPro ignora SET EXACT cuando se utiliza el operador de comparación de cadenas de caracteres (= =).
Usar SEEK
Visual FoxPro ignora las marcas diacríticas cuando se realiza una búsqueda parcial. Una búsqueda parcial se produce cuando la longitud de la expresión es inferior a la de la clave. Si las marcas diacríticas son importantes, considere la posibilidad de utilizar SCAN FOR...ENDSCAN o LOCATE FOR...CONTINUE en lugar de SEEK.
Entre las ventajas de utilizar SCAN y LOCATE en lugar de SEEK cabe citar las siguientes:
- SCAN y LOCATE reconocen las marcas diacríticas.
- Visual FoxPro optimiza plenamente los resultados de SCAN o LOCATE si el orden actual es Machine o Unique Weight, mientras que sólo optimiza parcialmente los resultados de SEEK.
- SCAN y LOCATE recuerdan la condición que los ha invocado, lo que permite utilizarlos para hacer un bucle en una condición. Por el contrario, SEEK le sitúa en algún lugar del índice y SKIP continúa hacia abajo desde ese punto del índice. En consecuencia, es posible que SEEK no produzca los resultados deseados con datos internacionales.
Usar SELECT - SQL
El comando SELECT - SQL utiliza el orden actual. Por ejemplo, si tiene una etiqueta de índice basada en el orden General y el orden actual (devuelto por SET ('COLLATE')) es Machine, el resultado de SELECT SQL se basará en Machine.
Para emplear el orden actual, utilice la cláusula ORDER BY de SELECT - SQL.
Usar índices
Los tipos de ordenación determinan el orden de los registros de las tablas indizadas. Tenga en cuenta las siguientes directrices para utilizar índices con tipos de ordenación:
- Vuelva a crear los índices creados en versiones anteriores de FoxPro si desea que éstos utilicen un orden distinto que Machine.
- Vuelva a crear los índices de dBASE para aprovechar los tipos de ordenación de Visual FoxPro.
- Utilice el comando REINDEX para volver a generar un índice, ya que REINDEX no modifica el orden.
Vea también
Páginas de códigos compatibles con Visual FoxPro | Creación de aplicaciones con juegos de caracteres codificados en dos bytes | Desarrollar aplicaciones internacionales | Datos | Crear o modificar programas