Error de campo nulo al crear un nuevo registro

Lo primero, perdona el título, pero sintentizar a veces es complicado.

Te cuento. Estoy limpiando el código de una base de datos, optimizándolo. En los casos en que se repite un mismo código, lo paso a un módulo, y lo llamo desde el formulario en que lo necesito.

El código que se me repite es este:

Private Sub Form_Current()
On Error Resume Next
Dim vAutonum As Variant, vUltimo As Variant
If Me.NewRecord Then
        If MsgBox("Vas a generar un nuevo apunte con numeración automática" & vbCrLf & vbCrLf & "¿Quieres seguir?", vbYesNo) = vbYes Then
        'Tomamos el valor del campo CodFormaPago
        vAutonum = Me.CodFormaPago
        'Si vAutonum no es nulo, es porque ya hay valor en el CodFormaPago, entonces salimos del procedimiento
        If Not IsNull(vAutonum) Then Exit Sub
        'vUltimo es igual al Número de Registros del año +1, que se sumará abajo
        vUltimo = Nz(DCount("[CodFormaPago]", "[01-TPV Forma de pago]"), 0)
        'Si vUltimo es nulo, es porque no hay ningún NumJustifica, entonces le damos valor 0
        If IsNull(vUltimo) Then
                vUltimo = 0
        End If
        'Sumamos 1 al valor anterior
        vUltimo = vUltimo + 1
        Me.CodFormaPago.Value = vUltimo
        Else
                'Si la respuesta a la Pregunta ha sido No
                Me.Undo
                DoCmd.GoToRecord , , acPrevious
                Exit Sub
        End If
End If
End Sub

Donde tengo el problema es en esta parte:

        vAutonum = Me.CodFormaPago
        'Si vAutonum no es nulo, es porque ya hay valor en el CodFormaPago, entonces salimos del procedimiento
        If Not IsNull(vAutonum) Then Exit Sub

El código ya optimizado, que pongo en el módulo es:

Public Function GeneracionDeCodigosConsecutivosGeneral(FName As Form, Codigo As String, Formulario As String)
    Dim vAutonum As Variant, vUltimo As Variant
    If FName.NewRecord Then
            If MsgBox("Vas a generar un nuevo apunte con numeración automática" & vbCrLf & vbCrLf & "¿Quieres seguir?", vbYesNo, NombreBD) = vbYes Then
                vUltimo = Nz(DCount(Codigo, Formulario), 0)
            If IsNull(vUltimo) Then
                vUltimo = 0
            End If
            vUltimo = vUltimo + 1
            FName.Codigo.Value = vUltimo
            Else
                    FName.Undo
                    DoCmd.GoToRecord , , acPrevious
                    Exit Function
            End If
    End If
End Function

Y lo llamo desde el formulario así:

    Call GeneracionDeCodigosConsecutivosGeneral(Me, "NombreFormaDePago", "T05FormasDePago")

Vamos al lío. En la parte que decía que tenía problemas al pasarlo al módulo, se debe a que evalúa si ya has iniciado un nuevo registro y has escrito algo en el campo Código. Por norma general, ese valor va a ser nulo, y ahí está el error que me da. Entonces, no tengo ninguna de meter esas tres líneas en el módulo para que evalúe si es o no nulo.

Yo había pensado en evaluarlo en el propio formulario, pero quería saber si existe alguna forma de hacerlo en el módulo sin que de ese error de campo nulo.

1 Respuesta

Respuesta
2

Diego, lamento decirte que no he entendido dónde tienes el problema para el que pides ayuda, pero te comento un par de cosas sobre tu código, para ayudarte a optimizarlo:

1º/ una variable de tipo Variant (como es el caso de vAutonum) admite valores nulos, por lo que me parece sumamente raro que tengas un error en esa parte. Pero independientemente de eso, puedes usar Nz() para convertir los nulos en "otra cosa" y analizar esa "otra cosa" en vez del nulo.

2º/ Si a vultimo le asignas un valor usando Nz, nunca a va tener un valor nulo, luego la comparación siguiente que haces (If IsNull(vUltimo)...) siempre va a ser falsa...

Todas esas 5 lineas (desde el vYltimo=nz(....) hasta el vUltimo=vUltimo+1) las puedes resumir en una:

vUltimo = Nz(DCount("[CodFormaPago]", "[01-TPV Forma de pago]"), 0)+1

o en tu código optimizado:

vUltimo = Nz(DCount(Codigo, Formulario), 0)+1

Un saludo.


La pregunta no admite más respuestas

Más respuestas relacionadas