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 14-06-2003
IcebergDelphi IcebergDelphi is offline
Miembro
 
Registrado: may 2003
Ubicación: VillaFlores, Chiapas, Mexico
Posts: 81
Poder: 21
IcebergDelphi Va por buen camino
Unhappy Como actualizar mi contador numerico en dos o mas aplicaciones?

Hola amigos del foro, antes que nada quiero agradecer a aquellos que brindan ayuda desinteresada a cada
uno de los del foro y gracias por ayudarme.
Mi problema es el siguiente:
Estoy haciendo un sistema con Firebird , dentro de la base hay tres tablas,
Una es la tabla Maestra (Grupos)y la otra la tabla detalle(DetalleGrupos), y por separado tengo una tabla llamada Contador
que es la que lleva el control del numero de IdGrupos de la tabla maestra (grupos), de igual forma
dentro de mi protecto utilizo un modulo en donde residen estas tre tablas con (TIbTable).
En el evento On NewRecord de la tabla Grupos utilizo este codigo para generar el conteo numerico de la tabla contador:
begin
With TCntGrupo Do // Tabla Contador
Begin
Open;
Try
Edit;
//Tablagrupo TablaContador
TGruposIdGrupo.Value:=TCntGrupoCntIdGrupo.Value;
//TablaContador Tablacontador
TCntGrupoCntIdGrupo.Value:=TCntGrupoCntIdGrupo.Value + 1;
Post;
Finally
Close;
end;
end;
end;

Funciona bien el contador si abro solamente una vez la aplicacion pero si se abre en dos maquinas...
El problema es en si, que si habro dos veces la aplicacion o lo pruebo en dos maquinas al mismo tiempo
el contador de la segunda aplicacion atrapa el numero de la Primera aplicacion, es decir: no se actualiza y
los dos se quedan con el mismo numero correspondiente, lo que me gustaria es que cada uno actuara como una aplicacion independiente
si doy click en agregar de la primera aplicacion el contador genere el numero P/e:32 entonces di doy clic en agregar de la segunda aplicacion
me gustaria que el contador generara p/e: 33, y esto no pasa los dos generan el mismo numero y me trae problemas de Indices con
mi tabla Grupo.
Ya use transacion con mi tabla Grupo y nada, ya probre con triggers pero este tarda para generar el autonumerico y meda mas problema.
Alguien tiene una posible solucion, se los agradeceria.

Gracias.
__________________
IcebergDelphi
LIA. Hiber tadeo Moreno Tovilla. INITEC Software
Responder Con Cita
  #2  
Antiguo 14-06-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por IcebergDelphi
Funciona bien el contador si abro solamente una vez la aplicacion pero si se abre en dos maquinas...
El problema es en si, que si habro dos veces la aplicacion o lo pruebo en dos maquinas al mismo tiempo
el contador de la segunda aplicacion atrapa el numero de la Primera aplicacion, es decir: no se actualiza y
los dos se quedan con el mismo numero correspondiente, ...
en realidad la segunda aplicación (transacción) no "atrapa el numero de la Primera aplicacion", sino que debido al aislamiento entre ambas transacciones (la de la primera y segunda aplicación), las dos ven el mismo valor para el contador, a pesar de que la primera haya modificado su valor.

Una regla a tener en cuenta: dos transacciones concurrentes tendrán la misma visión de los datos (la que tenían cuando se abrieron), a pesar de que una de ellas los modifique, mientras no se confirmen los cambios y desde la segunda se tenga un nivel de aislamiento lo suficientemente bajo (p. ej. READ COMMITTED) para poder ver estos cambios confirmados (commit).

Algunas alternativas:

1. Abrir una transacción independiente para leer y actualizar el valor del contador; mejor a tavés de un procedimiento almacenado, para que el servidor haga el trabajo, cerrando la transacción lo más rápido posible. Como podrían aparecer errores de actulización (que dos transacciones intenten modificar a la vez el contador), habría que controlar en el cliente que de producirse el mismo, se volviese a ejecutar el proceso que obtiene un nuevo valor del contador.

2. Si el valor del contador es un entero, utilizar un mecanismo que no dependa de las transacciones ... los generadores. A tener en cuenta que los generadores, al estar fuera del control transaccional, no le afecta la cancelación de los cambios aplicados (rollback), con lo que pueden aparecer huecos en la secuencia.

Podemos desarrollar más en detalle estas u otras alternativas.

Saludos.
Responder Con Cita
  #3  
Antiguo 16-06-2003
IcebergDelphi IcebergDelphi is offline
Miembro
 
Registrado: may 2003
Ubicación: VillaFlores, Chiapas, Mexico
Posts: 81
Poder: 21
IcebergDelphi Va por buen camino
Gracias amigo por tu interes, dejame contarte que recurri a otro metodo, lo que hice fue meter IbDatasets para la el maestro y para el detalle, y en el maestro Me fui al generatorfield y llame al generador que habia hecho en mi base y eureka funciono todo a la perfeccion, claro tambien meti dos Ibtransactios para cada una de las tablas, por ultimo elimine el codigo de mi problema y claro latabla contador .

Gracias por la respuesta y seguiremos en contacto.
__________________
IcebergDelphi
LIA. Hiber tadeo Moreno Tovilla. INITEC Software
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


La franja horaria es GMT +2. Ahora son las 04:15:41.


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