Validar DNI extranjero

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • Validar DNI extranjero

    Buenos días,

    estoy haciendo una base de datos y tengo una función para validar los dni, pero cuando ingreso un dni extranjero, que empieza por X, eso casca por todos lados.

    Sabéis alguna forma de validarlo??

    Muchas gracias

  • #2
    Re: Validar DNI extranjero

    Funciones completas para todo tipo de DNI, NIF, NIE y CIF. Ponlo en un módulo, y haz la llamada con DigitoCIFNIF(TxtNif.Text)

    Código:
    '
    ' Propósito: Calcular el Dígito de control para los:
    '            NIF - Número de Identificación Fiscal.
    '            NIE - Número Identificador de Extranjeros.
    '            CIF - Código de Identificación Fiscal.
    '
    '******************************************************************************
    
    Public Function DigitoCIFNIF(ByVal strCifNif As String) As String
        Dim strTemp As String, strLetra As String
        Dim lngTam As Long, i As Long
        
        ' iniciar y así, si salimos por algún error, que podamos detectarlo
        ' en la función/procedimiento de llamada
        DigitoCIFNIF = ""
        strTemp = ""
        
        strCifNif = UCase(strCifNif) ' convertir en mayúsculas
        lngTam = Len(strCifNif)
        
        ' quitar los espacios en blanco y los carácteres - y /
        For i = 1 To lngTam
            strLetra = Mid$(strCifNif, i, 1)
            If strLetra = "-" Or strLetra = "/" Or strLetra = " " Then
                ' no hace nada - se lo salta
            Else
                strTemp = strTemp & UCase(strLetra) ' monta la cadena carácter a carácter
            End If
        Next i
          
        lngTam = Len(strTemp)
        cNif = strTemp
        
        ' si el primer carácter es un número tratarlo como un DNI -> NIF
        If IsNumeric(Mid$(strTemp, 1, 1)) Then
            If lngTam = 0 Then
                Exit Function
            ElseIf lngTam < 9 Then
                If Not lMensVis Then
                    nSecMens = 3
                    aTitMens = Array("NIF incompleto, mínimo 9 carácteres.")
                    frmMens.Show vbModal
                    
                End If
    
                cNif = cNif & "???"
                Exit Function
            ElseIf lngTam > 9 Then
                If Not lMensVis Then
                    nSecMens = 3
                    aTitMens = Array("El NIF no debe tener más de 9 carácteres.")
                    frmMens.Show vbModal
                    
                End If
    
                cNif = cNif & "???"
                Exit Function
            End If
                
            DigitoCIFNIF = DigitoNIF(CLng(Val(Left(strTemp, 8))))
            cNif = Left(cNif, 8) & DigitoCIFNIF
            cNif = Left(cNif, 8) & "-" & Mid(cNif, 9)
            If DigitoCIFNIF <> Right(strTemp, 1) Then
                cNif = cNif & "..."
            End If
            
        Else ' es un CIF - NIE
            ' si es un NIE procesarlo como un DNI -> NIF
            If Mid$(strTemp, 1, 1) = "X" Or _
                    Mid$(strTemp, 1, 1) = "Y" Or _
                    Mid$(strTemp, 1, 1) = "Z" Then   ' es un NIE
                X = "0"
                If Mid$(strTemp, 1, 1) = "Y" Then X = "1"
                If Mid$(strTemp, 1, 1) = "Z" Then X = "2"
                X = X & Mid$(strTemp, 2, 7)
                DigitoCIFNIF = DigitoNIF(CLng(Val(X)))
                cNif = Left(cNif, 8) & DigitoCIFNIF
                cNif = Left(cNif, 8) & "-" & Mid(cNif, 9)
                cNif = Left(cNif, 1) & "-" & Mid(cNif, 2)
                If DigitoCIFNIF <> Right(strTemp, 1) Then
                    cNif = cNif & "..."
                End If
            Else ' es un CIF
                ' tiene los 8 carácteres necesarios para la comprobación del CIF ?
                If lngTam = 0 Then
                    Exit Function
                ElseIf lngTam < 8 Then
                    If Not lMensVis Then
                        nSecMens = 3
                        aTitMens = Array("CIF incompleto, mínimo 8 carácteres.")
                        frmMens.Show vbModal
                        
                    End If
    
                    cNif = strCifNif & "???"
                    Exit Function
                ElseIf lngTam > 9 Then
                    If Not lMensVis Then
                        nSecMens = 3
                        aTitMens = Array("El CIF no debe tener más de 9 carácteres.")
                        frmMens.Show vbModal
                        
                    End If
    
                    cNif = strCifNif & "???"
                    Exit Function
                Else
                    ' comienza por alguna de las letras admitidas para los CIF ?
                    If InStr(1, cPreCif, Left(strTemp, 1)) > 0 Then
                        DigitoCIFNIF = DigitoCIF(strTemp)
                        If InStr(DigitoCIFNIF, Right(cNif, 1)) = 0 Then
                            If Not lMensVis Then
                                nSecMens = 3
                                aTitMens = Array("El último carácter de este CIF tiene que ser " & DigitoCIFNIF)
                                frmMens.Show vbModal
                                
                            End If
    
                            cNif = strCifNif & "???"
                        Else
                            cNif = Left(cNif, 1) & "-" & Mid(cNif, 2)
                            If Not IsNumeric(Right$(cNif, 1)) Then
                                cNif = Left(cNif, 9) & "-" & Mid(cNif, 10)
                            End If
                        End If
                    Else
                        If Not lMensVis Then
                            nSecMens = -1
                            aTitMens = Array("No se encuentra la Plantilla de", _
                                """Operaciones con Terceros"" para Word." & Chr(10), _
                                "Póngase en contacto con su proveedor de Software.")
                            frmMens.Show vbModal
                            
                        End If
                        If Not lMensVis Then
                            nSecMens = 3
                            aTitMens = Array("La Primera letra no corresponde a un CIF.")
                            frmMens.Show vbModal
                            
                        End If
                        cNif = strCifNif & "???"
                    End If
                End If
            End If
            
        End If
    
    End Function
    
    
    Private Function DigitoNIF(ByVal lngDNI As Long) As String
        DigitoNIF = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (lngDNI Mod 23) + 1, 1)
    End Function
    
    
    Private Function DigitoCIF(ByVal strCif As String) As String
        Const conValores As String = "0246813579"
        Dim i As Long, lngTemp As Long
        
        DigitoCIF = ""
        lngTemp = 0
        For i = 2 To 6 Step 2
            lngTemp = lngTemp + Val(Mid$(conValores, Val(Mid$(strCif, i, 1)) + 1, 1))
            lngTemp = lngTemp + Val(Mid$(strCif, i + 1, 1))
        Next i
        
        lngTemp = lngTemp + Val(Mid$(conValores, Val(Mid$(strCif, 8, 1)) + 1, 1))
        lngTemp = 10 - (lngTemp Mod 10)
        If lngTemp = 10 Then
            DigitoCIF = "J ó 0"
        Else
            DigitoCIF = Chr(lngTemp + 64) & " ó " & Trim(Str(lngTemp))
        End If
    
    End Function
    NOTA: Todo lo relacionado con lMensVis, nSecMens, aTitMens y frmMens se refiere a un método de presentar los mensajes, que puedes sustituirlo simplemente por MsgBox o por el método que tú utilices para tal fin.
    José María Movilla Cuadrado
    ______________________
    Normas del foro
    www.foro.vb-mundo.com
    www.vb-mundo.com

    Comentario


    • #3
      Re: Validar DNI extranjero

      Muchísimas gracias!!!!
      Funciona a las mil maravillas!!

      Comentario


      • #4
        Hola,
        Estoy intentando utilizar estas funciones en una aplicacion de Access pero no consigo que funcione. El campo de texto se llama txtNif y hago la llamada pero no se ejecuta nada. Como deberia hacerlo?

        Private Sub TxtNif_AfterUpdate()
        DigitoCIF
        End Sub

        Estoy empezando con Access y debo cometer algun error pero no se cual realmente. Agradeceria algo de ayuda.

        Comentario


        • #5
          No, no... Tienes que poner todo el código que subí en un módulo. Y harás la llamada al mismo con

          DigitoCIFNIF(TxtNif.Text)

          Por ejemplo; si introduces el número del documento en un textbox que se llame "txtNif", puedes validarlo así:

          Código:
          Private Sub txtNif_Validate(Cancel As Boolean)
              txtNif.Text = UCase(Left(Trim(txtNif.Text), 12))
              If txtNif.Text = "" Then txtNif.Text = " "
              
              cNif = txtNif.Text   ' cNif está predefinida como String
              DigitoCIFNIF (cNif)
              If Right(cNif, 3) = "..." Then
                MsgBox("Compruebe la veracidad de este dato:" & Chr(10), _
                          "Se ha detectado falta de correlación entre", _
                          "el número del NIF y su letra de control...")           
                  txtNif.Text = Left(cNif, Len(cNif) - 3)
                  txtNif.SetFocus
                  Exit Sub
              ElseIf Right(cNif, 3) = "???" Then
                  txtNif.Text = Left(cNif, Len(cNif) - 3)
                  txtNif.SetFocus
                  Exit Sub
              Else
                  txtNif.Text = cNif
              End If
              
          '    If txtNif.Text <> Previo Then CmdGrab.Enabled = True 'Activa un control...
          '    txtDes.SetFocus   ' Salta al siguiente textbox...
          End Sub
          José María Movilla Cuadrado
          ______________________
          Normas del foro
          www.foro.vb-mundo.com
          www.vb-mundo.com

          Comentario


          • #6
            Originalmente escrito por J_M_Movilla Ver mensaje
            No, no... Tienes que poner todo el código que subí en un módulo. Y harás la llamada al mismo con

            DigitoCIFNIF(TxtNif.Text)

            Por ejemplo; si introduces el número del documento en un textbox que se llame "txtNif", puedes validarlo así:

            Código:
            Private Sub txtNif_Validate(Cancel As Boolean)
            txtNif.Text = UCase(Left(Trim(txtNif.Text), 12))
            If txtNif.Text = "" Then txtNif.Text = " "
            
            cNif = txtNif.Text ' cNif está predefinida como String
            DigitoCIFNIF (cNif)
            If Right(cNif, 3) = "..." Then
            MsgBox("Compruebe la veracidad de este dato:" & Chr(10), _
            "Se ha detectado falta de correlación entre", _
            "el número del NIF y su letra de control...")
            txtNif.Text = Left(cNif, Len(cNif) - 3)
            txtNif.SetFocus
            Exit Sub
            ElseIf Right(cNif, 3) = "???" Then
            txtNif.Text = Left(cNif, Len(cNif) - 3)
            txtNif.SetFocus
            Exit Sub
            Else
            txtNif.Text = cNif
            End If
            
            ' If txtNif.Text <> Previo Then CmdGrab.Enabled = True 'Activa un control...
            ' txtDes.SetFocus ' Salta al siguiente textbox...
            End Sub
            Gracias por la respuesta.

            Lo que no entiendo es que tipo de evento debo usar con esta función en el campo de texto. He probado con Despues de Actualizar y no funciona.
            Podrias aclararmelo. Gracias de nuevo.

            Comentario


            • #7
              En el VALIDATE... del TextBox en el que introduzcas el número de DNI / NIF / NIE
              José María Movilla Cuadrado
              ______________________
              Normas del foro
              www.foro.vb-mundo.com
              www.vb-mundo.com

              Comentario


              • #8
                Gracias por la respuesta, pero en la ficha de propiedades del campo de texto de formulario no existe el evento Actualizar.
                Solo existe en los eventos de formulario. Esto es lo que no entiendo. Si me lo puedes aclarar mejor, te estaria agradecido.

                Comentario


                • #9
                  En ningún momento hablo yo del evento Actualizar... Supongo que tú utilices un control TextBox para introducir el DNI/NIF/NIE... Pues ese control tiene indudablemente el evento Validate

                  Tienes que copiar el código que pongo en el post #5; sólo has de cambiar txtNif por el nombre que tú le des al TextBox en que introduzcas el número de documento...

                  Y, por supuesto, también tienes que tener copiado en un módulo el código del post #2.
                  José María Movilla Cuadrado
                  ______________________
                  Normas del foro
                  www.foro.vb-mundo.com
                  www.vb-mundo.com

                  Comentario

                  Trabajando...
                  X