In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

OT. Calculo del CIF/NIF

Foro público de Xailer en español
Responder
desarrollo
Mensajes: 109
Registrado: Lun Abr 02, 2007 10:12 am

OT. Calculo del CIF/NIF

Mensaje por desarrollo »

¿Tiene alguien a mano una funcion para comprobación de CIF/NIF (empresas,
particulares y extanjeros)?
Gracias
Jose A. Suarez
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

OT. Calculo del CIF/NIF

Mensaje por Bingen Ugaldebere »

******************************************************
* CHEQUEO DE UN CIF DE UNA EMPRESA *
* Mungia informática 2002 BINGEN * CHECKCIF
* Parámetros: *
* cCIF CIF a chequear con o sin letra delante *
* puede ser numérico o caracter *
******************************************************
FUNCTION CHECKCIF(cCif)
LOCAL lOK:=.F.,cDc,a,res,i,j,k
LOCAL cc[7],nc[7],b[4],bb[4]
LOCAL c,d
IF VALTYPE(cCIF)="N"
cCIF:=STR(cCIF)
ENDIF
IF LEN(cCIF)<8
RETURN lOK
ENDIF
cCIF:=RIGHT(cCIF,8)
cDc:=RIGHT(cCif,1)
FOR i:=1 to 7
cc:=SUBSTR(cCif,i,1)
NEXT
FOR j:=1 to 7
nc[j]:=VAL(cc[j])
NEXT
a:=nc[2]+nc[4]+nc[6]
b[1]:=strzero(nc[1]*2,2)
b[2]:=strzero(nc[3]*2,2)
b[3]:=strzero(nc[5]*2,2)
b[4]:=strzero(nc[7]*2,2)
FOR k:=1 to 4
bb[k]:=VAL(LEFT(b[k],1))+VAL(RIGHT(b[k],1))
NEXT
res:=bb[1]+bb[2]+bb[3]+bb[4]
c:=a+res
d:=10-(val(right(strzero(c,2),1)))
IF d==10
d:=0
ENDIF
IF right(str(d,2),1)==cDc
lOk:=.T.
ENDIF
RETURN lOk
--
PILO
Mensajes: 583
Registrado: Vie Jul 06, 2007 5:18 pm

OT. Calculo del CIF/NIF

Mensaje por PILO »

Bueno lo probaré
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:[email=463225f7@ozsrv2.ozlan.local...]463225f7@ozsrv2.ozlan.local...[/email]
> Aqui tienes unas cuantas, la del NIF la uso y va bien pero la del CIF no
> la he comprobado, tu mismo.
>
> Salu2
>
>
> ****** RETORNA EL Nº DE LETRA DEL NIF DANDOLE UN DNI ******
> FUNCTION CNIF(cDNI)
> RETURN
> STRZERO(VAL(CVALTOCHAR(cDNI)),8)+'-'+SUBSTR('TRWAGMYUPDXBNJZ SQVHLCKEO',(VAL(CVALTOCHAR(cDNI))
> % 23)+1,1)
>
>
> Jose A. Suarez escribió:
>
>> ¿Tiene alguien a mano una funcion para comprobación de CIF/NIF (empresas,
>> particulares y extanjeros)?
>>
>> Gracias
>>
>>
>> Jose A. Suarez
>>
>>
>
------------------------------------------------------------ --------------------
> /*
> ADAPTACION DE RUTINAS DEL CALCULO DEL NIF Y DEL CIF PARA PODER
> INTRODUCIR CUALQUIERA DE LOS DOS DATOS A TRAVES DEL MISMO CAMPO
> */
>
>
> ************************************************************ ************
> * Esta rutina comprueba que el CIF es correcto.
> * CIF en formato !99999!!! ( A->letra, 9->N£mero, X->letra o n£mero ).
>
> * OJO AL FORMATO !A9999!!!, ya que exiten DNI con numeros muy bajos
> * de solo seis cifras.
>
> * Existen 3 tipos de sociedades:
> * - Sociedades Espa¤olas .... la £ltima cifra es un n£mero.
> * - Sociedades Especiales ... empiez. por P, Q o S y acaban en letra.
> * - Sociedades Extranjeras .. el resto de las que acaban en letra.
>
> * letras de tipos de sociedades
> * A -> Sociedad An¢nima
> * B -> Sociedades Limitadas
> * C -> Sociedades Colectivas
> * D -> Sociedades Comanditarias
> * E -> Comunidades de Bienes
> * F -> Sociedades Cooperativas
> * G -> Asociaciones y otros tipos no definidos
> * H -> Comunidades de Propietarios
> * P -> Corporaci¢n local
> * Q -> Org. Aut¢nomos Estables
> * S -> Org. Dependientes de Admin. Locales
>
> * Autor de rutina para CIF: Luis Hern ndez.
> * Autor de rutina para CIF: Infor4, S.L. y Eduardo de Distrito C
> diz-Bah¡a.
> * Revisi¢n y adaptaci¢n: Jose A. Su rez Moreno
>
> ************************************************************ ************
>
>
> FUNCTION Cheq_CIF( cNif )
>
> LOCAL cSoci := "ABCDEFGHPQS"
> LOCAL cLetras := "JABCDEFGHI"
> LOCAL cSerie1 := "TXLMK"
> LOCAL cSerie2 := "PQS"
> LOCAL nPares := 0
> LOCAL nNones := 0
> LOCAL nNum, nTotal, nCompl, nCod
> LOCAL aLetras := { 'R', ;
> 'W', ;
> 'A', ;
> 'G', ;
> 'M', ;
> 'Y', ;
> 'F', ;
> 'P', ;
> 'D', ;
> 'X', ;
> 'B', ;
> 'N', ;
> 'J', ;
> 'Z', ;
> 'S', ;
> 'Q', ;
> 'V', ;
> 'H', ;
> 'L', ;
> 'C', ;
> 'K', ;
> 'E' }
> LOCAL nPos, nCif, cLet, cLetraCif
>
> IF Empty( cNif )
> // Permitimos que se pueda introducir un NIF o CIF vacio.
> RETURN .T.
> END IF
>
> IF IsDigit( SubStr( cNif, 1, 1 ) )
> // Al comenzar con un n§ lo tomamos como un NIF
> cNif := PadL( Alltrim( cNif ), 9 )
> nCif := Val( Substr( cNif, 1, 8 ) )
> cLet := Substr( cNif, 9, 1 )
>
> IF nCif <= 0
> // No se permiten NIF menores o iguales a cero.
> MsgInfo( "NIF no puede ser menor o igual a CERO" )
> RETURN .F.
> END IF
>
> IF IsDigit( cLet )
> // En el caso de no poner la letra, al no saberla, por ejemplo.
> cLet := " "
> nCif := Val( cNif )
> END IF
>
> nPos := nCif % 23 // Esto es para calcular la letra del NIF.
>
> IF nPos == 0
> cLetraCif := 'T'
> ELSE
> cLetraCif := aLetras[ nPos ]
> END IF
>
> IF cLet != cLetraCif
> MsgInfo( "Letra de NIF erronea, debe ser " + cLetraCif )
> RETURN .F.
> ELSE
> RETURN .T.
> END IF
>
> END IF
>
> IF Substr( cNif, 9 ) == " "
> MsgInfo( OemToAnsi( "Ultimo caracter debe ser un n£mero o una
> letra" ) )
> RETURN .F.
> END IF
>
> IF !IsStrNum( SubStr( cNif, 2, 7 ) )
> MsgInfo( 'CIF erroneo.' + ;
> SubStr( cNif, 2, 7 ) + ;
> OemToAnsi( ' debe ser num,rico.' ) )
> RETURN .F.
> END IF
>
> IF At( SubStr( cNif, 1, 1 ), cSerie1 ) > 0
> // NIF especial sin validaci¢n
> RETURN .T.
> ELSE
> // Validamos si existe la sociedad
>
> IF At( SubStr( cNif, 1, 1 ), cSoci ) == 0
> MsgInfo( 'CIF erroneo. Letra ' + ;
> SubStr( cNif, 1, 1 ) + ;
> ' de Sociedad no existe.' )
> RETURN .F.
> ELSE
> // Todo este barullo es para calcular el £ltimo n£mero del CIF.
> FOR nI := 3 To 7 Step 2
> nPares += Val( SubStr( cNif, nI, 1 ) )
> NEXT
>
> FOR nI := 2 To 8 Step 2
> nNum := Val( SubStr( cNif, nI, 1 ) ) * 2
> IF nNum >= 10
> nNones += nNum - 9
> ELSE
> nNones += nNum
> END IF
> NEXT
>
> nTotal := nPares + nNones
> IF nTotal % 10 != 0
> nCompl := ( Int( nTotal / 10 ) + 1 ) * 10
> nCod := nCompl - nTotal
> ELSE
> nCod := 0
> END IF
> // Hasta aqu¡.
>
> IF IsDigit( SubStr( cNif, 9 ) ) .and. ;
> At( SubStr( cNif, 1, 1 ), cSerie2 ) == 0
>
> /* Sociedades Espa¤olas */
> IF Val( SubStr( cNif, 9 ) ) == nCod
> RETURN .T.
> ELSE
> MsgInfo( OemToAnsi( 'CIF erroneo. El £ltimo n£mero debe ser
> ' ) ;
> + Str( nCod,
> 1 ) )
> RETURN .F.
> END IF
>
> ELSE // sociedades especiales y extranjeras
>
> IF SubStr( cLetras, nCod+1, 1 ) == Upper( SubStr( cNif, 9 ) )
> RETURN .T.
> ELSE
> MsgInfo( OemToAnsi( 'CIF erroneo. La £ltima cifra debe ser
> ' );
> + SubStr( cLetras, nCod+1,
> 1 ) )
> RETURN .F.
> END IF
>
> END IF
>
> END IF
> END IF
>
> RETURN .F.
>
> FUNCTION IsStrNum( cCad )
>
> // Comprueba si una cadena es totalmente num,rica.
>
> FOR nI := 1 TO Len( cCad )
> IF !Substr( cCad, nI, 1 )$"0123456789-."
> RETURN .F.
> ENDIF
> NEXT
>
> RETURN .T.
>
>
------------------------------------------------------------ --------------------
> ******************************************************
> * CHEQUEO DE UN CIF DE UNA EMPRESA *
> * Mungia informática 2002 BINGEN * CHECKCIF
> * Parámetros: *
> * cCIF CIF a chequear con o sin letra delante *
> * puede ser numérico o caracter *
> ******************************************************
>
> FUNCTION CHECKCIF(cCif)
> LOCAL lOK:=.F.,cDc,a,res,i,j,k
> LOCAL cc[7],nc[7],b[4],bb[4]
> LOCAL c,d
>
> IF VALTYPE(cCIF)="N"
> cCIF:=STR(cCIF)
> ENDIF
>
> IF LEN(cCIF)<8
> RETURN lOK
> ENDIF
>
> cCIF:=RIGHT(cCIF,8)
>
> cDc:=RIGHT(cCif,1)
> FOR i:=1 to 7
> cc:=SUBSTR(cCif,i,1)
> NEXT
> FOR j:=1 to 7
> nc[j]:=VAL(cc[j])
> NEXT
> a:=nc[2]+nc[4]+nc[6]
> b[1]:=strzero(nc[1]*2,2)
> b[2]:=strzero(nc[3]*2,2)
> b[3]:=strzero(nc[5]*2,2)
> b[4]:=strzero(nc[7]*2,2)
> FOR k:=1 to 4
> bb[k]:=VAL(LEFT(b[k],1))+VAL(RIGHT(b[k],1))
> NEXT
> res:=bb[1]+bb[2]+bb[3]+bb[4]
> c:=a+res
> d:=10-(val(right(strzero(c,2),1)))
> IF d==10
> d:=0
> ENDIF
> IF right(str(d,2),1)==cDc
> lOk:=.T.
> ENDIF
>
> RETURN lOk
>
desarrollo
Mensajes: 109
Registrado: Lun Abr 02, 2007 10:12 am

OT. Calculo del CIF/NIF

Mensaje por desarrollo »

Gracias!!!
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:[email=463225f7@ozsrv2.ozlan.local...]463225f7@ozsrv2.ozlan.local...[/email]
> Aqui tienes unas cuantas, la del NIF la uso y va bien pero la del CIF no
> la he comprobado, tu mismo.
>
> Salu2
>
>
> ****** RETORNA EL Nº DE LETRA DEL NIF DANDOLE UN DNI ******
> FUNCTION CNIF(cDNI)
> RETURN
> STRZERO(VAL(CVALTOCHAR(cDNI)),8)+'-'+SUBSTR('TRWAGMYUPDXBNJZ SQVHLCKEO',(VAL(CVALTOCHAR(cDNI))
> % 23)+1,1)
>
>
> Jose A. Suarez escribió:
>
>> ¿Tiene alguien a mano una funcion para comprobación de CIF/NIF (empresas,
>> particulares y extanjeros)?
>>
>> Gracias
>>
>>
>> Jose A. Suarez
>>
>>
>
------------------------------------------------------------ --------------------
> /*
> ADAPTACION DE RUTINAS DEL CALCULO DEL NIF Y DEL CIF PARA PODER
> INTRODUCIR CUALQUIERA DE LOS DOS DATOS A TRAVES DEL MISMO CAMPO
> */
>
>
> ************************************************************ ************
> * Esta rutina comprueba que el CIF es correcto.
> * CIF en formato !99999!!! ( A->letra, 9->N£mero, X->letra o n£mero ).
>
> * OJO AL FORMATO !A9999!!!, ya que exiten DNI con numeros muy bajos
> * de solo seis cifras.
>
> * Existen 3 tipos de sociedades:
> * - Sociedades Espa¤olas .... la £ltima cifra es un n£mero.
> * - Sociedades Especiales ... empiez. por P, Q o S y acaban en letra.
> * - Sociedades Extranjeras .. el resto de las que acaban en letra.
>
> * letras de tipos de sociedades
> * A -> Sociedad An¢nima
> * B -> Sociedades Limitadas
> * C -> Sociedades Colectivas
> * D -> Sociedades Comanditarias
> * E -> Comunidades de Bienes
> * F -> Sociedades Cooperativas
> * G -> Asociaciones y otros tipos no definidos
> * H -> Comunidades de Propietarios
> * P -> Corporaci¢n local
> * Q -> Org. Aut¢nomos Estables
> * S -> Org. Dependientes de Admin. Locales
>
> * Autor de rutina para CIF: Luis Hern ndez.
> * Autor de rutina para CIF: Infor4, S.L. y Eduardo de Distrito C
> diz-Bah¡a.
> * Revisi¢n y adaptaci¢n: Jose A. Su rez Moreno
>
> ************************************************************ ************
>
>
> FUNCTION Cheq_CIF( cNif )
>
> LOCAL cSoci := "ABCDEFGHPQS"
> LOCAL cLetras := "JABCDEFGHI"
> LOCAL cSerie1 := "TXLMK"
> LOCAL cSerie2 := "PQS"
> LOCAL nPares := 0
> LOCAL nNones := 0
> LOCAL nNum, nTotal, nCompl, nCod
> LOCAL aLetras := { 'R', ;
> 'W', ;
> 'A', ;
> 'G', ;
> 'M', ;
> 'Y', ;
> 'F', ;
> 'P', ;
> 'D', ;
> 'X', ;
> 'B', ;
> 'N', ;
> 'J', ;
> 'Z', ;
> 'S', ;
> 'Q', ;
> 'V', ;
> 'H', ;
> 'L', ;
> 'C', ;
> 'K', ;
> 'E' }
> LOCAL nPos, nCif, cLet, cLetraCif
>
> IF Empty( cNif )
> // Permitimos que se pueda introducir un NIF o CIF vacio.
> RETURN .T.
> END IF
>
> IF IsDigit( SubStr( cNif, 1, 1 ) )
> // Al comenzar con un n§ lo tomamos como un NIF
> cNif := PadL( Alltrim( cNif ), 9 )
> nCif := Val( Substr( cNif, 1, 8 ) )
> cLet := Substr( cNif, 9, 1 )
>
> IF nCif <= 0
> // No se permiten NIF menores o iguales a cero.
> MsgInfo( "NIF no puede ser menor o igual a CERO" )
> RETURN .F.
> END IF
>
> IF IsDigit( cLet )
> // En el caso de no poner la letra, al no saberla, por ejemplo.
> cLet := " "
> nCif := Val( cNif )
> END IF
>
> nPos := nCif % 23 // Esto es para calcular la letra del NIF.
>
> IF nPos == 0
> cLetraCif := 'T'
> ELSE
> cLetraCif := aLetras[ nPos ]
> END IF
>
> IF cLet != cLetraCif
> MsgInfo( "Letra de NIF erronea, debe ser " + cLetraCif )
> RETURN .F.
> ELSE
> RETURN .T.
> END IF
>
> END IF
>
> IF Substr( cNif, 9 ) == " "
> MsgInfo( OemToAnsi( "Ultimo caracter debe ser un n£mero o una
> letra" ) )
> RETURN .F.
> END IF
>
> IF !IsStrNum( SubStr( cNif, 2, 7 ) )
> MsgInfo( 'CIF erroneo.' + ;
> SubStr( cNif, 2, 7 ) + ;
> OemToAnsi( ' debe ser num,rico.' ) )
> RETURN .F.
> END IF
>
> IF At( SubStr( cNif, 1, 1 ), cSerie1 ) > 0
> // NIF especial sin validaci¢n
> RETURN .T.
> ELSE
> // Validamos si existe la sociedad
>
> IF At( SubStr( cNif, 1, 1 ), cSoci ) == 0
> MsgInfo( 'CIF erroneo. Letra ' + ;
> SubStr( cNif, 1, 1 ) + ;
> ' de Sociedad no existe.' )
> RETURN .F.
> ELSE
> // Todo este barullo es para calcular el £ltimo n£mero del CIF.
> FOR nI := 3 To 7 Step 2
> nPares += Val( SubStr( cNif, nI, 1 ) )
> NEXT
>
> FOR nI := 2 To 8 Step 2
> nNum := Val( SubStr( cNif, nI, 1 ) ) * 2
> IF nNum >= 10
> nNones += nNum - 9
> ELSE
> nNones += nNum
> END IF
> NEXT
>
> nTotal := nPares + nNones
> IF nTotal % 10 != 0
> nCompl := ( Int( nTotal / 10 ) + 1 ) * 10
> nCod := nCompl - nTotal
> ELSE
> nCod := 0
> END IF
> // Hasta aqu¡.
>
> IF IsDigit( SubStr( cNif, 9 ) ) .and. ;
> At( SubStr( cNif, 1, 1 ), cSerie2 ) == 0
>
> /* Sociedades Espa¤olas */
> IF Val( SubStr( cNif, 9 ) ) == nCod
> RETURN .T.
> ELSE
> MsgInfo( OemToAnsi( 'CIF erroneo. El £ltimo n£mero debe ser
> ' ) ;
> + Str( nCod,
> 1 ) )
> RETURN .F.
> END IF
>
> ELSE // sociedades especiales y extranjeras
>
> IF SubStr( cLetras, nCod+1, 1 ) == Upper( SubStr( cNif, 9 ) )
> RETURN .T.
> ELSE
> MsgInfo( OemToAnsi( 'CIF erroneo. La £ltima cifra debe ser
> ' );
> + SubStr( cLetras, nCod+1,
> 1 ) )
> RETURN .F.
> END IF
>
> END IF
>
> END IF
> END IF
>
> RETURN .F.
>
> FUNCTION IsStrNum( cCad )
>
> // Comprueba si una cadena es totalmente num,rica.
>
> FOR nI := 1 TO Len( cCad )
> IF !Substr( cCad, nI, 1 )$"0123456789-."
> RETURN .F.
> ENDIF
> NEXT
>
> RETURN .T.
>
>
------------------------------------------------------------ --------------------
> ******************************************************
> * CHEQUEO DE UN CIF DE UNA EMPRESA *
> * Mungia informática 2002 BINGEN * CHECKCIF
> * Parámetros: *
> * cCIF CIF a chequear con o sin letra delante *
> * puede ser numérico o caracter *
> ******************************************************
>
> FUNCTION CHECKCIF(cCif)
> LOCAL lOK:=.F.,cDc,a,res,i,j,k
> LOCAL cc[7],nc[7],b[4],bb[4]
> LOCAL c,d
>
> IF VALTYPE(cCIF)="N"
> cCIF:=STR(cCIF)
> ENDIF
>
> IF LEN(cCIF)<8
> RETURN lOK
> ENDIF
>
> cCIF:=RIGHT(cCIF,8)
>
> cDc:=RIGHT(cCif,1)
> FOR i:=1 to 7
> cc:=SUBSTR(cCif,i,1)
> NEXT
> FOR j:=1 to 7
> nc[j]:=VAL(cc[j])
> NEXT
> a:=nc[2]+nc[4]+nc[6]
> b[1]:=strzero(nc[1]*2,2)
> b[2]:=strzero(nc[3]*2,2)
> b[3]:=strzero(nc[5]*2,2)
> b[4]:=strzero(nc[7]*2,2)
> FOR k:=1 to 4
> bb[k]:=VAL(LEFT(b[k],1))+VAL(RIGHT(b[k],1))
> NEXT
> res:=bb[1]+bb[2]+bb[3]+bb[4]
> c:=a+res
> d:=10-(val(right(strzero(c,2),1)))
> IF d==10
> d:=0
> ENDIF
> IF right(str(d,2),1)==cDc
> lOk:=.T.
> ENDIF
>
> RETURN lOk
>
Responder