Los números de cuenta bancaria en Venezuela llevan un par de dígitos de control para evitar posibles problemas de transcripción. La forma de validarlos es muy sencilla.
En primer lugar, debemos darnos cuenta de que un número de cuenta completo está formado por varias partes:
En total, 20 dígitos.
.
El primero de los dígitos de control se calcula a partir de los cuatro dígitos de la entidad más los cuatro dígitos de la sucursal.
El segundo dígito de control se calcula a partir de los diez dígitos de la cuenta.
El algoritmo es de tipo checksum, en el que se multiplica cada dígito de la cuenta empezando por el de más a la derecha por un peso específico que se obtiene de la siguiente tabla según su posición. Estas multiplicaciones se suman y si el resultado es s, se el dígito de control se calcula de la siguiente manera:
En primer lugar, debemos darnos cuenta de que un número de cuenta completo está formado por varias partes:
- 4 dígitos que identifican a la entidad bancaria
- 4 dígitos que identifican a la sucursal
- 2 dígitos de control
- 10 dígitos que son el número de cuenta dentro de la sucursal
En total, 20 dígitos.
.
El primero de los dígitos de control se calcula a partir de los cuatro dígitos de la entidad más los cuatro dígitos de la sucursal.
El segundo dígito de control se calcula a partir de los diez dígitos de la cuenta.
El algoritmo es de tipo checksum, en el que se multiplica cada dígito de la cuenta empezando por el de más a la derecha por un peso específico que se obtiene de la siguiente tabla según su posición. Estas multiplicaciones se suman y si el resultado es s, se el dígito de control se calcula de la siguiente manera:
- dc=(11-(s mod 11))
- si (dc==11) entonces dc=0
- si dc (dc==10) entonces dc=1
A continuación muestro como implementar la validación módulo 11 en .NET y SQL Server
public bool ValidaModulo11(string cuentaCliente)
{
string entidad = cuentaCliente.Substring(0, 4);
string sucursal = cuentaCliente.Substring(4, 4);
string DC = cuentaCliente.Substring(8, 2);
string cuenta = cuentaCliente.Substring(10);
string dcCalculado = DigitosControl(entidad, sucursal, cuenta).ToString();
if (dcCalculado != DC)
{
return false;
}
else
{
return true;
}
}
static string DigitosControl(string entidad, string sucursal, string cuenta)
{
string d = dc(entidad + sucursal, false);
d += dc(sucursal + cuenta, true);
return d;
}
static string dc(string numero, bool esCuenta)
{
int[] pesos;
if (esCuenta == false)
{
pesos = new int[] { 3, 2, 7, 6, 5, 4, 3, 2, 5, 4, 3, 2 };
}
else
{
pesos = new int[] { 3, 2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 };
}
int contador = 0;
long s = 0, d;
bool fin = false;
while (fin == false)
{
d = int.Parse(new string(numero[contador], 1));
s += d * pesos[contador];
contador++;
if (contador == numero.Length)
fin = true;
}
int resultado = (int)(11 - (s % 11));
if (resultado == 10)
resultado = 0;
else if (resultado == 11)
resultado = 1;
return resultado.ToString();
}
}
EN SQL:
CREATE FUNCTION [dbo].[validaModulo11]
(
@cuentaBancaria nvarchar(30)
)
RETURNS bit -- 0 cuenta incorrecta / 1 cuenta correcta
AS
BEGIN
--
--Variable con el valor que retornara la función.
DECLARE @Resultado bit
--
DECLARE @subCadena1 nvarchar(10)
DECLARE @subCadena2 nvarchar(15)
--
DECLARE @control nvarchar(5)
DECLARE @peso1 nvarchar(10)
DECLARE @peso2 nvarchar(15)
SET @Resultado= 0
if (len(@cuentaBancaria)= 20 and ISNUMERIC(@cuentaBancaria)=1) --Es un numero de cuenta valido
begin
SET @peso1 ='32765432'
SET @peso2='32765432765432'
SET @subCadena1=SUBSTRING(@cuentaBancaria,1,8)
SET @subCadena2=SUBSTRING(@cuentaBancaria,5,4)+SUBSTRING(@cuentaBancaria,11,10)
select @control=dbo.calcularControlBanco(@peso1,@subCadena1)+ dbo.calcularControlBanco(@peso2,@subCadena2)
IF(@control=SUBSTRING(@cuentaBancaria,9,2))
SET @Resultado= 1
end
RETURN @Resultado
END
GO
CREATE FUNCTION [dbo].[calcularControlBanco]
(
@peso nvarchar(20),
@digitos nvarchar(20)
)
RETURNS nvarchar(5)
AS
BEGIN
DECLARE @suma int
DECLARE @control int
DECLARE @varIndice int
set @suma=0
set @varIndice=1
WHILE len(@digitos)>=@varIndice
BEGIN
SET @suma = @suma + cast(CAST(SUBSTRING(@digitos,@varIndice,1) AS INT)* CAST(SUBSTRING(@peso,@varIndice,1) AS INT) as nvarchar(30))
SET @varIndice=@varIndice+1
END
set @control= 11-(@suma%11)
if(@control=10)
set @control=0
else
begin
if (@control =11)
set @control=1
end
return convert(nvarchar(5),@control)
END
Excelente información Omar, Gracias!
ResponderBorrargracias
ResponderBorrarseria excelente disponer de la formula afuera de lenguajes de programación
ResponderBorrar