Entrar    
 
Home My Page Code Snippets Cursos
 

Browse | Submit A New Snippet | Create A Package

 

Función para calcular el IBAN

Type:
Function
Category:
Database Manipulation
License:
GNU General Public License
Language:
SQL
 
Description:
Función para calcular el IBAN desde la cuenta bancaria.

Versions Of This Snippet::

Danny García Hernández
Snippet ID Download Version Date Posted Author Delete
11.002014-01-09 14:06Danny García Hernández

Download a raw-text version of this code by clicking on "Download Version"

 


Latest Snippet Version: :1.00

set term ^;
commit work^

execute procedure ur_borra_procedimiento('CALCULAR_IBAN')^
commit work^

CREATE PROCEDURE CALCULAR_IBAN (
    PAIS CHAR(2),
    CUENTA VARCHAR(30) )
RETURNS (
    IBAN VARCHAR(34) )
AS
DECLARE VARIABLE caracteres varchar(26); 
declare variable posicion smallint;
declare variable posicion1 smallint;
declare variable posicion2 smallint;
declare variable encontrado smallint;
declare variable encontrado1 smallint;
declare variable encontrado2 smallint;
declare variable paisnum varchar(4);
declare variable cuentapais varchar(36);
declare variable cuentaaux varchar(9);
declare variable valormod integer;
declare variable cantidad smallint;
BEGIN
  pais = UPPER(pais);
  /* Tabla de conversión de caracteres de paises */
  caracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  paisnum = '';
  
  /* Encontrar posición de la primera y segunda letra del pais en la tabla */
  posicion = 0;
  encontrado1 = 0;
  encontrado2 = 0;
  posicion1   = 1;
  posicion2   = 1;
  
  while ((posicion <= 26) and (encontrado1 = 0 or encontrado2=0)) do
  begin
    posicion = posicion + 1;
    if (SUBSTR(pais,1,1) = SUBSTR(caracteres,posicion,posicion)) then
    begin
      encontrado1 = 1;
      posicion1 = posicion;
    end
    if (SUBSTR(pais,2,2) = SUBSTR(caracteres,posicion,posicion)) then
    begin
      encontrado2 = 1;
      posicion2 = posicion;
    end
  end
  
  if (encontrado1 = 1) then 
  begin
    posicion1  = posicion1 + 9;
    paisnum = :paisnum || :posicion1;
  end
    
  if (encontrado2 = 1) then 
  begin
    posicion2  = posicion2 + 9;
    paisnum = :paisnum || :posicion2;
  end
  
  
  /* Colocamos codigo numerico de pais a la derecha de la cuenta */
  cuentapais = :cuenta || :paisnum || '00';
  posicion = 1;
  encontrado = 0;
  cantidad = 9;
  valormod = null;
  while (encontrado = 0) do
  begin
    cuentaaux = substr(:cuentapais,:posicion,posicion+:cantidad-1);
    if (valormod is not null) then cuentaaux = cast(valormod as varchar(2)) || :cuentaaux;
    posicion = :posicion + :cantidad;
    
    execute procedure UT_MODULUS(cast(cuentaaux as integer),97)
      RETURNING_VALUES :valormod;
    
    if (strlen(cast(:valormod as varchar(2))) = 1) then
       cantidad = 8;
    else cantidad = 7;
         
    if (posicion > strlen(:cuentapais)) then encontrado = 1;      
  end
  
  valormod = 98 - valormod;
  if (strlen(cast(valormod as varchar(2))) = 1) then
    iban = :pais || '0' || cast(valormod as varchar(2)) || :cuenta;
  else iban = :pais  || cast(valormod as varchar(2)) || :cuenta;  
  
  SUSPEND;
END^
commit work^

		

Submit a new version

You can submit a new version of this snippet if you have modified it and you feel it is appropriate to share with others..