Foros Club Delphi

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

Pedro-Juan 06-03-2008 20:53:06

Tipo desconocido en SQL
 
Hola a tod@s, un saludo.
Tengo una consulta que me da el error de: Project Biblio.exe raised exception class EDatabaseError
with message 'cAut' is of an unknown type, Process
stopped. Use step or run to continue.
Me da el mismo mensage de error con todos los parámetros, excepto con el primero (cPalabra).
Todos los tipos de variable están bien, tanto en la declaración como en las asignaciones previas a la llamada
al procedure.
Lo más curioso: tengo otras consultas idénticas a esta (pero para otros ámbitos dentro de la misma
aplicación) y me funcionan bien, sin problemas.
¿Cómo pueden ser de un tipo desconocido? y ¿porqué funcionan procedures similares en otros ámbitos?
Muchas gracias de antemano a tod@s por vuestra ayuda.

Código Delphi [-]
 
procedure BusarPorCalificacionSQL(cCalificacion,cAutor,cTema,cClasificacion: String);
var cPalabra,cAut,cTem,cClasif: String;
    nParam: Integer;
begin
nParam    := 0;
cPalabra  := Trim(cCalificacion);
cAut      := Trim(cAutor);
cTem      := Trim(cTema);
cClasif   := Trim(cClasificacion);
DataModule.QueryLib.Close;
DataModule.QueryLib.SQL.Clear;
DataModule.QueryLib.SQL.Add('Select * From TITULOS');
DataModule.QueryLib.SQL.Add('Where ((NomCalifCas = :cPalabra) or (NomCalifCat = :cPalabra) or 
                                                                           (NomCalifIng = :cPalabra) or (NomCalifFra = :cPalabra) or 
                                                                           (NomCalifAle = :cPalabra) or (NomCalifIta = :cPalabra) or 
                                                                           (NomCalifPor = :cPalabra))');
DataModule.QueryLib.Params[nParam].AsString := cPalabra;
if ((nNumItemIndexA = 1) and (cAut <> '')) then begin
     DataModule.QueryLib.SQL.Add('And NOMAUTOR1 = :cAut or NOMAUTOR2 = :cAut or 
                                                                          NOMAUTOR3 = :cAut or NOMAUTOR4 = :cAut or 
                                                                          NOMAUTOR5 = :cAut or NOMAUTOR6 = :cAut');
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := cAut;
end;
if ((nNumItemIndexB = 1) and (cTem <> '')) then begin
     Inc(nParam);
     DataModule.QueryLib.SQL.Add('AND (Tema = :cTem)');
     DataModule.QueryLib.Params[nParam].AsString := cTem;
end;
if ((nNumItemIndexC = 1) and (cClasif <> '')) then begin
     Inc(nParam);
     DataModule.QueryLib.SQL.Add('AND (Clasificacion = :cClasif)');
     DataModule.QueryLib.Params[nParam].AsString := cClasif;
end;
DataModule.QueryLib.SQL.Add('AND (IsConte = ''No'')');
if(F_Main.sRadioGGrid.ItemIndex = 0) then  DataModule.QueryLib.SQL.Add('Order By TITULO');
if(F_Main.sRadioGGrid.ItemIndex = 1) then  DataModule.QueryLib.SQL.Add('Order By NUMERO');
DataModule.QueryLib.Open;
end;

enecumene 06-03-2008 21:13:03

Hola, Has intentado mover el trim?:

Código Delphi [-]
procedure BusarPorCalificacionSQL(cCalificacion,cAutor,cTema,cClasificacion: String);
var cPalabra,cAut,cTem,cClasif: String;
    nParam: Integer;
begin
nParam    := 0;
cPalabra  := cCalificacion;
cAut      := cAutor;
cTem      := cTema;
cClasif   := cClasificacion;
DataModule.QueryLib.Close;
DataModule.QueryLib.SQL.Clear;
DataModule.QueryLib.SQL.Add('Select * From TITULOS');
DataModule.QueryLib.SQL.Add('Where ((NomCalifCas = :cPalabra) or (NomCalifCat = :cPalabra) or 
                                                                           (NomCalifIng = :cPalabra) or (NomCalifFra = :cPalabra) or 
                                                                           (NomCalifAle = :cPalabra) or (NomCalifIta = :cPalabra) or 
                                                                           (NomCalifPor = :cPalabra))');
DataModule.QueryLib.Params[nParam].AsString := cPalabra;
if ((nNumItemIndexA = 1) and (cAut <> '')) then begin
     DataModule.QueryLib.SQL.Add('And NOMAUTOR1 = :cAut or NOMAUTOR2 = :cAut or 
                                                                          NOMAUTOR3 = :cAut or NOMAUTOR4 = :cAut or 
                                                                          NOMAUTOR5 = :cAut or NOMAUTOR6 = :cAut');
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
     Inc(nParam);
     DataModule.QueryLib.Params[nParam].AsString := Trim(cAut);
end;
if ((nNumItemIndexB = 1) and (cTem <> '')) then begin
     Inc(nParam);
     DataModule.QueryLib.SQL.Add('AND (Tema = :cTem)');
     DataModule.QueryLib.Params[nParam].AsString := cTem;
end;
if ((nNumItemIndexC = 1) and (cClasif <> '')) then begin
     Inc(nParam);
     DataModule.QueryLib.SQL.Add('AND (Clasificacion = :cClasif)');
     DataModule.QueryLib.Params[nParam].AsString := cClasif;
end;
DataModule.QueryLib.SQL.Add('AND (IsConte = ''No'')');
if(F_Main.sRadioGGrid.ItemIndex = 0) then  DataModule.QueryLib.SQL.Add('Order By TITULO');
if(F_Main.sRadioGGrid.ItemIndex = 1) then  DataModule.QueryLib.SQL.Add('Order By NUMERO');
DataModule.QueryLib.Open;
end;

Saludos.

maeyanes 06-03-2008 21:13:24

Hola...

Mayormente ese error salta cuando no le das un valor a uno de los parámetros. En tu caso, el parámetro cAut de seguro no recibe un valor.


Saludos...

Pedro-Juan 06-03-2008 22:23:05

Muchas gracias, pero está todo correcto (bueno, es evidente que algo falla) quiero decir que el error, después de poner comentarios a varias líneas me lo señala en esta, es decir la primera vez que encuentra cAut:

Código Delphi [-]
DataModule.QueryLib.SQL.Add('And NOMAUTOR1 = :cAut or NOMAUTOR2 = :cAut or 
                                                                          NOMAUTOR3 = :cAut or NOMAUTOR4 = :cAut or 
                                                                          NOMAUTOR5 = :cAut or NOMAUTOR6 = :cAut');
Por cierto que no lo había dicho:
Delphi6
Interbase 5.1

he cambiado el Trim y comprobado que los parámetros reciban contenido. Todo bien.

pero sigue dando el error.
Gracias

jcarteagaf 06-03-2008 22:33:32

Parametros
 
Y que tal si pruebas lo siguiente:

Código Delphi [-]
DataModule.QueryLib.Parambyname('CPALABRA').AsString := cPalabra;
....
DataModule.QueryLib.Parambyname('CAUT').AsString := Trim(cAut);
....
DataModule.QueryLib.Parambyname('CTEM').AsString := cTem;

Saludos

P.D. Hey este es mi post Nº 100.....je,je, poco a poco se anda lejos. Mi proxima meta: 250.

Pedro-Juan 06-03-2008 22:52:18

Muchas gracias a todos.

jcarteagaf, gracias, la primera compilación que he hecho con tu propuesta me ha funcionado bien. Deduzco que era innecesario (en este caso) numerar los parámetros. Esto lo hace más fácil, pues he suprimido nParam y todo ha ido muy bien. Gracias.


La franja horaria es GMT +2. Ahora son las 15:22:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi