¿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.
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])
/*
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.
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: No registered users and 43 guests