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 08-10-2004
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
Concurrencia, mantener existencias en Red

Vamos a ver si me podeis aclarar la mejor forma de que varios clientes en red trabajen.
Supongamos que tengo 3 tablas:
Articulos (ART)
Facturas (FAC)
Detalle de las Facturas (DETFAC). Cada una de los articulos de las facturas
Utilizo FB 1.5, IBX y delphi 7

Controlo las existencias con un trigger que se dispara cada vez que se hace una modificación sobre la tabla de detalle(uno cada vez que borro, otro cada vez que actualizo...).
Desde un solo puesto funciona de vicio, pero cuando varios clientes estan trabajando al mismo tiempo. SI alguien modifica un artiiculo de la factura, por ejemplo cambiando la cantidad vendida, se disparaq el trigger y hace la modificacion sobre la tabla de articulos. Es lo que quiero que haga, el problema es que ningun otro cliente podra utilizar el articulo hasta que el primero haga un commit (yo no hago un commit hasta que el usuario haga clic sobre el boton de candelar, haga rollback si presiona el boton de cancelar).
Si Hago un commit cada vez que hagoi un Post en la tabla de detalle, bueno, se dispara el trigger y al hacer el commit, el articulo queda liberado rápidamente. Creo que este es el camino.
Pero con IBX cada vez que hago un commit pierdo los datos, tengo que volver a abrir la consulta de nuevo (mayor trafico por la red) además pierdo la posicion dentro del articulo que estoy editando (bueno puedo volver a el utilizando algun invento como hacer un locate sobre los detalles o algo asi, me parece una chapuza pero funciona)
Otra solución que se me ocurre es utilizar un control no enlazado a datos como un TStringGrid para editar los detalles de la factura, pero eso implica mucho mas trabajo de programación.
Bueno pues despues de todo este rollo, se que hay alguna manera mas simple de hacer lo que quiero, ¿Cual es?

Bueno Salu2 y gracias a todos
Responder Con Cita
  #2  
Antiguo 08-10-2004
athlontado athlontado is offline
Miembro
 
Registrado: sep 2004
Ubicación: Almázcara - León (España)
Posts: 63
Poder: 20
athlontado Va por buen camino
Hola.

Por qué no pruebas el "CommitRetaining", de la transacción.
Hace lo mismo que el "Commit", con la diferencia de que parece que mantiene abierta la transacción y la posición del cursor en las tablas.

Suerte!
__________________
Óscar Salvador Páez
Aprendiendo a aprehender de quienes aprehenden, sin cerciorarse de sus edades, culturas, sexos, razas, creencias u orígenes, es la forma más sabia de aprehender.
Responder Con Cita
  #3  
Antiguo 08-10-2004
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 22
kalimero Va por buen camino
Hola.
Tu mismo lo has dicho. Procura qe las transacciones sean lo mas cortas (al hacer Post en el detalle) posibles y como apuntata Atholontado utiliza CommitRetaining ó RollBackRetainning para que no se te cierrren todos los recursos asociados al Dataset.

Saludos
Responder Con Cita
  #4  
Antiguo 08-10-2004
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
tengo que hacer pruebas con commitretaining, gracias. Sólo me surge una pregunta si un usuario hace commitretaining otro usuario vera los cambios que este ha realizado si hace con posterioridad un select. Podría ese mismo usuario hacer una modificaion sin problemas.
Creao haber leido por ahi, que commitretaining no es realmente un commit algo asi como que es menos eficiente.Me lo podeis confirmar,

salu2 y gracias
Responder Con Cita
  #5  
Antiguo 08-10-2004
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
Va a ser que si

OK poniendo en el metodo AfterPost y AfterDelete del IBDataSet Afectado "CommitRetaining" la cosa funciona del 10.
Al parecer al hacer un commitretaining, se hace un commit pero conservando el cursor en el servidor (por eso es menos eficiente que hacer un commit para grandes cantidades de datos, pa lo mio va de vicio). Permitiendo al resto de los usuarios hacer sus cambios sin pisarse unos a otros.

Salu2 a todos y gracias por orientarme
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 21:33:07.


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