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 08-05-2006
Avatar de Colgueit
Colgueit Colgueit is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lanzarote, España
Posts: 91
Poder: 21
Colgueit Va por buen camino
Conseguido

Perfecto! Ya lo he probado y todo OK.
Muchas Gracias Seoane!
Responder Con Cita
  #2  
Antiguo 08-05-2006
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 23
gluglu Va por buen camino
Y pregunto yo ?

No puede haber cifras del DNI que sean menor de 10.000.000, y con ello la longitud ser menor de 9 ?

Yo creo recordar DNI's con cifras menores de esos Diez Millones (que me perdonen, pero supongo que de gente bastante mayor ...).

Por ello creo que deberías reconsiderar entonces la comprobación de la longitud. El método para calcular la letra sigue siendo perfectamente válido.

Si sirve como indicación adicional, dicho método también se puede aplicar a las Tarjetas de Residentes emitidas en España. En este caso, siempre empezaría por una 'X', seguido de 7 cifras y la letra final según el método descrito.

Saludos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 09-05-2006
Avatar de Colgueit
Colgueit Colgueit is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lanzarote, España
Posts: 91
Poder: 21
Colgueit Va por buen camino
Que yo sepa todos los Nif son de 8 numeros y la letra, estoy casi seguro vaya, eso si para Nif españoles.

En Nif extranjeros cambia la cosa y es un problema que me establa planteando ya que usando esta funcion para comprobar los Nif no puedo introducir un Nif que no sea español, que aunque no es muy común se puede dar el caso y el usuario no podría insertar en la base de datos a un cliente extranjero, con lo cual no se que hacer al respecto...

Chauu
Responder Con Cita
  #4  
Antiguo 09-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
La longitud fue mas una suposicion que una certeza, no había visto nunca ningun documento menor de 10.000.000, pero siempre se aprenden cosas nuevas. El caso es que probando con el programa PADRE, no me deja introducir un nif de menos de 9 letras ni de mas, no se si los de hacienda saben algo que yo ignoro pero sus razones tendran.

De todas formas no cuesta nada poner como requisito que se deben rellenar con ceros a la izquierda los numeros que no alcancen las nueve cifras. En algunos impresos oficiales ya te lo piden.

O simplemente podemos comprobar que la longitud esta entre 8 y 10
Código Delphi [-]
function LetraNIF(Numero: Integer): string;
begin
  Result:= copy('TRWAGMYFPDXBNJZSQVHLCKET',1 + numero mod 23,1);
end;

function EsNIFCorrecto(NIF: String): Boolean;
var
  Numero: Integer;
begin
  Result:= FALSE;
  // Eliminamos espacios y separadores
  while (pos(' ',NIF)>0) do
    delete(NIF,pos(' ',NIF),1);
  while (pos('-',NIF)>0) do
    delete(NIF,pos('-',NIF),1);
  while (pos('/',NIF)>0) do
    delete(NIF,pos('/',NIF),1);
  // La longitud entre 8 y 10 deberia de valer
  if Length(NIF) in [8..10] then
    if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
      Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
end;
Responder Con Cita
  #5  
Antiguo 09-05-2006
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 288
Poder: 21
identsoft Va por buen camino
oficialmente si el cif/nif tiene menos de 9 dígitos, hay que rellenar esos huecos con 0
Responder Con Cita
  #6  
Antiguo 09-05-2006
Avatar de Colgueit
Colgueit Colgueit is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lanzarote, España
Posts: 91
Poder: 21
Colgueit Va por buen camino
Thumbs up Lo conseguí

Cogiendo lo que habeis escrito, un ejemplo de trucomania, con algunas cosas que he añadido y con varias horas de trabajo he hecho un código que comprueba tanto si es un Nif, Cif o Nif Extrangero, creo que he contemplado casi todas las posiblilidades.
Lo he probado y parece que funciona bien pero siempre puede haber errores, si veis algo mal comentadlo please.
Pues nada aquí dejo el código para quien lo quiera .

Código Delphi [-]
function Letra(Numero: Integer): string;
begin
  Result:= copy('TRWAGMYFPDXBNJZSQVHLCKET',1 + numero mod 23,1);
end;

function EsNif(NIF: String): Boolean;
var
  Numero: Integer;
begin
   Result:= FALSE;
   if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
      Result:= Uppercase(Copy(NIF,Length(NIF),1)) = Letra(Numero);
end;

function EsNumero(Num: Char): Boolean;
begin
  try
    StrToInt(Num);
    Result:=True;
  Except
    result:=False;
  end;
end;

{Eliminamos espacios y separadores}
function CadLimpiaCar(NIF: String): String;
 begin
 Result:= NIF;
  while (pos(' ',NIF)>0) do
    delete(NIF,pos(' ',NIF),1);
  while (pos('-',NIF)>0) do
    delete(NIF,pos('-',NIF),1);
  while (pos('/',NIF)>0) do
    delete(NIF,pos('/',NIF),1);
  Result:=NIF;
end;


{ Validar si un CIF introducido es correcto}
function ValidaCif(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 := CadLimpiaCar(Cif);

   {El cif debe ser de 9 cifras}
   if Length(Cif) = 9 then
   begin
     {Comprobamos que sea un NIF}
     if EsNumero(Cif[1]) then
       Result := EsNif(Cif)
     else
       {Se comprueba que la letra que designa el tipo de cif sea correcta}
       if (Pos(Cif[1], 'ABCDEFGHPQSKLMX') = 0) then
         Result := False
       else
         {Se comprueba si es un extranjero,
          en ese caso se calcula el nif, cambiando la X, por 0}
         if Cif[1] = 'X' then
           Result := EsNif('0'+Copy(Cif,2,8))
         else
         begin
          if EsNumero(Cif[9]) then
          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],'PS')<>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
          else
           Result:=False;
         end;
   end;
end;

Y para usarlo un ejemplo sería este: (yo lo compruebo al salir del Edit)
Código Delphi [-]
procedure TFormX.DBEditNifExit(Sender: TObject);
begin
 DBEditNif.text:= CadLimpiaCar(DBEditNif.text); //esto solo si quiero borrar los caracteres especiales
 //compruebo que es valido
 if not ValidaCif(DBEditNif.text) then
 begin
  MessageDlg('El Cif introducido es incorrecto',mtError, [MBOK],0);
  DBEditNif.Clear;
 end;
end;

Gracias a todos, Saludos.

Última edición por Colgueit fecha: 09-05-2006 a las 14:18:22.
Responder Con Cita
  #7  
Antiguo 10-05-2006
manuelgomez manuelgomez is offline
Miembro
 
Registrado: ene 2006
Posts: 25
Poder: 0
manuelgomez Va por buen camino
Thumbs up Me comprometo a poner la letra

Hola a todos:

Me comprometo a poner para averiguar la letra

Un Saludo
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
Validar Campo esimon OOP 6 09-05-2006 16:07:34
validar en fecha, dia y mes alcides Varios 2 08-02-2005 16:29:33
Validar XML con schema rsotolongo Internet 5 27-04-2004 10:33:15
validar sin exepciones gustavo2 Conexión con bases de datos 2 30-01-2004 15:54:56
validar en qry alcides SQL 2 06-01-2004 18:11:19


La franja horaria es GMT +2. Ahora son las 11:54:14.


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