PDA

Ver la Versión Completa : DBGrid y Query


dvdjr
18-05-2003, 17:37:27
Hola a todos, a ver si me la podiais aclarar lo siguiente:

Tengo un componente DBGrid asociado a un componente DataSource y este a un Query. Tengo que aportar la funcionalidad de eliminar los registros marcados en el componente DBGrid y no se muy bien como hacerlo.

He agregado a la ficha el componente DBNavigator pero soló me aparecen activos los controles de desplazamiento. No puedo insertar ni borrar.

Creo haber leido por ahi que podia eliminar los registros con el procedimiento Delete(), pero no se muy bien cómo hacerlo.

Espero vuestra respuesta y gracias por todo.:confused:

__marcsc
18-05-2003, 19:11:33
Hola,

pon a True la propiedad RequestLive del Query.

Saludos.

marcoszorrilla
18-05-2003, 19:50:30
Además de lo que te dice Marc ten en cuenta la propiedad CanModify del Query, pues no todos los queryes admiten modificaciones.

Un Saludo.

dvdjr
18-05-2003, 19:51:56
Tengo la propiedad RequestLive a true y sigue sin ir. Saludos

marcoszorrilla
18-05-2003, 19:54:19
Tendrás que decir que tipo de tablas usas y como es la Query, para ver si tiene arreglo, o simplemente no permite borrados y habría que implementarla de otra forma.

Un Saludo.

dvdjr
18-05-2003, 20:02:56
Utilizo tablas de tipo PARADOX 7 y en la query hago un select como sigue:

SELECT m.Id_articulo, m.titulo, m.Autor, m.N_cds, m.N_cop_alq_dis, c.N_cliente, c.Nombre, c.Apellidos, c.Dni, c.Direccion, c.Telefono, a.Precio_alquiler, a.Fecha_alquiler, a.Fecha_devolucion
FROM cliente AS c, alquiler_musica AS a, musica AS m
WHERE c.N_cliente = a.N_cliente
AND m.Id_articulo = a.Id_articulo
ORDER BY m.titulo

Espero vuestra respuesta, muchas gracias!!

marcoszorrilla
18-05-2003, 20:33:50
Pues en el momento en que implicas más de una tabla lo mas probable es que no puedas borrar.

Por eso te decía que consultaras la propiedad CanModify.


If MiQuery.CanModify = True then
Delete;

De todas maneras, ten en cuenta que implicas tres tablas, no creo que quieras borrar el artículo, el cliente,....

Si dices que es exactamente lo que quieres borrar, quizás se podría plantear de otra forma.

Un Saludo.

dvdjr
18-05-2003, 20:44:59
Hola a todos, mi intención es borrar los registros de la tabla dónde guardo los alquileres que hacen los clientes.

La tabla dónde guardo los alquileres se llama alquiler_musica y tiene los siguientes campos:

N_registro PK
N_cliente
Id_articulo
Precio_alquiler
Fecha_alquiler
Fecha_devolucion

Cómo veréis la Primary Key(PK) es el campo N_registro.
En N_cliente y Id_articulo guardo el número de registro y el número de identificativo del disco de música respectivamente.

Existen otras dos tablas dónde guardo los datos de los clientes y los datos de los discos musicales.

Saludos.

marcoszorrilla
18-05-2003, 20:53:21
Entonces solamente debes de implicar esta tabla.

Si quieres borrar todos y la tabla está en uso exclusivo.

MiTabla.EmptyTable;

Si son entre fechas montas una Query que seleccione los registros entre las fechas indicadas.

Si solamente quieres presentar los alquileres e ir borrando de uno en uno con el DbNavigator, haz un Select sobre está tabla únicamente.

Un Saludo.

marcoszorrilla
18-05-2003, 21:04:45
Como colofón quizás te interese este truco de "Marco Cantù", que consiste en establecer relaciones maestro-detalle entre querys.

y que consiste en definir un parametro con el mismo nombre que el campo a relacionar, esto en la tabla detalle, de esta manera podrías presentar varías tablas con esta estructura citada y solamente poner RequestLive a la que te interesa.

Un Saludo.

Ruben_Cu
19-05-2003, 01:31:25
Hola, como complemento a lo que escribe marcoszorrilla en la ayuda de delphi sobre la propiedad RequestLive se lee

Note: All multi-table queries return read-only result sets

O sea que el resultado de tu query es de solo lectura de ahí tus desgracias, aplica el query solo en la tabla que te interesa.

Además Marcos haces referencia a un truco de Cantú pero no das mas referencia, ¿pudieras brindarla?¿donde se puede ver?
Saludos

marcoszorrilla
19-05-2003, 07:53:58
Hola Ruben, aquí son las 7h:49 a ver si esta tarde tengo un rato y lo explicó con más amplitud, está tomado del libro de Delphi 6 de Marco Cantù, es extraordinariamente simple y funciona.


Un Saludo.

marcoszorrilla
19-05-2003, 16:03:19
El truco procede del Libro de Marco Cantù - "Delphi 6" página 587. en su versión en español. Parte III - Progamación de Bases de Datos.

Para los que no tengan el libro.

Consiste en realizar una relación maestro detalle entre dos Querys, obviamente tendrán un campo en común.

Para el ejemplo podemos utilizar el alias DbDemos que viene con Delphi para los ejemplos.

Necesitamos 2 Tquerys 2 TdataSource y 2 rejillas para comprobar que todo funciona correctamente.

Yo he utilizado para la Query1 la tabla Customer y en el Sql del Tquery he escrito:
Select * From Customer

A este Query conecto el TdataSource1 y a este la primera Rejilla.

EL CAMPO EN COMUN ES: CusTNo

En el segundo Query escribo.
Select *
from orders
Where CustNo = :CustNo

Este parámetro al llamarse igual que el campo es el que hace que funcione la relación maestro detalle.

Esto lo dice Marco Cantù, pero las tablas las he elegido yo para hacer la prueba y va perfectamente.

Ojo el DataSource del Query2 será tambien el DataSource1.

Bueno un saludo a todos.

delphi.com.ar
19-05-2003, 17:32:37
Una solucióm mucho mas sencilla, puede ser utilizar un TUpdateSQL asociado a la propiedad UpdateObject del TQuery. Lo que tenés que hacer en este objeto es definir los SQL a utilizar para hacer un Delete, Update y Insert, si solo vas a hacer Deletes, con solo establecer la propiedad DeleteSql es suficiente.

Espero que te sirva, saludos!