Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   transacciones con firebird. (https://www.clubdelphi.com/foros/showthread.php?t=87575)

josejairoms 24-01-2015 21:43:18

transacciones con firebird.
 
Buenas tardes a todos..
soy nuevo en el club... mi idea es aportar y también encontrar ideas y soluciones a algunas situaciones... para el efecto entonces a lo que vinimos,..

tengo un problema con el uso de transacciones de Delphi y Firebird para manejo de 2 tablas: maestro y detalle

en la unidad de datamodule tengo 7 componentes asi (según lei en alguna parte)

1. SQLCONNECTION para conectarse a la BD.

2. SQLDATASET: Dos, cada uno de ellos conectados con sqlconnection a la tabla maesto y otro a la tabla detalle.

3. DATASOURCE para unir la tabla detalle y maestro.

4. DATASETPROVIDER apuntando al SQLDATASET de la tabla maestro.

5. CLIENTDATASET son los dataset de cada tabla, el dataset de la tabla maestra esta unido con el dataset de la tabla detalle.

En el Datasetprovider tengo activado resuelva el dataset ( resolvetodataset )

en el evento afterpost del clientdataset se inicia la transacción asi
var TD: TTransactionDesc ;

begin..
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
Datamodule1.SQLC_BDSBI.StartTransaction(TD);

end ..

y viene mi problema al ejecutar me sale un error que no comprendo que componente lo genera.. el error

SQLT_detalle no puede ejecutar la operación en un dataset cerrado.. pero los dataset ambos están abiertos, aparentemente el datasetprovider que es el que resuelve el dataset lo esta cerrando y no comprendo en que momento.. he puesto en varios eventos de los dataset la propiedad
.open para abrirlos pero sigue igual...

Si alguien puede darme una manito,, seria de gran utilidad con el compromiso de compartir mi experiencia con todos..

saludo cordial a todos. y espero encontrar ayuda y ayudar a otros...

duilioisola 26-01-2015 10:38:29

Según he entendido de lo que escribes, estás conectando mal los componentes.
En principio hay solo un SQLConnection, lo cual haces bien, pero de ahí en adelante son son "cadenas" de componentes distintas.
En principio, la propiedad DataSource del ClienteDataSet Detalle tiene que ser el DataSource Maestro.
Espero que con este esquema se entienda:
Código:

                SQLDataSet (Maestro) - DataSetProvider - ClientDataSet - DataSource
              /                                                        /
SQLConnection-+                                                        /
              \                                                    /
                SQLDataSet (Detalle) - DataSetProvider - ClientDataSet - DataSource


duilioisola 26-01-2015 11:07:26

Por otro lado, no dices en qué línea tienes el error. Ese es el código que interesa. No creo que sea ninguna de las líneas que mencionas en tu post.
Supongo que es un poco mas tarde en el código, en donde tratas de hacer algo en el detalle (insert/update/delete) y el DataSet está cerrado.
Normalmente, no sería necesario utilizar transacciones ya que esa "cadena de conexiones" se encarga de todo.
Básicamente haces los cambios que quieras en los datos y luego le dices ApplyUpdates(0);

Código Delphi [-]
// Abro el detalle al abrir el maestro
procedure TDMClase.CDSMaestroAfterOpen(DataSet: TDataSet);
begin
   CDSDetalle.Open;
end;

// Cierro el detalle si cierro el maestro
procedure TDMClase.CDSMaestroBeforeClose(DataSet: TDataSet);
begin
   CDSDetalle.Close;
end;

// Aplico cambio después de hacer un Post
procedure TDMClase.CDSMaestroAfterPost(DataSet: TDataSet);
begin
   TClientDataSet(DataSet).ApplyUpdates(0);
end;

procedure TDMClase.CDSDetalleAfterPost(DataSet: TDataSet);
begin
   TClientDataSet(DataSet).ApplyUpdates(0);
end;

// Aplico cambios después de hacer un borrado de registro
procedure TDMConsultaLotes.CDSMaestroAfterDelete(DataSet: TDataSet);
begin
   TClientDataSet(DataSet).ApplyUpdates(0);
end;

procedure TDMConsultaLotes.CDSDetalleAfterDelete(DataSet: TDataSet);
begin
   TClientDataSet(DataSet).ApplyUpdates(0);
end;

duilioisola 26-01-2015 11:10:07

Corrijo el post anterior:

Cita:

En principio, la propiedad DataSource del ClienteDataSet Detalle tiene que ser el DataSource Maestro.
En principio, la propiedad MasterSource/MasterFields del ClienteDataSet Detalle tiene que ser el DataSource Maestro / Campos que utilices para unirlos.

josejairoms 26-01-2015 22:56:00

Mil gracias por tu aporte..
 
Tu apoorte me es de gran ayuda me dio nuevas ideas...

ya hice las modificaciones pero ahora se me sucede que no graba los datos de la tabla detalle, aunque no creo que insida te comento que tengo en la tabla detalle un triger que hace un update en la tabla maestro.

por otro lado le comento en la situación inicial que plantee voy a hacer unas precisiones dado que el modelo que tengo graba una parte del maestro y graba el detalle, queda una parte del maestro que no se graba la situación es asi.

1. SQLCONNECTION
2. SQLTABLE MAESTRO
SQLTABLE DETALLE
master source : datasource apuntando a sqltable maestro.
master fields : campos que unen las tablas.

3. DATASETPROVIDER
dataset : sqltable maestro

4. CLIENTDATASET MAESTRO.
Al editar o añadir los campos del dataset el coloca un nuevo campo con el nombre del dataset de detalle
CLIENTDATASET DETALLE
datasetfiels clientdatasetmaestroSQLTABLEDETALLE

5 .DATASOURCE MAESTRO
DATASOURCE DETALLE

6 UN DBNAVIGATOR QUE APUNTA AL MAESTRO.

EN LA FORMA UNOS CAMPOS DBEDIT EN LA PARTE SUPERIOR QUE SE ALMACENAN EN EL MAESTRO
EN LA PARTE MEDIA UNA GRILLA CUYOS CAMPOS SE ALMACENAN EN EL DETALLE,
Y EN LA PARTE INFERIOR NUEVAMENTE UNOS DBEDIT Y UN DBMEMO..... ESTOS CAMPOS SON LOS QUE ESTAN PERDIENDO..

LO QUE OBSERVO ES QUE CUANDO EL FORM ENTRA EN LA GRILLA ALAMCENA LOS DATOS EN EL MAESTRO, PERO CUANDO SALE DE LA GRILLA LOS OTROS CAMPOS DEL FORM QUE ESTAN DEBAJO DE LA GRILLA NO SE ALMACENAN , POR ESO PENSE EN USAR TRANSACCINES..; POR OTRO LADO NOTE QUE SI SE USA EL BOTON CANCELAR, LOS DATOS DEL MAESTRO NO SE CANCELAN YA QUEDAN REGISTRADOS ..

ESPERO HABER SIDO CLARO, PARA QUE ME PUEDAS AYUDAR...

IGUALMENTE LE ENVIO UN SALUDO ESPECIAL Y MUCHA GRATITUD POR SU COLABORACION ...ESTE MUNDO DEBERIA ESTAR POBLADO DE PERSONAS COMO VOZ...

Casimiro Notevi 26-01-2015 23:16:31

Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

josejairoms 27-01-2015 03:54:56

presento disculpas..
 
a todos presento disculpas por el uso de las mayúsculas en mi tema...pues use demasiadas mayúsculas pero lo hice sin conocimiento de las reglas del club...

Casimiro Notevi 27-01-2015 09:48:11

Cita:

Empezado por josejairoms (Mensaje 488162)
a todos presento disculpas por el uso de las mayúsculas en mi tema...pues use demasiadas mayúsculas pero lo hice sin conocimiento de las reglas del club...

^\||/ gracias a tí por tu colaboración :)


La franja horaria es GMT +2. Ahora son las 01:53:53.

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