Boquear rgistros de una tabla

22/02/2006 - 11:56 por Jordi | Informe spam
Hola,
Tengo una tabla de encabezados de facturas y otra del detalle.
Como puedo bloquear un registro de la tabla encabezados de facturas para
asegurar que mientras yo estoy trabajando en esta factura nadie más puede
hacerlo, aunque si pueda modificar otras facturas.

Lo que quiero hace es mirar si en la tabla encabezado, una determinada
factura está bloqueada, y si lo está entonces no hacer nada, pero si no está
bloquada, la boqueo y empiezo a modifcar esta factura, cuando termino
desbloqueo este registro.

Gracias

Preguntas similare

Leer las respuestas

#6 Jordi
23/02/2006 - 14:59 | Informe spam
Y Existe alguna forma de bloquear tablas?
"Developers" escribió en el mensaje
news:%
Jordi:

Definitivamente llevar los bloqueos en SqlServer x Registro seria un
suicidio porque cuando se habla de un Motor de Datos ya se piensa en
Conjunto de Datos.
Una posible Solucion a Tu problema seria que tengas un campo en tu tabla
de comprobantes que indicara si el documento esta siendo visto por otro
usuario. es Decir:

en el metodo de llamado de documento tendrias esto:
Select campo1,campo2,Modo_edicion, etc... from mitabla where
campo1=mivalor1
If Modo_edicion='S'
Messagebox("Registro esta en proceso de modificacion")
Else
Update mitabla set Modo_Edicion='S' where campo1=mivalor1
Endif

y cuando cierres el formulario o cuando grabes liberes el documento de
nuevo.
Update mitabla set Modo_Edicion=' ' where campo1=mivalor1

Nota:
Tendrias que adaptarlo a tus necesidades con Sqlconnect,SqlExec,etc.. y
probar
No es recomendable hacer la misma pregunta en varios foros (VFP,SQLserver)

Suerte

Developers - Dany Acosta
Jordi escribió:
Hola,
Pero como evito que otra persona edite el mismo registro


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:u8Gi%

No lo puedes implementar directamente en la base de datos a base de
los
bloqueos de ésta. Si lo que quieres es que mientras un usuario tiene en
la
pantalla de su aplicación los datos de una factura, tendrás que grabar
esa
acción en una tabla específica del servidor, pero lo que no puedes hacer
es
mantener un bloqueo de registros tal y como lo estás pensando en la base
de
datos.

Lo que quieres hacer lo detallas perfectamente en el segundo párrafo,
sólo que cuando dices "[...]la bloqueo[...]" lo que deberás hacer es
almacenar esa acción en una tabla


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Jordi" escribió en el mensaje
news:dthfsn$fa6$

Hola,
Tengo una tabla de encabezados de facturas y otra del detalle.
Como puedo bloquear un registro de la tabla encabezados de facturas para
asegurar que mientras yo estoy trabajando en esta factura nadie más
puede
hacerlo, aunque si pueda modificar otras facturas.

Lo que quiero hace es mirar si en la tabla encabezado, una determinada
factura está bloqueada, y si lo está entonces no hacer nada, pero si no



está

bloquada, la boqueo y empiezo a modifcar esta factura, cuando termino
desbloqueo este registro.

Gracias









Respuesta Responder a este mensaje
#7 Developers
23/02/2006 - 16:11 | Informe spam
Aplica Begin Trans,Rollback Trans y Commit Trans mientras realizes ese proceso

Jordi escribió:
Y Existe alguna forma de bloquear tablas?
"Developers" escribió en el mensaje
news:%

Jordi:

Definitivamente llevar los bloqueos en SqlServer x Registro seria un
suicidio porque cuando se habla de un Motor de Datos ya se piensa en
Conjunto de Datos.
Una posible Solucion a Tu problema seria que tengas un campo en tu tabla
de comprobantes que indicara si el documento esta siendo visto por otro
usuario. es Decir:

en el metodo de llamado de documento tendrias esto:
Select campo1,campo2,Modo_edicion, etc... from mitabla where
campo1=mivalor1
If Modo_edicion='S'
Messagebox("Registro esta en proceso de modificacion")
Else
Update mitabla set Modo_Edicion='S' where campo1=mivalor1
Endif

y cuando cierres el formulario o cuando grabes liberes el documento de
nuevo.
Update mitabla set Modo_Edicion=' ' where campo1=mivalor1

Nota:
Tendrias que adaptarlo a tus necesidades con Sqlconnect,SqlExec,etc.. y
probar
No es recomendable hacer la misma pregunta en varios foros (VFP,SQLserver)

Suerte

Developers - Dany Acosta
Jordi escribió:

Hola,
Pero como evito que otra persona edite el mismo registro


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:u8Gi%


No lo puedes implementar directamente en la base de datos a base de
los
bloqueos de ésta. Si lo que quieres es que mientras un usuario tiene en
la
pantalla de su aplicación los datos de una factura, tendrás que grabar
esa
acción en una tabla específica del servidor, pero lo que no puedes hacer
es
mantener un bloqueo de registros tal y como lo estás pensando en la base
de
datos.

Lo que quieres hacer lo detallas perfectamente en el segundo párrafo,
sólo que cuando dices "[...]la bloqueo[...]" lo que deberás hacer es
almacenar esa acción en una tabla


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Jordi" escribió en el mensaje
news:dthfsn$fa6$


Hola,
Tengo una tabla de encabezados de facturas y otra del detalle.
Como puedo bloquear un registro de la tabla encabezados de facturas para
asegurar que mientras yo estoy trabajando en esta factura nadie más
puede
hacerlo, aunque si pueda modificar otras facturas.

Lo que quiero hace es mirar si en la tabla encabezado, una determinada
factura está bloqueada, y si lo está entonces no hacer nada, pero si no



está


bloquada, la boqueo y empiezo a modifcar esta factura, cuando termino
desbloqueo este registro.

Gracias













Respuesta Responder a este mensaje
#8 Carlos Sacristán
23/02/2006 - 16:32 | Informe spam
No lo recomiendo en absoluto porque no es esa la idea que quiere Jordi.
La idea de las transacciones es que sean lo más cortas en el tiempo posible,
y lo que propones es que se mantenga abierta mientras el usuario está en la
pantalla de edición de los datos. Lo normal es que el usuario tarde en
realizar la operación, o que se vaya a tomar un café mientras tiene la
pantalla de edición... ¿te imaginas lo que sucedería si lo hacen muchos
usuarios a la vez? Es algo inviable.

Por eso recomendaba la opción de un flag almacenado en una tabla...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Developers" escribió en el mensaje
news:
Aplica Begin Trans,Rollback Trans y Commit Trans mientras realizes ese


proceso

Jordi escribió:
> Y Existe alguna forma de bloquear tablas?
> "Developers" escribió en el mensaje
> news:%
>
>>Jordi:
>>
>>Definitivamente llevar los bloqueos en SqlServer x Registro seria un
>>suicidio porque cuando se habla de un Motor de Datos ya se piensa en
>>Conjunto de Datos.
>>Una posible Solucion a Tu problema seria que tengas un campo en tu tabla
>>de comprobantes que indicara si el documento esta siendo visto por otro
>>usuario. es Decir:
>>
>>en el metodo de llamado de documento tendrias esto:
>>Select campo1,campo2,Modo_edicion, etc... from mitabla where
>>campo1=mivalor1
>>If Modo_edicion='S'
>> Messagebox("Registro esta en proceso de modificacion")
>>Else
>> Update mitabla set Modo_Edicion='S' where campo1=mivalor1
>>Endif
>>
>>y cuando cierres el formulario o cuando grabes liberes el documento de
>>nuevo.
>>Update mitabla set Modo_Edicion=' ' where campo1=mivalor1
>>
>>Nota:
>>Tendrias que adaptarlo a tus necesidades con Sqlconnect,SqlExec,etc.. y
>>probar
>>No es recomendable hacer la misma pregunta en varios foros


(VFP,SQLserver)
>>
>>Suerte
>>
>>Developers - Dany Acosta
>>Jordi escribió:
>>
>>>Hola,
>>>Pero como evito que otra persona edite el mismo registro
>>>
>>>
>>>"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el


mensaje
>>>news:u8Gi%
>>>
>>>
>>>> No lo puedes implementar directamente en la base de datos a base de
>>>>los
>>>>bloqueos de ésta. Si lo que quieres es que mientras un usuario tiene


en
>>>>la
>>>>pantalla de su aplicación los datos de una factura, tendrás que grabar
>>>>esa
>>>>acción en una tabla específica del servidor, pero lo que no puedes


hacer
>>>>es
>>>>mantener un bloqueo de registros tal y como lo estás pensando en la


base
>>>>de
>>>>datos.
>>>>
>>>> Lo que quieres hacer lo detallas perfectamente en el segundo


párrafo,
>>>>sólo que cuando dices "[...]la bloqueo[...]" lo que deberás hacer es
>>>>almacenar esa acción en una tabla
>>>>
>>>>
>>>> Un saludo
>>>>
>>>>-
>>>>"Sólo sé que no sé nada. " (Sócrates)
>>>>
>>>>"Jordi" escribió en el mensaje
>>>>news:dthfsn$fa6$
>>>>
>>>>
>>>>>Hola,
>>>>>Tengo una tabla de encabezados de facturas y otra del detalle.
>>>>>Como puedo bloquear un registro de la tabla encabezados de facturas


para
>>>>>asegurar que mientras yo estoy trabajando en esta factura nadie más
>>>>>puede
>>>>>hacerlo, aunque si pueda modificar otras facturas.
>>>>>
>>>>>Lo que quiero hace es mirar si en la tabla encabezado, una


determinada
>>>>>factura está bloqueada, y si lo está entonces no hacer nada, pero si


no
>>>>
>>>>está
>>>>
>>>>
>>>>>bloquada, la boqueo y empiezo a modifcar esta factura, cuando termino
>>>>>desbloqueo este registro.
>>>>>
>>>>>Gracias
>>>>>
>>>>>
>>>>
>>>>
>
Respuesta Responder a este mensaje
#9 Developers
23/02/2006 - 20:33 | Informe spam
Carlos:
Creo que no me entendiste la idea de usar el Begin Trans,Rollback Trans y Commit Trans.
Haber el Amigo Jordi hablaba de como proteger un documento mientras un usuario lo veia y
los demas No entonces le di un ejemplo de como podia hacerlo y era esto:(Sigue al Final
del Mensaje)

Una posible Solucion a Tu problema seria que tengas un campo en tu tabla
de comprobantes que indicara si el documento esta siendo visto por otro
usuario. es Decir:

en el metodo de llamado de documento tendrias esto:
Select campo1,campo2,Modo_edicion, etc... from mitabla where
campo1=mivalor1
If Modo_edicion='S'
Messagebox("Registro esta en proceso de modificacion")
Else
Update mitabla set Modo_Edicion='S' where campo1=mivalor1
Endif

y cuando cierres el formulario o cuando grabes liberes el documento de
nuevo.
Update mitabla set Modo_Edicion=' ' where campo1=mivalor1










Pero despues el amigo Jordi volvio a decir lo siguiente, Que pasaba si 2 o mas usuarios
llamaban al mismo documento podria suceder que todos pongan el Modo_Edicion='S' y el
resultado no valia.
Es por eso que le recomende que use las transacciones en el mismo ejemplo osea este:

*-- Metodo de Llamado Documento
Begin Trans
Select campo1,campo2,Modo_edicion, etc... from mitabla where campo1=mivalor1
If Modo_edicion='S'
Rollback Transaccion
Messagebox("Registro esta en proceso de modificacion")
Else
Update mitabla set Modo_Edicion='S' where campo1=mivalor1
Commit Trans
Endif
*-- Si te fijas con la transacion me aseguro que nadie pueda entrar a esa tabla mientras
verifico su estado y si esta libre Cambio Su Estado a Ocupado y libero mi transaccion con
eso otros usuarios no podran ver ese documento pero si los demas.

*-- y cuando cierre su Pantalla o Actualize documento tendria que hacer algo parecido
Begin Trans
Update mitabla set Modo_Edicion=' ' where campo1=mivalor1
Commit Trans

si te fijas la transaccion es rapida(Abrir-Cerrar) y "NO Necesariamente tiene que estar
abierta mientras dure la aplicacion("Eso tampoco lo recomiendo")

Nota.
Claro esta que tiene que controlar los posibles errores o la Cantidades de Transacciones x
usuario que se le presente porque no vaya hacer que se quede con las transacciones abiertas...


Developers - Dany Acosta
Respuesta Responder a este mensaje
#10 Carlos Sacristán
24/02/2006 - 08:05 | Informe spam
Ok, entendí mal entonces tu propuesta, lo siento


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Developers" escribió en el mensaje
news:#
Carlos:
Creo que no me entendiste la idea de usar el Begin Trans,Rollback Trans y


Commit Trans.
Haber el Amigo Jordi hablaba de como proteger un documento mientras un


usuario lo veia y
los demas No entonces le di un ejemplo de como podia hacerlo y era


esto:(Sigue al Final
del Mensaje)

>>>>Una posible Solucion a Tu problema seria que tengas un campo en tu


tabla
>>>>de comprobantes que indicara si el documento esta siendo visto por


otro
>>>>usuario. es Decir:
>>>>
>>>>en el metodo de llamado de documento tendrias esto:
>>>>Select campo1,campo2,Modo_edicion, etc... from mitabla where
>>>>campo1=mivalor1
>>>>If Modo_edicion='S'
>>>> Messagebox("Registro esta en proceso de modificacion")
>>>>Else
>>>> Update mitabla set Modo_Edicion='S' where campo1=mivalor1
>>>>Endif
>>>>
>>>>y cuando cierres el formulario o cuando grabes liberes el documento de
>>>>nuevo.
>>>>Update mitabla set Modo_Edicion=' ' where campo1=mivalor1
>>>>

Pero despues el amigo Jordi volvio a decir lo siguiente, Que pasaba si 2 o


mas usuarios
llamaban al mismo documento podria suceder que todos pongan el


Modo_Edicion='S' y el
resultado no valia.
Es por eso que le recomende que use las transacciones en el mismo ejemplo


osea este:

*-- Metodo de Llamado Documento
Begin Trans
Select campo1,campo2,Modo_edicion, etc... from mitabla where


campo1=mivalor1
If Modo_edicion='S'
Rollback Transaccion
Messagebox("Registro esta en proceso de modificacion")
Else
Update mitabla set Modo_Edicion='S' where campo1=mivalor1
Commit Trans
Endif
*-- Si te fijas con la transacion me aseguro que nadie pueda entrar a esa


tabla mientras
verifico su estado y si esta libre Cambio Su Estado a Ocupado y libero mi


transaccion con
eso otros usuarios no podran ver ese documento pero si los demas.

*-- y cuando cierre su Pantalla o Actualize documento tendria que hacer


algo parecido
Begin Trans
Update mitabla set Modo_Edicion=' ' where campo1=mivalor1
Commit Trans

si te fijas la transaccion es rapida(Abrir-Cerrar) y "NO Necesariamente


tiene que estar
abierta mientras dure la aplicacion("Eso tampoco lo recomiendo")

Nota.
Claro esta que tiene que controlar los posibles errores o la Cantidades de


Transacciones x
usuario que se le presente porque no vaya hacer que se quede con las


transacciones abiertas...


Developers - Dany Acosta
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida