Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Filtrado de datos con acentos

Hola a todos,

Tengo un clientDataSet con un campo "Nombre" que puede tener acentos o no. Tengo un campo TEdit donde introduzco el nombre a buscar. El problema es que si no introduzco exactamente el filtro tal como fue escrito, no me lo localiza.

Ejemplo:
  • cds -> exiten Jose y José
  • filtro -> introduzco Jose
  • resultado -> muestra Jose y no muestra José.
mi deseo es que al comparar no tenga en cuenta los acentos.

He creado un filtro de tipo:

Código Delphi [-]
    cdsEditaCliente.Filtered:= False;
    vFiltre:= 'Nombre = '''+ UpperCase(edClienteABuscar.Text)+'*''';
    cdsEditaCliente.Filter := vFiltre;
    cdsEditaCliente.Filtered := True;

¿Existe alguna función con la que poder comparar texto saltando el problema de los acentos? o alguna otra solución.

Trabajo con Delphi 7 y MySQL.

Gracias.
Responder Con Cita
  #2  
Antiguo 18-01-2008
espericueta espericueta is offline
Miembro
 
Registrado: ene 2008
Posts: 13
Poder: 0
espericueta Va por buen camino
Smile usa collate si existe

esto funciona en sql server y creo que tambien en MySql

Código SQL [-]
cdsEditaCliente.Filtered:= False;
    vFiltre:= 'Nombre collate Modern_Spanish_CS_AI = '''+ UpperCase(edClienteABuscar.Text)+'*''';
    cdsEditaCliente.Filter := vFiltre;
    cdsEditaCliente.Filtered := True;

lee intercalaciones
http://technet.microsoft.com/es-es/l.../ms143515.aspx
Responder Con Cita
  #3  
Antiguo 21-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Hola espericueta, gracias por tu aportación.

Las indicaciones que me das van orientadas a filtrar por SQL, pero el código que yo puse es un filtrado en el clientDataSet y no admite lo que me pones. En caso de hacerlo por SQL he estado mirando y creo que MySQL no admite la intercalación _AI. El problema que tengo está relacionado en el filtrado en el clientDataSet (o a lo sumo en el del ZQuery).

Por SQL aparentemente funciona correcto: en una sentencia tal como
Código SQL [-]
SELECT * FROM tabla WHERE nombre LIKE 'Jose'
me lista correctamente tanto José como Jose, es decir, el acento no es problema (el cotejamiento -collate- de MySQL lo tengo en latin1_spanish_ci).

En resumen, mi objetivo sería utilizar los filtros del clientDataSet sin tener que ejecutar explicitamente una sentencia SQL para cada letra que escriba en el TEdit (lo adecuado sería que el filtro lo hiciera solo, ¡para eso está!) pero mi único problema en ese momento es el de los acentos.

Si utilizo el evento OnFilterRecord del clientDataSet, tal como
Código Delphi [-]
Accept := AnsiContainsText(cdsEditaCliente.Fieldbyname('Nombre').AsString , edClienteABuscar.Text);
igualmente tengo el problema con los acentos. Si utilizo este mismo evento del Zquery no funciona.

¿Alguien puede aportarme alguna idea?
Responder Con Cita
  #4  
Antiguo 26-11-2015
d3nz1g d3nz1g is offline
Miembro
NULL
 
Registrado: jun 2012
Posts: 10
Poder: 0
d3nz1g Va por buen camino
Posible solución

Saludos,

Se que este hilo tiene bastante tiempo sin actividad pero tope con el mismo problema y buscando un poco más encontré una posible solución:

Para filtrar un CDS (ClientDataSet) existen 2 posibilidades: usar la propiedad filter del CDS, o utilizar un evento personalizado para la propiedad OnFilterRecord, de manera que este sea el criterio que se utilice para evaluar los registros del CDS. Con esta última opción, al habilitar la propiedad filtro, se filtrarán aquellos registros que cumplan con las propiedades dadas.

Por ejemplo:

Código Delphi [-]
procedure TFormConsultaActividades.CDSFilterRecord(DataSet: TDataSet;var Accept: Boolean);
begin
  Accept := Pos(AnsiUpperCase('ó'),AnsiUpperCase(ClientDataSet.FieldByName('DESCRIPCION').asString)) > 0;
end;

Con el código anterior, el filtro dejaría accesibles todos los registros que posean la letra o tildada:

Cita:
Aplicacion
Aplicación
Hormiga
Colón
Restauración
Filtro
Armería
En el caso del requerimiento original que indicaba Josepo (que tome en cuenta tanto hileras tildadas como sin tilde) me parece que simplemente habría que ajustar el código del evento OnFilterRecord para que sustituya aquellos caracteres tildados en ambas partes antes de realizar la comparación de valores.

PD: Probado con Delphi 2010.

Saludos!

Última edición por Casimiro Notevi fecha: 26-11-2015 a las 23:56:14.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
de Exel a MySql con filtrado de datos voldemmor MySQL 5 08-01-2008 13:24:02
Filtrado SQL por mes MaMu SQL 2 22-06-2007 04:59:49
Filtrado richi PostgreSQL 3 27-02-2007 13:56:31
Filtrado aanil Tablas planas 3 19-07-2006 02:52:45
UDF que quite acentos gendelphi Firebird e Interbase 1 28-02-2004 04:26:41


La franja horaria es GMT +2. Ahora son las 14:12:52.


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
Copyright 1996-2007 Club Delphi