Ir al contenido


Foto

[RESUELTO] "Like" se parece a... (Sentencia SQL rebelde)


  • Por favor identifícate para responder
62 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 12:29

Les platico. Por motivos de una consulta general, se me ocurrió utilizar la sentencia LIKE en mi conjunto de sentencias SQL, por medio de éste código...



delphi
  1. procedure TfrmBsqdDts.bitbttnBscrClick(Sender: TObject);
  2. var
  3.   wsSQLTxt : widestring;
  4.   sArmr : string;
  5. begin
  6.  
  7.   wsSQLTxt := 'SELECT Ca_Area, Ca_Titulo, Ca_Nombre, Ca_Paterno, Ca_Materno, '+
  8.                     'Ca_institucion, Ca_Dirg, Ca_Dir, Ca_Sub, Ca_Jud FROM carea'+
  9.                     ' WHERE (ca_cancelado = 0) ';
  10.  
  11.   if (edtArea.Text <> '') OR
  12.     (edtTitulo.Text <> '') OR
  13.     (edtNombres.Text <> '') OR
  14.     (edtAplldPaterno.Text <> '') OR
  15.     (edtAplldMaterno.Text <> '') then
  16.   begin
  17.     if (edtArea.Text <> '') then
  18.     begin
  19.       sArmr := '%'+edtArea.Text+'%';
  20.       wsSQLTxt := wsSQLTxt + 'AND (ca_area LIKE '+sArmr+')';
  21.     end;
  22.  
  23.     if (edtTitulo.Text <> '') then
  24.       wsSQLTxt := wsSQLTxt +
  25.                   'AND (ca_titulo LIKE '+QuotedStr('%'+edtTitulo.Text+'%')+') ';
  26.  
  27.     if (edtNombres.Text <> '') then
  28.       wsSQLTxt := wsSQLTxt +
  29.                   'AND (ca_nombre LIKE '+QuotedStr('%'+edtNombres.Text+'%')+') ';
  30.  
  31.     if (edtAplldPaterno.Text <> '') then
  32.       wsSQLTxt := wsSQLTxt +
  33.                   'AND (ca_paterno LIKE '+QuotedStr('%'+edtAplldPaterno.Text+'%')+') ';
  34.  
  35.     if (edtAplldMaterno.Text <> '') then
  36.       wsSQLTxt := wsSQLTxt +
  37.                   'AND (ca_materno LIKE '+QuotedStr('%'+edtAplldMaterno.Text+'%')+') ';
  38.   end;
  39.   wsSQLTxt := wsSQLTxt +';';
  40.  
  41.   with dtamdlDts.ADOQryBsqd do
  42.   begin
  43.     Active := False;
  44.     SQL.Clear;
  45.     SQL.Text := wsSQLTxt;
  46.     Active := True;
  47.   end;
  48.  
  49. end;




Arrojándome éste valor para la variable wsSQLTxt:



sql
  1. SELECT Ca_Area, Ca_Titulo,
  2.             Ca_Nombre, Ca_Paterno,
  3.             Ca_Materno, Ca_institucion,
  4.             Ca_Dirg, Ca_Dir,
  5.             Ca_Sub, Ca_Jud
  6.   FROM carea
  7.   WHERE (ca_cancelado = 0) AND (ca_area LIKE %APOYO%);




El problema esencial es que me envía éste error desde el SQLServer:
Project AreaTree.exe raised exception class EOleException with message '[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near 'APOYO'.

Y obviamente no ejecuta ni me muestra los datos que se requieren.

En mi confiabilísimo manejador de SQL Server, detecté parte del problema, que consiste en la inexistencia de dos comillas simples junto a los signos de porcentaje, y SQL Server acepta una sintaxis así:



