PDA

Ver la Versión Completa : Bloqueo de registros manualmente


Will
17-06-2005, 01:17:01
Hola amigos!!
Quisiera saber si alguien podría decirme(si existe) la forma de BLOQUEAR MANUALMENTE algunos registros específicos de una tabla con la finalidad de controlar la generación de consecutivos automáticos de facturas, les comento la situación por si ustedes tienen alguna otra forma de controlar esto.
Vamos a suponer el caso que un usuario va a generar 500 facturas(un poco exagerado, pero es solo para exponer el caso), la primera factura va a tener el consecutivo que está guardado en una tabla de consecutivos, las 499 facturas siguientes van a tener el consecutivo de la factura anterior mas uno.
Otro usuario va a generar otras 10 facturas con el mismo proceso de consecutivos, PERO al momento de consultar el consecutivo para asignar a la primera factura de las 10 a generar, va a encontrar el mismo primer consecutivo que se asignó a la primera factura de las 500, por lo tanto se van a generar 10 facturas con el mismo consecutivo.
Lo que pensé fué en bloquear el REGISTRO en la tabla de consecutivos al iniciar la transacción de las 500 facturas con la intención de que si otra transacción quisiera CONSULTAR este mismo registro, saliera alguna clase de mensaje de bloqueo o algo por el estilo,y liberar el registro despues de terminada la transacción.
Estuve buscando algo sobre una sentencia SQL que era algo así como: SELECT CODIGO,VALOR_CONSECUTIVO FROM CONSECUTIVOS WHERE CODIGO='FACTURAS' FOR UPDATE WITH LOCK. pero no encontré mucha información al respecto, la probé pero no me funcionó para lo que tengo pensado hacer.

Perdonen por la chacharería que yo se que da flojera leer :o , pero es para exponer claramente la situación. Les agradecería si tienen alguna información que me pueda servir.
Gracias!!...ah y que viva DELPHI !!!!! :)

jachguate
17-06-2005, 01:21:17
Seguramente la idea expuesta en este post te será de utilidad.

Hasta luego.

;)

HenryAraniva
17-06-2005, 02:04:48
No te entendi muy bien tu ejemplo, parece que cuando haces una consulta se genera un nuevo consecutivo o algo así entendi con lo que dices "... PERO al momento de consultar el consecutivo para asignar a la primera factura de las 10 a generar, va a encontrar el mismo primer consecutivo que se asignó a la primera factura de las 500" y no explicas si es una aplicación cliente servidor y accesarán a esta tabla varios usuarios a la vez.

jachguate
17-06-2005, 03:07:01
lo que correspondería hacer es que al momento de iniciar la generación de facturas, lances la actualización en falso, dejando el registro bloqueado y por último actualizarlo con el valor que debe tener y hacer commit.
Dado que todos los clientes tendrian este comportamiento, los demás podrán iniciar el proceso solamente si ningún otro ha empezado, de lo contrario recibirán un error o simplemente quedarán esperando (dependiendo de cómo configures la transacción).

Hasta luego.

;)

Will
17-06-2005, 16:04:34
Correcto jachguate, eso es exactamente lo que tengo pensado hacer, entonces la pregunta se resumiría en: "Como hago para bloquear el registro que contiene el consecutivo, para que otro usuario en el momento de CONSULTAR lo encuentre en estado de bloqueo?", indicándome así que otro usuario se encuentra generando facturas.
les agradezco sus ayudas y comentarios!!

maeyanes
17-06-2005, 16:28:27
Yo tuve un problema similar en una aplicación que estoy desarrollando actualmente, pero yo lo resolví de la siguiente manera:

Cuando un usuario necesita saber el número consecutivo, tomo el valor de la tabla y lo uso. Si otro usuario necesita un consecutivo, lo tomo igualmente, no importando que sea el mismo.

Al momento de guardar los datos en la BD es donde viene lo bueno, en un trigger before insert, primero verifico el valor actual del consecutivo con el que tiene asignado el registro a insertar, si es igual, uso el valor e incremento el cosecutivo. Si el valor del consecutivo es mayor al actual, significa que algún otro cliente yo usó ese consecutivo, así que solo actualizo el campo con el nuevo consecutivo y lo incremento.

Obviamente en la aplicación indico que el número consecutivo indicado puede variar al momento de grabar los datos, pero en la impresión ya se muestra el consecutivo correcto.

Hasta el momento esto me ha servido muy bien, sería cosa que lo pruebes y ver que tanto te sirve a tí.


Saludos...

jachguate
17-06-2005, 17:38:38
"Como hago para bloquear el registro que contiene el consecutivo, para que otro usuario en el momento de CONSULTAR lo encuentre en estado de bloqueo?",

Lanzando en ese momento una actualización en falso. ¿has leido la respuesta a la que te remití originalmente? :confused: