Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
problemas selectSQL-Like, pasando datos desde código en el delphi

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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 22-09-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
En principio lo unico que veo mal es el '*' lo debes cambiar por '%'

Prueba con eso
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #3  
Antiguo 22-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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

Código:
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 )
Responder Con Cita
  #4  
Antiguo 22-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,


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

Cita:
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.


Cita:
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #5  
Antiguo 22-09-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
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:

Código:
 
   TQuery1.filtered := false;
   TQuery1.filter := RCampo +'='+ EditBuscar.Text + '%';
   TQuery1.filtered := true;
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #6  
Antiguo 22-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
¿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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #7  
Antiguo 22-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
eureka!!!!



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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:57:07.


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
Copyright 1996-2007 Club Delphi