PDA

Ver la Versión Completa : Buscar texto indistintamente en Mayusculas o minusculas


Jose Manuel
22-04-2004, 22:55:17
Hola, quisiera saber como puedo indicar que en una busqueda de datos no distinga entre Mayúsculas o Minúsculas, en un campo Memo.

En el ejemplo siguiente trabaja bien con un campo texto como es "RESUMEN", pero como puedo hacer para que en el campo TEXTO que es un "memo", la busqueda de datos no distinta mayusculas o minusculas, ya que si pongo
fDatabase.q_pre.SQL.add('or UPPER(TEXTO) LIKE :buscar') me da un error del tipo Mismatch.

Estoy trabajando con Dbase, Delphi 6.

Un saludo
Jose Manuel
...................................................................................
procedure TfRegistro.buscar_por_textoClick(Sender: TObject);
var
aBuscar: string;
ClickedOK: Boolean;
begin
aBuscar := 'escriba texto a buscar';
ClickedOK := InputQuery('Texto a Buscar', 'texto:', aBuscar);
if ClickedOK then
begin
aBuscar:=UPPERCASE(aBuscar);
fDatabase.q_pre.active:=false;
fDatabase.q_pre.SQL.clear;
fDatabase.q_pre.SQL.add('Select * from PREGUNTA');
fDatabase.q_pre.SQL.add('where UPPER(RESUMEN) LIKE :buscar'); // BIEN
->fDatabase.q_pre.SQL.add('or TEXTO LIKE :buscar'); // <-- CAMPO MEMO
fDatabase.q_pre.SQL.add('order by ID');
fDatabase.q_pre.Params[0].AsString := '%'+abuscar+'%';
fDatabase.q_pre.active:=true;
end;
end;

Gydba
23-04-2004, 14:20:35
Bunas,

En primer lugar realizar una búsqueda por campo tipo memo no es de lo mas óptimo ni aconsejable.

Alguna solución sería castear (aunque no sé si el motor lo soporta) el campo y luego realizar la búsqueda donde deberías utilizar un uppercase tanto para el contenido del campo como para el parámetro que le estás pasando.

Hay otros métodos mucho más complejos de realizar este tipo de búsquedas que realmente bien utilizados dan extraordinarios resultados, pero son utilizados para desarrollos muy puntuales.

Debo indicar también que Dbase lo conozco muy por encima por lo que mis comentarios son de por sí vagos.

gendelphi
24-04-2004, 08:44:57
Nunca lo he probado en DBase, pero en interbase/firebird si funciona:


SELECT *
FROM tabla
WHERE campo CONTAINING '%cadena%'


CONTAINING a diferencia de LIKE no es sensible a mayusculas y minusculas.

Jose Manuel
24-04-2004, 09:57:43
La instrucción CONTAINING parece que no esta soportada en Dbase.

De momento, he solucionado el problema con las siguientes instrucciones, no sé si habrá otra solución para buscar una "string" no sensible a Mayusculas o Minusculas en un campo memo, de una base de datos DBASE.

q_pre.SQL.add('Select * from PREGUNTA');
q_pre.SQL.add('where TIPO = :cTipo');
* q_pre.SQL.add('or TEXTO LIKE :buscar0'); // minusculas
* q_pre.SQL.add('or TEXTO LIKE :buscar1'); // mayusculas
* q_pre.SQL.add('or TEXTO LIKE :buscar2)');// la 1ª en Mayusculas

* q_pre.Params[0].AsString := '%'+UPPERCASE (Buscar.text) +'%';
* q_pre.Params[1].AsString := '%'+LOWERCASE(Buscar.text) +'%';
* q_pre.Params[2].AsString := '%'+UPPERCASE (copy(Buscar.text,1,1))+
LOWERCASE(copy(buscar.text,2,length(Buscar.text)))+'%';