En principio esa fórmula parece correcta y es la que yo utilicé. Pero comparando el IBAN que a mi me salía de una cuenta, con el que me salía con una calculadora de una entidad bancaria, a veces, el dígito era un número menos o mas. Según descubrí en una circular de la AEB, lo que ocurría, es que si el guarismo es demasiado largo (un número entero de 32 bits representa un máximo de 9 dígitos), se producía el error y para solucionarlo ellos aconsejan "dividir el cálculo en cálculos restantes consecutivos sobre números enteros con una extensión máxima de 9 dígitos para 32 bits y 18 dígitos para 64 bits".
Yo lo hago así:
// cPais siempre 'ES'
FUNCTION fIban( cBanco, cSucursal, cDC, cCuenta )
local nIban, cIban, nMod, nContador, cPais := 'ES', cPais2:=''
// comprueba ccc es correcto
IF !CCC (cBanco, cSucursal, cDC, cCuenta)
// devuelve cadena vacia por error CCC
RETURN ' '
ENDIF
FOR ncontador = 1 TO 2
IF ASC(SUBSTR(cPais, ncontador, 1)) >= 65
cPais2 += STR( (ASC(UPPER(SUBSTR(cPais, ncontador, 1)))-55), 2, 0)
ELSE
cPais2 += SUBSTR(cPais, ncontador, 1)
ENDIF
NEXT
cIban := cBanco + cSucursal
nMod := INT ( VAL(cIban) % 97)
cIban := LTRIM(STR(nMod,3,0))+cDC+SUBS(cCuenta,1,2)
nMod := INT ( VAL(cIban) % 97)
cIban := LTRIM(STR(nMod,3,0))+SUBS(cCuenta,3) + cPais2 + "00"
nMod := INT ( VAL(cIban) % 97 )
nIban := INT ( 98 - ( VAL(cIban) % 97) )
return cPais + STRZERO( nIban, 2)+cBanco+cSucursal+cDC+cCuenta
La función es mucho mas grande que la tuya, pero me ha funcionado en todas las pruebas que he hecho.
Por otra parte indicarle a Paquito que el cálculo del IBAN es diferente en cada país. En España tiene 24 caracteres, pero en otros paises puede ser diferente. Las normas para cada pais las aprueba
http://www.swift.com/dsp/resources/docu ... gistry.pdf