Pessoal, um colega perguntou se eu sabia como fazer, pesquisando achei alguns exemplos em outras linguagens e migrei para nossa.
Segue abaixo exemplo.
PORÉM SEGUINTE: Testei a validação de 3 nrs de título e deram certo, mas o do colega em questão não deu certo, então se puderem dar uma olhada e testarem tb agradeço...
Seguem tb
links de onde foi baseado o código.
Código: Selecionar todos
Proc Main()
local cTitulo := SPACE(12), lOk := .F.,;
cMsg := 'T¡tulo Eleitoral '
cls
@ 10,10 say 'Informe o Nr. do T¡tulo: ' GET cTitulo PICT '999999999999'
READ
IF lastkey()==27 .or. Empty(ctitulo)
quit
endif
lOk := ValidaTituloEleitor(cTitulo)
Alert( cMsg + IF( lOk, 'Valido','Invalido') )
return
function ValidaTituloEleitor( cTitulo )
local d1 := 0, d2 := 0, d3 := 0, d4 := 0,;
d5 := 0, d6 := 0, d7 := 0, d8 := 0,;
d9 := 0, d10 := 0, d11 := 0, d12 := 0,;
DV1 := 0, DV2 := 0, UltDig := 0, lOk := .F.
cTitulo := ALLTRIM(cTitulo)
*-- Completa com zeros a esquerda caso nao esteja com os 12 digitos
if Len(cTitulo) < 12
cTitulo = PADL(cTitulo, 12, '0')
endIf
*-- 'Pega a posicao do ultimo digito
UltDig := Len(cTitulo)
*-- Sai da funcao caso a esteja vazia
if cTitulo = "000000000000"
return .F.
endIf
*-- Pega cada digito do CPF informado e coloca nas variáveis especificas
d1 = Int(VAL(SUBSTR(cTitulo, UltDig - 11, 1)))
d2 = Int(VAL(SUBSTR(cTitulo, UltDig - 10, 1)))
d3 = Int(VAL(SUBSTR(cTitulo, UltDig - 9, 1)))
d4 = Int(VAL(SUBSTR(cTitulo, UltDig - 8, 1)))
d5 = Int(VAL(SUBSTR(cTitulo, UltDig - 7, 1)))
d6 = Int(VAL(SUBSTR(cTitulo, UltDig - 6, 1)))
d7 = Int(VAL(SUBSTR(cTitulo, UltDig - 5, 1)))
d8 = Int(VAL(SUBSTR(cTitulo, UltDig - 4, 1)))
d9 = Int(VAL(SUBSTR(cTitulo, UltDig - 3, 1)))
d10 = Int(VAL(SUBSTR(cTitulo, UltDig - 2, 1)))
d11 = Int(VAL(SUBSTR(cTitulo, UltDig - 1, 1)))
d12 = Int(VAL(SUBSTR(cTitulo, UltDig, 1)))
//----------- Aqui e executado o calculo para obter os digitos verificadores corretos
DV1 := (d1 * 2) + (d2 * 3) + (d3 * 4) + (d4 * 5) + (d5 * 6) + (d6 * 7) + (d7 * 8) + (d8 * 9)
DV1 := Mod(DV1,11) //'Obtem o resto
//se o resto for igual a 10 altera pra 0
If DV1 = 10
DV1 := 0
EndIf
DV2 = (d9 * 7) + (d10 * 8) + (DV1 * 9)
DV2 = MOD(DV2,11) // Obtem o resto
//se o resto for igual a 10 altera pra 0
If DV2 = 10
DV2 = 0
EndIf
*---------- Fazendo a comparação dos dvs informados -------
If d11 == DV1 .And. d12 = DV2
If Int(d9 + d10) > 0 .And. Int(d9 + d10) < 29
lOk := .T.
EndIf
EndIf
return lOk
[]´s