Access - Verificar Dni/Nif

 
Vista:
Imágen de perfil de Francesc

Verificar Dni/Nif

Publicado por Francesc (68 intervenciones) el 12/10/2013 12:41:52
Intento unificar código localizado en algunos foros, para conseguir que a partir de la entrada de datos en un formulario controle que la letra final es correcta así como en los nif de extranjeros.
En antes de actualizar anoto el siguiente código:

1
2
3
4
5
6
7
8
Private Sub DNI_BeforeUpdate(Cancel As Integer)
If Nz(Me.DNI, "") <> "" Then
If Right(Me.DNI, 1) <> VerLetraNIF(Me.DNI) Then
MsgBox "Letra incorrecta o no introducida.", vbExclamation
Cancel = True
End If
End If
End Sub

Es después de actualizar el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub DNI_AfterUpdate()
    Dim elNIF As String
    Dim primerCaracter As String
        'Cogemos el valor introducido pasándolo a mayúsculas
    elNIF = UCase(Me.DNI.Value)
        'Obtenemos el primer carácter
    primerCaracter = CStr(Left(elNIF, 1))
        'Miramos el primer carácter
    Select Case primerCaracter
        Case "X" 'El carácter es una X
                'Cogemos los valores numéricos
            elNIF = CStr(Right(elNIF, Len(elNIF) - 1))
                'Sacamos la letra
            elNIF = "X" & VerLetraNIF(Val(elNIF))
        Case "Y" 'El carácter es una Y
                'Sustituimos la Y por un 1
            elNIF = "1" & CStr(Right(elNIF, Len(elNIF) - 1))
                'Sacamos la letra
            elNIF = "Y" & VerLetraNIF(Val(elNIF))
        Case "Z" 'El carácter es una Z
                'Sustituimos la Z por un 2
            elNIF = "2" & CStr(Right(elNIF, Len(elNIF) - 1))
                'Sacamos la letra
            elNIF = "Z" & VerLetraNIF(Val(elNIF))
        Case Else
                'Es un DNI no extranjero
            elNIF = VerLetraNIF(Val(elNIF))
    End Select
        'Escribimos el valor obtenido en el campo txtDNI
    Me.DNI.Value = elNIF
End Sub

El módulo VerLetraNIF es:

1
2
3
Public Function VerLetraNIF(DNI As String) As String
VerLetraNIF = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(DNI) Mod 23) + 1, 1)
End Function

El problema es que por separado me funciona correctamente, es decir si entro un DNI funciona y me avisa si la letra no es correcta y permite volver a introducir la letra, pero si entro un NIF (extranjero, normalmente empieza por X,Y o Z) no me funciona correctamente.
¿Es posible que la función recoja ambas casuísticas, si es así como la estructuro?
Gracias por la colaboración.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Verificar Dni/Nif

Publicado por Neckkito (1157 intervenciones) el 13/10/2013 09:52:48
Hola, Francesc:

Mirándolo por encima tu código parece que es correcto. Veo que el código que estás escribiendo está sacado literalmente de uno de mis ejemplos, así que te animo a echar un vistazo al ejemplo "original" a ver si puedes detectar alguna diferencia con el tuyo, no sólo en código si no también en sistemática, a ver si descubres "algo raro".

El ejemplo es: http://goo.gl/9eu4lV

Saludos,


http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francesc

Verificar Dni/Nif

Publicado por Francesc (68 intervenciones) el 13/10/2013 13:35:07
Buenas tardes, Neckkito,

Finalmente lo he resuelto con las siguientes funciones que he localizado en los foros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'***********************************************
' COMPRUEBA LETRA DNI
'***********************************************
Function letra_dni(DNI)
Select Case Left$(DNI, 1) 'Orden EHA/451/2008, de 20 de febrero
Case Is = "X"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "X", "0")) Mod 23) + 1, 1)
Case Is = "Y"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "Y", "1")) Mod 23) + 1, 1)
Case Is = "Z"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "Z", "2")) Mod 23) + 1, 1)
Case Else
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(DNI) Mod 23) + 1, 1)
End Select
End Function
 
'**********************************************
' CALCULA DNI CORRECTO
'***********************************************
Function CalculaDNI(sDNI As String) As String
'Revisamos que el DNI es correcto.
Dim miNIE As String
Dim miDNI As String
Dim NIEsinletra As String
Dim NIFsinletra As String
Dim mivar, mivar1 As Integer
miNIE = Left(sDNI, 1)
mivar1 = Asc(miNIE)
miDNI = Right(sDNI, 1)
mivar = Asc(miDNI)
NIEsinletra = Left(sDNI, 8)
NIFsinletra = Left(sDNI, 8)
If mivar1 > 47 And mivar1 < 58 Then 'Si el primer caracter es un número If mivar > 47 And mivar < 58 Then _
'Si el último carácter no es una letra CalculaDNI = sDNI + letra_dni(sDNI) Else _
'Si el último carácter es una letra If miDNI = letra_dni(NIFsinletra) Then _
'Si el último carácter es una letra y la letra es correcta CalculaDNI = sDNI Else _
'Si el último carácter es una letra y la letra no es correcta MsgBox "La letra del DNI introducida es errónea. _
'Debería ser " & letra_dni(NIFsinletra), vbInformation CalculaDNI = NIFsinletra + letra_dni(NIFsinletra) _
'End If End If Else 'Si el primer caracter es una letra If mivar > 47 And mivar < 58 Then
'Si el último carácter no es una letra
CalculaDNI = sDNI + letra_dni(NIEsinletra)
Else
'Si el último carácter es una letra
If miDNI = letra_dni(NIEsinletra) Then
'Si el último carácter es una letra y la letra es correcta
CalculaDNI = sDNI
Else
'Si el último carácter es una letra y la letra no es correcta
MsgBox "La letra del DNI introducida es errónea. Debería ser " & letra_dni(NIEsinletra), vbInformation
CalculaDNI = NIEsinletra + letra_dni(NIEsinletra)
End If
End If
End Function

Y en el campo antes de actualizar y después de actualizar las siguientes instrucciones:

1
2
3
4
5
6
7
8
9
10
11
12
Private Sub txtDNI_AfterUpdate()
Me.txtDNI = CalculaDNI(Me.txtDNI)
End Sub
 
Private Sub txtDNI_BeforeUpdate(Cancel As Integer)
If Nz(Me.txtDNI, "") <> "" Then
If Right(Me.txtDNI, 1) <> letra_dni(Me.txtDNI) Then
MsgBox "Lletra incorrecta o no introduïda.", vbExclamation
Cancel = True
End If
End If
End Sub

En principio con ánimo de fastidiar no he conseguido que no funcionara. Cuando lo utilice otro usuario no se si saltará por los aires, ya te diré. Dame tu opinión. No he sido capaz de descubrir porqué no me funciona la que está en tu página.
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar