Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Órden alfabético en la Clausula Order by (https://www.clubdelphi.com/foros/showthread.php?t=63672)

Manuel 25-02-2009 23:37:31

Órden alfabético en la Clausula Order by
 
Hola amigos del club, tengo el siguiente problema en mi base de datos, que es una interbase 6, tengo la siguiente sql.

select * from alumnos
order by apellido1, apellido2, nombres

lo ordena de la siguiente manera
-------------------------------

apellido 1 apellido 2 Nombres
-------------------------------
Beltran Badilla Pedro Juan
Águila Acuña Francisco Pedro <----------- ?????????????:rolleyes::confused:

Ahora que pasa con el tílde, al parece el sql lo toma como un símbolo especial por lo tanto no lo interpreta como un vocal acentuada.

que podría hacer en el sql o la base interbase para que me pudiera interpretar bien los tíldes?, Gracias amigo por leer este hilo.

ElKurgan 26-02-2009 07:37:41

Lo que se suele hacer en estos casos es, o bien tener un campo más con los nombres "normalizados" (sin acentos ni otros caracteres especiales) o seleccionar el campo mediante alguna función o procedimiento almacenado que elimine dichos acentos y los sustituya por sus letras "normales"

Un saludo

Ñuño Martínez 26-02-2009 09:00:16

Depende del motor de la base de datos que estés utilizando. Yo no he visto que los acentos afecten al orden en la aplicación que estoy realizando ahora en el trabajo (MySQL). Aun así, la solución de ElKurgan puede ayudar.

Neftali [Germán.Estévez] 26-02-2009 09:50:50

¿Y cambiando el juego de caracteres? (creo que se podía hacer para cada campo de forma individual)

A ver si alguno de los que sabe de IB/FB aporta algo más...

Durbed 26-02-2009 10:28:47

Te pongo una declaración de domino, utilizo FB 1.5 pero creo que para IB también será valido. Tienes que fijarte en el juego de caracteres que es WIN1252 y el collate es la forma en la que ordena de ahí que se utilice el PXW_SPAN de españa.

Código SQL [-]
CREATE DOMAIN TWC_NOMBRE AS 
VARCHAR(60) CHARACTER SET WIN1252 
COLLATE PXW_SPAN

Espero que te sirva.

fidel 26-02-2009 20:18:55

Supongo que lo que te dice Durbed funciona, si no prueba con

CARACTER SET DOS850
COLLATE DB_PT850

en FireBird 1 ordena según el orden latino internacional que es el correcto actualmente para el español.

Manuel 26-02-2009 20:22:09

Gracias Fidel
 
Lo intente lo que pasa que ya tengo con datos la base y cuando le asigno el dominio a un campo me borra la data.

fidel 27-02-2009 00:14:48

Tendrás que crear una tabla nueva con otro nombre y los mismos campos definidos con CARACTER SET DOS850 COLLATE DB_PT850, pasar a esta nueva tabla todos los datos, borrar la original y renombrar la nueva con el nombre original.
Si te conectas con un IBDatabase, en su caracter set debes poner ISO8859_1 para que visualice bien la ñ, ç, vocales acentuadas, etc.

.....

Por otra parte, he observado que en la versión 2 de FireBird con CARACTER SET ISO8892_1 y COLLATE ES_ES ya ordena bien según el orden latino internacional (el correcto), pero no lo hace igual con las tildes cuando el ordenamiento es a un campo que cuando es a dos campos.

Si lo hago a dos campos APELLIDO1, APELLIDO2 y me dejo la tilde en algún Martínez me ordena así.

Martinez Abad
Martinez Ruiz
Martínez Pérez
Martínez Ruiz

en cambio si tengo un solo campo APELLIDOS ordena bien aunque en algún Martínez se me olvide la tilde

Martinez Abad
Martínez Pérez
Martinez Ruiz
Martínez Ruiz

De todas formas esto supongo que se evita haciendo lo que dice ElKurgan.

Manuel 02-03-2009 02:07:00

Otra consulta
 
Con la siguiente query creo dominios:

Código SQL [-]
CREATE DOMAIN TWC_NOMBRE AS VARCHAR(60) CHARACTER SET WIN1252 COLLATE PXW_SPAN
Y con esto creo campos en una table
Código SQL [-]
alter table alumnosadd campo1 char(30)
ahora como creo ese mismo campo asignandole el dominio creado más arriba.

Durbed 02-03-2009 10:00:40

Código SQL [-]
ALTER TABLE ALUMNOSADD
ADD CAMPO1 TWC_NOMBRE
COLLATE PXW_SPAN

TWC_NOMBRE es el nombre que les doy yo, donde TWC es un identificador del nombre de la aplicación que usa la base de datos ;), es decir, que puedes poner el nombre que quieras.

