FUN?ÃO PARA VALIDAR PIS

ELMO01 01/05/2015 22:59:02
#446275
Olá pessoal,

Fiz uma função para validar o numero do PIS, mas está dando erro, o digito verificador não tem o valor que é necessário, por isto estou colocando a minha função neste tópico para que me ajudem a descobrir onde eu erro.

Public Function ValidaPIS2(ByVal zcampo As String) As String
Dim zresult, zresto, zdig11, zok, zpis1, zpis2, zpis3, zpis4, zpis5, zpis6, zpis7, zpis8, zpis9, zpis10, zpis11 As Integer

zpis1 = Val(Mid(zcampo, 1, 1)) * 3
zpis2 = Val(Mid(zcampo, 2, 1)) * 2
zpis3 = Val(Mid(zcampo, 3, 1)) * 9
zpis4 = Val(Mid(zcampo, 4, 1)) * 8
zpis5 = Val(Mid(zcampo, 5, 1)) * 7
zpis6 = Val(Mid(zcampo, 6, 1)) * 6
zpis7 = Val(Mid(zcampo, 7, 1)) * 5
zpis8 = Val(Mid(zcampo, 8, 1)) * 4
zpis9 = Val(Mid(zcampo, 9, 1)) * 3
zpis10 = Val(Mid(zcampo, 10, 1)) * 2
zpis11 = Val(Mid(zcampo, 11, 1))

zresult = zpis1 + zpis2 + zpis3 + zpis4 + zpis5 + zpis6 + zpis7 + zpis8 + zpis9 + zpis10

zresto = CInt(zresult Mod 11)
zresto = 11 - zresto
zdig11 = If(zresto > 9, 0, zresto)
zok = True

If zdig11 <> zpis11 Then
zok = False
End If
Return (zok)
End Function

No meu FORM utilizo assim:

Private Sub Txt_PisFunc_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Txt_PisFunc.KeyPress
If e.KeyChar = Convert.ToChar(Keys.Enter) Then
e.Handled = True
Dim Grv_Fun As String
Dim dx As MySqlDataReader
Grv_Fun = [Ô]SELECT * FROM empregado where pis = [ô][Ô] & Me.Txt_PisFunc.Text & [Ô][ô][Ô]
Dim ProConn As New MySqlConnection(StrServFun01)
Dim ProCmd As New MySqlCommand(Grv_Fun, ProConn)
ProConn.Open()
dx = ProCmd.ExecuteReader
If dx.Read Then
MsgBox([Ô]PIS já Cadastrado para [Ô] & dx.Item([Ô]nome[Ô]))
Me.Txt_PisFunc.Clear()
Me.Txt_PisFunc.Focus()
Else
If ValidaPIS2(Me.Txt_PisFunc.Text) = False Then
MsgBox([Ô]PIS cadastrado não confere[Ô])
Me.Txt_PisFunc.Focus()
Else
Me.Txt_PisFunc.MaxLength = 12
Me.Txt_PisFunc.Text = FormataPIS(Me.Txt_PisFunc.Text)
End If
End If
End If
End Sub

Public Function FormataPIS(ByVal xcampo As String) As String
If xcampo <> [Ô][Ô] Then
xcampo = Mid(xcampo, 1, 3) & [Ô].[Ô] & Mid(xcampo, 4, 4) & [Ô].[Ô] & Mid(xcampo, 8, 4) & [Ô]-[Ô] & Mid(xcampo, 11, 1)
Else
xcampo = [Ô][Ô]
End If
Return xcampo
End Function

No caso estou utilizando o seguinte nº de PIS 11111111116, veja que o digito verificador é 6, mas quando rodo o validador que fiz sempre me retorna um outro numero tipo 7, ai dá erro.

Se alguém puder me ajudar ficarei muito grato.

Obrigado.
JABA 02/05/2015 14:18:31
#446289
Veja se esse aqui resolve o teu problema:

Public Function PISPASEP(numero As String)
Dim ftap As String
Dim total As String
Dim i As Integer
Dim resto As Integer

If Val(numero) = 0 Or Len(numero) <> 11 Then
PISPASEP = False
Exit Function
End If

ftap = [Ô]3298765432[Ô]
total = 0

For i = 1 To 10
total = total + Val(Mid(numero, i, 1)) * Val(Mid(ftap, i, 1))
Next i

resto = Int(total Mod 11)

If resto <> 0 Then
resto = 11 - resto
End If

If resto <> Val(Mid(numero, 11, 1)) Then
PISPASEP = False
Exit Function
End If

PISPASEP = True

End Function
JABA 02/05/2015 14:20:04
#446290
public static class ValidaPis
{
public static bool IsPis(string pis)
{
int[] multiplicador = new int[10] { 3,2,9,8,7,6,5,4,3,2 };
int soma;
int resto;
if (pis.Trim().Length != 11)
return false;
pis = pis.Trim();
pis = pis.Replace([Ô]-[Ô], [Ô][Ô]).Replace([Ô].[Ô], [Ô][Ô]).PadLeft(11, [ô]0[ô]);

soma = 0;
for (int i = 0; i < 10; i++)
soma += int.Parse(pis[i].ToString()) * multiplicador[i];
resto = soma % 11;
if ( resto < 2 )
resto = 0;
else
resto = 11 - resto;
return pis.EndsWith(resto.ToString());
}
}
Tópico encerrado , respostas não são mais permitidas