Algoritmo para validar DNI

283 views
Skip to first unread message

ihe...@gmail.com

unread,
Jan 20, 2016, 7:33:04 AM1/20/16
to Comunidad de Visual Foxpro en Español
Hola .
Alguien tiene algún algoritmo para validar el DNI en España????
Y si lo tiene me lo puede pasar??

Muchas gracias de antemano
Irene

Mauricio Gonzalez

unread,
Jan 20, 2016, 7:57:46 AM1/20/16
to Comunidad de Visual Foxpro en Español
este codigo lo encontre aca en el foro, solo es de poner algoritmo dni en buscar:
*
Aca dejo este codigo para los que quieran validar el DNI pero ojo para poder validar se tiene que ingresar el Numero DNI mas el digito de verificacion.
 
? CheckDni("011637057")

*/-- Verificador y Generador de DNI peruano: Antiguos y Nuevos
Function CheckDNI
LParameters tcDni, tlGenera, tlNumero
Local luResult, lnTotal, lnIndex, lnFactor, lnDigito, lnPosicion, lnNumero, lcNumeros, lcLetra, lcLetras
    tlGenera = Iif(Vartype(tlGenera) == "L", tlGenera, .F.)
    tlNumero = Iif(Vartype(tlNumero) == "L", tlNumero, .F.)
    
    If !tlGenera And Len(tcDni) != 9
       Return .T.
    EndIf
   
    lcLetras  = "KABCIEFGHI" && Antiguo DNI
    lcNumeros = "6789011234" && Nuevo DNI
    
    lnTotal   = 0
    For lnIndex = 1 To 8
        lnFactor = Int(Val(Substr("32765432", lnIndex, 1)))
        lnDigito = Int(Val(Substr(tcDni, lnIndex, 1)))
        lnTotal  = lnTotal + (lnFactor * lnDigito)
    EndFor
    lnPosicion = 11 - Mod(lnTotal, 11)
    If lnPosicion = 11
       lnPosicion = 0
     Else
       If lnPosicion = 10
          lnPosicion = 1
       EndIf
    EndIf
    lnNumero = Int(Val(Substr(lcNumeros, lnPosicion + 1, 1)))
    lcLetra  = Substr(lcLetras, lnPosicion + 1, 1)
    If tlGenera
       If tlNumero
          luResult = lnNumero
        Else
          luResult = lcLetra
       EndIf
     Else
       luCheck = Right(tcDni, 1)
       If IsAlpha(luCheck)
          luResult = luCheck == lcLetra
        Else
          luCheck  = Int(Val(luCheck))
          luResult = luCheck == lnNumero
       EndIf
    EndIf
Return (luResult)

José Enrique Llopis

unread,
Jan 20, 2016, 8:03:49 AM1/20/16
to publice...@googlegroups.com

Esta es la función que uso, quita las funciones personalizadas y pon messagebox y te funcionará correctamente.

 

Cualquier duda me lo dices.

 

Saludos,

 

José Enrique Llopis

 

 

 

 

***************************************************************************************

*** Verifica un DNI español

***************************************************************************************

FUNCTION _FFWK_VerificaDNISpain

            LPARAMETER lccadena, llnopreguntar

            LOCAL lnlencad, dnum, primerc, ultimoc, pultimoc, lncont, lnnumnifcif, lcletra

            lnlencad = LEN(lccadena)

            lcauxcad = ALLTRIM(lccadena)

            FOR lncont = 1 TO LEN(lcauxcad)

                        IF !(ISDIGIT(SUBSTR(lcauxcad, lncont, 1)) OR ISALPHA(SUBSTR(lcauxcad, lncont, 1)) OR INLIST(SUBSTR(lcauxcad, lncont, 1), ".", "-", "/"))

                                   lcauxcad = STUFF(lcauxcad, lncont, 1, " ")

                        ENDIF

            ENDFOR

            lcauxcad = ALLTRIM(CHRTRAN(lcauxcad, " ", ""))

            primerc = LEFT(lcauxcad, 1)

            ultimoc = RIGHT(lcauxcad, 1)

            pultimoc = LEFT(RIGHT(lcauxcad, 2), 1)

            IF !ISDIGIT(primerc)

                        RETURN PADR(lcauxcad, lnlencad)

            ENDIF

            IF ISALPHA(pultimoc)

                        RETURN PADR(lcauxcad, lnlencad)

            ENDIF

            dnum = ""

            FOR lncont = 1 TO LEN(lcauxcad)

                        IF ISDIGIT(SUBSTR(lcauxcad, lncont, 1))

                                   dnum = dnum+SUBSTR(lcauxcad, lncont, 1)

                        ENDIF

            ENDFOR

            lnnumnifcif = ABS(VAL(dnum))

            lncont = lnnumnifcif-((INT(lnnumnifcif/23))*23)

            lcletra = SUBSTR("TRWAGMYFPDXBNJZSQVHLCKET", lncont+1, 1)

            DO CASE

                        CASE ISALPHA(ultimoc) AND ultimoc!=lcletra AND lnnumnifcif!=0

                                   IF llnopreguntar OR MESSAGEBOX( _FFWK_TextoTraducido2("El dígito de control de CIF está equivocado.¿Desea corregirlo de forma automática?", 381), 36, _FFWK_TextoTraducido2("Atención", 382) )=6

                                               lcauxcad = STUFF(lcauxcad, LEN(lcauxcad), 1, lcletra)

                                   ENDIF

                        CASE (ISDIGIT(ultimoc) OR EMPTY(ultimoc) OR INLIST(ultimoc, ".", "-")) AND lnnumnifcif!=0

                                   IF llnopreguntar OR MESSAGEBOX("Falta el dígito de control del CIF. "+CHR(13)+"¿ Desea que se añada de forma automática ?", 36, "Atención")=6

                                               lcauxcad = lcauxcad+lcletra

                                   ENDIF

            ENDCASE

            RETURN (lcauxcad)

