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