Access - Bloquear registros selectivamente

   
Vista:

Bloquear registros selectivamente

Publicado por David (49 intervenciones) el 27/02/2018 15:33:53
Hola a todos.
A veces tengo problemas con un formulario. Sin querer puedo borrar o sobrescribir los datos de un registro. Me gustaría que uno de los campos fuera para bloquear la escritura de ESE registro, sin influir en los demás. Y si quiero modificar el contenido, con desmarcar ese campo ya podría hacerlo, y luego volver a marcarlo para que quedase de nuevo protegido.
Es decir, quiero poder bloquear registros individuales, y desbloquearlo a voluntad. De todas maneras, veo un problema: ese campo, al pertenecer a ese registro, si bloqueo el registro se bloqueará también ese campo, con lo que no podría volver a desbloquearlo.
¿Es posible hacer todo esto? ¿Se puede bloquear sólo algunos campos?
Gracias anticipadas
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
Imágen de perfil de Norberto

Bloquear registros selectivamente

Publicado por Norberto (613 intervenciones) el 28/02/2018 10:51:25
Hola.

En el formulario pones un botón de alternar independiente al que llamarás altBloqueado con el siguiente código para los eventos Después de actualizar y Al bajar el Mouse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Compare Database
Option Explicit
 
Private Sub altBloqueado_AfterUpdate()
    Me.AllowEdits = True 'Permitimos ediciones
    Me.Bloqueado = Me.altBloqueado 'Para poder actualizar el valor del campo Bloqueado
    DoCmd.RunCommand acCmdSaveRecord 'Y guardamos el registro
 
    Me.AllowEdits = Not Me.altBloqueado 'Luego permitimos o no las ediciones en función del botón de Alternar
 
End Sub
 
'Como el botón no se actualiza al estar AllowEditions en False, capturamos por MouseDown
Private Sub altBloqueado_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Me.altBloqueado Then 'Si el registro está bloqueado
        Me.altBloqueado = False 'Cambiamos el estado del botón
        altBloqueado_AfterUpdate 'y ejecutamos el código como si se hubiese actualizado
    Else
        'Nada ya que el evento AfterUpdate se producirá directamente
    End If
 
End Sub

En el evento Al activar registro pones este otro código:

1
2
3
4
5
Private Sub Form_Current()
    Me.AllowEdits = Not Me.Bloqueado 'Permitimos editar en función del valor del campo
    Me.altBloqueado = Me.Bloqueado  'Actualizamos el botón de alternar
 
End Sub

Un saludo,

Norberto.

P.S. No me deja ver la vista preliminar. Espero que se vea bien.
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

Bloquear registros selectivamente

Publicado por David (49 intervenciones) el 28/02/2018 23:13:51
Muchas gracias por tan pronta respuesta
Me da problemas: Me.Bloqueado
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
Imágen de perfil de Norberto

Bloquear registros selectivamente

Publicado por Norberto (613 intervenciones) el 01/03/2018 10:31:51
Hola de nuevo.

La tabla tiene que tener un campo que se llame Bloquedo. Si en tu caso tiene otro nombre, deberás sustituir en el código Me.Bloqueado por Me.como_se_llame_tu_campo. Dicho campo tiene que ser de tipo Sí/No.

Un saludo,

Norberto.
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

Bloquear registros selectivamente

Publicado por Anonimo (814 intervenciones) el 01/03/2018 11:50:43
Es difícil ofrecer una respuesta concreta a una exposición inconcreta ....

Si partimos de algo 'concreto', aclarar que en un formulario solo existe un registro 'real': el que este activo
Esa misma concreción dice que el bloqueo de un registro a nivel de tabla mediante uno de sus campos: no existe
-- (se podrá tener una marca o testigo, pero su bloqueo se hará siempre por programación).

Llegados a este punto solo queda tomar una decisión ... ¿Dónde se podría ubicar el "desbloqueador" para poderlo aplicar con el mínimo de interferencia?

Posiblemente su ubicación idónea sea un lugar común (sea el formulario padre si es un subformulario, su sección cabecera o en caso extremo en cada registro .... pero esta ultima es la opción mas costosa en recursos y tiempo).

Si se tratase de un subformulario (con el control de desbloqueo en su formulario padre), seria tan sencillo como modificar en el evento CURRENT del subformulario a bloquear su propiedad ENABLED y a golpe de botón en el formulario que lo contiene (el formulario padre) y de forma voluntaria desbloquearlo (por defecto, todos estarían 'bloqueados' al hacerse activos y activo solo lo puede ser y es uno a la vez).

Esta forma de manejar los bloqueos, no precisa el añadir ningún testigo de control y si se precisase conjugar bloqueos con desbloqueos, lo normal seria que hubiera una o varias condiciones (normalmente falta de datos para su posterior finalización) y seria cualquiera de esas condiciones las que podrían (en tiempo de ejecución) presentar bloqueados o no los registros afectados.
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
Imágen de perfil de Norberto

Bloquear registros selectivamente

Publicado por Norberto (613 intervenciones) el 01/03/2018 15:48:25
Hola.

Lo que él quiere es tener un "algo" en el formulario que le permita desbloquear el registro bloqueado y volverlo a bloquear. Ese algo es un botón de alternar y el código que permite hacerlo es el que he puesto. Al querer que sea por registro, entiendo que algunos registros estarán bloqueados y otros no. Para ello deberá de haber un campo Sí/No en la tabla que indique dicho estado para cada uno de ellos (que yo he llamado Bloqueado). Subo un ejemplo.

Un saludo,

Norberto.
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

Bloquear registros selectivamente

Publicado por Anonimo (814 intervenciones) el 02/03/2018 10:42:40
El bloqueo (aun con el método propuesto) se sigue haciendo por programación, insisto en que ese dato (o cualquiera otro) NO BLOQUEA NADA, cualquiera que acceda a la tabla podrá montar el circo que desee sin que se le pueda impedir.

Desbloquear y bloquear el registro activo se puede hacer en tiempo de ejecución (sea en base a un testigo o a 'todos por defecto')

Que el testigo sea un campo mas en la tabla podría tener sus ventajas en casos muy concretos, validar una condición (por ejemplo: la existencia campos incompletos) permitiría ese mismo bloqueo de una forma interactiva y dinámica, lo de 'volver a bloquearlos' es algo intrascendente, pues al guardar el registro se vuelve a validar el condicional (si fuera el caso) o simplemente se auto bloquearía si esa es la opción por defecto.

Utilizar un testigo, implica un campo mas en cada tabla (o incluso consulta) que se desee controlar, utilizar otra metodología hace innecesarios esos campos apéndice.

Innegablemente la necesidad es quien valida uno u otro método, el resto son simples teorías.
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

Bloquear registros selectivamente

Publicado por David (49 intervenciones) el 03/03/2018 00:33:07
Norberto, he probado tu código entero y me da problemas con MouseDown.
He eliminado lo correspondiente a: Private Sub altBloqueado_MouseDown........ y parece que FUNCIONA MUY BIEN.
Quizás he hecho una barbaridad.
Muchas gracias a todos por vuestro interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Revisar política de publicidad