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^