PDA

Ver la Versión Completa : problemas selectSQL-Like, pasando datos desde código en el delphi


Giniromero
22-09-2003, 15:21:31
Hola a todos,

Tengo una aplicación en delphi 6 con interbase 7.

Estoy intentando agregar un "form de busqueda" a mi aplicación.

Utilizo un IBDataset, y el selectSQL

En este Form tengo un RadioGroup, según el cual el usuario puede elegir el campo del IBDataSet por el que se va a buscar.
Este campo se guardará en la variable RCampo.

Los campos que se pueden seleccionar son: Apellidos, Nombre y nºCliente

Tengo un TEdit creado (EditBuscar), donde se tiene que escribir el criterio de busqueda, y quiero que la busqueda se haga con un like, al hacer click sobre un botón.

El problema, es que, aunque la variable RCAmpo, que es private, tiene bien tomado el dato del campo, cuando pulso el botón que me ejecuta esta consulta, me da el siguiente error:




""exception class EIBInterBaseError with message 'Dinamic SQL Error
SQL error code = -206
Column unknown
GARCIA*'. ""

Donde GARCIA es lo que he escrito en el campo EditBuscar, y mi código para todo esto es:


procedure que gestiona el RadioGroup:


// según radio que seleccionemos así nos busca en un campo u en otro
// el texto que escribimos en EditBuscar
procedure TFrmSeleAlu.RadioGroup1Click(Sender: TObject);
begin
//la tabla que utiliza, en cualquier caso, es la FrmDModule.TbAlumnos
//Ponemos el campo editBuscar vacio de texto
EditBuscar.Text := '';
TRY
//deshabilitamos los controles de la tabla
FrmDModule.TbAlumnos.DisableControls;
//cerramos la tabla
FrmDModule.TbAlumnos.Close;
//borramos el contenido de la propiedad SelectSQL
FrmDModule.TbAlumnos.SelectSQL.Clear;
//le asignamos el SQL que tenía al inicio la tabla
FrmDModule.TbAlumnos.SelectSQL.Add(FrmDModule.VAlumnosSQL);
//para, dependiendo del campo por el que vamos a querer que nos ordene la tabla
//así añadir el código


//si seleccionamos Apellidos
IF (RadioGroup1.ItemIndex = 0) THEN BEGIN
RCampo := 'APELALU';
//hacemos que se ordene la tabla por apellidos
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
EditBuscar.SetFocus;
END
// si seleccionamos matricula
ELSE IF (RadioGroup1.ItemIndex = 1) THEN BEGIN
RCampo := 'NUMALU';
//hacemos que se ordene la tabla por numero de alumno (por defecto)
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
EditBuscar.SetFocus;
END
//si seleccionamos nombre
ELSE IF (RadioGroup1.ItemIndex = 2) THEN BEGIN
RCampo := 'NOMALU';
//hacemos que se ordene la tabla por nombre
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
EditBuscar.SetFocus;
END;
//una vez modificado el sql del select, abrimos la tabla
FrmDModule.TbAlumnos.Open;
//SetFocus hace que vuelva el cursor al campo EditBuscar
EditBuscar.SetFocus;
FINALLY
//volvemos a habilitar los controles de la tabla
FrmDModule.TbAlumnos.EnableControls;
END;

end;



Este código nos funciona bien,

Pero el problema llega cuando le introducimos parámetros de busqueda y hacemos click sobre el botón de busqueda

el código es el siguiente:



//al pulsar el botón de buscar
procedure TFrmSeleAlu.SpeedButton1Click(Sender: TObject);
begin
TRY

//para, dependiendo del campo por el que vamos a querer que nos ordene la tabla
//así añadir el código

IF EditBuscar.Text = '' THEN BEGIN //Si no hay datos en el campo de texto para buscar
//mostramos mensaje que pida insertar texto
Showmessage ('No se ha introducido parámetros de búsqueda');
//Salimos del procedure
Exit;
END
ELSE BEGIN //si hay parámetros de búsqueda
Showmessage ('SI se ha introducido parámetros de búsqueda');
//deshabilitamos los controles de la tabla
FrmDModule.TbAlumnos.DisableControls;
//cerramos la tabla
FrmDModule.TbAlumnos.Close;
//borramos el contenido de la propiedad SelectSQL
FrmDModule.TbAlumnos.SelectSQL.Clear;
//le asignamos el SQL que tenía al inicio la tabla
FrmDModule.TbAlumnos.SelectSQL.Add(FrmDModule.VAlumnosSQL);
//insertamos los parámetros de búsqueda en la sentencia selectSQL
FrmDModule.TbAlumnos.SelectSQL.Add('WHERE ' + RCampo + ' LIKE " ' + EditBuscar.Text + '*" ' );
//ordenamos por ...
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
//abrimos la tabla
FrmDModule.TbAlumnos.Open;

