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
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.
- Compartir respuesta