Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error: Type mismatch in expression (https://www.clubdelphi.com/foros/showthread.php?t=29657)

gusanita 27-01-2006 19:12:02

Error: Type mismatch in expression
 
Hola!!!

El siguiente es mi código:
Código Delphi [-]
DataModuleBD.Query.SQL.Clear;
DataModuleBD.Query.SQL.Add('Select ALU_NOM, ALU_SEM, ALU_ESP');
DataModuleBD.Query.SQL.Add('From ":BDBECAS_BAJDEF: DATPERAL"');
DataModuleBD.Query.SQL.Add('Where ALU_CTRL = ' + validancontrol.Text);
DataModuleBD.Query.SQL.Add(';');
DataModuleBD.Query.Open;
Y cuando termina de leer la aultima linea me manda el error!!! (Type mismatch in expression).
El tipo de campo de ALU_CTRL es varchar.

Gracias por su atención!!!

roman 27-01-2006 19:29:40

Si ALU_CTRL es de tipo texto, sustituye validancontrol.Text por QuotedStr(validancontrol.Text).

Por otra parte fíjate que el error es acerca de tipos de datos, por tanto sería recomendable que nos índicaras de qué tipos de datos son tus campos. ;)

EDITO:

¡Ah!, veo que ya agregaste esa información :)

// Saludos

gusanita 27-01-2006 19:59:10

Hola!!!

Para que es el QuotedStr(validancontrol.Text)???

Gracias por atender!!!!

roman 27-01-2006 20:13:28

Suponte que validancontrol tiene el texto HU74832. Si examinas la sentencia SQL verás que queda así:

Código SQL [-]
Select ALU_NOM, ALU_SEM, ALU_ESP
From ":BDBECAS_BAJDEF: DATPERAL"
Where ALU_CTRL = HU74832

Lo cual es incorrecto por que faltan las comillas alrededor de HU74832. QuotedStr te pone esas comillas. Podrías hacerlo tú misma:

Código Delphi [-]
DataModuleBD.Query.SQL.Add('Where ALU_CTRL = "' + validancontrol.Text + '"');

pero termina siendo bastante ilegible tantas comillas. De hecho, lo mejor siempre que uses consultas donde el valor de un campo varíe, es usar parámetros:

Código Delphi [-]
DataModuleBD.Query.SQL.Clear;
DataModuleBD.Query.SQL.Add('Select ALU_NOM, ALU_SEM, ALU_ESP');
DataModuleBD.Query.SQL.Add('From ":BDBECAS_BAJDEF: DATPERAL"');
DataModuleBD.Query.SQL.Add('Where ALU_CTRL = :ctrl');
DataModuleBD.Query.SQL.Add(';');
DataModuleBD.Query.Open;

y sustituir el parámetro al momento de ejecutar la consulta:

Código Delphi [-]
DataModuleBD.Query.ParamByName('ctrl').AsString := validancontrol.Text;

Al usar AsString, ya le estás indicando que el parámetro es texto y se agregarán las comillas automáticamente. El uso de parámetros te deja un código mucho más prolijo y manejable.

// Saludos

gusanita 27-01-2006 20:47:53

Hola!!!

y sustituir el parámetro al momento de ejecutar la consulta:

Código Delphi [-]
DataModuleBD.Query.ParamByName('ctrl').AsString := validancontrol.Text;

Disculpa pero, te refieres a colocar esta instruccion antes de la siguiente???

Código Delphi [-]
DataModuleBD.Query.Open;

Gracias nuevamente por tu pronta atención!!!!

roman 27-01-2006 20:53:53

Cita:

Empezado por gusanita
Disculpa pero, te refieres a colocar esta instruccion antes de la siguiente???

Sí :)

// Saludos

gusanita 27-01-2006 21:02:34

Mi código quedó de la siguiente manera:

Código Delphi [-]
DataModuleBD.Query.SQL.Clear;
DataModuleBD.Query.SQL.Add('Select ALU_NOM, ALU_SEM, ALU_ESP');
DataModuleBD.Query.SQL.Add('From ":BDBECAS_BAJDEF: DATPERAL"');
DataModuleBD.Query.SQL.Add('Where ALU_CTRL = :ctrl');
DataModuleBD.Query.SQL.Add(';');
DataModuleBD.Query.ParamByName('ctrl').AsString := validancontrol.Text;
DataModuleBD.Query.Open;

Pero aun me sigue marcando el mismo error!!!

Nuevamente Muchas Gracias!!!

roman 27-01-2006 21:25:14

¡Pues no veo nada extraño! Excepto dos cosas:

1. En 'From ":BDBECAS_BAJDEF: DATPERAL yo quitaría el espacio después de los segundos :

2. Supongo que es innecesario el ; al final de la consulta.

En Paradox, el punto 1 marca un error pero distinto al que mencionas. El punto 2 no genera problemas pero no sé qué base de datos uses y quizá sí afecte.

// Saludos

gusanita 28-01-2006 03:50:59

Cita:

Empezado por roman
1. En 'From ":BDBECAS_BAJDEF: DATPERAL yo quitaría el espacio después de los segundos :

En efecto no debe de haber espacio, pero lo separe porque si no lo hago aparece una carita ":BDBECAS_BAJDEF:DATPERAL" y creí que seria más entendible si los separaba

Cita:

Empezado por roman
2. Supongo que es innecesario el ; al final de la consulta.

Utilizo otra línea para el ; porque normalmente se me olvida colocarlo.

Para la Base de Datos utilizo Access

Muchas gracias por tu Atención!!!

vtdeleon 28-01-2006 13:45:39

Saludos
Cita:

Empezado por gusanita
En efecto no debe de haber espacio, pero lo separe porque si no lo hago aparece una carita ":BDBECAS_BAJDEFATPERAL" y creí que seria más entendible si los separaba

Usando las etiquetas ([delphi ],[sql ],....) no salen las caritas!

Si aun tienes problemas con la sentencias, pues yo te aconsejos que lo manejes en tiempo de dise~o, es decir, agregando la sentencias (con algun valor en "where") al dataset en su propiedad SQL, lo activas y chequea a ver si aun te da el error.

Yo, aveces, verifico la sentencias de esa forma en el dataset en tiempo de dise~o antes que en ejecucion.

Jonnathan 28-01-2006 17:43:04

Disculpen mi ignorancia, nunca he trabajado en Paradox (si es este el caso) pero: ¿Esta bien que el nombre de la tabla vaya entre comillas dobles en esa consulta? Porque yo en otros manejadores siempre lo pongo sin comillas o entre corchetes: [:BDBECAS_BAJDEF: DATPERAL]. ¿Alguien que me oriente un poco?

lucasarts_18 28-01-2006 18:12:17

Hola:

A mí me parece raro los dos puntos luego de la clausula From :eek:

Hasta Luego -


La franja horaria es GMT +2. Ahora son las 23:55:25.

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