17 de agosto de 2012

Validar DNI Peruano

Aquí les dejo una rutina para validar el DNI Peruano ya sea los antiguos o los nuevos:

? 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)
Saludos.

Roberto Reategui Kanashiro