PDA

Ver la Versión Completa : Error en procedimiento SQL embebido en Delphi 7


gorsan
14-09-2007, 00:23:57
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:

/* 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")
);

/* 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:
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:

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
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?

CREATE DOMAIN "NUM_IDEN" AS VARCHAR(10);


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.


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
Muchas gracias por vuestras respuestas. Me ha quedado claro.

Saludos y hasta otra.