Bloquear el registro si el campo estado tiene el valor OK

Tengo una access donde necesito si el campo estado tiene valor OK bloquee el registro

Respuesta
1

En el evento Al activar el registro de ese formulario crea un procedimiento de evento y entre Private Sub y End Sub pon

If estado="OK" then

me.allowedits=false

else

me.allowedits=true

end if

Lo que hace es que no te permite borrar nada de lo que hay en el registro. También puedes ponerlo como

If estado="OK" then

for each control in form.controls

control.enabled=false

next

end if

Te bloquea los controles de cada registro que ponga OK

Gracias por atenderme

Son varios campos pero solo uno tendrá el valor OK para que se bloqueen todos los demás, si quito el OK debería desbloquear todos los campos de ese registro

Si, en el registro, le vas a poder cambiar el valor al control Estado, entonces lo de antes no te sirve, te conviene poner, en el evento Después de actualizar del cuadro de texto Estado

If Estado="OK" then

controlA.locked=true

controlb.locked=true

controlc.locked=true

else

controla.locked=False

controlB.locked=false

ControlC.locked=False

end if

Controla,... son cuadros de texto, combinados, etc.

Es decir, que si pones en el cuadro de texto Estado OK, entonces te bloquea el controlA,... y si luego lo cambias(para lo cual el cuadro de texto Estado no puede estar bloqueado) te los desbloquea

No resulta amigo, lo coloque tal me dices en después de actualizar en el Control Estado

If ESTADO = "OK" Then
ESTADO.Locked = True
IDEquipo.Locked = True
Clasif.Locked = True
Valor.Locked = True
CANT.Locked = True
TipoMov.Locked = True
Caracteristicas.Locked = True
FecDev.Locked = True
Costo.Locked = True
Total.Locked = True
Else

ESTADO.Locked = True
IDEquipo.Locked = False

Clasif.Locked = False
Valor.Locked = False
CANT.Locked = False
TipoMov.Locked = False
Caracteristicas.Locked = False
FecDev.Locked = False
Costo.Locked = False
Total.Locked = False
End If

Te dije que si piensas cambiarle el valor en el propio formulario al valor de Estado, éste no puede estar ni bloqueado ni inhabilitado. Mira, si tengo el formulario(lo voy a hacer sólo con los dos primeros cuadros de texto)

En el momento que escribo OK y pulso Enter(voy a usar enabled porque se vé el cambio de color)

Me los ha dejado inhabilitados. Vamos a suponer que ahora le cambio el valor(para eso Estado no puede estar ni bloqueado ni inhabilitado, ya que si estuviera no le podría cambiar el valor como decías).

Cuando escribo otra cosa y pulso Enter me los vuelve a habilitar.

En este caso el código es

Lo mismo con Locked. En este caso, si pongo OK y me voy a NombreCliente, no me deja escribir nada

En este caso el código es

Private Sub Estado_AfterUpdate()
If Estado = "OK" Then
NombreCliente.Locked = True
NombreContacto.Locked = True
Else
NombreCliente.Locked = False
NombreContacto.Locked = False
End If
End Sub

Otra cosa distinta es que después de haber escrito lo que sea, te vayas a otro registro y vuelvas a uno que tenía Estado marcado como OK. En este caso, el mismo código tienes que ponerlo también el evento Al activar registro del formulario. Pero nunca bloquear o inhabilitar Estado, porque sino no lo podrías cambiar.

Lo más rápido sería usar

Me. Allowedits pero eso impediría que pudieras cambiar el valor en Estado.

Me manda de compilación con el campo TipMov  y con otros. Dice No se encontró el método o el dato miembro

Para que esto tan simple no se eternice, si quieres, repito, si quieres, mándame una copia con datos inventados a [email protected] y la miro.

Si lo haces, en el asunto del mensaje pon tu alias Jose Cordovez ya que si no sé quien me escribe ni los abro.

Mira, esto es lo que tengo en cada Item que me has dicho

Option Compare Database

Private Sub Form_AfterUpdate()
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
End Sub

Private Sub Form_Current()
If ESTADO = "OK" Then
'ESTADO.Enabled = True
IDEquipo.Enabled = False
Clasif.Enabled = False
Valor.Enabled = False
CANT.Enabled = False
'TipoMov.Enabled = False
'Caracteristicas.Enabled = False
'FecDev.Enabled = False
'Costo.Enabled = False
'Total.Enabled = False
Else
'ESTADO.Enabled = True
IDEquipo.Enabled = True
Clasif.Enabled = True
Valor.Enabled = True
CANT.Enabled = True
'TipoMov.Enabled = True
'Caracteristicas.Enabled = True
'FecDev.Enabled = True
'Costo.Enabled = True
'Total.Enabled = True
End If
End Sub

Private Sub Texto56_AfterUpdate()
If ESTADO = "OK" Then
'ESTADO.Enabled = True

IDEquipo.Enabled = False
Clasif.Enabled = False
Valor.Enabled = False
CANT.Enabled = False
'TipoMov.Enabled = False
'Caracteristicas.Enabled = False
'FecDev.Enabled = False
'Costo.Enabled = False
'Total.Enabled = False
Else
'ESTADO.Enabled = True
IDEquipo.Enabled = True
Clasif.Enabled = True
Valor.Enabled = True
CANT.Enabled = True
'TipoMov.Enabled = True
'Caracteristicas.Enabled = True
'FecDev.Enabled = True
'Costo.Enabled = True
'Total.Enabled = True
End If
End Sub

Private Sub Texto56_BeforeUpdate(Cancel As Integer)
End Sub

Private Sub Texto56_Exit(Cancel As Integer)
If ESTADO = "OK" Then
'ESTADO.Enabled = True

IDEquipo.Enabled = False
Clasif.Enabled = False
Valor.Enabled = False
CANT.Enabled = False
'TipoMov.Enabled = False
'Caracteristicas.Enabled = False
'FecDev.Enabled = False
'Costo.Enabled = False
'Total.Enabled = False
Else
'ESTADO.Enabled = True
IDEquipo.Enabled = True
Clasif.Enabled = True
Valor.Enabled = True
CANT.Enabled = True
'TipoMov.Enabled = True
'Caracteristicas.Enabled = True
'FecDev.Enabled = True
'Costo.Enabled = True
'Total.Enabled = True
End If
End Sub

Lo que tengo con apostrofe (') es porque si lo dejo para que corra me da error, entonces solo me bloquea solo algunos campos y no todo el registro, obviamente dejando en cada caso el campo ESTADO desbloquerado

Disculpa Julián, había leído lo de enviarte la BBDD

Dame tu correo y te comparto un link para que la tomes desde drive

Vamos a ver si lo dejo claro de una vez.

En el evento Al activar el registro

if estado="OK" then

nombrecliente.enabled=true

nombrecontacto.enabled=true

....

else (o sea, que Estado tenga otro valor, que se supone que es lo contrario a OK)

nombrecliente.enabled=false

nombrecontacto=false

...

end if

De forma, que si te desplazas por registros, en aquellos que tengan en Estado el valor OK te permitirá cambiar los valores que quieras, mientras que en aquellos en que estado no sea OK no podrás cambiar nada.

Pero vamos a suponer que estás en un registro en blanco. Sólo tendrá constancia de que Estado es OK o no, cuando hayas escrito algo en él. Por eso lo del evento Después de actualizar y es exactamente lo mismo que te he puesto arriba.

Pero al principio de los tiempos dijiste que querías poder cambiar el valor de Estado en el propio formulario. Por eso es ineludible que nunca, repito, nunca, Estado este inhabilitado o bloqueado. Y verás que no lo pongo en ninguna instrucción.

Hola Julián... excelente tu solución, funcionó perfecto...

Una consulta más...

En otra tabla, si un campo fecha tiene un valor ingresado (fecha de finiquito es el campo) que bloquee los registros de la misma línea o simplemente que bloquee todas las líneas de registros donde el campo fecha de finiquito esté con fecha ingresada

Las tablas no tienen código, por tanto no las puedes "obligar". En un formulario si. En el evento Al activar registro de un formulario, y suponiendo que son todos cuadro de texto, puedes poner

Private Sub Form_Current()
If Not IsNull([Pais]) Then
    For Each Control In Form.Controls
    If Control.ControlType = acTextBox Then
    Control.Locked = True
    End If
    Next
Else
    For Each Control In Form.Controls
    If Control.ControlType = acTextBox Then
    Control.Locked = False
    End If
    Next
End If
End Sub

Donde yo pongo pais tu tienes que poner FechaFiniquito

Es decir, que si "al ir" a ese registro el control FechaFiniquito tiene valor, todos los cuadros de texto se quedan bloqueados y si no tiene valor puedes hacer los cambios que quieras.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas