Campo obligatorio en formulario access

Tengo un formulario y quiero que si el campo TIPOLOGÍA no está relleno cuando cambio de registro me aparezca un mensaje de EL CAMPO TIPOLOGÍA TIENE QUE ESTAR RELLENO.

1 Respuesta

Respuesta
1
En la acción Al perder el enfoque del campo tipología el código:
If IsNull(Form!Tipologia.Value)=True then
MsgBox "El campo Tipolgia tiene que estar relleno"
End If
Muchas gracias, de nuevo. Me gustaría que en vez de perder enfoque del campo sea al cambiar de registro del formulario, pero no se en cual de todos los eventos tengo que escribir el procedimiento.
Lo tendrás que poner en las propiedades del formulario, en la acción Al activar registro
Lo que me hace así es ponerme el aviso cuando cargo un registro nuevo. ¿Hay alguna forma de hacer que sea obligatorio rellenar este campo? Perdona si te estoy volviendo loca.
Un Saludo
Creo que lo que tendrías que hacer es mandar el mensaje e ir al registro anterior, es decir al que estabas, de esta forma no dejas que pase de registro hasta que no se llene el cuadro.
If IsNull(Form!Tipologia.Value)=True then
MsgBox "El campo Tipolgia tiene que estar relleno"
DoCmd.GoToRecord , , acPrevious
End If
Lo siento pero no me sale, me dice que no encuentra el registro. Error 2105 y me dice que tengo que depurarlo y lo que me marca en amarillo es:
DoCmd.GoToRecord , , acPrevious
Te copio lo que he escrito:
If IsNull(Cuadro_combinado29.Value) = True Then
MsgBox "El campo Tipología esta vacío"
DoCmd.GoToRecord , , acPrevious
Un saludo
Lo he puesto así y si funciona:
Private Sub Form_Current()
If IsNull(Form!cantidad.Value) = True Then
MsgBox "Cantidad Vacio"
DoCmd.GoToRecord , , acPrevious
End If
End Sub
En mí caso sería el cuadro cantidad
Me cuentas.
A mí me funciona porque tengo vacío el 2º registro y claro puede ir al anterior, ya que existe. En tú caso, si el que tienes vacío es el 1er registro le tendrás que decir que se quede en él, es decir: DoCmd. GoToRecord,, acFirst
Con acFirst lo que haces es ir al 1er registro.
Me cuentas.
No se que hago mal, pero el caso es que no me sale. Te cuento. Si pongo acPrevious, y quito el segundo campo que también tiene vacío este campo, me salta al registro anterior, el que si lo tiene relleno y cuando paso de registro, al que no lo tiene relleno me sale el mensaje y de vuelta al registro anterior, no al que tiene el campo vacío.
Si en cambio pongo acFirst, me va al primer registro del formulario y tampoco puedo rellenarlo. Así que no se que hacer.
Como se nota que no entiendo de esto.
Un saludo
El método DoCmd. GotoRecord lo que hace es ir a otro registro, puede ser al primero (acFirst), al anterior (acPrevious)... pero también puede ir a uno específico, esto se hace con acGoTo, nº del registro al que queremos ir. Por ejemplo, si queremos ir al registro 7 pondríamos:
DoCmd. GoToRecord,, acGoTo, 7
Si lo que quieres es quedarte en el registro en el que estás puedes hacerlo con la propiedad CurrentRecord que nos da el registro actual de un formulario, entonces pondríamos:
DoCmd.GoToRecord , , acGoTo, Form.CurrentRecord
Me cuentas.
Me sale algo mejor, si cuando le doy a siguiente registro y ese registro si esta relleno el campo tipología se queda en el registro que originariamente no estaba relleno el campo, pero si el siguiente registro no tiene el campo relleno se queda en el ultimo, no en el anterior que es donde se tendría que quedar para no olvidarme de ese registro.
Muchas gracias de verdad porque me estas ayudando mucho aun dándote tanta guerra.
Efectivamente, esto ocurre porque estamos evaluando el registro al que vamos, no el que estábamos.
Lo pienso y te cuento.
Si utilizamos al activar registro, siempre evalúa el nuevo. Así que yo haría lo siguiente:
Quito los botones de desplazamiento que te pone por defecto (lo haces en las propiedades del formulario) y creo un botón para ir al registro siguiente. En el código de este botón:
If Form.CurrentRecord < DCount("[IdProducto]", "[Productos]") Then
    If IsNull(Form!cantidad.Value) = False Then
        DoCmd.GoToRecord , , acNext
    Else
        MsgBox "Campo Cantidad Vacio"
    End If
