PDA

Ver la Versión Completa : Consulta maestro-detalle, DBExpress con MySQL


Josepo
26-11-2007, 15:04:11
Hola a todos. Soy nuevo en el foro. Estoy muy contento y satisfecho con todo lo que he aprendido aquí en los últimos días. Estoy haciendo una aplicación para consumo propio, su utilidad será agenda, facturar y llevar los datos de los clientes en una peluquería. Estoy en situación inicial (sólo he hecho prácticas...).

Inicialmente he optado por una conexión dbexpress con base de datos MySQL, estoy diseñando un tipo de consulta maestro-detalle y no me acaba de funcionar. Para practicar he creado 2 tablas cliente y factura, visualizo el query del cliente en campos dbedit y navego correctamente con un dbnavigator. En un dbgrid visualizo las facturas respectivas del cliente que se refrescan correctamente.

Problema: en el SQLQuery de factura, DataSource apunta al DataSource de Cliente (que es maestro) y en SQL tengo:
SELECT * FROM factura

y funciona pero si hago cualquier variación, por ejemplo escoger ciertos campos o renombrarlos:
SELECT fra_num AS Número FROM factura

me da error diciendo que otro campo (por cierto, indexado) no lo ha encontrado. He hecho diferentes variaciones de SELECT y sólo funciona con SELECT *.

¿que puede estar pasando?

Espero haber aportado suficientes datos :o, agradeceré cualquier comentario.

enecumene
26-11-2007, 17:22:03
Hola, prueba quitando el acento a Numero.

Saludos.

Josepo
26-11-2007, 17:37:01
Hola enecumene, no es el acento, se me ha escapado cuando lo he escrito aquí como ejemplo...

Es curioso, porque cuando escribo las instrucciones SQL en el phpmyadmin hace los SELECT de cualquier tipo correctamente pero si lo hago desde un SQLQuery imprescindiblemente se han de seleccionar ciertos campos para que no salga error.

basti
26-11-2007, 18:31:44
Cuando haces un maestro-detalle, has de incluir en la consulta del detalle el campo que la relaciona con el maestro.


SELECT cliente, fra_num AS Número FROM factura

Josepo
28-11-2007, 09:51:21
Gracias por vuestras respuestas. Tienes razón, basti, se ha de incluir necesariamente el campo que relaciona el detalle con el maestro.

No obstante, he descubierto otra cosa, que al campo que relaciona no se le puede dar otro nombre en el select, es decir si hago SELECT fra_idcli FROM facturafunciona, pero si hago SELECT fra_idcli AS Cliente FROM factura no funciona. Dándole vueltas he descubierto que si quiero hacer esta segunda opción, la propiedad ClientDataSet.IndexFielName debo de poner también Cliente. Seguro que lo que explico es muy evidente para todos, pero claro, esto de ser novato trae estos dolores de cabeza;).

Una vez resuelto esto me encuentro con otro problema: yo no quiero que en la grid salga el campo fra_idcli, que dinámicamente me lo pone porque hemos visto que es obligatorio ponerlo. Este campo hace que en cada linea me repita el mismo número de cliente (es obvio: ¡todas las lineas son las facturas del mismo cliente!).

¿cómo puedo hacer para que una columna no salga en la grid?

Gracias por vuestra paciencia.

basti
28-11-2007, 12:19:00
Puedes hacerlo de dos maneras. Una en el propio editor de campos del dataset, poniendo la propiedad visible a false. La otra es definiendo las columnas del dbgrid (doble click en el grid), añadiendo sólo las que quieres que se vean. Cualquiera de las dos opciones sólo afectará al grid, no al resto de controles que puedas tener asociados al campo.

Josepo
30-11-2007, 17:59:06
Muchas gracias, basti, tu respuesta me ha sido de mucha utilidad. :)

He probado los dos sistemas y con ambos consigo lo que necesitaba.