Ver Mensaje Individual
  #4  
Antiguo 17-09-2008
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Reputación: 24
apicito Va por buen camino
Lo he resuelto así.
Pero ojo!!!! No tengo suficientes CIF's y NIF's para hacer la comprobación, por lo que puede ser que falle en algún caso.
Es unha modificación sobre unas funciones que no recuerdo de donde las saqué, quizás de trucomania.
Código Delphi [-]
{----------------------------------------------------------EsCif---------------}
 { Validar si un CIF introducido es correcto}
function TDatos.EsCif(Cif : String) : Boolean;
 var
    Suma, Control : Integer;
    n             : Byte;
 begin
   Result := False;

   {Se pasa todo a mayúsculas limpio de espacios y de caracteres especiales}
   Cif := UpperCase(Trim(Cif));

   {Se limpia de los caracteres '-' y '/'. }
   Cif := CadCambioCar(Cif,'-','');
   Cif := CadCambioCar(Cif,'/','');

   {El cif debe ser de 9 cifras}
   if Length(Cif) = 9 then
   begin
     {Comprobamos que sea un NIF}
     if (pos(Cif[1],'0123456789'))>0 then
       Result := EsNif(Cif)
     else
       begin
       {Se comprueba que la letra que designa el tipo de cif sea correcta}
         if (Pos(Cif[1], 'ABCDEFGHPQSKLMXYZJUVWR') = 0) then
           Result := False
         else
           {Se comprueba si es un extranjero,
            en ese caso se calcula el nif, cambiando la X,Y,Z, por 0}
           if (Pos(Cif[1], 'XYZ') = 1) then
           // if Cif[1] = 'X' then
             Result := EsNif('0'+Copy(Cif,2,8))
           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);
               {Se comprueba si es de tipo 'P' o 'S', es decir,
               Corporaciones Locales (Ayuntamientos, etc.)
               y Organismos públicos.}
               if Pos(Cif[1],'PSQ')<>0 then
                 {Control tipo letra}
                 Result := (Cif[9] = Chr(64+Control))
               else
                 {Resto de tipos de CIF}
                 begin
                   {Control tipo número}
                   if Control = 10 then
                     Control := 0;
                   Result:= ( StrToInt(Cif[9]) = Control);
                 end;
             end;
         end;
     end;
end;
{----------------------------------------------------------EsNif---------------}
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;
Responder Con Cita