El control valida una cadena numérica "20172543597"
compuesta de 11 dígitos, por lo que previamente deberemos haber
controlado de no haber introducido un valor incorrecto.
Private Sub ValidarCUIT()
'Recogemos el valor del TextBox que sólo contiene número
Dim cadena as string = Me.TextBox.Text
'Valores por los que multiplicaremos cada digito del CUIT
Dim loValores() As Integer = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2}
'Variable donde iremos sumando los valores que obtengamos de multiplicar
'los digitos del cuit por los números de loValores
Dim loProducto As Integer = 0
For index As Integer = 0 To 9
loProducto += (Me.loValores.GetValue(index) * CInt(cadena.Text.Substring(index, 1)))
Next
'Sacamos el mod 11 de loProducto
Dim intMod11 As Integer = loProducto Mod 11
'Restamos el resultado de mod11 a 11
Dim digito As Integer = 11 - intMod11
'Comprobamos que el valor coincida con el dígito de control introducido por el usuario en el TextBox
Dim dc As Integer = CInt(cadena.Text.Substring(10, 1))
If dc = digito Then
'El resultado es correcto
Me.TextBox1.BackColor = Drawing.Color.PaleGreen
Else
'El resultado es incorrecto
Me.TextBox1.BackColor = Drawing.Color.MistyRose
End If
End Sub
Te muestro el código para validar el NASS (Número de afiliación a la
Seguridad Social) en Visual Basic .NET para Windows Form, si quieres
puedes descargarte el archivo con el control terminado que incluye
además otro para validar un DNI.
La cadena que se valida está conpuesta de doce caracteres, "aabbbbbbbbcc", donde los dos primeros ("aa") son el indicativo provincial, los ocho siguientes ("bbbbbbbb") indican la cuenta de cotización de la persona, y los dos últimos ("cc") son los dígitos de control.
Private Sub ValidarNass()
dim strCodigo as String = Me.TextBox1.Text
'Dos primeros dígitos de la cadena "aabbbbbbbbcc" en strCodigo
Dim a As Long = CInt(strCodigo.Text.Substring(0, 2))
'Ultimos dos dígitos de la cadena "aabbbbbbbbcc" en strCodigo
Dim c As Long = CInt(strCodigo.Text.Substring(10, 2))
'Digitos restantes por extraer de la cadena "aabbbbbbbbcc" en strCodigo
Dim b As Long = CInt(strCodigo.Text.Substring(2, 8))
Dim d As Long = Nothing
If b < 10000000 Then
d = b + a * 10000000
Else
d = CLng(strCodigo.Text.Substring(0, 2) & strCodigo.Text.Substring(2, 8))
End If
Dim dc As Long = d Mod 97
If dc = c Then
'Es correcto
Me.TextBox1.BackColor = Drawing.Color.PaleGreen
Else
'es incorrecto
Me.TextBox1.BackColor = Drawing.Color.MistyRose
End If
End Sub
Cuando desarrollamos un sitio web suele ser conveniente o idóneo
guardar ciertos datos en el web.config, por ello es interesante
centralizar el acceso a los datos almacenados en dicho archivo en una
clase específica, que además podremos reutilizar en todos nuestros
proyectos web. Y qué decir de enviar mail, eso no tiene discusión
alguna, por lo que no me extenderé en este punto, sólo decirte que los
datos sobre conexión al servidor de correos los almacenaremos en el
web.config, así evitaremos colocar una cadena de texto en el código y
podremos cambiar la dirección de mail y sus parámetros desde un
formulario web.
Clase SettingsWeb
Desde esta clase podremos leer y
escribir los datos que almacenamos en el archivo web.config de nuestro
sitio web y cambiarlos. Una precisión importante es que el siguiente
código almacena los datos en texto plano, por lo que es muy
recomendable codificar los valores para mantenerlos a salvo de miradas
indiscretas y maliciosas
Previamente debemos añadir a nuestro archivo web.config las propiedades
</system.webServer>
<appSettings>
<!--ENCRIPTAR LOS VALORES SIEMPRE-->
<add key="mail" value="contoso@contoso.es"/>
<add key="servidorSMTP" value="mail.contoso.es"
<add key="cuentaMail" value="contoso@contoso.es"/>
<add key="passMail" value="contraseña"/>
</appSettings>
A continuación podemos crear la clase que manejara el appSetting
Imports System
Imports System.Configuration
Imports System.Web.Configuration
Imports Microsoft.VisualBasic
Public Class SettingsWeb
‘Devuelve los valores que necesitamos para enviar una mail
Public Function DameConfiguracionSMTP() as String()
‘Declaramos la variable que recoge los resultados
Dim returnValue() as String = {"","",""}
With returnValue
‘Recuperamos los valores del web.config por el valor del key
.SetValue(WebConfigurationManager.AppSettings("servidorSMTP"),0)
.SetValue(WebConfigurationManager.AppSettings("passMail"),1)
.SetValue(WebConfigurationManager.AppSettings("cuentaMail"), 2)
End With
Return returnValue
End Function
‘Guardamos los datos para enviar correo electrónico en el web.config
Public Sub GuardarConfiguracionSMTP(ByVal smtp as String, _
ByVal user as String, ByVal pass as String)
WebConfigurationManager.AppSettings("servidorSMTP") = smtp
WebConfigurationManager.AppSettings("cuentaMail") = user
WebConfigurationManager.AppSettings("passMail") = pass
End Function
End Class
Clase EnviarMail
Enviar correo electrónico desde nuestras aplicaciones web que tiene
gran misterio. El propio Framework 2.0 nos provee de una clase que
convierte la tarea en algo sumamente sencillo
Imports System.Net.Mail
Imports Microsoft.VisualBasic
Public Class EnviarMail
Public Function SendMail(ByVal remite As String, ByVal destinatario As String, _
ByVal asunto As String, ByVal mensaje As String) As Integer
'Declaramos una instancia de la clase de acceso al web.config
Dim data As New settings
'Recuperamos los datos necesarios para enviar un mail
Dim mySetting() As String = data.DameConfiguracionSMTP
'Estraermos los valores de setting para clarificar el código
Dim servidor As String = mySetting.GetValue(0)
Dim user As String = mySetting.GetValue(1)
Dim pass As String = mySetting.GetValue(2)
'Creamos un mensaje de correo electrónico
Dim correo As New MailMessage(remite, destinatario, asunto, mensaje)
'Declaramos una variable que nos informe del resultado de la operacion
Dim status As Integer = Nothing
'Controlamos los posibles errores que puedan surgir al enviar el correo
Try
'Declaramos la clase que se encargara de gestionar el envio con el servidor
Dim carrier As New SmtpClient
carrier.UseDefaultCredentials = False
'Le pasamos las credenciales
carrier.Credentials = New Net.NetworkCredential(user, pass)
'Asignamos el puerto
carrier.Port = 25
'Asignamos el servidor
carrier.Host = servidor
'Escogemos el método de envio
carrier.DeliveryMethod = SmtpDeliveryMethod.Network
'Enviamos el correo
carrier.Send(correo)
'Si hemos llegado ha este punto suponemos el éxito
status = 1
Catch ex As Exception
MsgBox("Error: " & ex.Message)
'Se ha producido un error y asignamos un valor para informar
status = 0
End Try
'Devolvemos el resultado de la operación
Return status
End Function
End Class
Con el paso del tiempo todos los programadores creamos
nuestra propia utilería con la cual agilizamos el desarrollo de nuestras
soluciones. Es cierto que con las constantes evoluciones algunas se quedan
obsoletas, pero muchas otras mantienen su vigencia a pesar del discurrir del
tiempo. Una estrategia muy útil es la de crear controles que encapsulen toda la
lógica de validación de datos. En esta línea voy a exponer como crear algunos
controles TextBox para la introducción de DNI, NASS, EAN13 y ISBN en una librería
de controles para posteriormente incorporarlos a nuestro panel de controles en
Visual Studio. Si quieres profundizar en los algoritmos que existen para
validar estos códigos puedes visitar La tecla de
Escape donde encontraras mucha información al respecto, y seguramente la
añadirás a tus favoritos. Al final puedes encontrar un descargable con el
proyecto que contiene el código. Si decides descargarlo y emplearlo
directamente te recomiendo que lo examines, aunque lo he probado, es una buena
costumbre revisar los códigos. Algunas veces los duendes hacen de las suyas y
una coma de comentario mal puesta da al traste con toda una función.
Control TextBox
para validar DNI
Este es un control de obligada presencia para la creación de
toda aplicación de gestión. En este caso vamos a controla la entrada de
caracteres. Tendremos en cuenta que los DNI para extranjeros comienza con X con
lo cual controlaremos dicha eventualidad
El código en cuestión lo que hace es crear un nuevo control
del tipo TextBox, del cual hereda toda su funcionalidad. Lo que hacemos es
personalizar todas las propiedades y eventos que nos interesa. El código es el
siguiente:
Imports System.ComponentModel
<Drawing.ToolboxBitmap("TextBoxDNI.bmp")> _
Public Class TextBoxDNI
Inherits System.Windows.Forms.TextBox
'Variable para almacenar el DNI temporalmente
Private loDNI As String
'Variable que nos indica si es un NIE
Private loNIE As Boolean = False
Private loDNIOK As Boolean
'Esta propiedad nos indica el estado en los procesos de validación de formulario
Public ReadOnly Property DNIOK() As Boolean
Get
Return loDNIOK
End Get
End Property
''' <summary>
''' Sobrecargamos el método de getfocus para seleccionar todo el texto
''' </summary>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
MyBase.OnGotFocus(e)
If Me.TextLength <> 0 Then Me.SelectAll()
End Sub
'
''' <summary>
''' Personalizamos las acciones al perder el foco
''' </summary>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
MyBase.OnLeave(e)
'evaluamos si tiene contenido
If Me.TextLength <> 0 Then
'EVALUAMOS EL DNI SI ES DISTINTO DEL QUE TENEMOS YA
If Me.Text <> loDNI Then
Me.Text.ToUpper()
Me.EvaluarDNI()
End If
Else
'Si está vacia cambiaremos el fondo a predeterminado, por si hubieramos borrado una entrada erronea
Me.BackColor.ToString()
End If
End Sub
'METODO DE VALIDACIÓN
Private Sub EvaluarDNI()
Dim numeros As String = "0123456789"
Dim dc As String = Nothing
If Me.TextLength >= 8 Then
'Extraemos el último caracter
dc = Me.Text.Chars(Me.TextLength - 1)
'Comprobamos que el último caracter sea una letra
If numeros.LastIndexOf(dc) <> -1 Then
'El último caracter es un número
Me.BackColor = Drawing.Color.MistyRose
Me.loDNIOK = False
MsgBox("Falta la letra de control")
'Habilitando la dos líneas siguiente forzamos una introducción válida
'Me.Focus()
'Me.SelectAll()
Else
'Comprobamos si es NIE
If Me.Text.Chars(0) = "X"c Then
If Me.TextLength = 10 Then
loDNIOK = True
loNIE = True
Else
'El NIE es incorrecto
loDNIOK = False
Me.BackColor = Drawing.Color.MistyRose
Me.loDNIOK = False
MsgBox("El NIE debe tener 10 caracteres")
'Habilitando la dos líneas siguiente forzamos una introducción válida
'Me.Focus()
'Me.SelectAll()
End If
Else
If Me.TextLength > 9 Then
'El DNI es incorrecto
loDNIOK = False
Me.BackColor = Drawing.Color.MistyRose
Me.loDNIOK = False
MsgBox("El DNI debe tener máximo 9 caracteres")
'Habilitando la dos líneas siguiente forzamos una introducción válida
'Me.Focus()
'Me.SelectAll()
Else
loDNIOK = True
End If
End If
End If
Else
'Si el resultado es incorrecto por la longitud
Me.BackColor = Drawing.Color.MistyRose
Me.loDNIOK = False
MsgBox("El DNI debe tener almenos 8 caracteres")
'Habilitando la dos líneas siguiente forzamos una introducción válida
'Me.Focus()
'Me.SelectAll()
End If
'Si el resultado previo es correcto valido el DNI
Dim DNI As Integer = Nothing
Dim cadena As String = "TRWAGMYFPDXBNJZSQVHLCKE"
If loDNIOK = True Then
If loNIE = True Then
DNI = CInt(Me.Text.Substring(1, Me.TextLength - 2))
Else
DNI = CInt(Me.Text.Substring(0, Me.TextLength - 1))
End If
Dim letra As String = cadena.Substring(DNI Mod 23, 1)
If letra = dc Then
loDNIOK = True
Me.BackColor = Drawing.Color.PaleGreen
Me.loDNIOK = True
Else
Me.BackColor = Drawing.Color.MistyRose
Me.loDNIOK = False
End If
End If
End Sub
'Limitamos el máximo de caracteres a 10
Public Overrides Property MaxLength() As Integer
Get
Return 10
End Get
Set(ByVal value As Integer)
MyBase.MaxLength = 10
End Set
End Property
End Class
Tienes un archivo zip con el proyecto para que juegues con
el: Controles Tropicalia 0.1.zip