Validar
(Validar
Número de Cuenta Bancaria y Letra NIF)
Fecha: 26-Jun-97
Autor: Carlos Barreira
Date sent: Wed, 4 Jun 1997
22:49:43 +0200
From: "C. Barreira" <tuto@redestb>
Lo que mando es una Clase para
validar números de Cuenta Bancarios y por el mismo precio ;-)
una clase para validar y/o calcular la letra del NIF.
Ya se que no descubro América (sobre todo con la segunda clase
pero ya dije que es un añadido) pero no encontré nada parecido
en la red, por lo que me parece que puede resultarle útil a
mucha gente, sobre todo si se dedica a la programación de
gestión.
La forma de codificación es por supuesto muy discutible y por
ello agradeceré cualquier comentario.
Incluyo un pequeño form de prueba de las clases y un comentario
sobre ellas al principio de cada una.
Lo que no he comentado son los procedimientos en si, pues creo
que no son complicados, aun así estoy a disposición de todos.
Un Saludo.
P.D. La forma de eliminar todo lo que no sean números de un
string es una pequeña modificación de una rutina tuya.
Mi opinión es que así te ahorras la constante de números.
Listados y Diseño del Form de prueba.
El Form:
Option Explicit
Dim Cuenta As New clsCuentaBancaria
Dim Nif As New clsNIF
Private Sub cmdCalcularLetra_Click()
Nif.DarFormato = False
Nif = txtNIF
If Nif.Err Then
txtNIF = "Error"
Else
txtNIF = Nif
End If
'If Nif.Validar(txtNIF) Then
' txtNIF = "Error"
' Else
' txtNIF = Nif
'End If
End Sub
Private Sub cmdSalir_Click()
Unload Me
End Sub
Private Sub cmdValidar_Click()
Cuenta.DarFormato = False
Cuenta = txtCuenta
If Cuenta.Err Then
txtCuenta = "Error"
Else
txtCuenta = Cuenta
End If
'If Cuenta.Validar(txtCuenta) Then
' txtCuenta = "Error"
' Else
' txtCuenta = Cuenta
'End If
End Sub
La Clase clsCuentaBancaria.cls
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsCuentaBancaria"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
'****************************************
' (c) Carlos Augusto Barreira Díaz
' Fecha Creación: 03/06/97
'
' Finalidad: Proporcionar una clase para validar números de Cuenta Bancario.
'
' Premisas y efectos: Su funcinamiento es totalmente autonomo.
'
' Funcionamiento: Hay dos formas de usar esta clase:
' 1.- Asignar a la Propiedad Cuenta (Que es la propiedad predeterminada)
' un valor de tipo string (es igual el formato ya que elimina todo lo que no
' sean numeros) y luego comprobar la propiedad Err.
' 2.- Usar la función Validar pasandole el nº de cuenta en un string y opcionalmente
' si se quiere pasar un boolean para dar formato al nº de cuenta (por defecto es true).
' Esta función devuelve el valor de la propiedad Err.
'
'**************************************
Option Explicit
Private Const strSep = "-"
Private mstrCuenta As String
Private mblnErr As Boolean
Private mblnDarFormato As Boolean
Private mintPesos(1 To 10) As Integer
Private strText1 As String, strBanco As String, strOficina As String, strCuenta As String, strDC1 As String, strDC2 As String
Private strDC1Bueno As String, strDC2Bueno As String
Public Property Get Err() As Boolean
Err = mblnErr
End Property
Public Property Get DarFormato() As Boolean
Attribute DarFormato.VB_Description = "Si es True (Valor por defecto) se da formato al nº de cuenta despues de validar correctamente el nº."
DarFormato = mblnDarFormato
End Property
Public Property Let DarFormato(blnDarFormato As Boolean)
mblnDarFormato = blnDarFormato
End Property
Public Property Let Cuenta(ByVal vData As String)
mstrCuenta = vData
Validar_Todo
End Property
Public Property Get Cuenta() As String
Attribute Cuenta.VB_UserMemId = 0
Cuenta = mstrCuenta
End Property
Public Function Validar(strCuentaBanco As String, Optional blnDarFormato As Boolean = True) As Boolean
mstrCuenta = strCuentaBanco
mblnDarFormato = blnDarFormato
Validar_Todo
Validar = mblnErr
strCuentaBanco = mstrCuenta
End Function
Private Sub Class_Initialize()
mstrCuenta = ""
mblnErr = True: mblnDarFormato = True
mintPesos(1) = 6: mintPesos(2) = 3: mintPesos(3) = 7: mintPesos(4) = 9: mintPesos(5) = 10
mintPesos(6) = 5: mintPesos(7) = 8: mintPesos(8) = 4: mintPesos(9) = 2: mintPesos(10) = 1
End Sub
Private Sub Validar_Todo()
Dim i As Integer
mblnErr = False
strText1 = "" 'Eliminar todo menos los numeros
For i = 1 To Len(mstrCuenta)
If IsNumeric(Mid$(mstrCuenta, i, 1)) Then
strText1 = strText1 + Mid$(mstrCuenta, i, 1)
End If
Next
If Len(strText1) <> 20 Then
mblnErr = True
Else
strBanco = Mid(strText1, 1, 4)
strOficina = Mid(strText1, 5, 4)
strDC1 = Mid(strText1, 9, 1)
strDC2 = Mid(strText1, 10, 1)
strCuenta = Mid(strText1, 11, 10)
If Not Validar_cuenta(strBanco & strOficina, strDC1, False, strDC1Bueno) Then
mblnErr = True
ElseIf Not Validar_cuenta(strCuenta, strDC2, True, strDC2Bueno) Then
mblnErr = True
ElseIf mblnDarFormato Then
mstrCuenta = strBanco & strSep & strOficina & strSep & strDC1 & strDC2 & strSep & strCuenta
End If
End If
End Sub
Private Function Validar_cuenta(ByVal num As String, ByVal cc As String, ByVal Cuenta As Boolean, Optional strDcCorrecto As String) As Boolean
Dim contpesos As Integer, contnum As Integer, suma As Long, resto As Integer, ccc As Integer
If Cuenta Then
contpesos = 10 'se paso un nº de cuenta
Else
contpesos = 8 ' se paso el nº de banco y oficina
End If
For contnum = 1 To Len(num)
suma = suma + (mintPesos(contpesos) * CLng(Mid(num, contnum, 1)))
contpesos = contpesos - 1
Next
resto = suma Mod 11
ccc = 11 - resto
If ccc = 10 Then ccc = 1
If ccc = 11 Then ccc = 0
If ccc = CInt(cc) Then
Validar_cuenta = True
Else
Validar_cuenta = False
End If
If Not IsMissing(strDcCorrecto) Then
strDcCorrecto = CStr(ccc)
End If
End Function
La Clase: clsNIF.cls
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsNIF"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
'****************************************
' (c) Carlos Augusto Barreira Díaz
' Fecha Creación: 03/06/97
'
' Finalidad: Proporcionar una clase para validar y calcular letra del NIF.
'
' Premisas y efectos: Su funcinamiento es totalmente autonomo.
'
' Funcionamiento: La clase puede validar y calcular la letra del nif para
' ello asume que si la ultima letra del string que se le pasa es una letra valida
' lo que se quiere es validar el nif y si no lo que se quiere es calcular el NIF
' el resto de caracteres solo son significativos si son numericos. Así pues el
' funcionamiento es de dos formas:
' 1.- Asignar a la Propiedad NIF (Que es la propiedad predeterminada)
' un valor de tipo string (es igual el formato ya que elimina todo lo que no
' sean numeros) y luego comprobar la propiedad Err.
' 2.- Usar la función Validar pasandole el nº de NIF en un string y opcionalmente
' si se quiere dar formato al nº de cuenta (por defecto es true). Esta función
' devuelve el valor de la propiedad Err.
' En ambos casos la propiedad NIF contiene el NIF resultado segun los calculos
' o formato indicados.
'**************************************
Option Explicit
Private Const strLetras = "TRWAGMYFPDXBNJZSQVHLCKE"
Private Const strSep = "-"
Private mstrNIF As String 'copia local
Private mstrLetra As String, mstrLetraBuena As String
Private lngNIF As Long
Private blnErr As Boolean, blnFormat As Boolean
Public Property Let DarFormato(blnFor As Boolean)
blnFormat = blnFor
End Property
Public Property Get DarFormato() As Boolean
DarFormato = blnFormat
End Property
Public Property Get Err() As Boolean
Err = blnErr
End Property
Public Property Get Letra() As String
Letra = mstrLetra
End Property
Public Property Let Nif(ByVal vData As String)
mstrNIF = vData
Validar_NIF
End Property
Public Property Get Nif() As String
Attribute Nif.VB_UserMemId = 0
Nif = mstrNIF
End Property
Public Function Validar(Nif As String, Optional Format As Boolean = True) As Boolean
mstrNIF = Nif
blnFormat = Format
Validar_NIF
Validar = Err
Nif = mstrNIF
End Function
Private Sub Validar_NIF()
Dim strN As String
blnErr = False
strN = Dejar_Numeros(mstrNIF)
If strN = "" Then
blnErr = True
mstrLetraBuena = "" ': mstrNIF = ""
Else
lngNIF = CLng(strN)
mstrLetra = UCase(Mid(mstrNIF, Len(mstrNIF), 1))
mstrLetraBuena = CalcularLetra
If InStr(strLetras, mstrLetra) Then
'se desea validar
If mstrLetra <> mstrLetraBuena Then
blnErr = True ': mstrNIF = ""
End If
Else
mstrNIF = mstrNIF + mstrLetraBuena
End If
'si no se produjo error
If (Not blnErr) And blnFormat Then
mstrNIF = Format(lngNIF, "00,000,000") & strSep & mstrLetraBuena
End If
End If
End Sub
Private Function CalcularLetra() As String
CalcularLetra = Mid(strLetras, 1 + (lngNIF Mod 23), 1)
End Function
Private Function Dejar_Numeros(strN As String) As String
Dim i As Integer
For i = 1 To Len(strN)
If IsNumeric(Mid$(strN, i, 1)) Then
Dejar_Numeros = Dejar_Numeros + Mid$(strN, i, 1)
End If
Next
End Function
Private Sub Class_Initialize()
blnFormat = True
End Sub