sql
  1. SELECT Ca_Area, Ca_Titulo, Ca_Nombre,
  2.       Ca_Paterno, Ca_Materno, Ca_institucion,
  3.       Ca_Dirg, Ca_Dir, Ca_Sub, Ca_Jud
  4.   FROM carea
  5.   WHERE (ca_cancelado = 0) AND
  6.         (ca_area LIKE '%APOYO%');



Mi pregunta va en el sentido, ¿cómo puedo asegurarme que solamente UNA comilla simple será añadida a mi texto? He usado QuotedStr() y juegos de comillas dentro del código, pero me pone DOS comillas simples y obviamente ésto genera un error dentro del motor de base de datos...

¿Algún consejo o solución que puedan aportarme, por favor?
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 17 marzo 2010 - 12:33

Porqué no intentas así ?



delphi
  1. 'AND (ca_materno LIKE % '+QuotedStr(edtAplldMaterno.Text)+'%)' // así en todas las lineas



Saludox !
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 17 marzo 2010 - 12:46

¿ Checaste que las demás opciones si hagan lo que requieres ?

Porque me parece que esto



delphi
  1.       sArmr := '%'+edtArea.Text+'%';
  2.       wsSQLTxt := wsSQLTxt + 'AND (ca_area LIKE '+sArmr+')';



deberías modificarlo así



delphi
  1.       sArmr := '%'+edtArea.Text+'%';
  2.       wsSQLTxt := wsSQLTxt + 'AND (ca_area LIKE '+QuotedStr(sArmr)+')';



Este es el resultado con y sin QuotedStr


SIN QuotedStr ----> AND (ca_titulo LIKE %ALGO EN EL EDIT%)

CON QuotedStr ----> AND (ca_titulo LIKE '%ALGO EN EL EDIT%')


Salud OS
  • 0

#4 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 17 marzo 2010 - 12:48

Porqué no intentas así ?



delphi
  1. 'AND (ca_materno LIKE % '+QuotedStr(edtAplldMaterno.Text)+'%)' // así en todas las lineas



Saludox !


ese dejaria los comodines (%) afuera de las comillas

a mi se me ocurriria algo asi:


delphi
  1. 'AND (ca_materno LIKE '+ #39 + '%' + edtAplldMaterno.Text + '%' + #39 + ')' // así en todas las lineas



Saludos

Kafastoforman

  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 12:48

Porqué no intentas así ?



delphi
  1. 'AND (ca_materno LIKE % '+QuotedStr(edtAplldMaterno.Text)+'%)' // así en todas las lineas



Saludox !


Resultado:
AND (ca_materno LIKE % '''TEXTO'''%) y marca error.
  • 0

#6 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 12:50

¿ Checaste que las demás opciones si hagan lo que requieres ?

Porque me parece que esto



delphi
  1.       sArmr := '%'+edtArea.Text+'%';
  2.       wsSQLTxt := wsSQLTxt + 'AND (ca_area LIKE '+sArmr+')';



deberías modificarlo así



delphi
  1.       sArmr := '%'+edtArea.Text+'%';
  2.       wsSQLTxt := wsSQLTxt + 'AND (ca_area LIKE '+QuotedStr(sArmr)+')';



Este es el resultado con y sin QuotedStr



SIN QuotedStr ----> AND (ca_titulo LIKE %ALGO EN EL EDIT%)

CON QuotedStr ----> AND (ca_titulo LIKE '%ALGO EN EL EDIT%')


Salud OS


Así lo hice al principio, y marca un error bastante más grave que el que consigno...  :cry:
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 17 marzo 2010 - 12:51

Ok, eso me pasó incluso con Firebird, deja ver si aún conservo esa nota y como lo resolví.

Salud OS
  • 0

#8 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 17 marzo 2010 - 12:53


Porqué no intentas así ?



delphi
  1. 'AND (ca_materno LIKE % '+QuotedStr(edtAplldMaterno.Text)+'%)' // así en todas las lineas



Saludox !


Resultado:
AND (ca_materno LIKE % '''TEXTO'''%) y marca error.


:o Acaso edtAplldMaterno.Text ya contiene comillas ???

Porque he usado mil veces el QuotedStr y solo agrega comillas simples :|... Sigamos probando...

Saludox ! :D


  • 0

#9 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 12:54


Porqué no intentas así ?



delphi
  1. 'AND (ca_materno LIKE % '+QuotedStr(edtAplldMaterno.Text)+'%)' // así en todas las lineas



Saludox !


ese dejaria los comodines (%) afuera de las comillas

a mi se me ocurriria algo asi:


delphi
  1. 'AND (ca_materno LIKE '+ #39 + '%' + edtAplldMaterno.Text + '%' + #39 + ')' // así en todas las lineas



Saludos

Kafastoforman



Resultado de Kastaforman:


sql
  1. SELECT Ca_Area, Ca_Titulo,
  2.             Ca_Nombre, Ca_Paterno,
  3.             Ca_Materno, Ca_institucion,
  4.             Ca_Dirg, Ca_Dir,
  5.             Ca_Sub, Ca_Jud
  6.   FROM carea
  7.   WHERE (ca_cancelado = 0) AND (ca_area LIKE ''%APOYO%'');



Se ejecuta pero no muestra nada en la rejilla de datos.
  • 0

#10 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 12:56


:o Acaso edtAplldMaterno.Text ya contiene comillas ???

Porque he usado mil veces el QuotedStr y solo agrega comillas simples :| ... Sigamos probando...

Saludox ! :D


Sí, chica. El contenido de la propiedad Text de edtAplldMaterno YA TRAE comillas, así que le añade un par extra el QuotedStr y ahí es donde se descuachalanga el baile.
  • 0

#11 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 17 marzo 2010 - 01:00

Hola


delphi
  1. procedure TfrmBsqdDts.bitbttnBscrClick(Sender: TObject);
  2. var
  3.   wsSQLTxt : widestring;
  4.   sArmr : string;
  5. begin
  6.     wsSQLTxt := 'SELECT Ca_Area, Ca_Titulo, Ca_Nombre, Ca_Paterno, Ca_Materno, '+
  7.                     'Ca_institucion, Ca_Dirg, Ca_Dir, Ca_Sub, Ca_Jud FROM carea'+
  8.                     ' WHERE ca_cancelado = 0 ';
  9.  
  10.   if (edtArea.Text <> '') then
  11.     wsSQLTxt := wsSQLTxt + 'AND ca_area LIKE '+QuotedStr(edtArea.Text);
  12.  
  13.   if (edtTitulo.Text <> '') then
  14.       wsSQLTxt := wsSQLTxt +'AND (ca_titulo LIKE '+QuotedStr(edtTitulo.Text);
  15.  
  16.   if (edtNombres.Text <> '') then
  17.       wsSQLTxt := wsSQLTxt +'AND (ca_nombre LIKE '+QuotedStr(edtNombres.Text);
  18.  
  19.   if (edtAplldPaterno.Text <> '') then
  20.       wsSQLTxt := wsSQLTxt +'AND (ca_paterno LIKE '+QuotedStr(edtAplldPaterno.Text);
  21.  
  22.   if (edtAplldMaterno.Text <> '') then
  23.       wsSQLTxt := wsSQLTxt +'AND (ca_materno LIKE '+QuotedStr(edtAplldMaterno.Text);
  24.  
  25.   with dtamdlDts.ADOQryBsqd do
  26.   begin
  27.     Active := False;
  28.     SQL.Clear;
  29.     SQL.Text := wsSQLTxt;
  30.     Active := True;
  31.   end;
  32.  
  33. end;


No se, digo....
Saludos
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 17 marzo 2010 - 01:07

Y así ?



delphi
  1. 'AND (ca_materno LIKE '+QUOTEDSTR('%')+edtAplldMaterno.Text+QUOTEDSTR('%')+')';



Saludox ! :D

Ah no !... cerramos el % antes de tiempo :(

Chin !


  • 0

#13 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 01:07

Hola


delphi
  1. procedure TfrmBsqdDts.bitbttnBscrClick(Sender: TObject);
  2. var
  3.   wsSQLTxt : widestring;
  4.   sArmr : string;
  5. begin
  6.     wsSQLTxt := 'SELECT Ca_Area, Ca_Titulo, Ca_Nombre, Ca_Paterno, Ca_Materno, '+
  7.                     'Ca_institucion, Ca_Dirg, Ca_Dir, Ca_Sub, Ca_Jud FROM carea'+
  8.                     ' WHERE ca_cancelado = 0 ';
  9.  
  10.   if (edtArea.Text <> '') then
  11.     wsSQLTxt := wsSQLTxt + 'AND ca_area LIKE '+QuotedStr(edtArea.Text);
  12.  
  13.   if (edtTitulo.Text <> '') then
  14.       wsSQLTxt := wsSQLTxt +'AND (ca_titulo LIKE '+QuotedStr(edtTitulo.Text);
  15.  
  16.   if (edtNombres.Text <> '') then
  17.       wsSQLTxt := wsSQLTxt +'AND (ca_nombre LIKE '+QuotedStr(edtNombres.Text);
  18.  
  19.   if (edtAplldPaterno.Text <> '') then
  20.       wsSQLTxt := wsSQLTxt +'AND (ca_paterno LIKE '+QuotedStr(edtAplldPaterno.Text);
  21.  
  22.   if (edtAplldMaterno.Text <> '') then
  23.       wsSQLTxt := wsSQLTxt +'AND (ca_materno LIKE '+QuotedStr(edtAplldMaterno.Text);
  24.  
  25.   with dtamdlDts.ADOQryBsqd do
  26.   begin
  27.     Active := False;
  28.     SQL.Clear;
  29.     SQL.Text := wsSQLTxt;
  30.     Active := True;
  31.   end;
  32.  
  33. end;


No se, digo....
Saludos


OK, me parece que solamente le falta un detallín..., el signo de porcentaje antes y después del valor de la variable. Vas bien, Caral...

Digo, no sé..., mejorarás...
  • 0

#14 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 17 marzo 2010 - 01:08


Sí, chica. El contenido de la propiedad Text de edtAplldMaterno YA TRAE comillas, así que le añade un par extra el QuotedStr y ahí es donde se descuachalanga el baile.


¿si ocupas un StringReplace() para quitar las comillas?



delphi
  1. if (edtAplldMaterno.Text <> '') then
  2.       wsSQLTxt := wsSQLTxt +
  3.                   'AND (ca_materno LIKE '+QuotedStr('%'+StringReplace(edtAplldMaterno.Text,#39,'',[rfReplaceAll])+'%')+') ';



creo que asi deberia funcionar jejejeje

Saludos

Kafastoforman
  • 0

#15 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 01:15

¿si ocupas un StringReplace() para quitar las comillas?



delphi
  1. if (edtAplldMaterno.Text <> '') then
  2.       wsSQLTxt := wsSQLTxt +
  3.                   'AND (ca_materno LIKE '+QuotedStr('%'+StringReplace(edtAplldMaterno.Text,#39,'',[rfReplaceAll])+'%')+') ';



creo que asi deberia funcionar jejejeje

Saludos

Kafastoforman


Nuevo Resultado de Kastaforman:


sql
  1. SELECT Ca_Area, Ca_Titulo,
  2.             Ca_Nombre, Ca_Paterno,
  3.             Ca_Materno, Ca_institucion,
  4.             Ca_Dirg, Ca_Dir,
  5.             Ca_Sub, Ca_Jud
  6.   FROM carea
  7.   WHERE (ca_cancelado = 0) AND (ca_area LIKE ''%APOYO%'');



Nuevamente, ejecuta pero no muestra nada. Veámoslo por el lado positivo: al menos, no marca error.

Por si se lo han preguntado, ya intenté usar parámetros y el resultado es lastimosamente el mismo.
  • 0

#16 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 17 marzo 2010 - 01:16

Saludos y por que no intentas con la vieja escuela



delphi
  1. ...
  2. if (edtAplldMaterno.Text <> '') then
  3.       wsSQLTxt := wsSQLTxt +'AND (ca_materno LIKE ''%'+edtAplldMaterno.Text+'%'')';
  4. ...



Ahi no deberias tener problemas
  • 0

#17 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 17 marzo 2010 - 01:16

Hola
En mi querido access seria asi:


delphi
  1. procedure TfrmBsqdDts.bitbttnBscrClick(Sender: TObject);
  2. var
  3.   wsSQLTxt : widestring;
  4.   sArmr : string;
  5. begin
  6.     wsSQLTxt := 'SELECT Ca_Area, Ca_Titulo, Ca_Nombre, Ca_Paterno, Ca_Materno, '+
  7.                     'Ca_institucion, Ca_Dirg, Ca_Dir, Ca_Sub, Ca_Jud FROM carea'+
  8.                     ' WHERE ca_cancelado = 0 ';
  9.  
  10.   if (edtArea.Text <> '') then
  11.     wsSQLTxt := wsSQLTxt +'AND ca_area LIKE '''+edtArea.Text+'*''';
  12.  
  13.   if (edtTitulo.Text <> '') then
  14.       wsSQLTxt := wsSQLTxt +'AND ca_titulo LIKE '''+edtTitulo.Text+'*''';
  15.  
  16.   if (edtNombres.Text <> '') then
  17.       wsSQLTxt := wsSQLTxt +'AND ca_nombre LIKE '''+edtNombres.Text+'*''';
  18.  
  19.   if (edtAplldPaterno.Text <> '') then
  20.       wsSQLTxt := wsSQLTxt +'AND ca_paterno LIKE '''+edtAplldPaterno.Text+'*''';
  21.  
  22.   if (edtAplldMaterno.Text <> '') then
  23.       wsSQLTxt := wsSQLTxt +'AND ca_materno LIKE '''+edtAplldMaterno.Text+'*''';
  24.  
  25.   with dtamdlDts.ADOQryBsqd do
  26.   begin
  27.     Active := False;
  28.     SQL.Clear;
  29.     SQL.Text := wsSQLTxt;
  30.     Active := True;
  31.   end;
  32.  
  33. end;


Y funciona.... :D
Saludos
  • 0

#18 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 17 marzo 2010 - 01:29

Nuevamente, ejecuta pero no muestra nada. Veámoslo por el lado positivo: al menos, no marca error.


jajajajaja eso si.

Creo que hay algo que falta saber, por que hice la prueba y se supone se comporta bien de acuerdo al escenario que estoy contemplando.

este es el codigo que puse en el botonaso.



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   ShowMessage(quotedSTr('%'+StringReplace(Edit1.Text,#39,'',[rfReplaceAll])+'%'));
  4. end;



y te adjunto la pantalla con el resultado

Saludos

Kafastoforman

Archivos adjuntos


  • 0

#19 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 17 marzo 2010 - 01:31

Saludos y por que no intentas con la vieja escuela

.
.
.

Ahi no deberias tener problemas


Punto menos para "la vieja escuela". Ejecuta, no marca error, pero no muestra nada.
  • 0

#20 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 marzo 2010 - 02:21

¿Y probaste encerrandolo en un paréntesis?



sql
  1. IF (edtAplldMaterno.Text <> '') THEN
  2.       wsSQLTxt := wsSQLTxt +
  3.                   'AND (ca_materno LIKE (''%'+edtAplldMaterno.Text+'%'')) ';


  • 0




IP.Board spam blocked by CleanTalk.