Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Incluir comillas y singos en consulta sql (https://www.clubdelphi.com/foros/showthread.php?t=68725)

antigrondona 02-07-2010 16:11:02

Incluir comillas y singos en consulta sql
 
Hola amigos. Resulta que tengo una consulta donde quiero buscar parte de un texto, seria where(sinopsis like "%detalle%"), donde detalle es la variable que contiene la frase a buscar. El problema es que si tengo una frase a buscar, con comilla y los 2 puntos, me salta el error de sintaxis, ejemplo:
casa de: d'amico es una frase que me trae problemas, la comilla o apostrofe sola no, pero si previamente tiene ( : ) ahi me genera el error.

Supongo que habria que adaptar la cadena detalle, de manera de evitar el problema en la consulta.

Espero sus ayudas, saludos.

ContraVeneno 02-07-2010 18:11:49

Código Delphi [-]
with TuQuery do begin //suponiendo que es un TADOQUery
 if active then close;
 SQL.Clear;
 SQL.Add('Select UnCampo');
 SQL.Add('From UnaTabla T');
 SQL.Add('Where UnCampo like :UnValor');
 Parameters.ParamByName('UnValor').Value := '%' + Detalle + '%';
 Open;
end;

o también:
Código Delphi [-]
....
 SQL.Add('Where UnCampo like '+QuotedStr('%'+ ReplaceStr(Detalle, ' ', '%')+'%'));
....

Aunque yo me inclino más por usar parámetros.

ElDioni 02-07-2010 18:23:29

Se me ocurre que podrías cambiar los caracteres que te dan problemas por el signo de interrogación.
En el caso que comentas quedaría de la siguiente forma ?d?amico, create una función por donde pasar los string y que te lo guarde en otra variable con los caracteres ya cambiados.

Un saludo.

ElDioni 02-07-2010 18:25:45

Había dejado abierto el hilo y no me he dado cuenta de que ContraVeneno ya te había contestado, sigue sus consejos que seguro serán más útiles que los mios.

Un saludo.

antigrondona 02-07-2010 22:24:20

ok, probare con los parametros, ahora bien, necesito por favor que me guien un poco más para completar la instruccion, mi linea de consulta para el query (es de tipo TAdoquery) es:
detalle, que es un edit que captura en detalle.text lo que se quiere buscar
query.sql.text:='select * from tabla where (det like "%'+detalle.text+'%")';

Ahi necesitaria ver como arreglarlo para probar

antigrondona 02-07-2010 22:50:22

Acabo de descubrir que el problema es otro, dejo la linea exacta ya que estaba posteando un ejemplo gral

peli_q1.Active:=false;
peli_q1.SQL.Clear;
peli_q1.SQL.Text:='Select * from TPeliculas where(peli_tit like "%'+info.Text+'%")and(peli_titori like "%'+info.Text+'%") order by peli_titori';
peli_q1.Active:=true;

el problema es la condicion doble ya que con
peli_q1.Active:=false;
peli_q1.SQL.Clear;
peli_q1.SQL.Text:='Select * from TPeliculas where(peli_tit like "%'+info.Text+'%") order by peli_titori';
peli_q1.Active:=true;

no genera error

ElDioni 05-07-2010 16:41:14

No se que gestor de base de datos usas, pero cuando yo hago un consulta con un like para encontrar dentro de un campo una cadena de texto tengo que utilizar comillas simples, al copiar tu ejemplo me sale que son comillas dobles (esta de aquí->"%'+info.Text+'%"<-y esta de aquí), yo te aconsejaría que, igual que en el ejemplo que te ha puesto ContraVeneno utilizaras el quotedstr que te añade las comillas simples a la cadena de string que le pases a esta función, en tu caso la comparación yo la pondría de la siguiente forma.
Código Delphi [-]
peli_q1.Close;
peli_q1.SQL.Text:='Select * from TPeliculas where (peli_tit like '+quotedstr('%'+info.Text+'%')+')and(peli_titori like '+quotedstr('%'+info.Text+'%')+') order by peli_titori';
peli_q1.ExecSQL;
peli_q1.Open;

Por cierto, intenta utilizar las etiquetas de delphi para cuando pongas código así se verá más claro tu mensaje.
Un saludo.

antigrondona 06-07-2010 15:51:18

Cita:

Empezado por ElDioni (Mensaje 369204)
No se que gestor de base de datos usas, pero cuando yo hago un consulta con un like para encontrar dentro de un campo una cadena de texto tengo que utilizar comillas simples, al copiar tu ejemplo me sale que son comillas dobles (esta de aquí->"%'+info.Text+'%"<-y esta de aquí), yo te aconsejaría que, igual que en el ejemplo que te ha puesto ContraVeneno utilizaras el quotedstr que te añade las comillas simples a la cadena de string que le pases a esta función, en tu caso la comparación yo la pondría de la siguiente forma.
Código Delphi [-]peli_q1.Close; peli_q1.SQL.Text:='Select * from TPeliculas where (peli_tit like '+quotedstr('%'+info.Text+'%')+')and(peli_titori like '+quotedstr('%'+info.Text+'%')+') order by peli_titori'; peli_q1.ExecSQL; peli_q1.Open;


Por cierto, intenta utilizar las etiquetas de delphi para cuando pongas código así se verá más claro tu mensaje.
Un saludo.

amigo, utilizo un archivo sencillo de acces para la base de datos. Tu recomendacion me evita el error, es decir, con la consulta como vos la planteas no revienta el programa pero la busqueda no es eficiente. Pongo una frase tal cual esta en la tabla y no la encuentra.

ElDioni 06-07-2010 17:28:54

Además de la última recomendación que te hago, ¿has probado a cambiar los caracteres que te daban problemas por signos de interrogación como te comentaba en mi primera aportación?
Yo creo que con estados dos opciones sumadas no deberías tener ningún problema.
Un saludo.

antigrondona 06-07-2010 19:04:02

Cita:

Empezado por ElDioni (Mensaje 369380)
Además de la última recomendación que te hago, ¿has probado a cambiar los caracteres que te daban problemas por signos de interrogación como te comentaba en mi primera aportación?
Yo creo que con estados dos opciones sumadas no deberías tener ningún problema.
Un saludo.

No entiendo a qué te referís con cambiar a signos de admiración, lo que sí es que sacando ( " ) y poniendo quotedstr (de hecho probe con el select tal cual vos armaste) no genera error pero no busca correctamente.

antigrondona 06-07-2010 19:26:43

Perdón amigos, no me hacia la búsqueda correctamente porque era peli_tit or peli_titori, estaba poniendo ''and'' por lo que era imposible que encuentre 2 títulos iguales.
La solución es entonces utilizar quotedstr y quitar ( " ). Mil gracias.


La franja horaria es GMT +2. Ahora son las 15:24:39.

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