Manuel 02-03-2009 21:31:00

Gracias Durbed
 
Ha sido de gran ayuda

Manuel 15-03-2009 12:49:08

Usuario me reportado error
 
Cita:

Empezado por fidel (Mensaje 339523)
Tendrás que crear una tabla nueva con otro nombre y los mismos campos definidos con CARACTER SET DOS850 COLLATE DB_PT850, pasar a esta nueva tabla todos los datos, borrar la original y renombrar la nueva con el nombre original.
Si te conectas con un IBDatabase, en su caracter set debes poner ISO8859_1 para que visualice bien la ñ, ç, vocales acentuadas, etc.

.....

Por otra parte, he observado que en la versión 2 de FireBird con CARACTER SET ISO8892_1 y COLLATE ES_ES ya ordena bien según el orden latino internacional (el correcto), pero no lo hace igual con las tildes cuando el ordenamiento es a un campo que cuando es a dos campos.

Si lo hago a dos campos APELLIDO1, APELLIDO2 y me dejo la tilde en algún Martínez me ordena así.

Martinez Abad
Martinez Ruiz
Martínez Pérez
Martínez Ruiz

en cambio si tengo un solo campo APELLIDOS ordena bien aunque en algún Martínez se me olvide la tilde

Martinez Abad
Martínez Pérez
Martinez Ruiz
Martínez Ruiz

De todas formas esto supongo que se evita haciendo lo que dice ElKurgan.

Como lo ha dicho fidel, hay problemas con los tíldes, usuarios me han reportado el siguiente problema en el orden alfabético.

Coloma Iturriaga Sebastián
Contreras Pérez Miguel
Chinni Aylwin Francisca
incluso cuando el orden lo realizo por el primer apellido

fidel 15-03-2009 18:47:26

Cita:

Coloma Iturriaga Sebastián
Contreras Pérez Miguel
Chinni Aylwin Francisca
En este caso el problema no es el acento, es la Ch que la ordena después de la C y no según el orden latino internacional.

Si usas InterBase 6 usa CARACTER SET DOS850 COLLATE DB_PT850

Manuel 16-03-2009 02:51:59

Cita:

Empezado por fidel (Mensaje 341502)
En este caso el problema no es el acento, es la Ch que la ordena después de la C y no según el orden latino internacional.

Si usas InterBase 6 usa CARACTER SET DOS850 COLLATE DB_PT850

AL CREAR ESTE DOMINIO DA UN ERROR,

CREATE DOMAIN TWC_APELLIDOS_NEW AS VARCHAR(25) CHARACTER SET DOS850 COLLATE DB_PT850

fidel 16-03-2009 18:37:07

Cuando tuve yo este problema hice estas anotaciones:

Se crea la base de datos con CARACTER SET DOS850
▸ Los campos VarChar con CARACTER SET DOS850 y COLLATE DB_PTB850
▸ Los campos Memo se puede dejar CARACTER SET ISO_8859_1
▸ Al hacer la conexión a la base de datos, ya sea con IBExpert o en las aplicaciones con el componente TIBDatabase se pone CARACTER SET ISO_8859_1, y con esto se ordena correctamente y se ven bien todos los caracteres (si se conecta con CaracterSet DOS850 los caracteres con ascii no estandar no se ven como son).

Por lo tanto puede ser que tengas que crear la tabla con CARACTER SET DOS850

De todas formas yo creo las tablas y campos antes con IBExpert, no en ejecución.

El problema si tienes que crear nuevas tablas es que tendrías que pasar a las nuevas todos los datos que ya tienes, y merecerá o no la pena dependiendo de lo importante que sea que ordene bien, a veces es fundamental, sobre todo cuando hay por medio asuntos legales que cuando hay errores pueden dar lugar a reclamaciones judiciales.


La franja horaria es GMT +2. Ahora son las 02:33:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi