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
>