//***************************************************************************
function ValidCEI(cCEI)
local nTot := 0
local cAux
local lRet
local i
*
if (lRet := SubStr(cCEI,11,1) $ "0678" .and. Val( Left(cCEI,2 )) > 0 .and.;
Val(SubStr(cCEI,3,3)) > 0 .and.;
Val(SubStr(cCEI,6,5)) > 0 )
for i := 1 to 11
nTot += Val(SubStr(cCEI,i,1)) * Val(SubStr("74185216374",i,1))
next
cAux := Right(Str(nTot,3),2)
nTot := Val(Left(cAux,1)) + Val(Right(cAux,1))
nTot := if(nTot>9, 0, 10-nTot)
lRet := Val(Right(cCEI,1)) = nTot
end
return lRet
[]'s
Maligno
--- Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
--- Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
eu estava precisando deste validador para um programa em FoxPro que estou fazendo, mas achei um pouco confuso teu código pois tu não estás iniciando as variáveis e em meus testes, necessariamente o IF deveria ter um ELSE porque se eu deixasse o lRet inicialmente .F., meus dois exemplos de CEI passavam reto pelo IF e o lRet ficava .F.. Caso eu iniciasse ele como .T., meus exemplos de CEI inválido então passavam reto e o lRet mantinha-se .T.
modifiquei ele um pouco mas isto não me deixou muito confiante... gostaria que se pudesses dar uma olhada no código que fiz para dizer o que achas...
ele encontra-se dentro de uma tela de cadastro de empresas na VALID de um campo chamado m.nu_cei com máscara "99.999.99999/99"
Não deixei de inicializar as variáveis. Elas apenas não foram todas inicializadas junto às suas declarações. Muitas vezes faço isso (na linguagem que assim permite) pra economizar código desnecessário, desde que não comprometa a legibilidade.
Da forma que você fez até funciona bem, apesar de haver código redundante. Li sua função e tudo me parece que funcionalmente correto. Acho que você pode confiar.
Mas se quiser outro código diferente, tenho um utilitário simples destinado a validar este e vários outros documentos, feito em C++. Não lembro se é a versão mais recente, mas pode ajudar. A versão mais nova também gera DVs para alguns números de documentos. Se não tiver isso, então é a versão mais antiga. Não posso conferir isso agora. Estou fora da minha base.
[]'s
Maligno
--- Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
--- Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Function valida_CEI(ByVal pCEI As String) As Boolean
Dim nTot As Byte
Dim cAux As String
Dim lRet As Boolean
Dim i As Byte
Dim pNu_cei As String
valida_CEI = False
nTot = 0
cAux = ""
lRet = True
i = 0
pNu_cei = ""
pNu_cei = Trim$(pCEI)
If Len(pNu_cei) < 12 Then
Exit Function
End If
For i = 1 To 11
nTot = nTot + Val(Mid$(pNu_cei, i, 1)) * Val(Mid$("74185216374", i, 1))
Next
cAux = Right$(str(nTot), 2)
nTot = Val(Left$(cAux, 1)) + Val(Right$(cAux, 1))
nTot = IIf(nTot > 9, 0, 10 - nTot)
lRet = IIf(Val(Right$(pNu_cei, 1)) = nTot, True, False)
If lRet = False Then
MsgBox "Codigo CEI incorreto - Tecle <Enter>"
Else
valida_CEI = True
End If
End Function
Sds,
Editado pela última vez por Maligno em 14 Set 2010 14:07, em um total de 1 vez.
Razão:Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1