Página 1 de 1

Validação de CEI

Enviado: 10 Ago 2007 01:30
por Maligno
CEI = Cadastro Específico do INSS.

Código: Selecionar todos

//***************************************************************************
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

Re: Validação de CEI

Enviado: 23 Fev 2010 11:59
por Darth GTB
Tchê...

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"

Código: Selecionar todos

PRIVATE nTot, cAux, lRet, i, pNu_cei

nTot = 0
cAux = ""
lRet = .T.
i = 0
pNu_cei = ""

pNu_cei = STRTRAN(m.nu_cei,".")
pNu_cei = STRTRAN(pNu_cei,"/")

IF !EMPTY(pNu_cei)
	IF lRet = (SUBSTR(pNu_cei,11,1) $ "0678") AND VAL(LEFT(pNu_cei,2))	   > 0 AND;
												  VAL(SUBSTR(pNu_cei,3,3)) > 0 AND;
												  VAL(SUBSTR(pNu_cei,6,5)) > 0
		FOR i = 1 TO 11
			nTot = nTot + VAL(SUBSTR(pNu_cei,i,1)) * VAL(SUBSTR("74185216374",i,1))
		ENDFOR
		cAux = RIGHT(STR(nTot,3),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,.T.,.F.)
	ELSE
		lRet = .F.
	ENDIF
	IF !lRet
		WAIT WINDOW "Codigo CEI incorreto - Tecle <Enter>"
		m.nu_cei = "  .   .     /  "
*		_CUROBJ = OBJNUM(m.nu_cei)
	ENDIF
ENDIF
OBS.: o campo pode ficar em branco porque ao invés de CEI a empresa pode ter CNPJ

Obrigado[/color]

Re: Validação de CEI

Enviado: 27 Fev 2010 11:59
por Maligno
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.

http://buzinello.com/pub/tools/valdoc.zip

Re: Validação de CEI

Enviado: 14 Set 2010 13:38
por Programmer
Pessoal,
Para quem está precisando do código para validação de CEI em Visual Basic 6, eis um exemplo:

Código: Selecionar todos

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,