Hola!
Quisiera que me den algunas ideas de como poder realizar el codigo en Delphi cuando estoy usando de Base de Datos SQL SERVER. en el sigte caso:
Quisiera realizar tipos de busquedas por varios campos pero de diferentes tablas, es decir:
TUniversitario:IdE,CI,NombreAlumno,Apellidos,Pais,NombreCarrera,TiempoCarrera...etc
TMateria:IdM,IdE,SiglaMateria,NombreMateria,SemesteAnual,Gestion,Calificacion,etc...
TBeca:IdB,IdE,Fecha,MontoMes, MontoTotal,etc.
....y tengo mas tablas que estan relacionadas por Tuniversitario.
Como ven las dos ultimas tablas estan relaciondas con TUniversitario por medio de IdE.
El 1ero ADOQuery1 y los otros son ADOTables(X) y estan relacionadas con MasterSource, MasterFields.....Cada tabla tiene su propia informacion, ya la introduci.
Ahora lo que quiero es realizar una busqueda simultanea por decir por medio de dos tablas o trees.
ejemplo:
Creando dos combobox, dos Tedit
Combobox: Nombres Carrera
Tedit: Juan Medicina
Y en un DBGrid1 quisiera que me aparezca la informacion "a medida que estoy escribiendo el nombre Juan y luego reduzca la informacion del DBGrid1 cuando escriba la carrera medicina"
Algun componente que pueda facilitarme? o como tendria q programarlo? Estaba colocando el sigte codigo para agrupar todos los campos:
Código:
Select U.*,M.*,B.*
From TUniversitario U, Tmateria M, Tbeca B
Where U.IdE=M.IdE and U.IdE=B.IdE
Esto para que seleccione todo los campos, lo coloque en un ADOQuery2
Pero en la busqueda como seria?
oTRA vez mas gracias por la ayuda
Publicado:
Sab Abr 03, 2010 8:19 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Busquedas multibles tablas
Anuncios
Sizne escribió:
Hola!
Quisiera que me den algunas ideas de como poder realizar el codigo en Delphi cuando estoy usando de Base de Datos SQL SERVER. en el sigte caso:
Quisiera realizar tipos de busquedas por varios campos pero de diferentes tablas, es decir:
TUniversitario:IdE,CI,NombreAlumno,Apellidos,Pais,NombreCarrera,TiempoCarrera...etc
TMateria:IdM,IdE,SiglaMateria,NombreMateria,SemesteAnual,Gestion,Calificacion,etc...
TBeca:IdB,IdE,Fecha,MontoMes, MontoTotal,etc.
....y tengo mas tablas que estan relacionadas por Tuniversitario.
Como ven las dos ultimas tablas estan relaciondas con TUniversitario por medio de IdE.
El 1ero ADOQuery1 y los otros son ADOTables(X) y estan relacionadas con MasterSource, MasterFields.....Cada tabla tiene su propia informacion, ya la introduci.
Ahora lo que quiero es realizar una busqueda simultanea por decir por medio de dos tablas o trees.
ejemplo:
Creando dos combobox, dos Tedit
Combobox: Nombres Carrera
Tedit: Juan Medicina
Y en un DBGrid1 quisiera que me aparezca la informacion "a medida que estoy escribiendo el nombre Juan y luego reduzca la informacion del DBGrid1 cuando escriba la carrera medicina"
Algun componente que pueda facilitarme? o como tendria q programarlo? Estaba colocando el sigte codigo para agrupar todos los campos:
Código:
Select U.*,M.*,B.*
From TUniversitario U, Tmateria M, Tbeca B
Where U.IdE=M.IdE and U.IdE=B.IdE
Esto para que seleccione todo los campos, lo coloque en un ADOQuery2
Pero en la busqueda como seria?
oTRA vez mas gracias por la ayuda
Efectivamente, para búsquedas de varias tablas tienes que utilizar SQL, en concreto la cláusula "LIKE", en tu caso sería algo así:
Código:
Select U.*,M.*,B.*
From TUniversitario U, Tmateria M, Tbeca B
Where U.IdE=M.IdE and U.IdE=B.IdE and (nombre_campo_busqueda like :pCampoBusqueda1 or nombre_campo_busqueda2 like :pCampoBusqueda2)
Ten en cuenta que he utilizado parámetros: :pCampoBusqueda1 y :pCampoBusqueda2, por lo que tendrás que indicar el tipo de datos y el valor de estos parámetros, por ejemplo:
Código:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select U.*,M.*,B.*');
ADOQuery1.SQL.Add('From TUniversitario U, Tmateria M, Tbeca B');
ADOQuery1.SQL.Add('Where U.IdE=M.IdE and U.IdE=B.IdE and ');
ADOQuery1.SQL.Add('(nombre_campo_busqueda like :pCampoBusqueda1 or nombre_campo_busqueda2 like :pCampoBusqueda2)');
ADOQuery1.Parameters.ParamByName('pCampoBusqueda1').DataType := ftString;
ADOQuery1.Parameters.ParamByName('pCampoBusqueda1').Value := Combobox1.Text;
ADOQuery1.Parameters.ParamByName('pCampoBusqueda2').DataType := ftString;
ADOQuery1.Parameters.ParamByName('pCampoBusqueda2').Value := Combobox2.Text;
ADOQuery1.Open;
Como siempre te muestro un ejemplo, cambia el nombre de tus campos, del ADOQuery y de los TComboBox o TEdit que utilices para introducir el valor de los filtros.
Si lo que quieres es que te vaya filtrando conforme se vaya escribiendo deberás colocar lo anterior el evento OnChange del TEdit o en el evento OnClick del TComboBox.
También tienes que tener en cuenta el tipo de filtro que quieras, en el ejemplo, te he puesto un "or" entre los dos "like", esto hace que se cumpla uno u otro filtro, si pones un "and" obligas a que se cumplan ambos. Esto lo puedes ir modificando a tu medida y añadir los "like" que quieras.
Otra cosa a tener en cuenta es que si tienes muchos registros en las tablas implicadas y la consulta SQL anterior tarda más de un segundo en ejecutarse, puede provocar que se ralentice la escritura en el TEdit para la selección del valor a filtrar, esto se suele arreglar con un TTimer, aunque complica un poco las cosas. Como te he comentado en otro post de este foro, si quieres implementar esto y tienes muchos registros en las tablas puedes ver este ejemplo, donde se emplea un TTimer para evitar ese molesto efecto de escribir en el TEdit y que tarde uno o dos segundos en salir lo que has escrito:
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A