FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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á :) |
#2
|
|||
|
|||
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" ;) |
#3
|
|||
|
|||
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'); 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 ) |
#4
|
|||
|
|||
Hola,
Puse el * en vez del % por que con el % me pasaba lo mismo. Cita:
Cita:
Muchas gracias por todo, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#5
|
|||
|
|||
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" ;) |
#6
|
|||
|
|||
¿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á :) |
#7
|
|||
|
|||
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á :) |
|
|
|