Hola Samuel,
Adjunto el código para validar NIF de personas físicas y sociedades
que se aplica al menos en España. No recuerdo si el cógido inicial es
mío o si me inspiré en algún sitio, lo que si recuerdo es que las
últimas adaptaciones la hice yo.
Saludos,
Miguel
*****************************************************************************
PARAM MICIF
*****************************************************************************
STORE "TRWAGMYFPDXBNJZSQVHLCKE" TO TABLA
STORE .T. TO ERROR2
STORE MICIF TO LENIF
STORE " " TO LETRA
STORE 0 TO DNI
STORE 0 TO NAUX
STORE 0 TO SUMA
STORE MICIF TO MINIF
* Limpiar el nif de caracteres no deseados
LENIF=STRTRAN(LENIF,"-","")
LENIF=STRTRAN(LENIF,"/","")
LENIF=STRTRAN(LENIF,".","")
LENIF=UPPER(ALLTRIM(LENIF))
* Si hay un carácter a la izquierda alfabético
IF ISALPHA(LENIF)
LETRA=UPPER(SUBSTR(LENIF,1,1))
IF LETRA$"ABCDEFGHJPQRUVNWSKLM"
IF LEN(LENIF)=9 THEN
SUMA=VAL(SUBSTR(LENIF,3,1))+VAL(SUBSTR(LENIF,5,1))
+VAL(SUBSTR(LENIF,7,1))
*SUMAMOS CIFRAS EN LUGARES IMPARES Y PARES POR 2N
FOR I=1 TO 4
SUMA = SUMA+ MOD(2*VAL(SUBSTR(LENIF,2*I,1)),10)+
INT(2*VAL(SUBSTR(LENIF,2*I,1))/10)
NEXT I
*SI LAS LETRAS SON P O Q ACABA EN LETRA QUE SE CALCULA ASI
IF LETRA$"PQS" THEN
IF SUBSTR(LENIF,9,1)=CHR(64+(10-MOD(SUMA,10))) THEN
STORE .F. TO error2
ELSE
MINIF="Posible error en letra final "
ENDIF
*SI NO SON LAS LETRAS DE ARRIBA COMPROBAMOS
ELSE
IF MOD(10-MOD(SUMA,10),10)=VAL(SUBSTR(LENIF,9,1)) THEN
STORE .F. TO error2
ELSE
MINIF="Posible error en dígitos "
ENDIF
ENDIF
ELSE
*ERROR EN LA LONGITUD DEL NIF
MINIF="Longitud incorrecta "
ENDIF
ELSE
IF LETRA="X" THEN
LETRA=RIGHT(LENIF,1)
DNI=VAL(SUBSTR(LENIF,2,8))
STORE MOD(DNI,23) TO NAUX
IF LETRA=SUBSTR(TABLA,NAUX+1,1)
STORE .F. TO error2
IF LEN(LENIF)<9
LENIF="X"+replicate("0",9-len(alltrim(LENIF)))
+alltrim(SUBSTR(LENIF,2,8))
STORE .T. TO error2
MINIF="ERROR*"+LENIF
ENDIF
ELSE
STORE MOD(DNI,23) TO NAUX
STORE " " TO LENIF
STORE "X"+RTRIM(LTRIM(STR(INT(DNI))+SUBSTR(TABLA,NAUX
+1,1))) TO LENIF
IF LEN(LENIF)<9
LENIF="X"+replicate("0",9-len(alltrim(LENIF)))
+alltrim(SUBSTR(LENIF,2,8))
ENDIF
MINIF="Si los números son correctos el NIF es "+LENIF
ENDIF
ELSE
*NO COMIENZA POR LETRA VALIDA
MINIF="Letra de inicio incorrecta "
ENDIF
ENDIF
ELSE
LETRA=RIGHT(LENIF,1)
LETRA=UPPER(LETRA)
DNI=VAL(LENIF)
STORE MOD(DNI,23) TO NAUX
IF LETRA=SUBSTR(TABLA,NAUX+1,1)
STORE .F. TO error2
IF LEN(LENIF)<9
LENIF=replicate("0",9-len(alltrim(LENIF)))+alltrim(LENIF)
STORE .T. TO error2
MINIF="Longitud incorrecta "+LENIF
ENDIF
ELSE
STORE MOD(DNI,23) TO NAUX
STORE " " TO LENIF
STORE RTRIM(LTRIM(STR(INT(DNI))+SUBSTR(TABLA,NAUX+1,1))) TO
LENIF
IF LEN(LENIF)<9
LENIF=replicate("0",9-len(alltrim(LENIF)))+alltrim(LENIF)
ENDIF
MINIF="Si los números son correctos el NIF es "+LENIF
ENDIF
ENDIF
RETURN
On 14 jun, 06:53, Samuel San Miguel Hernández
> >> Gracias.- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -