Visual Basic - ABRIR TABLA EN MODO EXCLUSIVO

Life is soft - evento anual de software empresarial
 
Vista:

ABRIR TABLA EN MODO EXCLUSIVO

Publicado por ivan (1040 intervenciones) el 24/10/2005 19:05:53
Necesito saber cómo abrir una tabla de Access en Modo Exclusivo, o sea, que un usuario la abra y que mientras la tenga abierta, ningún otro usuario pueda acceder a ella.

Por ejemplo, estoy capturando pagos, los cuales tienen esta estructura..:

Clave Otros Datos....
00001 .......
00002 ......

Cuando agrego un pago, la clave es generada automáticamente, a como se vayan agregando se va generando, mi forma de generar esa clave es así.... antes de grabar el nuevo registro, abro la tabla con un "SELECT MAX(clave) AS maximo FROM Tabla....." le sumo uno y ya tengo la clave, mi pregunta es....

Quiero que al momento de grabar el pago, se abra la tabla "TABLA" en modo exclusivo, o sea, bloquearla al resto de los usuarios para que no puedan abrirla mientras busco el MAXIMO y le agrego el nuevo registro....

¿CÓMO HAGO ESO..........?

La operación de agregar lo hago asi...:

Set Rs = New ADODB.RecordSet
Rs.Open "select max(Clave) as mayor from Pagos", Rc, adOpenKeyset, adLockOptimistic
If Not IsNull(Rs("mayor")) Then
Nva_Cve = Val(Rs("mayor")) + 1
Else
Nva_Cve = 1
End If
Rs.Close
Rs.Open "select * from Pagos", Rc, adOpenKeyset, adLockOptimistic
Rs.AddNew
Rs("clave") = Nva_Cve
Rs......
Rs.Update
Rs.Close

Lo que pretendo es que la tabla PAGOS quede bloqueada al resto de los usuarios mientras hago la operación de sacar el Máximo y grabar el registro..

Uso Access 2000, y ADODB para manejar los archivos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ABRIR TABLA EN MODO EXCLUSIVO

Publicado por Cecilia Colalongo (3117 intervenciones) el 24/10/2005 20:04:48
Puedes utilizar un campo autonumérico y luego si necesitas recuperar valor insertado con SELECT @@IDENTITY, sino utilizar transacciones mientras buscas el máximo y lo grabas.

En http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q232/1/44.ASP&NoWebContent=1 tienes un ejemplo de @@IDENTITY.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

NO LE ENTIENDO...!!!!

Publicado por ivan (1040 intervenciones) el 25/10/2005 00:43:40
Lo de IDENTITY no le entendí nada al ejemplo que viene en la página, y eso que lo abri en español... y lo de transacciones nunca las he usado y ni tengo idea de como se haga, según estuve viendo en el foro y solamente hablan de problemas que tienen con transacciones o sea, de cosas ya un poco mas avanzadas, en la ayuda del Visual lo que viene de transacciones, según lo que vi, como que son para DAO o RDO, pero no para ADO que es lo que yo manejo...

Tendrás tu algún ejemplo donde venga cómo hacer lo que pretendo....????

Ya sea con IDENTITY o con transacciones.....???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:NO LE ENTIENDO...!!!!

Publicado por Cecilia Colalongo (3117 intervenciones) el 25/10/2005 01:36:14
En ADO existen las transacciones con BeginTrans, CommitTrans y RollbackTrans, en:

http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthbegintrans.asp

está la documentación y un ejemplo.

Lo de @@IDENTITY se utiliza con campos autonuméricos que te evitarían tener que buscar el máximo en la tabla con un SELECT y agregarlo, al crear un campo autonumérico es la base de datos la que se ocupa de generar el máximo y se evitan bloquear registros. Lo único que hace @@IDENTITY es devolver el valor inmediatamente insertado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

NO FUNCIONA, A LO MEJOR ESTA MAL UBICADO

Publicado por ivan (1040 intervenciones) el 25/10/2005 02:19:20
Lo intenté por el lado de las transacciones y dejé mi código así...:

Rc.BeginTrans
Rs.Open "select max(Clave) as mayor from Pagos", Rc, adOpenKeyset, adLockOptimistic
If Not IsNull(Rs("mayor")) Then
Nva_Cve = Val(Rs("mayor")) + 1
Else
Nva_Cve = 1
End If
Rs.Close
Rs.Open "select * from Pagos", Rc, adOpenKeyset, adLockOptimistic
Rs.AddNew
Rs("clave") = Nva_Cve
Rs......
Rs.Update
Rs.Close
Rc.CommitTrans

O sea, inicio la transferencia; abro el RecordSet para obtener el mayor, cierro y vuelvo a abrir para agregarle el nuevo, grabo, cierro y termino transferencia

Probé esto con dos aplicaciones simultaneas, simulando a 2 usuarios agregando al mismo tiempo y me genera el mismo Maximo...

Qué está mal...?? o cómo se usa....???

Sigo en las mismas.... o le encuentro como hacerle o limito el módulo a un usuario y que los otros se esperen.... vaya solución.... seguimos intentando....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:NO FUNCIONA, A LO MEJOR ESTA MAL UBICADO

Publicado por Nuevo (10 intervenciones) el 25/10/2005 06:07:15
Mal ubicado estás tú, no vez que no sirves para esto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

EXCELENTE COMENTARIO NEWKID....!!!!!

Publicado por ivan (1040 intervenciones) el 25/10/2005 17:41:05
Gracias por tu atinado comentario he decidido cambiar de profesión, envidio tu basto y gran conocimiento gran maestro....!!! Saludos...!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:NO FUNCIONA, A LO MEJOR ESTA MAL UBICADO

Publicado por Cecilia Colalongo (3117 intervenciones) el 26/10/2005 00:10:36
¿No puedes usar un campo autonumérico en tu tabla y así ahorrarte todos esos pasos de buscar máximos y generarlos? Para algo se inventaron esos campos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

CLARO....!!

Publicado por ivan (1040 intervenciones) el 26/10/2005 00:47:59
Voy a hacer eso que mencionas, para ya facilitar las cosas, muchas gracias por la información.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:NO LE ENTIENDO...!!!!

Publicado por Pepe (9 intervenciones) el 25/10/2005 15:21:48
Hola a todos, si estan haciendo este tipo de consultas a lo mejor van a poder solucionar mi problema, como hago para que varias aplicaciones mias accedan a mi bd al mismo tiempo?
Saludos
Pepe
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

MULTIACCESO

Publicado por ivan (1040 intervenciones) el 25/10/2005 17:49:16
Puedes abrir la base tantas veces quieras, el problema es con lo bloqueos, ya que si varios usuarios acceden al mismo registro al mismo tiempo es lo que debes de controlar, ve las respuestas en el foro y si les entiendes me explicas....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar