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)
-   -   uso de componentes IBX en Cliente/Servidor Firebird (https://www.clubdelphi.com/foros/showthread.php?t=48937)

TrUnkS 08-10-2007 18:53:40

uso de componentes IBX en Cliente/Servidor Firebird
 
Hola a todos mi pregunta es la siguiente: En una aplicación Cliente/Servidor me basta con utilizar un solo componente TIBDatabase, TIBTransaction y un solo componente TIBDataSet para cada tabla ?, o lo mejor es utilizar una transaccion diferente para cada usuario ? ... osea en total 2 componentes TIBDatabase, 2 TIBtransaccion y 2 TIBDataSet asignados a una misma tabla de la base de datos ?. ¿ Me podria decir alguien su manera de trabajar ? ... Gracias

juanelo 08-10-2007 19:01:34

Que tal,
Si pudieras ser mas explicito, no queda muy claro lo que deseas hacer.
Saludos.

PD: Para conectarte a FB con IBX solo basta una IBDatabase, un TTransaction y un TIBQuery, recuerda que por cada operacion que hagas en FB se necesita un Transaccion, por lo que cada vez que acceses a tus datos necesitas un objeto transaccion, el Database puede ser compartido siempre y cuando todas tus consultas sean a una misma base de datos.

gluglu 08-10-2007 19:14:54

Las situaciones pueden ser miles difentes y las soluciones también mil diferentes.

No se puede concluir para nada que necesites una o más transacciones para uno o mas DataSet's.

Lo que sí deberías tener muy claros los conceptos de transacción antes de meterte a fondo. Te ahorrará muchísimos dolores de cabeza posteriores.

En general, si vas a acceder a una sólo base de datos, bastará con un sólo IBDatabase. En general también, a cada DataSet se le asocia una transacción. Pero yo por ejemplo en casos de tablas dependientes unas de otras, tengo hasta 20 o 30 DataSet's asociados a una sola transacción.

Lo más importante, tener claro el uso de las transacciones. ;)

Encontrarás mucha información al respecto en el foro.

TrUnkS 08-10-2007 19:45:08

Hola. Tengo claro el uso de las transacciones y como conectarme, pero hay algunos detalles:

1.- Si un cliente hace un Locate para buscar un registro y otro también lo hace, entonces hay 2 cursores en una misma tabla posicionados en distintos registros?

2.- Si un cliente habre una tabla y se encuentra en una transacción, otro cliente habre la misma tabla y se encuentra en algun registro, luego al hacer commit uno de ellos se cierra el dataset, pero el otro usuario sigue viendo el registro activo para el ? .. tengo Read Commited para la transacción.

3.- Cuando un usuario cierra un formulario quisiera poner Form.Enabled := False. Ahora si otro usuario está en el mismo form y el otro lo cierra con esa propiedad ... que pasa con el form del otro cliente ?

DE antemano gracias

gluglu 08-10-2007 20:04:27

Cita:

Empezado por TrUnkS (Mensaje 236973)
1.- Si un cliente hace un Locate para buscar un registro y otro también lo hace, entonces hay 2 cursores en una misma tabla posicionados en distintos registros?

No tendrás ningun problema. La posición del registro la gestion el DataSource asociado al DataSet (TIBDataSet, TIBQuery o TIBTable). No tiene nada que ver con la transacción.

Está claro, que para cada 'vista' diferente del set de datos que necesites, es decir, para cada DBGrid o cualquier otro elemento DataAware, debería tener un DataSource y un DataSet propio.

Si no vas a mostrar datos en pantalla, puedes reutilizar sin problema los DataSet's que estés utilizando, siempre y claro no necesites algun posicionamiento concreto. Es decir, como preguntas, si vas a hacer dos locate diferentes deberías de tener dos DataSet's diferentes. Pero siempre y cuando los utilizes a la vez en tu propia aplicación. No tiene nada que ver con otro usuario que esté utilizando la aplicación en otro puesto al mismo tiempo.

No sé si me he explicado bien o he liado más la cosa. :o

Cita:

Empezado por TrUnkS (Mensaje 236973)
2.- Si un cliente abre una tabla y se encuentra en una transacción, otro cliente habre la misma tabla y se encuentra en algun registro, luego al hacer commit uno de ellos se cierra el dataset, pero el otro usuario sigue viendo el registro activo para el ? .. tengo Read Commited para la transacción.

A no ser que tengas un proceso de refresco automático, para que se pueda ver la última copia de un registro en cualquiera de los puestos, necesitarás hacer un refresh (del registro, del DataSet completo, ... dependerá de tu aplicación y lo que quieras hacer).

Si la transacción está en Read Commited, funcionará perfectamente despues de que uno efectue un commit y el otro un refresco.

De nuevo, los dataset's no tienen nada que ver con el commit de la transacción. Más si son en aplicaciones diferentes en diferentes puestos.

Cita:

Empezado por TrUnkS (Mensaje 236973)
3.- Cuando un usuario cierra un formulario quisiera poner Form.Enabled := False. Ahora si otro usuario está en el mismo form y el otro lo cierra con esa propiedad ... que pasa con el form del otro cliente ?

Sigo sin entender exactemente a lo que te refieres. Si un usuario tiene su aplicación corriendo en su PC, y otro usuario tiene la misma aplicación corriendo en otro ordenador, que uno haga lo que sea con un form o no, no afectará en modo alguno al otro usuario en el otro ordenador.

No sé si lo entendí bien.

Espero haberte servido de ayuda. Si tienes más preguntas, intentaré respondértelas lo mejor posible ;)

Lepe 08-10-2007 20:22:42

Ya veo que guglu se me ha adelantado, dado que comento algunas cosas de forma distinta, pongo el post.

Cita:

Empezado por TrUnkS (Mensaje 236973)
1.- Si un cliente hace un Locate para buscar un registro y otro también lo hace, entonces hay 2 cursores en una misma tabla posicionados en distintos registros?

Un Locate no sería la mejor forma, ya que implica hacer un "select * from tabla", así que estas trayendo todos los registros de la tabla desde el servidor al ordenador cliente. Lo normal es "select * from tabla where clavePrimaria = 32", de esta forma solo estas accediendo a un solo registro de la BBDD.

Cita:

Empezado por TrUnkS (Mensaje 236973)
2.- Si un cliente habre una tabla y se encuentra en una transacción, otro cliente habre la misma tabla y se encuentra en algun registro, luego al hacer commit uno de ellos se cierra el dataset, pero el otro usuario sigue viendo el registro activo para el ? .. tengo Read Commited para la transacción.

Si. Ten en cuenta que al cerrar un Dataset, estas cerrándolo en el lado Cliente. Si otro usuario quiere ver el cambio, tendrá que cerrar y abrir su Dataset.
Cita:

Empezado por TrUnkS (Mensaje 236973)
3.- Cuando un usuario cierra un formulario quisiera poner Form.Enabled := False. Ahora si otro usuario está en el mismo form y el otro lo cierra con esa propiedad ... que pasa con el form del otro cliente ?

Esto no tiene sentido. Para que lo veas más claro: Tenemos 2 usuarios, cada uno en un ordenador distinto; Si el usuario A cambia el tamaño de una columna en un Grid... ¿ese cambio lo notará el usuario B? Por supuesto que no, cada uno está ejecutando su propio programa.

Puedes hacer algunas pruebas arrancando 2 instancias de tu programa en tu mismo ordenador, y ver que pasa modificando un registro, eliminando, etc.

Saludos

TrUnkS 08-10-2007 20:23:50

Gracias gluglu por tus respuestas te lo agradezco mucho. Estoy haciendo un sistema de facturación Cliente/Servidor y ya lo tengo casi terminado, con lo que me dijiste estoy asumiendo lo siguiente: Un solo componente TIBDatabase, TIBTransaction, TIBDataSet y un solo TDataSourse para cada TIBDataSet. Lo que cada usuario haga en el sistema de forma independiente no afeta al otro a excepción de los datos que se van agregando o eliminando en la base de datos. El problema es que tengo transacciones muy largas por ejemplo para efectos de navegación por los registros con botones creados por mi. Siempre estan abiertas las tablas pero siempre hago CommitRetaining para que se guarden los datos. No se si habra algún problema cuando uno tiene las tablas siempre abiertas en este tipo de aplicaciones. ¿ Lepe a que te refieres con 2 instancias ?.

Lepe 08-10-2007 20:38:18

Desde el explorador de windows, abre tu programa una vez, cuando ya esté cargado.... vuelves al explorador y lo abres de nuevo.

Tendrás 2 programas (simulando 2 usuarios distintos), cada uno con sus transacciones y sus Datasets...

Saludos


La franja horaria es GMT +2. Ahora son las 13:16:32.

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