Entrar    
 
Página principal Mi página Recortes de código Cursos
 

Navegar | Enviar un nuevo recorte | Crear un Paquete

 

Función para calcular el IBAN

Type:
Funciones
Category:
Manipulación de Base de Datos
License:
GNU General Public License
Language:
SQL
 
Description:
Función para calcular el IBAN desde la cuenta bancaria.

Versiones del Recorte::

Danny García Hernández
ID del Recorte Descargar Versión Fecha de Publicación Autor Borrar
11.002014-01-09 14:06Danny García Hernández

Descargar una versión texto de este código pulsando en "Descargar Versión"

 


útlimo recorte de la versión: :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^

		

Enviar un nuevo recorte

Si ha modificado una versión de este recorte sustancialmente y crea que debe compartirlo con otros, por favor, hágalo..