PDA

Ver la Versión Completa : Error DataSet is read Only


mightydragonlor
07-11-2008, 18:04:06
Hola a todos, este es un error que probablemente nos pase a muchos, estoy trabajando con Lazarus-Firebird, la conexion la hago con TIBConnection que está ligado a un TSQLTransaction, las consultas a las tablas con TSQLQuery, a travez de un TDatasource vinculo los datos a un formulario, ahora cuando trato de abrir el DataSet para insertar o eliminar me saca el error de
DataSet is read-only
Reviso que el TSQLTransaction esté activo y que las propiedad Readonly del TSQLQuery esté en false, ademas tengo esté código en un boton para abrir el TSQLQuery

MNegocio.SQLCliente.Open;
MNegocio.SQLCliente.Insert;
Application.CreateForm(TFCliente, FCliente);
FCliente.ShowModal;

Por favor ayudenme si pueden.
Gracias.

maeyanes
07-11-2008, 18:33:57
Hola...

No conozco de Lazarus ni de los componentes TSQLQuery, pero checa si tiene una propiedad llamada RequestLive, si es así, establece su valor a True y eso debería funcionarte.

Ahora, si el select que estás usando tiene joins, esto no te va a funcionar...



Saludos...

mightydragonlor
07-11-2008, 18:52:30
Gracias por responder maeyanes, he buscado la propiedad que me dices pero no la tiene, el consulta que estoy ejecutando es un Select simple, seguiré intentando para ver si logro algo.

maeyanes
07-11-2008, 19:06:26
Hola...

Pues si no tiene esa propiedad, mejor usa un TSQLDataSet (me imagino que habrá un componente llamado así). Si es equivalente a las IBX, este componente te debe permitir especificar las sentencias SQL para hacer inserciones (insert), actualizaciones (update) y borrados (delete).


Saludos...

mightydragonlor
07-11-2008, 19:46:53
Pues la verdad no las tiene, así que voy a tratar con los Componentes Zeos.

boreg
07-11-2008, 21:29:25
Mightydragonlor, las propiedades que menciona maeyanes para el componente TSQLQuery son InsertSQL, UpdateSQL y DeleteSQL, no importa que utilices Zeos, FIBL, FBLib (con estos no estoy muy seguro) o SQLdb, siempre tendrás que llenar estas propiedades ya sea en el mismo DataSet o mediante otro componente. Si tienes duda en como Llenar estas propiedades congusto te ayudamos.

Saludos

mightydragonlor
08-11-2008, 01:34:33
boreg, muchas gracias por tu respuesta y la verdad es que voy a necesitar vuestra ayuda sobre como llenar estas propiedades.

boreg
08-11-2008, 01:58:23
En tiempo de diseño, desde el panel de propiedades de tu SQLQuery buscas las propiedades que te mencioné en el mensaje anterior, le das doble click y escribes lo siguiente según la propiedad que modifiques (bueno, lo modificas según los datos que tengas)


--Para insertar: propiedad INSERTSQL
INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPOn)
VALUES(:CAMPO1, :CAMPO2, :CAMPOn)

--Para actualizar: propiedad UPDATESQL
UPDATE TABLA
SET CAMPO1 = :CAMPO1,
CAMPO1 = :CAMPO1,
CAMPO2 = :CAMPO2,
CAMPOn = :CAMPOn
WHERE CAMPOID = :CAMPOID

--Para eliminar: propiedad DELETESQL
DELETE FROM TABLA
WHERE CAMPOID = :CAMPOID



y ya está, la otra es hacerlo con codigo, de preferencia desde el evento oncreate del formulario en que tengas tu SQLQuery:


MNegocio.SQLCliente.INSERTSQL.Add(
' INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPOn) '
+ ' VALUES(:CAMPO1, :CAMPO2, :CAMPOn) ');
MNegocio.SQLCliente.UPDATESQL.Add(
' UPDATE TABLA '
+ ' SET CAMPO1 = :CAMPO1, '
+ ' CAMPO1 = :CAMPO1, '
+ ' CAMPO2 = :CAMPO2, '
+ ' CAMPOn = :CAMPOn '
+ ' WHERE CAMPOID = :CAMPOID ');
MNegocio.SQLCliente.DELETESQL.Add(
' DELETE FROM TABLA '
+ ' WHERE CAMPOID = :CAMPOID ');


Saludos


Creo que no aclaré, son 2 formas distintas de hacerlo, una es desde diseño y la otra en tiempo de ejecución.

mightydragonlor
08-11-2008, 03:15:32
Ok, muchas gracias, me dispongo a hacerlo y mas tarde comento como me fue.

mightydragonlor
08-11-2008, 21:31:21
Hola boreg , Ahora ya no me aparece el error, sin embargo ahora no graba, me refiero a que apesar que en tiempo de ejecución no aparece ningún error al momento del post, si reviso la base de datos no aparecen los registros que he insertado.

boreg
08-11-2008, 21:43:16
Hola Mightydragonlor, tienes que hacer commit en tu componente de transaccion despues de hacer post


MNegocio.SQLCliente.Post;
MNegocio.SQLTransaction.Commit;


donde, SQLTransaction es el componente que tienes ligado a tu SQLQuery.

Avisanos si tienes mas dudas.