Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2007
Cecilioxx Cecilioxx is offline
Registrado
 
Registrado: feb 2007
Ubicación: Santander
Posts: 5
Poder: 0
Cecilioxx Va por buen camino
Verificar CIF/NIF con c++ Builder

Saludos a todos.

PIDO PERDON...... POR NO HABER VERIFICADO BIEN EL PROGRAMA. DESLICÉ UN ERROR QUE CORRIJO SEGUIDAMENTE

Estoy desarrollando una aplicación de compras-ventas-stocks-enlace contable con base de datos MSSQL. Uno de los temas es la comprobación del CIF/NIF. He encontrado bastantes cosas muy útiles explicando el algoritmo y el código fuente en Delphi. He hecho un programa de prueba con un formulario, un botón y un control TEdit. Se introduce un CIF/NIF, se pulsa el botón. Si hay error da un mensaje indicando el valor que debiera tener el dígito o letra de control, devuelve un valor false y se limpia el texto. Si todo va bien no hay mensaje, devuelve true y limpia el texto.
Tengo alguna otra cosa de consolidación de balances, cálculo de participaciones, cruzadas o no.....
Por si es de interés, allá va el código-
//------------------------------------------------
En el fichero de cabecera (fichero Unit1.h) he declarado las funciones:
Código:
__published:
...............
bool __fastcall EsNumero(String Numero);
bool __fastcall EsCif(String Cif);
bool __fastcall ValidaCif(String Cif);
//------------------------------------------------
El código del fichero Unit1.hpp es
Código:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CurrEdit"
#pragma link "ToolEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
bool __fastcall TForm1::EsNumero(String Numero)
{
for(int i=1;i<Numero.Length();i++)
{
if(String("0123456789").AnsiPos(Numero.SubString(i,1))==0)
{
ShowMessage("Ha introducido un carácter "+
Numero.SubString(i,1)+ " que no es numérico");
return false;
}
}
return true;
}
//---------------------------------------------------
bool __fastcall TForm1::EsCif(String Cif)
{
//Comprobamos la letra
if(AnsiString("TRWAGMYFPDXBNJZSQVHLCKET").SubString(
StrToInt(Cif.SubString(1,Cif.Length()-1))%23+1,1)== Cif.SubString(9,1))
return true;
else
{
ShowMessage("La última posición a la derecha debe ser "+
AnsiString("TRWAGMYFPDXBNJZSQVHLCKET").SubString(
StrToInt(Cif.SubString(1,Cif.Length()-1))%23+1,1));
return false;
}
}
//--------------------------------------------------
bool __fastcall TForm1::ValidaCif(String Cif)
{
//1) Quitamos espacios, separadorestodos y convertimos a
// mayúsculas.
String C=StringReplace(Cif," ","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,"-","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,"/","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,".","",TReplaceFlags() << rfReplaceAll);
C=C.UpperCase();
//2) Comprobamos que son 9 caracteres
if(C.Length() != 9)
{
ShowMessage("El número de caracteres introducidos no es válido");
return false;
}
//3 Si es extranjero (1ª posición X, tratamos como Cif,
//cambiando la X por 0
if(C.SubString(1,1)=="X")
C="0"+C.SubString(2,8);
if(String("0123456789").AnsiPos(C.SubString(1,1))>0)
{
//Comprobamos que las 8 primeras posiciones son cifras
if(!EsNumero(C.SubString(1,8)))
return false;
else
return EsCif(C);
}
//Vamos con sociedades y entidades públicas
// Comprobar 1ª letra es válida
if(String("ABCDEFGHKLMNPQS").AnsiPos(C.SubString(1,1))==0)
{
ShowMessage("La primera letra "+C.SubString(1,1)+
" no es correcta");
return false;
}
// Tomamos desde la posición 2 a la 8
// verificamos que los caracteres del 2 al 8 sean cifras
if(!EsNumero(C.SubString(2,7))) return false;
// Sumamos las cifras impares y las pares multiplicadas
// por 2 y tomamos la cifra de las unidades de dicha
// suma
int Suma=0;
for(int i=2;i<9;i++)
{
if(i%2==1)
Suma+=StrToInt(C.SubString(i,1));
else
//Suma+=(2*StrToInt(C.SubString(i,1))%9); código erróneo cuando la cifra es 9 (9*2=18; yo dejaba 0 y debe ser 9)
Suma+=C.SubString(i,1)=="9"?9:(2*StrToInt(C.SubString(i,1)))%9;
}
//Tomamos el resto de dividir entre 10
// Restamos a 10
Suma=(10-Suma%10)%10;
// Si no sea entidad pública
//if(C.SubString(1,1) !="P" & C.SubString(1,1) !="S")//Código substituido son públicas las que empiezan por K,P,Q o S
if(String("KPQS").AnsiPos(C.SubString(1,1))==0)
{
  if( IntToStr(Suma) != C.SubString(9,1)) 
  {
  ShowMessage("La última posición de la derecha debe ser "+IntToStr(Suma));
  return false;
  }
else return true;
}
//Sí es entidad pública
if(Suma==0)
Suma=10;
if (C.SubString(9,1)!=String("ABCDEFGHIJ").SubString(Suma,1))
{
ShowMessage("La última posición de la derecha debe ser "+
String("ABCDEFGHIJ").SubString(Suma,1));
return false;
}
else return true;
}
//
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ValidaCif(Edit1->Text); código substituido es mejor limpiar sólo cuando e CIF sea correcto
if(ValidaCif(Edit1->Text))
Edit1->Text="";
}
//---------------------------------------------------------------------------
/* //ver explicación en http://es.geocities.com/softcv/codigo/cif.html Gracias, muy bien!!!!!
El CIF (Código de Identificación Fiscal) es un elemento de identificación administrativa para organizaciones y consta de 9 dígitos:
_ _ _ _ _ _ _ _ _
|_| |_|_|_|_|_|_|_| |_|
^ ^ ^ ^
| |_ Números _| |
| |
| Dígito de control, un número ó letra:
| {Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0}
|
Letra de tipo de Organización, una de las siguientes:
{A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S}
El primer dígito es una letra que indica el tipo de la organización y puede ser una de los siguientes:
A - Sociedad Anónima.
B - Sociedad de responsabilidad limitada.
C - Sociedad colectiva.
D - Sociedad comanditaria.
E - Comunidad de bienes.
F - Sociedad cooperativa.
G - Asociación.
H - Comunidad de propietarios.
K - Formato antiguo.
L - Formato antiguo.
M - Formato antiguo.
N - Formato antiguo.
P - Corporación local.
Q - Organismo autónomo
S - Organo de la administración.
Los siete dígitos siguientes son números y el último es el dígito de control que puede ser un número ó una letra.
Las operaciones para calcular el dígito de control se realizan sobre los siete dígitos centrales y son las siguientes:
Sumar los dígitos de la posiciones pares. Suma = A

Para cada uno de los dígitos de la posiciones impares, multiplicarlo por 2 y sumar los dígitos del resultado.
Ej.: ( 8 * 2 = 16 --> 1 + 6 = 7 ).
Acumular el resultado. Suma = B.

Sumar A + B = C

Tomar sólo el dígito de las unidades de C y restárselo a 10. Esta resta nos da D.

A partir de D ya se obtiene el dígito de control. Si ha de ser numérico es directamente D y si se trata de una letra se corresponde con la relación:
A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 0
Ejemplo para el C.I.F. : A58818501
Utilizamos los siete dígitos centrales = 5881850

Sumamos los dígitos pares: A = 8 + 1 + 5 = 14

Posiciones impares:
5 * 2 = 10 -> 1 + 0 = 1
8 * 2 = 16 -> 1 + 6 = 7
8 * 2 = 16 -> 1 + 6 = 7
0 * 2 = 0 -> = 0
Sumamos los resultados: B = 1 + 7 + 7 + 0 = 15

Suma parcial: C = A + B = 14 + 15 = 29

El dígito de las unidades de C es 9. Se lo restamos a 10 y nos da: D = 10 - 9 = 1

Si el dígito de control ha de ser un número es 1 y si ha de ser una letra es la "A"
*/

Última edición por Cecilioxx fecha: 16-02-2007 a las 18:17:06. Razón: Mejorar presentación. Corregir algo
Responder Con Cita
  #2  
Antiguo 14-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por Cecilioxx
Saludos a todos. Es la primera vez que asisto a este foro (tengo 72 años.¡ya son ganas!). Soy visoño en informática, autodidacta, */
Bienvenido al Foro Cecilioxx, es un honor que personas como tú participen aquí, así que ánimo y con ganas....
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 14-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bienvenido al club Cecilioxx !!!

Solamente dos consejos, cuando insertes código utiliza las etiquetas [code]Aquí tu código[/code] para que quede mejor colocado. El otro otro es, que como tu código esta bastante bien y puede resultar de utilidad a otros, podrías colocarlo en la sección de trucos.
Responder Con Cita
Respuesta



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
Verificar Apertura de Query anghell77 SQL 4 15-08-2006 06:02:23
Verificar si una imagen existe mcarazas Varios 36 10-08-2006 13:38:05
verificar fichero de texto arley_molina Varios 2 12-06-2006 20:52:40
Verificar impresora Diegoval Impresión 1 11-05-2005 06:41:23
Como verificar si un txt existe? danytorres Varios 1 02-12-2003 15:51:20


La franja horaria es GMT +2. Ahora son las 10:58:29.


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