Aquí tenemos una macro que sirve para validar el código de cuenta bancario, IBAN, que rige en muchos países de Europa, Caribe y Medio Oriente. Se le pasan como parámetros el nombre de la tabla y el nombre del campo que contiene el IBAN en formato electrónico (todos seguido, sin espacios) y devuelve un indicador de si es válido o no y el nomobre de la entidad bancaria a la que pertenece.
El código IBAN tiene tres partes, los dos primeros dígitos corresponden al país, los dos segundos son el código de verificación que se calculan en función de todos los demás y que validan que el código se ha escrito bien; y una última parte que es variable. Cada país define la estructura de esta tercera parte que es un código alfanumérico de hasta 30 caracteres, ya que el código IBAN tiene un máximo de 34 caracteres totales.
En el caso de España, esta tercera parte del IBAN corresponde a 4 dígitos para el código de la entidad bancaria tal y como se lo asigna el Banco de España, otros 4 dígitos para el código de la oficina bancaria, los dos siguientes corresponden al código de verificación del antiguo CCC (el antiguo número de cuenta que teníamos en España), y finalmente 10 caracteres para el número de cuenta bancaria. El total de caracteres para España son 24.
Esta macro valida el código del país, que tiene que estar incluido en la lista de países adjunta a este post, el código de oficina bancaria para los IBAN españoles (también según listado adjunto). Será necesario crear las tabla SAS PAISES y BANCOS respectivamente para que la macro funcione plenamente. Lamentablemente, solo valida códigos IBAN españoles.
%macro normalizar_ccc(tabla=,campo=);
/* Identificar país */
data norm1;
set &tabla;
&campo = upcase(&campo);
pais = substr(&campo,1,2);
verificador = substr(&campo,3,2);
resto = substr(&campo,5);
run;
/* Verificando pais y longitud */
proc sql;
create table norm2 as
select a.*,
longitud,
case when length(&campo) ne longitud then 0
when b.codigo_pais = '' then 0
else 1 end as ind_valido
from norm1 a
left join IBAN b
on a.pais = b.codigo_pais and a.pais = 'ES';
quit;
/* Verificar banco */
proc sql;
create table norm3 as
select a.*,
b.banco
from norm2 a
left join BANCOS b
on substr(&campo,5,4) = input(put(b.codigo_banco,z4.),$4.);
quit;
data norm4;
set norm3;
if banco = '' then ind_valido = 0;
run;
/* validar codigo control */
data norm5 (drop=calculo: modulo);
set norm4;
format calculo1 calculo2 calculo3 32.;
if ind_valido = 1 and longitud = 24 then do;
calculo1 = 0;
calculo2 = 0;
%do x = 5 %to 17;
calculo1 = calculo1 * 10;
if anyalpha(substr(&campo,&x,1)) = 1 then do;
calculo1 = calculo1 * 10;
calculo1 = calculo1 + rank(substr(&campo,&x,1))-55;
end;
else do;
calculo1 = calculo1 + put(substr(&campo,&x,1),8.);
end;
%end;
modulo = mod(calculo1,97);
%do x = 18 %to 24;
calculo2 = calculo2 * 10;
if anyalpha(substr(&campo,&x,1)) = 1 then do;
calculo2 = calculo2 * 10;
calculo2 = calculo2 + rank(substr(&campo,&x,1))-55;
end;
else do;
calculo2 = calculo2 + put(substr(&campo,&x,1),8.);
end;
%end;
%do x = 1 %to 4;
calculo2 = calculo2 * 10;
if anyalpha(substr(&campo,&x,1)) = 1 then do;
calculo2 = calculo2 * 10;
calculo2 = calculo2 + rank(substr(&campo,&x,1))-55;
end;
else do;
calculo2 = calculo2 + put(substr(&campo,&x,1),8.);
end;
%end;
calculo3 = (modulo * (10**ceil(log10(round(calculo2))))) + calculo2;
modulo = mod(calculo3,97);
if modulo ne 1 then do;
ind_valido = 0;
banco = "";
end;
end;
run;
/* salida */
proc sql;
create table &tabla._ as
select a.*, ind_valido, banco
from &tabla a
left join norm5 b
on a.&campo = b.&campo;
quit;
%mend normalizar_ccc;
Descárgate este Excel que contiene los datos que debes incluir en la tabla PAISES y BANCOS:
El algoritmo para validar el IBAN partiendo del número de cuenta, consiste en lo siguiente:
1) Colocer los cuatro primeros caracteres detrás de todos los demás.
2) Sustituir todos los caracteres alfanuméricos que pueda haber por un equivalente numérico de 2 cifras de forma que A=10, B=11, C=12, etc.
3) Dividir la cifre restante entre 97 y tomar el resto de esa división.
4) Si el resto es un 1, entonces el IBAN es correcto.
Para validar la macro con algunos ejemplos de prueba, puedes utilizar lo siguiente:
data CUENTAS;
format ccc $50.;
length ccc $ 50;
input ccc $;
datalines;
ES6621000418401234567891
ES6000491500051234567892
ES9420805801101234567891
ES90002469125012345678910
ES7100302053091234567895
EL71003020530943574567895
ES1000492352082414205416
ES1720852066623456789011
ES4501986746463463463547
ES450198674646D463463547
ES450198674646&463463547
ES450198674646.463463547
ES1346657676431313200000
run;
%normalizar_ccc(tabla=CUENTAS,campo=ccc);