Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error en procedimiento SQL embebido en Delphi 7 (https://www.clubdelphi.com/foros/showthread.php?t=48050)

gorsan 14-09-2007 00:23:57

Error en procedimiento SQL embebido en Delphi 7
 
Hola a todos. Debido al error que les presento a continuacion estoy atascado desde hace ya una semana. No entiendo el porque me pasa esto. Me explicare:

Tengo las siguientes tablas definidas con Interbase 6:

Código SQL [-]
/* Domain definitions */
CREATE DOMAIN "AB" AS VARCHAR(1)
   DEFAULT 'A'
   CHECK(VALUE='A' OR VALUE='B');
CREATE DOMAIN "SITIO" AS VARCHAR(3)
   CHECK(VALUE='ABC' OR VALUE='DEF');
CREATE DOMAIN "FECHA_CADUCIDAD" AS TIMESTAMP
   CHECK(VALUE>='NOW');
CREATE DOMAIN "MATRICULA_COCHE" AS VARCHAR(10);
CREATE DOMAIN "NOM" AS VARCHAR(60);
CREATE DOMAIN "NUM_IDEN_EXTRANJERO" AS VARCHAR(14);
CREATE DOMAIN "OBJETO_ACCESO" AS VARCHAR(20);
CREATE DOMAIN "PRIMER_APELLIDO" AS VARCHAR(60);
CREATE DOMAIN "SEGUNDO_APELLIDO" AS VARCHAR(60);
CREATE DOMAIN "VERDADERO_FALSO" AS CHAR(1)
   DEFAULT 'N'
   CHECK(VALUE='S' OR VALUE='N');

/* Table: EXTERNOS_NIE, Owner: SYSDBA */

CREATE TABLE "EXTERNOS_NIE" 
(
  "NIE1"  "NUM_IDEN_EXTRANJERO" NOT NULL,
  "APELLIDO_1"  "PRIMER_APELLIDO" NOT NULL,
  "APELLIDO_2"  "SEGUNDO_APELLIDO",
  "NOMBRE"  "NOM" NOT NULL,
  "MATRICULA"  "MATRICULA_COCHE",
  "CENTRO"  "SITIO" NOT NULL,
  "OBJETO"  "OBJETO_ACCESO",
  "ALTA_BAJA"  "AB",
  "CADUCIDAD"  "FECHA_CADUCIDAD",
  "NOTAS"  BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
  "ESTA_DENTRO"  "VERDADERO_FALSO",
 PRIMARY KEY ("NIE1")
);

Código SQL [-]
/* Domain definitions */
CREATE DOMAIN "SITIO" AS VARCHAR(3)
   CHECK(VALUE='ABC' OR VALUE='DEF');
CREATE DOMAIN "NOM" AS VARCHAR(60);
CREATE DOMAIN "NUM_IDEN" AS VARCHAR(10);
CREATE DOMAIN "PRIMER_APELLIDO" AS VARCHAR(60);
CREATE DOMAIN "SEGUNDO_APELLIDO" AS VARCHAR(60);

/* Table: INTERNOS, Owner: SYSDBA */

CREATE TABLE "INTERMEDIARIOS" 
(
  "NUM1"  "NUM_IDEN" NOT NULL,
  "APELLIDO_1"  "PRIMER_APELLIDO" NOT NULL,
  "APELLIDO_2"  "SEGUNDO_APELLIDO",
  "NOMBRE"  "NOM" NOT NULL,
  "CENTRO"  "SITIO" NOT NULL,
  "NOTAS"  BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
 PRIMARY KEY ("NUM1")
);

y un procedimiento embebido con delphi 7 que intenta hacer un query que arroja como resultado un único registro de la tabla EXTERNOS_NIE en tiempo de ejecucion. El procedimeiento es el siguiente:
Código Delphi [-]
procedure TForm1.BuscarUno;
begin
if PageControl1.ActivePage=TabSheet1 then
   begin
    with DM.IBDS_DNI do
     begin
       if Active=True then Active:=False;
       UnPrepare;
       SelectSQL.Clear;
       SelectSQL.Add('SELECT * FROM EXTERNOS_DNI');
       SelectSQL.Add('WHERE DNI1='+ComboBox1.Text);
       Prepare;
       if Active=False then Active:=True;
       Open;
     end;
   end;

if PageControl1.ActivePage=TabSheet2 then
   begin
    with DM.IBDS_NIE do
     begin
       if Active=True then Active:=False;
       UnPrepare;
       SelectSQL.Clear;
       SelectSQL.Add('SELECT * FROM EXTERNOS_NIE');
       SelectSQL.Add('WHERE NIE1='+ComboBox1.Text);
       Prepare;
       if Active=False then Active:=True;
       Open;
     end;
   end;

if PageControl1.ActivePage=TabSheet3 then
   begin
    with DM.IBDS_PAS do
     begin
       if Active=True then Active:=False;
       UnPrepare;
       SelectSQL.Clear;
       SelectSQL.Add('SELECT * FROM EXTERNOS_PAS');
       SelectSQL.Add('WHERE PASAPORTE1='+ComboBox1.Text);
       Prepare;
       if Active=False then Active:=True;
       Open;
     end;
   end;

if PageControl1.ActivePage=TabSheet4 then
   begin
    with DM.IBDS_INTERMEDIARIOS do
     begin
       if Active=True then Active:=False;
       UnPrepare;
       SelectSQL.Clear;
       SelectSQL.Add('SELECT * FROM INTERMEDIARIOS');
       SelectSQL.Add('WHERE NUM1='+ComboBox1.Text);
       Prepare;
       if Active=False then Active:=True;
       Open;
     end;
   end;
end;

El código subrayado en azul pasa sin problemas y arroja el query esperado, pero el codigo subrayado con rojo no. Da un error que es el siguiente:
"Project Control_Exterior.Exe raised exception class EIBInterBaseError with message 'Dynamic sql error SQL error code=-104; Token unknown -line 2, char 14 X22222222K.' Process stopped. Use step ....." El dato que intenta leer es la siguiente cadena: 0000X22222222K.

Si os fijais, cuando se hace el select sobre INTERMEDIARIOS que tambien esta definido como VARCHAR, no hay problema y todo funciona como debe. Es en cualqueira de los dos casos que expongo donde me da el error. Otras veces me dice, en lugar del error que os he expuesto, que "el campo X22222222K no esta definido"

¿Alguien tiene una idea de porque esto falla?
Muchas gracias por vuestro tiempo.

b3nshi 14-09-2007 04:58:34

Puedes probar cambiando las lineas por:
Código Delphi [-]
SelectSQL.Add('WHERE DNI1='+quotedstr(ComboBox1.Text)); //Si no me equivoco asi es la funcion

Solo para los campos varchar si?

De todos modos note q no presentas la estructura de la tabla:
EXTERNOS_DNI...

{Saludos}

gorsan 14-09-2007 07:59:11

Solucionado el problema
 
Buenos dias desde Madrid.
Solucionado el problema. Es esa funcion la que me soluciona el problema. Pero no obstante, ¿porque en el codigo de mas abajo no me daba el problema siendo tambien un varchar?

Código SQL [-]
CREATE DOMAIN "NUM_IDEN" AS VARCHAR(10);

Código Delphi [-]
SelectSQL.Add('WHERE NUM1='+ComboBox1.Text);

Muchas gracias.

duilioisola 14-09-2007 09:07:50

No te daba problemas porque podía "traducir" el número a varchar.

Código SQL [-]
WHERE NUM1=0001234 --> WHERE NUM1='1234'
WHERE NIE=X12345678 --> ERROR. Si no tiene comillas debe ser un número!

gorsan 14-09-2007 10:16:19

Ok
 
Muchas gracias por vuestras respuestas. Me ha quedado claro.

Saludos y hasta otra.


La franja horaria es GMT +2. Ahora son las 01:08:52.

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