Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Error DataSet is read Only (https://www.clubdelphi.com/foros/showthread.php?t=61442)

mightydragonlor 07-11-2008 18:04:06

Error DataSet is read Only
 
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
Código Delphi [-]
  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)

Código SQL [-]
--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:

Código Delphi [-]
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

Código Delphi [-]
MNegocio.SQLCliente.Post;
MNegocio.SQLTransaction.Commit;

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

Avisanos si tienes mas dudas.


La franja horaria es GMT +2. Ahora son las 16:15:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi