FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Letra DNI
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Letra DNI
Posted: Wed Nov 21, 2007 03:15 PM

¿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.

Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Letra DNI
Posted: Wed Nov 21, 2007 03:34 PM
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/
Posts: 428
Joined: Thu Oct 19, 2006 12:28 PM
Letra DNI
Posted: Thu Nov 22, 2007 07:54 AM
Y si no es persona fisica, aqui tienes para el calculo en personas juridicas.

/*
   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
--------------------------

Saludos



Jose Luis
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Letra DNI
Posted: Tue Sep 16, 2008 12:52 PM

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 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC

Continue the discussion