Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-01-2015
josejairoms josejairoms is offline
Registrado
NULL
 
Registrado: oct 2014
Posts: 8
Poder: 0
josejairoms Va por buen camino
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...
Responder Con Cita
  #2  
Antiguo 26-01-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 26-01-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
  #4  
Antiguo 26-01-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #5  
Antiguo 26-01-2015
josejairoms josejairoms is offline
Registrado
NULL
 
Registrado: oct 2014
Posts: 8
Poder: 0
josejairoms Va por buen camino
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...
Responder Con Cita
  #6  
Antiguo 26-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración
Responder Con Cita
  #7  
Antiguo 27-01-2015
josejairoms josejairoms is offline
Registrado
NULL
 
Registrado: oct 2014
Posts: 8
Poder: 0
josejairoms Va por buen camino
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...
Responder Con Cita
  #8  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por josejairoms Ver Mensaje
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Transacciones en Firebird jsanchez Firebird e Interbase 6 04-02-2015 20:04:13
Transacciones En Firebird espectro_jd SQL 3 21-02-2007 18:54:40
Transacciones anidadas en firebird Er_Manué Conexión con bases de datos 5 07-12-2005 14:53:10
Transacciones FireBird con Zeos vichovi Conexión con bases de datos 3 13-07-2005 08:49:29
Transacciones en FireBird El_Raso Firebird e Interbase 1 26-11-2004 16:22:04


La franja horaria es GMT +2. Ahora son las 11:29:22.


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
Copyright 1996-2007 Club Delphi