ENDFUNC

 

 

 


ihe...@gmail.com

unread,
Jan 21, 2016, 5:41:18 AM1/21/16
to Comunidad de Visual Foxpro en Español
Muchisimas gracias.

Irene

javierbar...@gmail.com

unread,
Jan 21, 2016, 5:57:43 AM1/21/16
to Comunidad de Visual Foxpro en Español
En España los DNI también hay que contar con los inmigrantes cuyo número comienza por "X" o "Y" así que al código de Mauricio habría que añadir el siguiente para tener todos controlados.

LOCAL lccif
lccif=ALLTRIM(this.Value)

IF LEFT(lccif,1)="X" OR LEFT(lccif,1)="Y" OR LEFT(lccif,1)="Z"
    lclet1=LEFT(lccif,1)
    lccuer=PADL(SUBSTR(lccif,2,9),8,"0")
    lccif=lclet1+lccuer
    this.Value=lccif
    this.Refresh
    lclet2=RIGHT(lccif,1)
    IF lclet1="X"
        lcnum="0"+SUBSTR(lccif,2,7)
    ENDIF
    IF lclet1="Y"
        lcnum="1"+SUBSTR(lccif,2,7)
    ENDIF
    IF lclet1="Z"
        lcnum="2"+SUBSTR(lccif,2,7)
    ENDIF

    lcletc= SUBSTR( "TRWAGMYFPDXBNJZSQVHLCKET", MOD( VAL( lcnum ), 23 ) + 1, 1 )
    IF Lclet2 != lcletc
        MESSAGEBOX("Letra errónea. La correcta es "+lcletc,16,"A T E N C I O N")
        RETURN .T.
    ENDIF
RETURN .T.
ENDIF





El miércoles, 20 de enero de 2016, 13:33:04 (UTC+1), ihe...@gmail.com escribió:

Luis Maria Guayan

unread,
Jan 21, 2016, 8:22:01 AM1/21/16
to publice...@googlegroups.com
-- Calcular la letra de un DNI (para España) --
http://comunidadvfp.blogspot.com/2001/08/calcular-la-letra-de-un-dni-para-espana.html

Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

El 20/01/16 a las 09:33, ihe...@gmail.com escribió:

Miguel A.

unread,
Jan 21, 2016, 1:47:53 PM1/21/16
to Comunidad de Visual Foxpro en Español
Hay que ver cómo proliferan las respuestas cuando hay una chica preguntando!!!; hasta el gran jefe blanco se apunta a tirar de esta cuerda. Estoy valorando cambiar de nic y poner uno más femenino; bueno, mientras me lo pienso..., os envío un código para validar cualquier NIF/CIF en España, o sea de cualquier tipo de persona, ya sea física o jurídica.

Ah!, y juro que el prg anexo no contiene chistes, ni comentarios chistosos; por lo que espero que no desaparezca este mensaje repentinamente, como es costumbre últimamente. Saludos,
Miguel
cif-nif.prg

José Enrique Llopis

unread,
Jan 21, 2016, 1:56:05 PM1/21/16
to publice...@googlegroups.com

Por favor manda el mensaje adjunto con otra extensión, Outlook se lo carga, gracias.

 

Es que me interesa el tema. Un abrazo a todos,

 

 

José Enrique Llopis

 

 


De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Miguel A.


Enviado el: jueves, 21 de enero de 2016 19:48
Para: Comunidad de Visual Foxpro en Español

Miguel A.

unread,
Jan 21, 2016, 2:10:42 PM1/21/16
to Comunidad de Visual Foxpro en Español
Ahí va comprimido en formato zip, si le sigue dando problemas se lo envío a su email Sr. Bernabeu.
Saludos,
Miguel
cifnif._zip

José Enrique Llopis

unread,
Jan 21, 2016, 4:56:56 PM1/21/16
to publice...@googlegroups.com

¡Gracias!   Un abrazo amigo

Reply all
Reply to author
Forward
0 new messages