Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problemita en query (https://www.clubdelphi.com/foros/showthread.php?t=23896)

marceloalegre 01-08-2005 21:06:00

Problemita en query
 
Buenos dias, tengo inconveniente con esa consulta:
Código SQL [-]
  INSERT INTO TABLAS (
    DESCRIPCION,
    FECHA_DESDE,
    FECHA_HASTA,
    UTILIZA_LLAMADA_ENTRANTE)
Select
    :DESCRIPCION,
    FECHA_DESDE,
    FECHA_HASTA,

    UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;

mi idea es insertar dentro de la tabla tablas el mismo dato que ya tiene con otro nro de id que ya se ingresa automatico con un generator.
el problema es que al ejecutar esto en ibexpert, sql editor, me dice :
incompatible column/host variable daa type.
Dynamic SQL Error.
SQL error code = -303.
conversion error from string "NombreTest".

tengo algun problema con la descripcion,, mi descripcion es un varchar de longitud 35... necesito algun casteo? como tendria que modificar esta query para que no me salga este error??

Muchas gracias a todos!

vtdeleon 02-08-2005 01:26:52

Saludos

Haciendo un analisis rapido, falta poner Values
Código SQL [-]
  INSERT INTO TABLAS (
     DESCRIPCION,
     FECHA_DESDE,
     FECHA_HASTA,
     UTILIZA_LLAMADA_ENTRANTE)
 /*Aqui*/
 values (
 Select
     :DESCRIPCION,
     FECHA_DESDE,
     FECHA_HASTA,
 
     UTILIZA_LLAMADA_ENTRANTE
 from tablas
 where
 ID_TABLA = :ID_TABLA_A_COPIAR)
Suerte

marceloalegre 02-08-2005 03:56:12

no, es otro tema..
 
no, no es necesario el uso de values, la query puedo ejecutarla perfectamente solo tengo un problema que se debe solucionar con cast calculo pero no se bien como encajarlo en la consulta...
se puede ver eso claramente por lo que dice la query cuando la ejecuto

Código:

incompatible column/host variable data type.
  Dynamic SQL Error.
  SQL error code = -303.
  conversion error from string "NombreTest".

Alguien puede ayudar con mi consulta? Gracias

Crandel 02-08-2005 05:49:28

Hola, no necesitas el value.

sólo queres copiar un registro o toda la tabla?

Quien es "NombreTest"?

como son las estructuras de las dos tablas?

hector.roma 02-08-2005 13:12:14

Yo creo que falta values o sobra la lista de campos

roman 02-08-2005 18:52:30

En

Código SQL [-]
select
  :DESCRIPCION

¿que no sobran esos dos puntos? Si se estuviera insertando un sólo registro usando VALUES entonces se pueden pasar como parámetros los valores de los campos, pero aquí se está usando un SELECT de manera que estamos hablando de los nombres de los campos y no de sus valores. ¿En IB pueden pasarse como parámetros a una consulta los nombres de los campos?

// Saludos

Crandel 02-08-2005 19:28:39

En realidad con el select le estamos pidiendo los valores de esos campos

roman 02-08-2005 19:34:06

Cita:

Empezado por Crandel
En realidad con el select le estamos pidiendo los valores de esos campos

Sí claro, pero para obtener esos valores, el texto de la consulta especifica el nombre de los campos, y esto es lo que se está intentando pasar como parámetro.

// Saludos

marceloalegre 03-08-2005 13:37:25

Buenas, ante todo, Gracias por responder! les detallo mas el tema, quizas no he sido muy claro el tema, el tema seria que tengo esta pequeña query donde estaria reutilizando los campos del registro anterior para la generacion de un nuevo registro de entrada:

Código SQL [-]
INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
Select
:DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
 
UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;

En el select le pongo : a descripcion porque quiero ingresar yo ese valor para que lo inserte en la tabla.(puede que mi error este ahi, porque estoy haciendo un select de un valor que estaria "cableado" o fijo a lo que ponga, no estoy seguro si eso es correcto o no, pero creo que puede ser un tema de casteo, puesto que si pongo un valos entre '' me funciona sin problemas.

Despues tengo :id_tabla_a_copiar ese es un campo tambien de entrada donde pongo un id existente y me copia todos los datos al nuevo registro, a excepcion de la descripcion que la quiero de entrada.

mi error como les mostre es:
Código:

incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
conversion error from string "NombreTest".

donde NombreTest es un ejemplo de un valor de entrada para el campo descripcion, puse nombretest podia ser cualquier cosa, es unvarchar de hasta 35 caracteres.

Lo que dice el error al ejecutarlo segun puedo entender es :
Código:

incompatible column/host variable data type.
tipo de datos incompatible... no se si podre aplicar un cast para el dato o cual es el problema concreto, quisas alguien con mayores conocimientos de este tema me pueda asistir..

Muchas Gracias!!

marceloalegre 03-08-2005 20:40:30

En cuanto a lo que tu dices roman, si, estoy pasando descripcion como parametro dentro del select, eso no me ha dado problemas nunca por lo menos con interbase...

roman 03-08-2005 21:06:15

Cita:

Empezado por kanvictor
si, estoy pasando descripcion como parametro dentro del select, eso no me ha dado problemas nunca por lo menos con interbase...

No me convences. Sé que es aventurado decir esto puesto que no uso las componentes IB pero curiosamente el mismo error de incompatibilidad de tipos me da cuando hago la prueba con el bde.

Por otra parte mencionaste antes que si pones un valor explícito sí funciona. Es decir, según entiendo, si pones:

Código SQL [-]
INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
Select
'NombreTest',
FECHA_DESDE,
FECHA_HASTA,
 
UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;

funcion a, ¿cierto? ¿Por qué no intentas sustituyendo el valor de DESCRIPCION de otra manera, por ejemplo, declara una constante con el texto de la consulta:

Código Delphi [-]
const
  fmtSql =
    'INSERT INTO TABLAS ('#13 +
    'DESCRIPCION,'#13 +
    'FECHA_DESDE,'#13 +
    'FECHA_HASTA,'#13 +
    'UTILIZA_LLAMADA_ENTRANTE)'#13 +
    'Select'#13 +
    '"%s",'#13 +
    'FECHA_DESDE,'#13 +
    'FECHA_HASTA,'#13 +
 
    'UTILIZA_LLAMADA_ENTRANTE'#13 +
    'from tablas'#13 +
    'where'#13 +
    'ID_TABLA = :ID_TABLA_A_COPIAR';

Al asignar el texto de la consulta a la componente usas Format:

Format(fmtSql, [Descripcion])

Format te devolverá el mismo texto pero con '%s' sustituido por el valor que tenga la variable Descripción.

// Saludos

Crandel 03-08-2005 21:52:58

Hola kanvictor, no estoy muy seguro de que puedas pasar el parámetro de descripción de esa forma en el select.

yo lo separaría en dos SQL

Código SQL [-]
INSERT INTO TABLAS (
  FECHA_DESDE,
  FECHA_HASTA,
  UTILIZA_LLAMADA_ENTRANTE)

Select
  FECHA_DESDE,
  FECHA_HASTA,
  UTILIZA_LLAMADA_ENTRANTE
from tablas

where
  ID_TABLA = :ID_TABLA_A_COPIAR;

Luego

Código SQL [-]
UPDATE TABLAS 
  SET DESCRIPCION = :pDESCRIPCION
WHERE
  ID_TABLA = :ID_TABLA_A_COPIAR;

roman 03-08-2005 22:03:22

Pero no es necesario. El valor que va a entrar al campo DESCRIPCION es el mismo para todos los registros insertados y puede hacerse desde la primera consulta, sólo que no puede sustituirse como si fuera un parámetro pero sí como describí antes. Al menos funciona en Paradox y sería raro que Paradox pueda hacer algo que Interbase no.

// Saludos

Crandel 03-08-2005 22:17:07

pero en FB/IB no se puede colocar un valor que reemplace el nombre del campo en una instrucción SQL.

roman 03-08-2005 22:22:43

¿O sea que no se puede hacer una cosulta del tipo

Código SQL [-]
select campo1, campo2, "dato fijo"
from tabla

Qué triste :(

// Saludos

roman 03-08-2005 22:57:09

Acabo de instalar firebird 1.5, creé dos tablas de prueba e inserté datos de una a otra tal como describí anteriormente y funcionó sin problemas.

// Saludos

Crandel 03-08-2005 23:03:40

si funciona :D , pero con comillas simples

ya voy a probar la otra instruccion.

Crandel 03-08-2005 23:05:15

instalaste firebird sólo para probarlo ??? :eek:

que dedicación !!!!

roman 03-08-2005 23:19:12

Cita:

Empezado por Crandel
instalaste firebird sólo para probarlo ???

Y no sólo Firebird, también el IBExpert :) . Lo que pasa es que en otro hilo de hoy se habló de esto mismo así que necesitaba comprobarlo por mi mismo antes de seguir diciendo que si algo se puede en paradox también se puede en ib/fb ;)

// Saludos

Crandel 04-08-2005 01:11:18

probe recien de nuevo la instrucción que planteo originalmente kanvictor, para lograr hacer las dos cosas en una sola instrucción, pero no puede hacer que funcione.

Probe con cast y tampoco.

que raro. :confused:


La franja horaria es GMT +2. Ahora son las 16:03:22.

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