Letra DNI
Posted: Wed Nov 21, 2007 3: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.
Gracias.
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])
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.