Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-09-2008
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 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
  #2  
Antiguo 18-09-2008
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 24
apicito Va por buen camino
Las modificaciones no sirven. Siento haberlas publicado. Si el administrador quiere eliminar mi post anterior...
Responder Con Cita
  #3  
Antiguo 18-09-2008
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.678
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Creo entender que las letras esas no son las que hay que calcular, sino las que se añaden según el tipo de empresa, por ejemplo, las sociedades anónimas empiezan por 'A', las limitadas por 'B', etc. y esas nuevas letras serán para definir también el tipo de sociedad.
Por eso dice:
Cita:
...se han creado nuevas letras del NIF de las entidades jurídicas (CIF), código que es asignado por la Agencia Estatal de Administración Tributaria.
O sea, que no son las letras que calculamos según el número de DNI.

Al menos, eso es lo que entiendo.
Responder Con Cita
  #4  
Antiguo 19-09-2008
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 24
apicito Va por buen camino
Yo entiendo que en el caso de las sociedades solo tenemos que añadir las nuevas letras para que las acepte. Eso creo que funciona en las modificacones que hice.
En el caso de los NIE, "yo entiendo", que además de detectar las letras YZ lo demás sigue igual. Osea, que con el resto de los caracteres se valida como un DNI normal, igual que pasaba hasta ahora con la X. Pero he probado con dos numeros que tengo y no me funciona. No tengo la seguridad de que estén bien estos dos números, pero deberían ser buenos. Pero no entiendo porque no me valida los restantes caracteres bien.
Responder Con Cita
  #5  
Antiguo 24-09-2008
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 24
apicito Va por buen camino
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 [-]
{----------------------------------------------------------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) or (Length(Cif) = 10) 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, por 0}
           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);
               {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;
Espero no haberme equivicado esta vez.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Sacar los números del 1 al 9 con dos digitos David OOP 4 06-03-2008 23:08:09
Descomponer un numero con 7 digitos Camilo Varios 3 05-11-2007 21:58:02
Ejercicio con Posiciones de dígitos gerupc Varios 19 18-08-2007 18:59:40
Ingresar un núm de 10 digitos... coronado Varios 1 12-10-2006 13:49:18
Cuantos digitos tomar Coco_jac SQL 1 11-04-2006 16:09:29


La franja horaria es GMT +2. Ahora son las 12:09:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi