Ayuda con los dnis

Quisiera saber si hay alguna función para que al introducir un DNI sin letra, se genere la letra correspondiente.Si no la hay, ¿Alguien me da alguna solución para ello?

1 Respuesta

Respuesta
1
Access no proporciona una rutina predefinida, pero buscando por ahí en internet encontré una en otro lenguaje que te puede servir.
Function checkDocumento(doc$) As String
Dim t$, p1$, p2$, p3$, l$
checkDocumento = ""
If doc = "" Then Exit Function
If sonDigitos(doc) Then ' DNI
If Len(doc) > 8 Then checkDocumento = "Un DNI está limitado a 8 dígitos"
Exit Function
End If
If sonDigitos(Left(doc, Len(doc) - 1)) And sonLetras(Right(doc, 1)) Then ' NIF
l = Mid("TRWAGMYFPDXBNJZSQVHLCKET", Val(Left(doc, Len(doc) - 1)) Mod 23 + 1, 1)
If l <> Right(doc, 1) Then
checkDocumento = "La letra del NIF no es correcta, debería ser una " & l
End If
Exit Function
End If
If Len(doc) > 2 Then
If sonLetras(Left(doc, 1)) And sonDigitos(Mid(doc, 2, Len(doc) - 2)) Then ' CIF
Dim suma%, control%, n%
p1 = Left(doc, 1)
p2 = Mid(doc, 2, Len(doc) - 2)
p3 = Right(doc, 1)
If Len(p2) < 7 Then
p2 = Right("0000000" & p2, 7)
ElseIf Len(p2) > 7 Then
checkDocumento = "Un CIF admite como máximo 9 caracteres"
Exit Function
End If
If InStr("ABCDEFGHPQSKLMX", p1) < 1 Then ' letra no es correcta
checkDocumento = "La letra del principio del CIF no es correcta"
Exit Function
End If
suma = Val(Mid(p2, 2, 1)) + Val(Mid(p2, 4, 1)) + Val(Mid(p2, 6, 1))
For n = 1 To 7 Step 2
suma = suma + ((2 * Val(Mid(p2, n, 1))) Mod 10) + ((2 * Val(Mid(p2, n, 1))) \ 10)
Next
control = 10 - (suma Mod 10)
If InStr("PS", p1) > 0 Then ' Ayuntamientos y organismos
If p3 <> Chr(64 + control) Then
checkDocumento = "La letra de control del CIF es incorrecto(" & Chr(64 + control) & ")"
Exit Function
End If
Else ' Resto de tipos de CIF
If control = 10 Then control = 0
If p3 <> Format(control) Then
checkDocumento = "El dígito de control del CIF es incorrecto(" & control & ")"
Exit Function
End If
End If
Exit Function
End If
End If
checkDocumento = "No se reconoce el tipo de documento"
End Function
Está hecha para comprobar si un dni/cif/nif es correcto, pero puedes aprovecharla para completar.
Por cierto, que se supone que las letras del NIF se utilizan para comprobar que las cifras son correctas, son un checksum. Por tanto, y por recomendación encarecida de la AEAT, no se deben generar nunca letras, sino que sólo se deben comprobar las introducidas.
Aunque en la práctica ya se sabe...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas