Numero repetido al llenar un formulario de access

Tengo un formulario con varios campos, introduje una línea de código para que cuando el numero se repita salte un Msgbox y diga "NUMERO YA INGRESADO".

Mi código es el siguiente :

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("Deseas guardar los cambios ?", vbYesNo + vbQuestion, "Salvar cambio") = vbYesNo Then
DoCmd.RunCommand acCmdUndo
End If
If IsNull(numero) Or IsNull(nombre) Or IsNull(rut) Or IsNull(empresa) Or IsNull(n_patente) Or IsNull(n_guia) Or IsNull(visita) Or IsNull(fecha) Or IsNull(hora_ingreso) Or IsNull(hora_salida) Then
MsgBox "Registro no guardado, faltan campos por llenar!", vbOKOnly, "REGISTRO NO GUARDADO"
DoCmd.RunCommand acCmdUndo
End If
If DCount("numero", "Visitas", "numero=1" & Me.numero & "") >= 1 Then

MsgBox "El numero que ingreso ya existe, por favor revise el numero y vuelva a intentarlo.", vbOKOnly, "NUMERO YA INGRESADO"

DoCmd.CancelEvent

End If

End Sub

Y al momento de ingresar un numero repetido, salta el mensaje pero después me aparece la siguiente ventana:

Agradecería si me pudieran dar una ayuda ya que no soy experto en visual Basic.

4 respuestas

Respuesta
1

La respuesta a porque salta el error:

En ese evento el registro no se guardo, por eso tiene un parámetro (Cancel) que por defecto esta a a False, se le cambia a True y y se fuerza la salida (añadiendo un: Exit Sub antes de End IF) para que no continúe con el código que hay antes de alcanzar el End Sub final.

Uno de los problemas de los valores NULL es que se propagan rápidamente (igual que si en una serie de multiplicaciones, uno de los multiplicandos fuera Cero, resultado final = cero)
Esa peculiaridad en algunas ocasiones puede ser útil, intenta así la verificación :

-- Original--

If IsNull(numero) Or IsNull(nombre) Or IsNull(rut) Or IsNull(empresa) Or IsNull(n_patente) Or IsNull(n_guia) Or IsNull(visita) Or IsNull(fecha) Or IsNull(hora_ingreso) Or IsNull(hora_salida) Then-- 

-- Opción --

If IsNull(numero & nombre & rut & empresa & n_patente & n_guia & visita & Fecha & hora_ingreso & hora_salida) Then

Lo correcto (si son objetos del formulario) es que se indique anteponiendo 'Me'. :

If IsNull(Me.numero & Me.nombre & Me.rut & Me.empresa & Me.n_patente & Me.n_guia & Me.visita & Me.Fecha & Me.hora_ingreso & Me.hora_salida) Then

Ambos métodos son un 'rápidos' (pero no los mas adecuados), un simple espacio en un campo de texto (aunque después se borre) será  un dato poco útil (una cadena vacía) pero no un NULL, por lo que se saltará la verificación.

Gracias por tu respuesta.

logré corregir el error, el problema era que al momento de no guardar, de igual manera me saltaba el mensaje de "número ya ingresado" y eso causaba el error.

asi que lo deje dea siguiente manera y me funciona sin problemas!

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("Deseas guardar los cambios ?", vbYesNo + vbQuestion, "Salvar cambio") = vbYesNo Then
DoCmd.RunCommand acCmdUndo
End If
If IsNull(numero) Or IsNull(nombre) Or IsNull(rut) Or IsNull(empresa) Or IsNull(n_patente) Or IsNull(n_guia) Or IsNull(visita) Or IsNull(fecha) Or IsNull(hora_ingreso) Or IsNull(hora_salida) Then
MsgBox "Registro no guardado, faltan campos por llenar!", vbOKOnly, "REGISTRO NO GUARDADO"
DoCmd.RunCommand acCmdUndo
ElseIf DCount("numero", "Visitas", "numero=" & Me.numero & "") >= 1 Then

MsgBox "El numero que ingreso ya existe, por favor revise el numero y vuelva a intentarlo.", vbOKOnly, "NUMERO YA INGRESADO"

DoCmd.RunCommand acCmdUndo

End If

End Sub 

de todas formas gracias por darte el tiempo para responder!

cambie el  "if " que lo tenia separado, y lo agregue como un "elseif" como condición si no se guarda.

Todos los caminos llegan a Roma.

Si cansa reescribir los datos por error en uno (ahora se detecta al querer guardar el registro), puedes plantearte una mejora: evaluar cada dato de forma independiente (tras escribirlo).

Por ejemplo: si se verifica la existencia de 'NUMERO' tras escribirlo (utilizando el método que ya se tiene y funciona), se evita introducir el resto de valores (que se perderán si ya existe).

Cuando alguien inicia una publicación advirtiendo que son sus primeros pasos y adjunta un código de creación propia que no da el resultado que espera, no le ofrezco una rutina que hace algo similar a lo que pretende, para copiar códigos (y mas cosas si no cerró) existe una web: 'el rincón del vago' que crearon en principio para compartir apuntes estudiantiles (uno o dos los creaban, el resto en las cafeterías).

Cualquier verificación genérica (si el contenido es un NULL) se efectúe elemento a elemento, como conjunto concatenando los valores, recorriendo los controles o utilizando su propiedad TAG, o creando una propiedad personalizada no cambia su tipo, sigue siendo genérica (y por ello inconsistente) sean los campos requeridos o no requeridos (los NULL no tienen 'sexo').

Verificar un dato de forma seria implica validar si entra en el rango que se desea/necesita.
Una fecha de compra que se introduce mal y pertenece al siglo pasado es un dato tan inconsistente como un NULL (o incluso peor).
Un dato al que se le adjudica un valor por defecto para evitar errores en los cálculos (cantidad de compra = cero) NO es un valor de tipo NULL y ese valor no es el que se desea o espera.

Felicito a Claudio por atreverse con el código y este o no este de acuerdo con lo que publico (cada maestrillo 'tiene su librillo) si además es capaz de encontrar una solución a los problemas (su creación FUNCIONA) ... a disfrutarla, todos los caminos llevan a Roma.
Ya tendrá tiempo a mejorarla cuando se introduzca mas a fondo en la materia o quiera optimizar el funcionamiento.

Respuesta
1

Caray, lo que te gusta escribir. Las instrucciones pueden ser más sencillas. Mira si tengo el formulario

Puedes ver que el cursor está en Pais y que el control Nombre del contacto está vacío. Si pulso Enter

Y al pulsar Aceptar el cursor se va al primer control vacío

Y lo único que le digo es

Private Sub Form_BeforeUpdate(Cancel As Integer)
For Each Control In Form.Controls
If IsNull([Control]) Then
MsgBox "Hay controles sin rellenar"
Control.SetFocus
End If
Next
End Sub
Respuesta
1

Tienen razón para que utilizar tantos ISNULL(). Cuando todos los controles del formulario son obligatorios se puede hacer como lo explican, pero ¿Qué pasa si uno o más controles no son obligatorios? O el control ¿Es un grupo de opciones?. Nos quedamos en bucle sin salida. Diseñé hace un tiempo una función a nivel de módulo que se puede llamar desde cualquier formulario, si el campo es REQUERIDO utilizo la propiedad "Información adicional" (TAG) y le asignó cualquier texto, por ejemplo, "validar" o "requerido" etc.

Observe este formulario

Si haga clic en el botón Agregar y no se cumple con la información requerida los campos toman un fondo diferente y se muestro el mensaje. Esto aplica para formularios dependiente e independientes. Si es un formulario dependiente y me desplazo con las teclas RePág o Av Pág también se hace la validación. Utilizo el "formato condicional" para hace que el control cambie el color al recibir el enfoque.

DISEÑO DEL FORMULARIO

Observe que en la "Información adicional" anote la palabra "validar", esto indica que la función utilizará esta información y validará que en campo no sea nulo.

FUNCIÓN VALIDAR_CAMPO

Public Function validar_campo() As Boolean
'Función para marcar y validar los campos que no
'cumplen un valor
'Elaborada por: EDUARDO PEREZ FERNANEZ
'Fecha: 12/04/2021
'La función se puede llamar desde cualquier formulario
'Trabaja con base a "Información adicional" (Tag)
 On Error Resume Next
Dim ctl As Control
    For Each ctl In Screen.ActiveForm.Controls
         With ctl
            If (.ControlType = acTextBox Or .ControlType = acComboBox Or _
            .ControlType = acOptionGroup) And .Tag <> "" Then
               If IsNull(ctl) Or ctl = "" Then
                   .BackColor = RGB(246, 110, 96)
                   validar_campo = True
               Else
                  .BackColor = vbWhite
             End If
            End If
        End With
    Next
End Function

La ventaja es que esta función sirve para todos los formularios, lo que hace que disminuya el código. Ahora ¿Cómo hago la validación con la función?. Hay varios procedimientos a validar, principalmente en formularios dependientes.

PROCEDIMENTO ANTES DE ACTUALIZAR

Private Sub Form_BeforeUpdate(Cancel As Integer)
   If validar_campo = True Then
      MsgBox "Faltan datos obligatorios", vbInformation, "Clientes"
      Cancel = True
   End If
End Sub

PROCEDIMIENTO AL ACTIVAR REGISTRO

Private Sub Form_Current()
If Me.Dirty Then
 If Me.NewRecord Then
   If validar_campo = True Then
      MsgBox "Faltan datos obligatorios", vbInformation, "Clientes"
   End If
 End If
End If
End Sub

CÓDIGO BOTON AGREGAR

Private Sub btnAgregar_Click()
 If validar_campo = True Then
   MsgBox "No puede adicionar, faltan datos obligatorios", vbInformation, "Cuidado"
   Exit Sub
 End If
   DoCmd.GoToRecord , , acNewRec
End Sub

Puede utilizar esta función para todos los formularios dependientes e independientes.

Este es un foro de Access y no de literatura. No se por qué inexpertos que no aportan nada se dedican a realizar criticas sin fundamentos. Estas personas deben aprender Access antes de ingresar a ofrecer respuestas imprecisas y llenar el foro fe literatura o buscar otro foro.

Respuesta

I learned a lot from your blog, and you can learn more about older video games to have more engaging experiences. I look forward to playing with you in the past! retro games

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas