** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error calculo DNI cuando empieza por 0
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError calculo DNI cuando empieza por 0

 Responder Responder
Autor
Mensaje
jorros Ver desplegable
Habitual
Habitual
Avatar

Unido: 20/Octubre/2008
Localización: España
Estado: Sin conexión
Puntos: 154
Enlace directo a este mensaje Tema: Error calculo DNI cuando empieza por 0
    Enviado: 09/Junio/2023 a las 11:46

Buenos días

Estoy intentando validar en un campo el DNI/NIE de trabajadores.

El problema me surge cuando pretendo dar de alta un DNI con ocho dígitos y al final una letra. Cuando el DNI empieza por “0” la función, creo que lo pasa a número y elimina los ceros por la izquierda y me dice que el DNI no es correcto. Por mucho que lo repaso no soy capaz de encontrar el error, agradecería una ayuda.

 

El código lo he adaptado de esta contestación de NECKITO en todoexpertos

https://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/yes7rzww4autg/problemas-para-calcular-letra-de-nif-y-nie-en-access

 

El código es el siguiente:

Private Function NIF(Dni As Long)

NIF = Dni & Mid$("TRWAGMYFPDXBNJZSQVHLCKEº", (Dni Mod 23) + 1, 1)

End Function

 

Private Sub CIF_AfterUpdate()

If Len(Me.CIF.Value) <> 9 Then

    MsgBox "El DNI / NIE debe terner en total 9 digitos y este no cumple con ese criterio"

        Me.Tfe.SetFocus

        Me.CIF.SetFocus

    Exit Sub

Else

Dim elNIF As String

Dim primerCaracter As String

Dim VaNIfDup As Integer

    elNIF = UCase(Me.CIF.Value)                             'Cogemos el valor introducido pasándolo a mayúsculas

    primerCaracter = Left(elNIF, 1)                     'Obtenemos el primer carácter

Select Case primerCaracter                              'Miramos el primer carácter

    Case "X"                                                'El carácter es una X

    elNIF = CStr(Right(elNIF, Len(elNIF) - 1))          'Cogemos los valores numéricos

    elNIF = "X" & NIF(Val(elNIF))                       'Sacamos la letra

Case "Y"                                                'El carácter es una Y

    elNIF = "1" & CStr(Right(elNIF, Len(elNIF) - 1))    'Sustituimos la Y por un 1

    elNIF = "Y" & NIF(Val(elNIF))                       'Sacamos la letra

    elNIF = "Y" & Right(elNIF, 8)

Case "Z"                                                'El carácter es una Z

    elNIF = "2" & CStr(Right(elNIF, Len(elNIF) - 1))    'Sustituimos la Z por un 2

    elNIF = "Z" & NIF(Val(elNIF))                       'Sacamos la letra

    elNIF = "Z" & Right(elNIF, 8)

Case Else

 

    elNIF = NIF(Val(elNIF))                             'Es un DNI no extranjero

End Select

    If StrComp(Me.CIF.Value, elNIF, 1) = 0 Then

        VaNIfDup = Nz(DCount("[EmpNif]", "TbEmpleados ", "[EmpNif]= [CIF]"), 0)

    If VaNIfDup <> 0 Then

        MsgBox " El NIF / NIE introducido ya existe, por favor comprueben"

            Me.CIF.Value = ""

            Me.Tfe.SetFocus

            Me.CIF.SetFocus

        Exit Sub

Else

End If

        Me.CIF.Value = elNIF                            'Escribimos el valor obtenido en el campo txtDNI

Else

        MsgBox "El Cif introducido no es correcto, intentelo de nuevo"

        Me.CIF.Value = ""

        Me.Tfe.SetFocus

        Me.CIF.SetFocus

 

End If

   

End If

End Sub

 

Un saludo

Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14734
Enlace directo a este mensaje Enviado: 09/Junio/2023 a las 13:50
Hola,

Sim entrar en detalle sobre tu código (ando pilladisimo de tiempo), yo tengo este otro código de Enrique Martinez desde hace muchísimo tiempo (obviamente la lógica es la misma pero desarrollada de otra forma)


Public Function GetNIF(ByVal strNIF As String) As String
    '*******************************************************************
    ' Nombre:     GetNIF
    '             por Enrique Martínez Montejo
    '
    ' Finalidad:  Devuelve la letra correspondiente al NIF o al NIE
    '             (Número de Identificación de Extranjero)
    '
    ' Entradas:
    '     NIF:    String. La cadena del NIF cuya letra final se desea
    '             obtener.
    '
    ' Resultados:
    '     String: La letra del NIF/NIE.
    '
    '*******************************************************************

    Dim firstChar   As String
    Dim DNI         As Double
    Dim r           As Integer


    ' Primer carácter del NIF.
    firstChar = UCase(Left(strNIF, 1))

    Select Case firstChar
        ' Dependiendo del primer caracter del NIF pasado, se tratará
        ' de un colectivo u otro de personas o entidades.
       Case "K", "L", "M"
            ' Colectivos especiales de personas físicas. El cálculo
            ' del dígito de control es igual que para el NIF, previa
            ' eliminación de la primer letra del NIF especificado.
            strNIF = Mid(strNIF, 2)
        Case "X", "Y", "Z"
            ' Es un número de extranjero (NIE). El NIE puede estar formado por
            ' 9 ó 10 caracteres, dependiendo si existe lo que se conoce como el
            ' peso del número (0, 1 ó 2), después de la letraun inicial: el primer
            ' carácter es una letra, seguido de un 0, 1 ó 2 y 7 dígitos, y
            ' finaliza con el dígito de control, por ejemplo:
            ' X-0-1234567-L
            ' Y-1-1234567-X
            ' Z-2-1234567-R
            ' En primer lugar, eliminamos la letra del NIE, la cual se
            ' encuentra almacenada en la variable «firstChar».
            strNIF = Mid(strNIF, 2)
            ' Comprobamos la longitud del número del NIE, para quedarnos
            ' con sus últimos 7 caracteres. Posteriormente se le añadirá
            ' el peso que se corresponda con la letra del NIE especificada.
            Select Case Len(strNIF)
                Case Is > 8
                    GetNIF = "ç"
                Case 8
                    ' Me quedo con los últimos 7 caracteres
                    strNIF = Right(strNIF, 7)
                Case Else
                    ' Completo con ceros a la izquierda del número especificado
                    ' hasta alcanzar los siete caracteres de longitud.
                    strNIF = Left(strNIF & String(7, "0"), 7)
            End Select
            ' Dependiendo de la inicial del NIE, se le concatenará su correspondiente
            ' peso (0 para la X, 1 para la Y y 2 para el caso de la Z), de tal manera
            ' que el número intermedio del NIE quede formateado con una longitud
            ' de 8 caracteres: peso (1 carácter) + número (7 caracteres).
            Select Case firstChar
                Case "X"
                    ' La cadena comenzará por el carácter 0.
                    strNIF = "0" & strNIF
                Case "Y"
                    ' La cadena comenzará por el carácter 1.
                    strNIF = "1" & strNIF
                Case "Z"
                    ' La cadena comenzará por el carácter 0.
                    strNIF = "2" & strNIF
                Case Else
                    ' No es un NIE válido.
                    GetNIF = "ç"
            End Select
        Case Else
            ' Si por casualidad el primer carácter es una letra
            ' que no se corresponde con ninguna entidad o colectivo
            ' especial, se abandonará el procedimiento.
            If Not IsNumeric(firstChar) Then
                GetNIF = "ç"
            End If
            ' Es un NIF de una persona física. Si la longitud es
            ' mayor de 8 caracteres, abandonamos la función.
            If Len(strNIF) > 8 Then
                GetNIF = "ç"
            End If
    End Select
    ' Tabla del NIF
    ' 0T 1R 2W 3A 4G 5M 6Y 7F 8P 9D
    ' 10X 11B 12N 13J 14Z 15S 16Q 17V 18H 19L
    ' 20C 21K 22E 23T
    '
    ' Procedo a calcular el NIF/NIE
    ' La operación consiste en calcular el resto de dividir el DNI
    ' entre 23 (sin decimales). Dicho resto (que estará entre 0 y 22),
    ' se busca en la tabla y nos da la letra del NIF.

    ' Convertimos a entero el número alfanumérico del NIF.
    DNI = CDbl(strNIF)
    ' Obtenemos el resto de la división.
    '
    r = DNI Mod 23

    ' Obtenemos el dígito de control del NIF
    GetNIF = Mid("TRWAGMYFPDXBNJZSQVHLCKE", r + 1, 1)

End Function

Ese código parece funcionar con DNI de 7 u 8 numeros.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
jorros Ver desplegable
Habitual
Habitual
Avatar

Unido: 20/Octubre/2008
Localización: España
Estado: Sin conexión
Puntos: 154
Enlace directo a este mensaje Enviado: 09/Junio/2023 a las 18:04
Gracias
Arriba
jorros Ver desplegable
Habitual
Habitual
Avatar

Unido: 20/Octubre/2008
Localización: España
Estado: Sin conexión
Puntos: 154
Enlace directo a este mensaje Enviado: 09/Junio/2023 a las 20:14
Este apaño me saca del paso  
Una linea antes de End Select

elNIF = Left(String(9 - (Len(elNIF)), "0") & elNIF, 9)


Con esto consigo que me rellene por la izquierda de ·0· hasta completar 9 dígitos.


Imagino que habrá maneras mas elegantes de conseguirlo, si a alguien se le ocurre alguna por favor que lo indique.



Un saludo y por mi se puede cerrar el hilo.





Editado por jorros - 09/Junio/2023 a las 20:17
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 09/Junio/2023 a las 21:31
Para rellenar con ceros a la izquierda un número y asignarlo a un String yo utilizo format, para tu caso sería:

elNIF = Format(elNIF, "000000000")

Saludos,

Juan M. Afan de Ribera
Arriba
jorros Ver desplegable
Habitual
Habitual
Avatar

Unido: 20/Octubre/2008
Localización: España
Estado: Sin conexión
Puntos: 154
Enlace directo a este mensaje Enviado: 10/Junio/2023 a las 07:34
Mas elegante y menos rebuscado, GRACIAS

Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable