** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Saber si un registro se está editando en otro PC
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSaber si un registro se está editando en otro PC

 Responder Responder Página  12>
Autor
Mensaje
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Tema: Saber si un registro se está editando en otro PC
    Enviado: 24/Agosto/2017 a las 09:48
Saludos, compañeros/as:

¿Sabéis si existe alguna manera de saber a priori si un registro concreto está siendo editado por otro usuario? He "jugado" con la propiedad RecordLocks del formulario pero no es lo que yo quiero.

Lo que me gustaría es que, desde el típico formulario de selección de registros, cuando el usuario le dé a editar uno, antes de abrirlo se pueda detectar que se está editando en otra máquina y directamente no lo permita hasta que el otro usuario lo "suelte".

Para más "diversión", la aplicación donde pretendo controlar esto está en SQL Server y accedo mediante tablas vinculadas.

Gracias de antemano por vuestra valiosa ayuda.

Arriba
RRoca Ver desplegable
Colaborador
Colaborador


Unido: 02/Enero/2006
Localización: España
Estado: Sin conexión
Puntos: 4817
Enlace directo a este mensaje Enviado: 24/Agosto/2017 a las 10:41
Hola:
Creo que en las opciones de la configuración de Access puedes preveer esta situación.
Saludos.
Romain Rolland (1866-1944) escritor y ensayista frances dijo: Crear, es matar la muerte. (para mi, filosoficamente penetrante)
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 11858
Enlace directo a este mensaje Enviado: 24/Agosto/2017 a las 12:28
Lo que yo recuerdo de la configuración de Access es la posibilidad de configurar "por defecto" los bloqueos de registro. No recuerdo nada que permita indicar si un registro está siendo editado.

La primera idea que me viene a la cabeza (sin desarrollar no estudiar implicaciones) es una "chapuza". Si se dispara el evento Dirty, marcar el registro. De ese modo, cuando otro usuario acceda al registro, se puede evaluar ese flag y obrar en consecuencia.

Como decía, no he estudiado como quitar el flag o si es posible que, cuando el segundo usuario accede al mismo registro que el primero, este no haya empezado a modificarlo por lo que no tendria la marca.

A lo mejor es matar moscas a cañonazos...

Por otro lado existe la posibilidad de que SQL Server pudiera saber eso y entonces el enfoque sería totalmente distinto.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Enviado: 24/Agosto/2017 a las 13:17
Sí, el hacerlo "manualmente", pues tengo claro cómo sería, manteniendo una tabla donde guardar Id's de cada registro en el momento que se editan; y comprobando si el registro editado está en la tabla antes de abrirlo desde otro lugar. Precisamente buscando he encontrado un ejemplo de Emilio Sancha que hace justo eso. pero claro, esto ya implica tener que programar e ir formulario por formulario añadiendo el código que gestiona la escritura en la tabla.

Lo ideal, si existiese, que creo que no, sería que el propio motor de Access (o de SQL) tuviera una propiedad que indicase si un registro está siendo editado en algún sitio. Solo tendrías que consultarla, te evitarías todo el resto de "parafernalia".

A ver si a alguien se le enciende la bombillita :-)

Gracias por vuestras respuestas.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: en línea
Puntos: 5192
Enlace directo a este mensaje Enviado: 24/Agosto/2017 a las 22:38
Hola a todos y buenas noches.

Fíjate que hay cosas que si no salen se me quedan en el olvido, ya que lo resolví hace años con un campo en el propio registro del tipo Si/No, cuando alguien entraba al registro cambiaba a True y cuando salía lo ponía a False. Evidentemente estoy hablando de una colección de libros que manejamos mis hijas y yo, vamos que la red es para no levantarse de la silla y arrimarse a la habitación de al lado (he engordado con la informática, por si no lo sabíais).

Ahora al leer esto aún lo he hecho mas simple el ejemplo para practicar:

Creo una base de datos con una sola tabla (con tres campos) y creo directamente dos registros con algunos datos en los campos.
Creo un formulario en formato formulario continuo. 
Divido la base para dejar en un lado tan solo la tabla (base_be) y en el otro lado el formulario (prueba1)
De la que tengo el formulario he hecho una copia y le he puesto otro nombre (prueba2)
Abro el prueba1 y lo adecúo a un lado de la pantalla y abro prueba2 y lo coloco al otro lado.
(Sigo engordando) Ya tengo la red "casera" delante de mí.

Aclaro, estoy haciendo la prueba en Access 2007.

Me pongo a trastear en los campos de cada uno de los formularios y me doy cuenta de que si en las propiedades, pestaña Datos, propiedad "bloqueos del registro" selecciono la opción de Registro modificado, hace lo que creo que pide Omnipresente.

Claro, hay que tener en cuenta de que está la posibilidad de que el otro usuario esté tan solo situado en el registro sin hacer ninguna modificación, pero es un placer (al menos por lo que yo he visto) ver como cambia el botón de seleccionar el registro, de la famosa flecha a un círculo cuando el otro usuario está modificando en ese instante o ha modificado y ahora no está haciendo ninguna modificación, simplemente está allí mirando la pantalla...., pero aún no ha salido del registro (que hará que se actualice). También es una gozada este último caso, pues cuando el otro usuario vaya a modificar, le aparecerá el círculo, cambiará el campo que toque al nuevo dato y volverá a ponerse la flecha para que pueda modificarlo... En serio me quedo a cuadros. Pues en el primer caso, NO SE PUEDE MODIFICAR NADA y en el segundo TE CAMBIA LO QUE HABÍA EN TU CAMPO POR LO QUE EL OTRO HABIA PUESTO y a MODIFICAR SIN MAS.

Bueno, no me ha dado vergüenza decir que llevo varios años con el otro sistema, una cura de humildad nunca está de mas.

Por cierto Omnipresente, si observas algo distinto, por favor ponlo aquí, no me vaya a pasar otro puñado de años "en el limbo".

J.... que vida.

Saludos.


Editado por VIMIPAS - 24/Agosto/2017 a las 22:42
Gracias
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 09:09
Hola,

Antes que nada, gracias por tu investigación Smile

Van por ahí los tiros pero no es exactamente lo que quiero... yo necesitaría poder consultar ese "algo" que Access sí que sabe y que hace que en el registro modificado pinte el círculo para saber que está siendo editado. Pero tendría que poderse hacer desde VBA para poder evitar que se abra un registro concreto; ya te digo yo que mis usuarios no van a mirar círculos, ni cuadrados ni ninguna figura geométrica Smile

Yo sigo investigando; por supuesto que si averiguo algo, os saco del limbo a todos.

Mil gracias; un saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 11858
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 11:17
Creo que lo tengo: abrir un recordset sobre la tabla filtrado al registro en cuestión e intentar la edición. Si se obtiene error 3188 es porque el registro está bloqueado.

A ver si por ahí obtenemos algo...
Xavi, un minyó de Terrassa

Mi web
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 12:41
Bravísimo, Xavi; ocurre exactamente eso, siempre y cuando el usuario que tiene abierto el formulario haya editado algo y luego lances el código VBA. En ese momento, salta el error.

Si el usuario no ha editado nada, no salta error, y cuando en el formulario cambias de campo, repinta y muestra lo que el código ha cambiado.

El formulario tiene que tener el bloqueo a nivel de "registro modificado".

No es exactamente lo que quería, me gustaría que solo con estar mostrándose el registro ya estuviera bloqueado, pero esto se puede solucionar de una forma poco "elegante" (no se me ocurre otra), pero efectiva, que es cambiando el valor de cualquier campo y volviéndolo a dejar como estaba en el evento AlActivarRegistro. Con esto el registro siempre ha sido editado y siempre salta el error (comprobado).

Aparte, esto lo he probado teniendo el back-end en Access... peeeeeeeero... para la aplicación que yo quería en SQL Server no funciona Cry

La prueba que he hecho en SQL:
  • Formulario abierto en un registro concreto y con el bloqueo a nivel de registro modificado.
  • Desde otro lugar, en VBA abro recordset con ese registro, edito e incluso cambio algún dato.
  • En el formulario... si en el momento de hacer la edición "paralela" aun no había cambiado nada, cuando intente editar algo, me avisará de que "otro usuario ha cambiado datos" y me actualizará esos datos. Si ya había editado algo y hago la edición paralela después, guarda esos cambios (sobreescribiendo lo que había hecho el código VBA) y no se queja de nada.
  • Pero en ningún caso en el código VBA me salta ningún error.
Supongo que SQL Server bloquea los registros de otra manera, intentaré averiguar algo, pero eso ya será otro tema; este lo podemos dar por zanjado y cerrar el hilo.

Mil gracias a todos.



Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10841
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 13:21
Chicos ... estàis peleado con un viejo problema informático : los bloqueos

Todavía no existe la solución perfecta ... pero todo se andará.

Ya casi habéis llegado a la conclusión buena ... solo falta que veais que antes de editar un registro (incluyendo un formulario) primero hay que bloquearlo -como dice Xavi-, después se edita, y al guardarlo se desbloquea para el siguiente usuario.

Esto es muy peligroso porque la aplicación se puede llegar a bloquear por las esperas y los bloqueos cruzados (el famoso bucle de la muerte).

Cada uno lo hace a su manera, yo uso formularios desconectados, cuando un usuario modifica algo reflejo los cambios con código (comprobando bloqueos). Esto implica que si dos usuarios modifican a la vez el mismo registro el segundo machaca los datos del primero ... pero así es la vida

Un saludo.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Feo

Unido: 10/Abril/2004
Localización: Estremera
Estado: Sin conexión
Puntos: 11303
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 15:11
Yo he utilizado el método "manual".
Alguien entra en un formulario a ver-editar un registro y en algunos de los eventos que se desencadenan al abrir el Form, pongo a true un campo de la tabla que alimenta el formulario.
Si, ya lo sé, por cada tabla que haya en la aplicación, susceptible de tener un form para visualizar-editar, tienes que poner un campo "bloqueado" del tipo Si/NO pero una vez que lo haces...te olvidas de problemas.

Alguien en una maquina, entra en el registro X de la tabla Y. Una función de usuario que vale para todos los formularios, mira si esta a TRUE el campo en cuestion. ¿Esta a true? Mensajito y pa fuera.
¿Que no está a ture? Pues se pone a TRUE y pa dentro.
Todo se controla con una unica función que recibe dos parámetros (Tres en realidad): Tabla e ID de registro y controla si esta a true o no.
Y al cerrar el form, poner a FALSE de nuevo el campo con la misma función de usuario (Tiene un tercer parámetro que es TRUE o FALSE) según se entre o salga, respectivamente.

Problema: Que un usuario se vaya a almorzar y deje un formulario abierto estando editando. O que se cuelgue la aplicacion y ese registro quede Bloqueado en ese campo.
¿Solución?
Creé un formulario de "desbloqueo" de acceso único para el admon de la aplicación, que si algun usuario le avisa que un registro "siempre" esta bloqueado, primero investiga y si ve algo raro, pone a FALSE el campo y habilita de nuevo la edición.

Juro por Snoopy que es mas fácil hacerlo que explicarlo.

Eso sí, hay que crear insisto un campo mas en todas las tablas afectadas ("Bloqueado") pero bueno, un campo mas o menos, no vamos a ser ratas Evil Smile, una función de usuario que se comprueba en CADA formulario (Sí, lo sé, hay que ponerlo en cada formulario de edición de registros) pero total es un copy paste en X formulariuos, no me seais vagazos-...

Lleva 8 años funcionando en un negocio familiar con varios ordenatas y solo una vez que se fue la luz al carajo, me ha tocado acceder a ese registro bloqueado indebidamente y volverle a desbloquear.

Que a veces, lo "manual" es lo mas efectivo, sobre todo si lo controlas tu mismo Evil Smile

Muuuuuuuuuuuuuuu explica eso del bucle de la muerte...parece interesante

P.D 
Editado para quitar gazapos

Editado por buho - 25/Agosto/2017 a las 15:17
Foro Offline GRATIS:BAJAR.
Página WEB:Web
Saludos desde la cárcel de Estremera
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 16:06
Bueno bueno, cuánta literatura de la buena... gracias por el interés, chicos.

Está claro que no existe el:

If RecordLock(tabla,criterio) = True Then...

... con lo cual lo tendremos que pedir para reyes Smile

Yo en cuanto al método manual prefiero el de la tabla dedicada a controlar Id's bloqueados como apuntaba Emilio en su ejemplo. Por no ir creando el campo en cada tabla, pero ya son manías mías; está claro que los dos métodos dan el mismo resultado.

Gracias otra vez; si no hay nadie que quiera aportar nada más (difícil lo veo), por mí se puede cerrar.

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10841
Enlace directo a este mensaje Enviado: 25/Agosto/2017 a las 22:15
Omnipresente,

Esa función te la puedes crear tú ...


Don Francisco,

