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

ir al índice