PDA

Ver la Versión Completa : Uso del DBGrid


lucas05
10-08-2010, 19:50:12
Hola, es la primera vez que escribo, sepan disculpar si no me doy a entender correctamente.
El asunto es que tengo un problema con una pequeña aplicación que estoy realizando.
Estoy utilizando Delphi 7 y me conecto a MySQL.
En el Form tengo los siguientes componentes:
2 DBGrid, 1 Data Source, 1 ADOQuery, 1 ADOConnection.
Utilizo dos tablas:
libros tiene los siguientes campos (id_libro, titulo, genero, id_editorial, etc)
editorial tiene los siguientes campos (id_editorial, nombre, localidad, país, etc).
Ambas tablas están relacionadas por id_editorial.
Funcionamiento: en el DBGrid1 muestro la información correspondiente a la tabla libros (mediante una consulta sql que hago en el ADOQuery).
Problema: Lo que quiero hacer es que al hacer click en un registro del DBGrid1 me muestre en el DBGrid2 los datos de la editorial (tabla editorial) a la que pertenece ese libro.

Espero que hayan entendido y puedan ayudarme.
Gracias por su atención y saludos.

erickahr
10-08-2010, 21:34:17
ok, te recomendaria que en vez de un AdoQuery, pusieras dos y por ende dos datasource, en el primer ADOQuery, puedes poner la consulta:

Select id_libro, titulo, genero, id_editorial, etc from libros


Esto acarrearia todos los libros de a la DBGrid1, en el segundo ADOQuery pondrias:

Select id_editorial, nombre, localidad, país, etc from editoriales
Where id_editorial = :id_editorial


Ahora en el evento Click de tu DBGrid1 pon este codigo:

ADOQuery2.Close;
ADOQuery2.ParamByName('id_editorial').Value := AdoQuery1.FieldByName('id_editorial ').AsInteger;
ADOQuery2.Open;


Y claro todos los objetos deben estar enlazados correctamente:

http://avt7ya.bay.livefilestore.com/y1ph_sVYV5k-E8phP9uRRZKakqLDtuOjGSO6urW3PbzhgvORX9dILDpTf6yJ-DaA_D6XYvFJdvcbVdHAT5hhsretbtfOaHjwUNu/q.jpg?psid=1
:cool: Espero te sea de utilidad

lucas05
11-08-2010, 05:33:35
Hola erickahr, muchisimas gracias por responder, pero tengo algunos problemitas con el codigo. Paso a detallar.

Este es el codigo que me pasaste:
ADOQuery2.Close;
ADOQuery2.ParamByName('id_editorial').Value := ADOQuery1.FieldByName('id_editorial').AsInteger;
ADOQuery2.Open;

El problema aparece en la segunda linea del codigo.
Este es mi codigo, el que pongo en el evento OnCellClick
ADOQuery2.Close;
ADOQuery2.Parameters.ParamByName('id_editorial').Value := ADOQuery1....
ADOQuery2.Open;

Como puedes ver. Despues del ADOQuery2 tengo que poner Parameters, y luego recien ParamByName. Despues del ADOQuery1 no me aparece la propiedad FieldByName.

Cual puede ser el problema?

Otra vez gracias por tu atencion y saludos.

Caro
11-08-2010, 15:28:07
Hola lucas05, puedes hacer la relación maestro detalle directamente. Necesitas dos AdoQuerys y dos DataSource como te ha indicado erickahr y haces lo siguiente:

1.-En el AdoQueryLibros colocas la consulta "Select * From Libros", enlazas a su DataSource (digamos que se llame DataSourceLibro) y su DBGrid.
2.-En AdoQueryEditoriales colocas "Select * From Editoriales Where id_editorial=:id_editorial" enlazado a su DataSource respectivo, ahora para hacer la relación maestro-detalle, en la propiedad DataSource de tu AdoQueryEditoriales escoges DataSourceLibro.

Saluditos

erickahr
11-08-2010, 17:01:24
OK, perdon, te comento que la respuesta la escribi 'a patín', ya que no tenia Delphi a la mano, ademas que ya tiene un rato que no uso ADO (actualmente desarrollo con Firebird), pero ya lo revise y en efecto, a mi me funciono con parameters, como lo mencionas.

ADOQuery1.Parameters.ParamByName('id_editorial').Value := ADOQuery2.Parameters.ParamByName(''id_editorial').Value;

tambien podrias intentar con:


ADOQuery1.Parameters.ParamValues['id_editorial'] := ADOQuery2.Parameters.ParamValues['id_editorial'] ;


Aunque siendo sincero, la respuesta de caro me parece una excelente solucion. Saludos;

lucas05
12-08-2010, 05:13:44
Hola Caro, tu solución funciono muy bien, gracias.

Pero tengo una consulta, como seria si en lugar de tener 2 tablas tuviera 3 tablas.
Paso a explicarte, es el mismo caso que el problema anterior en donde tenia: 2 DBGrid, 2 ADOQuery, 2 DataSource. Pero esta vez tengo 3 tablas que estan relacionadas de la siguiente forma:
Tabla A: id_a
Tabla B: id_a, id_c
Tabla C: id_c
Quiero lograr el mismo funcionamiento que en el caso anterior (maestro-detalle), en donde el DBGrid1 muestre la informacion de la Tabla A. Pero ahora en el DBGrid 2 tiene que aparecer la informacion de la Tabla C.
Como puedes ver en este caso hay que pasar por una tabla intermedia (Tabla B).
Como puedo solucionarlo?

Gracias por tu atencion y saludos.

lucas05
12-08-2010, 21:46:23
Hola erickahr, disculpame que te vuelva a molestar, pero cuando utilizo lineas de código no puedo hacerlo funcionar (aunque la solución de Caro funciona bien).

Este es el codigo que utilizo en el OnCellClick del DBGrid1:
ADOQuery2.Close;
ADOQuery2.Parameters.ParamValues['id_editorial']:=ADOQuery1.Parameters.ParamValues['id_editorial'];
ADOQuery2.Open;

Cuando lo compilo no aparece ningun error, pero cuando elijo un registro del DBGrid1 aparece el siguiente mensaje `ADOQuery1: Parameter 'id_editorial'
not found´

Te recuerdo que el parametro 'id_editorial' lo defino en el ADOQuery2 que esta conectado al DBGrid2.
El ADOQuery1 no sabe de la existencia del parametro 'id_editorial'?

Cual puede ser el error?

Gracias por tu atencion y saludos.