jueves, 29 de octubre de 2009

Cálculo del dígito de Control de una cuenta corriente

Codificar un programa VB.net que lea la cuenta corriente de una persona desde cuatro campos:

- Entidad 4 posiciones (sólo números)
- Oficina 4 posiciones (sólo números)
- Digitocontrol 2 posiciones (sólo números)
- Número de cuenta 10 posiciones (sólo números)

Cogeremos el valor de los 4 campos y validaremos que en base a una fórmula el valor introducido en el campo dígito de control “Correcto” o “Incorrecto”.

La forma de calcular el dígito de control es esta:

La primera cifra del banco se multiplica por 4.
La segunda cifra del banco se multiplica por 8.
La tercera cifra del banco se multiplica por 5.
La cuarta cifra del banco se multiplica por 10.

La primera cifra de la entidad se multiplica por 9.
La segunda cifra de la entidad se multiplica por 7.
La tercera cifra de la entidad se multiplica por 3.
La cuarta cifra de la entidad se multiplica por 6.

Se suman todos los resultados obtenidos.
Se divide entre 11 y nos quedamos con el resto de la división.
A 11 le quitamos el resto anterior, y ese el el primer dígito de control, con la salvedad de que si nos da 10, el dígito es 1

Para obtener el segundo dígito de control:
La primera cifra de la cuenta se multiplica por 1
La primera cifra de la cuenta se multiplica por 2
La primera cifra de la cuenta se multiplica por 4
La primera cifra de la cuenta se multiplica por 8
La primera cifra de la cuenta se multiplica por 5
La primera cifra de la cuenta se multiplica por 10
La primera cifra de la cuenta se multiplica por 9
La primera cifra de la cuenta se multiplica por 7
La primera cifra de la cuenta se multiplica por 3
La primera cifra de la cuenta se multiplica por 6
Se suman todos los resultados obtenidos.
Se divide entre 11 y nos quedamos con el resto de la división.
A 11 le quitamos el resto anterior, y ese el el segundo dígito de control, con la salvedad de que si nos da 10, el dígito es 1

Crearemos un winForm con 5 campos de texto y un botón.

Damos doble click al botón y escribimos este código

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim campovalido As Boolean = True 'Por defecto somos unos máquinas y todo está bien
If TextBox1.Text.Length <> 4 Then 'Si la entidad no tiene 4 dígitos el campo está mal
campovalido = False
End If
If TextBox2.Text.Length <> 4 Then 'Si la oficina no tiene 4 dígitos el campo está mal
campovalido = False
End If
If TextBox3.Text.Length <> 2 Then 'Si el digito de control no tiene 2 dígitos el campo está mal
campovalido = False
End If
If TextBox4.Text.Length <> 10 Then 'Si el numero de cuenta no tiene 10 dígitos el campo está mal
campovalido = False
End If
If campovalido = True Then
TextBox5.Text = sBankControlDigit(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text)
Else
TextBox5.Text = "Cuenta con formato incorrecto"
End If
End Sub

Con esto controlamos que los campos de la cuenta tienen el número de dígitos adecuado.

En esta línea: TextBox5.Text = sBankControlDigit(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text) llamamos a la función que compobará si el dígito de control es correcto.

Como aún no la hemos añadido al form1.vb nos aparecerá un error diciendo que sBankControlDigit no está declarada. Para solucionarlo, escribimos la siguiente función:

Function sBankControlDigit(ByVal sBank As String, ByVal sSubBank As String, ByVal sControlDigit As String, ByVal sAccount As String) As String

Dim Temporal As Integer

Temporal = 0
Temporal = Temporal + Mid(sBank, 1, 1) * 4 'Primer dígito de la entidad
Temporal = Temporal + Mid(sBank, 2, 1) * 8
Temporal = Temporal + Mid(sBank, 3, 1) * 5
Temporal = Temporal + Mid(sBank, 4, 1) * 10 'Cuarto dígito de la entidad
Temporal = Temporal + Mid(sSubBank, 1, 1) * 9 'Primer dígito de la oficina
Temporal = Temporal + Mid(sSubBank, 2, 1) * 7
Temporal = Temporal + Mid(sSubBank, 3, 1) * 3
Temporal = Temporal + Mid(sSubBank, 4, 1) * 6 'Cuarto dígito de la oficina
Temporal = 11 - (Temporal Mod 11)
If Temporal = 11 Then
sBankControlDigit = "0"
ElseIf Temporal = 10 Then
sBankControlDigit = "1"
Else
sBankControlDigit = Format(Temporal, "0") 'Primer dígito del dígito de control calculado
End If

Temporal = 0
Temporal = Temporal + Mid(sAccount, 1, 1) * 1 'Primer dígito del número de cuenta
Temporal = Temporal + Mid(sAccount, 2, 1) * 2
Temporal = Temporal + Mid(sAccount, 3, 1) * 4
Temporal = Temporal + Mid(sAccount, 4, 1) * 8
Temporal = Temporal + Mid(sAccount, 5, 1) * 5
Temporal = Temporal + Mid(sAccount, 6, 1) * 10
Temporal = Temporal + Mid(sAccount, 7, 1) * 9
Temporal = Temporal + Mid(sAccount, 8, 1) * 7
Temporal = Temporal + Mid(sAccount, 9, 1) * 3
Temporal = Temporal + Mid(sAccount, 10, 1) * 6 'Décimo dígito del número de cuenta
Temporal = 11 - (Temporal Mod 11)
If Temporal = 11 Then
sBankControlDigit = sBankControlDigit + "0" 'Concatenamos el segundo dígito al que obtuvimos antes
ElseIf Temporal = 10 Then
sBankControlDigit = sBankControlDigit + "1" 'Concatenamos el segundo dígito al que obtuvimos antes
Else
sBankControlDigit = sBankControlDigit + Format(Temporal, "0") 'Concatenamos el segundo dígito al que obtuvimos antes
End If
If sBankControlDigit = sControlDigit Then 'Comprobamos si coincide con el que se introdujo en el campo
Return "Correcto"
Else
Return "Incorrecto"
End If
End Function

Como hemos dicho, los campos, sólo puede contener números. Por ello, controlaremos que sólo se puedan escribir números con este procedimiento:

Private Sub DNI_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress, TextBox3.KeyPress, TextBox4.KeyPress
e.KeyChar = e.KeyChar.ToString.ToUpper
If (e.KeyChar < "0" Or e.KeyChar > "9") And (e.KeyChar <> vbBack) Then
e.Handled = True
End If
End Sub

Bueno, pues ya lo tenemos!!!

No hay comentarios:

Publicar un comentario