Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error con Lower? (https://www.clubdelphi.com/foros/showthread.php?t=72432)

nena_yei 18-02-2011 09:11:31

Error con Lower?
 
Buenos días,
Tengo una consulta con un LIKE que hace condiciones como esta:
xdoc like "% '+temp+' %"
La variable temp esta formateada antes para pasar a minúsculas:
temp:=ansilowercase(temp);

La cosa es que para que me haga correctamente la consulta se supone que añadiendo el Lower delante de xdoc (el campo) ya tendría que funcionar, pero no, tengo un try catch puesto desde el principio de la función y me salta éste en el momento que pongo esto:
lower(xdoc) like "% '+temp+' %"

Alguna sugerencia? No sé qué hacer más..

Muchas gracias de antemano

- Zaida -

Ñuño Martínez 18-02-2011 09:35:15

Pero, ¿cuál es la excepción? ¿Qué mensaje porta?

nena_yei 18-02-2011 09:44:41

Ups, perdón, tienes toda la razón.
El error es:
Type mismatch in expression

Gracias

Ñuño Martínez 18-02-2011 10:18:46

Entonces "temp" no es un STRING ni un ANSISTRING, sino un PCHAR, ¿me equivoco? Si es así, ahí está el problema, ya que no se pueden concatenar PCHAR así como así. Si no recuerdo mal, lo siguiente debería funcionar:
Código Delphi [-]
'lower(xdoc) like "% '+ANSISTRING (temp)+' %"'
O, en el peor de los casos:
Código Delphi [-]
VAR
  temp2: ANSISTRING;
(...)

  temp2 := temp;
(...)
  'lower(xdoc) like "% '+temp2+' %"'
Si no es el caso, entonces pon el método completo a ver si el problema está en otro lado.

nena_yei 18-02-2011 10:28:32

La variable temp es del tipo: widestring.
He añadido lo de ansistring(temp) en la consulta, tal y como comentas y me sigue dando el mismo error. Voy a cambiar el tipo de la variable temps de widestring a ansistring o string, aver si funciona.

Gracias

nena_yei 18-02-2011 10:57:01

He puesto la variable temp como ansistring:
temp: ansistring;
Y nada..me sigue saltando el mismo error. También he probado lo de crear una variable temp_aux de tipo ansistring y hacer un temp_aux:=temp, y tampoco. Y el error es seguro que viene de aquí porque en el momento que quito lo de lower(temp) y dejo solo temp, hace la consulta correctamente.

ecfisa 18-02-2011 12:58:50

Hola nena_yei.

No sé si entendi bién tu problema, pero hice esta prueba con employee.gdb y me funciona perfectamente.
Código Delphi [-]
var
  temp: WideString;
begin
  temp:= 'Japan';
  temp:= Lowercase(temp);
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('SELECT * FROM COUNTRY');
  IBQuery1.SQL.Add('WHERE LOWER(COUNTRY) LIKE ''%'+ temp + '%''');
  IBQuery1.Open;
end;

Un saludo.

nena_yei 28-02-2011 10:08:24

Gracias ecfisa, pero la cosa sigue sin funcionar, he llegado a la conclusión que la función LOWER no es compatible con el motor de base de datos que estoy utilizando. La solución sería tener toda la información en minúscula en la base de datos (cosa imposible) o en la consulta sql hacer la comparación con la palabra buscada tal cual, la palabra buscada en mayúscula y la palabra buscada en minúscula, pero tampoco me es posible porque es una consulta con multitud de condiciones (es un diccionario etimológico, de ahí la dificultad) y si añado 2 condiciones a cada comparación, la consulta excede de carácteres y también me saltaría un error.

Si alguien tiene alguna idea de como podría solucionarlo?

Muchas gracias

pacopenin 28-02-2011 10:39:16

Hola,

¿Que base de datos usas? Con Firebird, la función lower funciona correctamente.

Saludos,

nena_yei 28-02-2011 11:21:44

La base de datos está en Access

pacopenin 28-02-2011 11:30:54

Hola.

Entonces la función es lcase (y ojo, que en access las comillas son dobles).

Un saludo.

nena_yei 28-02-2011 11:41:28

Hola,

Con lcase me aparece el siguiente error: Capability not supported.

Qué desesperación..porque la aplicación la inició otra persona y la verdad es que me está costando sacarla ahora adelante, y más porque hacía 4 años que no tocaba nada de Delphi!

Saludos,

pacopenin 28-02-2011 11:57:58

Hola.

Prueba a hacer la instrucción completa en access, y cuando te funcione, copia y pega en delphi. Cuando da guerra, bajo mi punto de vista, lo mejor es probar la sintaxis completa de la instrucción sobre la base de datos y solo cuando funcione adaptarla al programa.

Saludos,

nena_yei 28-02-2011 12:21:40

Ya lo hice anteriormente eso, la consulta en sí esta bien, cuando la paso directamente a Access hago los cambios que toca (dobles comillas y demás) y funciona correctamente. El problema lo da cuando se ejecuta desde Delphi, que en el momento de poner el lower, me da el error de Type mismatch, he probado también de poner la palabra a buscar manualmente, es decir sin utilizar la variable "temp" y también me da error.

xdoc like "% test %" --> también da error

Que algo que parece tan sencillo y simple de estos problemas..buff..

Saludos,


La franja horaria es GMT +2. Ahora son las 09:08:10.

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