Else
    MsgBox "Último registro"
End If
Es decir si el nº del registro es menor que el total de registros de la tabla:
Mira si no es nulo ---> si no es nulo ---> ve al siguiente registro
si es nulo ---> mensaje
si el nº del registro NO es menor que el total de registros de la tabla:
Mensaje.
Verás que hemos utilizado la función DCount("[IdProducto]", "[Productos]") es igual que la DSum() pero en vez de sumar, cuenta. Como queremos contar los registros de toda la tabla, no ponemos condiciones.
Verás que a diferencia de cuando se pone en origen del registro, cuando se pone en código la función hay que ponerla en inglés y sustituir los ; por,
Me cuentas.
Antes de hacer la prueba que me dices te comento. Yo tengo más cosas asociadas a la opción de activar registro. Lo tengo para bloquear el registro y que no se modifique si no se pincha un botón que cree y también una condición para que si el estado de un campo esta en Cerrada, se cambie el fondo del registro.
Me cuentas
Creo que da igual, el activar registro lo activas igual ya sea por medio de los botones por defecto o por uno que tú crees, la diferencia es que en el que tú creas si el cuadro está en blanco, no te deja pasar (ni activar) el siguiente.
Te comento el problema que me encuentro ahora, he quitado como me dices la barra de desplazamiento y creado un botón para pasar al siguiente registro. En las opciones al hacer click, he puesto lo siguiente:
If Form.CurrentRecord < DCount("[Id]", "[Fecha_cracion]") Then
    If IsNull(Form!Cuadro_combinado29.Value) = False Then
        DoCmd.GoToRecord , , acNext
    Else
        MsgBox "Tipología Vacío"
    End If
Else
    MsgBox "Último registro"
End If
Cuando lo ejecuto, me da error de depurar en la primera línea. Los dos campos que he puesto son campos que siempre tienen datos, para que los cuente. Lo que no entiendo es el otro mensaje de error que has puesto, no se para lo que sirve.
Un saludo
Se me olvidó preguntarte si también se puede hacer lo misma función para los botones de ultimo registro, anterior, nuevo registro, etc...
Un Saludo
Hola de nuevo, olvida por el momento los dos últimos mensajes, creo que he podido encontrar la solución, pero me faltan algunas aclaraciones y ayudas. He quitado la barra de desplazamiento, como me dijiste y creado los cinco botones que tiene esta barra. Y he puesto el siguiente código al hacer click sobre ese botón:
If IsNull(Cuadro_combinado29.Value) = True Then
MsgBox "El campo Tipologia tiene que estar relleno"
DoCmd.GoToRecord , , acPrevious
End If
Esto me funciona perfectamente para el botón de siguiente registro y anterior poniendo
DoCmd.GoToRecord , , acNext
Pero me falta por saber que poner en DoCmd.GoToRecord,, para el botón de ir al ultimo registro; y el de ir al primer registro y el de crear nuevo registro. He probado con current.record, back, etc, pero no funciona.
Por otra parte necesito saber si se puede crear algún comando o cuadro para que vuelva a aparecer cuadro que identifica el número de registros, como aparece en la barra de desplazamiento, ya que nos es útil.
Un saludo
La función DCount("[NombreCampo]","[NombreTablaALaQuePerteneceElCampo]")
El mensaje Último registro es para que si estás en el último registro, es decir Form.CurrentRecord = DCount("[NombreCampo]","[NombreTablaALaQuePerteneceElCampo]")
Te dé el mensaje de error que tú pongas, en vez que te salte el de access.
La función se puede poner para cualquier movimiento de registros:
AcFirst
AcGoTo
AcLast
AcNewRec
AcNext
AcPrevious
Me cuentas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas