Letra DNI

Post Reply
Verhoven
Posts: 435
Joined: Sun Oct 09, 2005 7:23 pm

Letra DNI

Post by Verhoven »

¿Tiene alguien una función para validar las letras de los DNI en España?. Tengo entendido que la letra es el resultado de un cálculo con los números.

Gracias.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Post by Biel EA6DD »

Code: Select all

FUNCTION LetraDni(nDni)
    LOCAL aLetra:={"T","R","W","A","G","M","Y","F","P","D","X","B",;
                   "N","J","Z","S","Q","V","H","L","C","K","E"}
RETURN (aLetra[(nDni-(Int(nDni/23)*23))+1])
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Post by JoseLuis »

Y si no es persona fisica, aqui tienes para el calculo en personas juridicas.

Code: Select all

/*
   ADAPTACION DE RUTINAS DEL CALCULO DEL NIF Y DEL CIF PARA PODER
   INTRODUCIR CUALQUIERA DE LOS DOS DATOS A TRAVES DEL MISMO CAMPO
*/

// ***********************************************************************
//  Esta rutina comprueba que el CIF es correcto.
//  CIF en formato !99999!!! ( A->letra, 9->N£mero, X->letra o n£mero ).

//  OJO AL FORMATO !A9999!!!, ya que exiten DNI con numeros muy bajos
//  de solo seis cifras.

//  Existen 3 tipos de sociedades:
//  - Sociedades Espa¤olas .... la £ltima cifra es un n£mero.
//  - Sociedades Especiales ... empiez. por P, Q o S y acaban en letra.
//  - Sociedades Extranjeras .. el resto de las que acaban en letra.

//  letras de tipos de sociedades
//  A -> Sociedad An¢nima
//  B -> Sociedades Limitadas
//  C -> Sociedades Colectivas
//  D -> Sociedades Comanditarias
//  E -> Comunidades de Bienes
//  F -> Sociedades Cooperativas
//  G -> Asociaciones y otros tipos no definidos
//  H -> Comunidades de Propietarios
//  P -> Corporaci¢n local
//  Q -> Org. Aut¢nomos Estables
//  S -> Org. Dependientes de Admin. Locales
// ***********************************************************************

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+    Function Cheq_CIF()
*+
*+    Called from ( empresa.prg  )   1 - function empresa()
*+                ( prove.prg    )   1 - function entreg()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
function Cheq_CIF(cNif)

local cSoci   := "ABCDEFGHPQS"
local cLetras := "JABCDEFGHI"
local cSerie1 := "TXLMK"
local cSerie2 := "PQS"
local nPares  := 0
local nNones  := 0
local nNum
local nTotal
local nCompl
local nCod
local aLetras := {'R',;
                     'W',;
                     'A',;
                     'G',;
                     'M',;
                     'Y',;
                     'F',;
                     'P',;
                     'D',;
                     'X',;
                     'B',;
                     'N',;
                     'J',;
                     'Z',;
                     'S',;
                     'Q',;
                     'V',;
                     'H',;
                     'L',;
                     'C',;
                     'K',;
                     'E'}
local nPos
local nCif
local cLet
local cLetraCif
local ni
if empty(cNif) .or. cNif="00000000 "
   // Permitimos que se pueda introducir un NIF o CIF vacio.
//   return .T.
 cNif:="99999999 "
end if

if isdigit(substr(cNif,1,1))
   // Al comenzar con un n§ lo tomamos como un NIF
   cNif := padl(alltrim(cNif),9)
   nCif := val(substr(cNif,1,8))
   cLet := substr(cNif,9,1)

   if nCif <= 0
      // No se permiten NIF menores o iguales a cero.
      MsgAlert("NIF no puede ser menor o igual a CERO","INFORMACION")
      return .F.
   end if

   if isdigit(cLet)
      // En el caso de no poner la letra, al no saberla, por ejemplo.
      cLet := " "
      nCif := val(cNif)
   end if

   nPos := nCif % 23                    // Esto es para calcular la letra del NIF.

   if nPos == 0
      cLetraCif := 'T'
   else
      cLetraCif := aLetras[nPos]
   end if

   if cLet != cLetraCif
      MsgAlert("Letra de NIF erronea, deberia ser "+cLetraCif,"INFORMACION")
      return cLetraCif  //.F.
   else
      //          MsgInfo( " Correcto ","Hemos atinado" )
      return ""//.T.
   end if

end if

if substr(cNif,9) == " "
   MsgAlert("Ultimo caracter debe ser un número o una letra"+chr(13)+chr(10)+"Te dejo que lo pongas, pero te aviso","INFORMACION")
   return "000000000"//.F.
end if

if !IsStrNum(substr(cNif,2,7))
   MsgAlert('CIF erroneo.'+;
                         substr(cNif,2,7)+;
                         ' debe ser numérico.'+chr(13)+chr(10)+"Te dejo que lo pongas, pero te aviso",'INFORMACION')
   return "000000000"//.F.
end if

if at(substr(cNif,1,1),cSerie1) > 0
   // NIF especial sin validaci¢n
   return ""//.T.
else
   // Validamos si existe la sociedad

   if at(substr(cNif,1,1),cSoci) == 0
      MsgAlert('CIF erroneo. Letra '+;
                                   substr(cNif,1,1)+;
                                   ' de Sociedad no existe.'+chr(13)+chr(10)+"Te dejo que lo pongas, pero te aviso",'INFORMACION')
      return "000000000"//.F.
   else
      // Todo este barullo es para calcular el £ltimo n£mero del CIF.
      for nI := 3 to 7 Step 2
         nPares += val(substr(cNif,nI,1))
      next

      for nI := 2 to 8 Step 2
         nNum := val(substr(cNif,nI,1)) * 2
         if nNum >= 10
            nNones += nNum - 9
         else
            nNones += nNum
         end if
      next

      nTotal := nPares+nNones
      if nTotal % 10 != 0
         nCompl := (int(nTotal / 10)+1) * 10
         nCod   := nCompl - nTotal
      else
         nCod := 0
      end if
      // Hasta aqu¡.

      if isdigit(substr(cNif,9)) .and. ;
                       at(substr(cNif,1,1),cSerie2) == 0

         /* Sociedades Espa¤olas */
         if val(substr(cNif,9)) == nCod
            //                MsgInfo( " Correcto ","Hemos atinado" )
            return ""//.T.

         else
            MsgAlert(OemToAnsi('CIF erroneo. El £ltimo n£mero debe ser ') ;
                             +str(nCod,1)+chr(13)+chr(10)+"Te dejo que lo pongas, pero te aviso",'INFORMACION')
            return "000000000"//.F.
         end if

      else          // sociedades especiales y extranjeras

         if substr(cLetras,nCod+1,1) == upper(substr(cNif,9))
            //               MsgInfo( " Correcto ","Hemos atinado" )
            return ""//.T.
         else
            MsgAlert(OemToAnsi('CIF erroneo. La £ltima cifra debe ser ') ;
                             +substr(cLetras,nCod+1,1)+chr(13)+chr(10)+"Te dejo que lo pongas, pero te aviso",'INFORMACION')
            return "000000000"//.F.
         end if

      end if

   end if
end if

return .F.

Saludos

Jose Luis
User avatar
Manuel Aranda
Posts: 561
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Post by Manuel Aranda »

Para calcular la letra del NIE antiguo (Número de identificación de extranjeros que comenzaban por la letra "X") se utilizaba la misma rutina que para calcular la letra del NIF, pero ignorando la letra "X".

Ahora hay NIE,s que comienza por la letra "Y" y en un futuro por la letra "Z" pero para estos nuevos NIE,s ya no vale la rutina anterior.
¿Alguien conoce la nueva?
Un saludo,
Manuel

xH 1.2.3, FWH 14.09, BC++ 5.8.2, xVerce CW 1.0, PellesC
Post Reply