Bueno, creo que he encontrado el problema y es que la cita de Casimiro que pega una noticia de la seguridad social española tiene un error, no de casimiro sino de l seg.socail, cuando dice:
Dicho identificador siempre tiene 9 caracteres de longitud –una letra, siete dígitos numéricos y un carácter de control alfabético-
Ya que en el caso de los NIE la longitud es de 10 caracteres, así lo está exigiendo el I.N.Estadistica: 1 letra, ocho numeros y 1 letra.
Osea que la validación del NIE supone comprobar que empieza por XYZ y es este caso comprobar que con los restantes 9 dígitos valida correctamente como si fuera un DNI español.
Por ello deje las funciones anteriores así:
Código Delphi
[-]
function TDatos.EsCif(Cif : String) : Boolean;
var
Suma, Control : Integer;
n : Byte;
begin
Result := False;
Cif := UpperCase(Trim(Cif));
Cif := CadCambioCar(Cif,'-','');
Cif := CadCambioCar(Cif,'/','');
if (Length(Cif) = 9) or (Length(Cif) = 10) then
begin
if (pos(Cif[1],'0123456789'))>0 then
Result := EsNif(Cif)
else
begin
if (Pos(Cif[1], 'ABCDEFGHPQSKLMXYZJUVWR') = 0) then
Result := False
else
if (Pos(Cif[1], 'XYZ') = 1) then
result := EsNif(Copy(Cif,2,9))
else
begin
Suma:= StrToInt(Cif[3])+StrToInt(Cif[5])+StrToInt(Cif[7]);
for n := 1 to 4 do
Suma := Suma +
((2*StrToInt(Cif[2*n])) mod 10)+((2*StrToInt(Cif[2*n])) div 10);
Control := 10 - (Suma mod 10);
if Pos(Cif[1],'PSQ')<>0 then
Result := (Cif[9] = Chr(64+Control))
else
begin
if Control = 10 then
Control := 0;
Result:= ( StrToInt(Cif[9]) = Control);
end;
end;
end;
end;
end;
function TDatos.EsNif(Cif:String): Boolean;
var a:string;
Dni:String;
Letra:String;
begin
Dni:=copy(cif,1,8);
a:=Copy('TRWAGMYFPDXBNJZSQVHLCKET',StrToInt( Dni ) mod 23 + 1, 1 );
Letra:=Copy(cif,9,1);
if a = letra then
result:=True
else
result:=False;
end;
Espero no haberme equivicado esta vez.