END;

FINALLY
//volvemos a habilitar los controles de la tabla
FrmDModule.TbAlumnos.EnableControls;
END;


end;




Me imajino que estaré poniendo algo mal relaccionado con el sql , pero no sé que. :(


os agradezco la ayuda de antemano.


Virginia

Viet
22-09-2003, 15:35:52
En principio lo unico que veo mal es el '*' lo debes cambiar por '%'

Prueba con eso ;)

__cadetill
22-09-2003, 15:44:04
Un consejo, cuando pongas código, encierralo entre CODE y /CODE (estre corchetes que no los pongo porque sino no se vería nada).

Una forma buena de ver el SQL que se está lanzando y, así saber si es una sentencia SQL válida es grabar el contenido del TStrings de la consulta


FrmDModule.TbAlumnos.SelectSQL.SaveToFile('c:\lolo.txt');

Siempre antes del Open porque si da error no se grabaría el fichero.

Con respecto a tu problema, es difícil saberlo ya que, me imagino que RCampo es una variable global a toda la Unit y no se puede ver a simple vista los valores que puede coger (si sólo es lo que has escrito, parece estar bien a parte de lo que te comenta Viet).

Otra cosa que puedo sugerirte es que te descagues de mi web el componente TDBSearchDialog. Hace precisamente lo que estás haciendo tu y, quizás pueda darte ideas (o utilizarlo si te gusta ;))

Giniromero
22-09-2003, 16:39:04
Hola,


Puse el * en vez del % por que con el % me pasaba lo mismo.

Con respecto a tu problema, es difícil saberlo ya que, me imagino que RCampo es una variable global a toda la Unit y no se puede ver a simple vista los valores que puede coger

si, está definida como String, y si justo antes de intertar el codigo sql, en el selectSQL, le digo que me muestre el valor que tiene guardado este campo, me muestra el dato correspondiente, correctamente.


Otra cosa que puedo sugerirte es que te descagues de mi web el componente TDBSearchDialog. Hace precisamente lo que estás haciendo tu y, quizás pueda darte ideas (o utilizarlo si te gusta )

¿Cual es tu web? ¿como me añado ese componente al delphi para usarla?

Muchas gracias por todo,

Virginia

Viet
22-09-2003, 16:50:43
Hola... la Web de cadetill la tienes en si firma(al final del mensaje)..

Prueba de hacer esto para confirmar que no es un error de SQL

pon antes del Open : Showmessage(FrmDModule.TbAlumnos.SQL.Text); ...... y pasanos el code que te muestra

a propocito que componente estas usando para acceder a la tabla? ... porque si es una ttable o TQuery podrias hacer esto

en ves de redefinir el codigo para hacer:


TQuery1.filtered := false;
TQuery1.filter := RCampo +'='+ EditBuscar.Text + '%';
TQuery1.filtered := true;

Giniromero
22-09-2003, 17:39:10
¿puede tener esto algo que ver con el tipo de dialecto?

Estoy usando dialecto 3. El objeto con el que estoy gestionanado el SQL es un IBDataSet.

El sql que me resulta haciendo lo que me comentas de :
Showmessage(FrmDModule.TbAlumnos.SelectSQL.Text);

es:

select ALIASALU, APELALU, CCA, CCCALU, CODPALU, DOMIALU, EMAIL, FNACALU, INFORMALU, INFORMALU2, LASTUPDATE, NACIONAL, NIC, NIFALU, NOMAILALU, NOMALU, NOMCLAN, NUMALU, PAISALU, POBALU, PROFALU, PROVALU, RELAC, RUBRALU, SEXALU, TELFALU, TRATAMIE, TUTOR, VIAALU, (APELALU ||', '|| NOMALU) as APENOM
from ALUMNOS

WHERE APELALU LIKE "ROM%"
ORDER BY APELALU



Saludos

Virginia

Giniromero
22-09-2003, 17:49:49
eureka!!!!

:D

YA SÉ DONDE ESTÁ EL ERROR!! estaba poniendo dobles comillas en vez de dos comillas, y por eso en el código me buscaba "ROM%", en vez de 'ROM%'

Vamos, que el código bien, queda así:

FrmDModule.TbAlumnos.SelectSQL.Add('WHERE ' + RCampo + ' LIKE ''' + EditBuscar.Text + '%'' ' );

Muchas gracias a todos,

Virginia