Antiguamente (hablo del siglo pasado) eso de los desbloqueos de registros era un tema que no se hacía porque las máquinas realizaban los procesos de uno en uno (no existía el interactivo) y no había problemas con los mismos.

Al empezar con procesos simultáneos tanto en batch como interactivos es cuando empezó a surgir el problema, ... nadie realizaba el desbloqueo de registros (y al escribir un registro editado no se desbloqueaba automáticamente, eso vino después) con lo que te podía ocurrir que un proceso bloqueaba el registro A, pasaba a tratar el B (manteniendo el A bloqueado) y un segundo proceso intentaba modificar el registro A cuando el ya tenía el B bloqueado, con lo que ambos procesos se bloqueaban entre sí sin poder avanzar ... eso se comía el procesador que lo que intentaba es bloqueo A, como no puedo intento bloquear B, como no puedo lo intento de nuevo con el A ....

En aquellos tiempos, lo del administrador de tareas todavía estaba muuuuuu verde, con lo que no quedaba otra que parar la máquina y volver a arrancarla, por eso se llama bucle de la muerte.

Yo no lo ví nunca .... Wink.




Editado por Mihura - 25/Agosto/2017 a las 22:16
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: en línea
Puntos: 5192
Enlace directo a este mensaje Enviado: 26/Agosto/2017 a las 00:32
Hola de nuevo.

Vamos que yo creía que era el único que tenía el campo ese en mis tablas y veo que hay mas de uno.

Bueno, ya que he explicado como hice la prueba ayer, se me olvidó decir:

Omnipresente (después de lo que acabo de releer en tus posteriores intervenciones), ¿has probado tu mi ejemplo? -quiero decir que si has tratado de emularlo en tu ordenador- (no tengas miedo a engordar hombre, era una broma), míra de hacer la prueba, ya que:

1.- Si el otro ha editado o está editando y "TODAVIA NO HA GUARDADO", te pondrá el círculo en el otro usuario, pero lo he dicho para la prueba que he hecho, ya que si el botón ese no figura en el formulario (propiedad formulario de no mostrar esos botones de selección de registro), ni lo verás.... PERO EL USUARIO QUE VIENE DESPUÉS, mientras que  "ESTÉ EN EL ESTADO DE EDICION", no podrá escribir en ese registro: REPITO=no podrá escribir en ese registro.

2.- Debido a esto anterior, LO CONTRARIO=YA HA SIDO GUARDADO, al nuevo usuario "LE CAMBIARÁ LO QUE EN ESE MOMENTO TENGA ÉL EN SU PANTALLA, POR LO QUE EL PRIMER USUARIO ACABE DE GUARDAR".

Por favor haz la prueba tu mismo en todos los estados que se te ocurra, ya ves que no necesitas nada mas que UNA SOLA PANTALLA PARA COMPROBARLO Y UNA BASE DIVIDIDA CON DOS BASES QUE CONTENGAN LOS FORMULARIOS.

Yo desde luego que he cambiado en mi "pequeña red" mi propia experiencia.

Tu decides, ejemplos (incluso el mío que yo pretendía que era antediluviano, veo que existen) te han puesto varios.

Saludos.


Editado por VIMIPAS - 26/Agosto/2017 a las 00:33
Gracias
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1849
Enlace directo a este mensaje Enviado: 26/Agosto/2017 a las 09:29
Mihura:
Sí, al "pedirlo para reyes" me refería precisamente a eso :-) a programar la función utilizando la idea que muy acertadamente apuntó Xavi de cazar el error 3188. Y no es complicada, solo que ahora tengo que ver cómo lo hago con SQL Server, ya que aquí no me salía el error. Pero para mis aplicaciones "Access, Access", la tengo clara.

Vimipas:
Lo que tú comentas sí que lo conocía, pero me interesa "poderlo saber" desde VBA, es decir, independientemente de que en un selector de registro se muestre que se está editando, si el usuario pulsa el botón de abrir, que no le deje.

Gracias otra vez.
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4282
Enlace directo a este mensaje Enviado: 26/Agosto/2017 a las 10:34
Buenas


Quizás os pueda servir ...........
Peroooooooo porque No abris el recorset con  dbPessimistic es decir 

 Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset, DAO.dbConsistent, DAO.LockTypeEnum.dbPessimistic)


el caso contrario seria

 Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset, DAO.dbConsistent, DAO.LockTypeEnum.dbOptimistic)






Editado por javier.mil - 26/Agosto/2017 a las 10:58
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable