SEPA: cálculo del IBAN en Dynamics NAV
Ante la inminente puesta en marcha de la normativa SEPA (Single Euro Payments Area) desde el 1 de Febrero de este año y una vez implantadas las actualizaciones que Microsoft nos ofrece para Dynamics NAV (Navision), a continuación os propongo el contenido de unas funciones muy sencillas que os sirvan de guía para el cálculo de la cuenta IBAN de forma masiva a partir del código cuenta cliente (nº CCC) configurado en las distintas fichas, por ejemplo, de banco, banco cliente o banco proveedor.
Este ejemplo se basa en el cálculo del IBAN para cuentas españolas, aunque se podría adaptar para cualquier país.
CalcularIBAN(pCCC : Code[30]; pPais : Code[2]) : Code[2] ccc := pCCC + '142800'; //E=14 y S=28, son valores fijos definidos para España EVALUATE(k, Modulo(ccc, 97)); //Se realiza el módulo de 97 digitoControl := 98 - k; //El resultado se resta a 98 IF (digitoControl < 10) THEN EXIT('0' + FORMAT (digitoControl)) ELSE EXIT (FORMAT(digitoControl)); |
Código 1. Función principal.
Modulo(pCuenta : Code[30]; modulo97 : Integer) : Code[2] inicio := 1; fin := 1; WHILE (fin <= STRLEN(pCuenta)) DO BEGIN EVALUATE(buffer, resto + COPYSTR(pCuenta, inicio, fin - inicio + 1)); IF (buffer >= modulo97) THEN BEGIN result := ROUND(buffer / modulo97, 1, '<'); restoTmp := buffer - (result * modulo97); resto := FORMAT(restoTmp); sErg := sErg + FORMAT(result); inicio := fin + 1; fin := inicio; END ELSE BEGIN IF (sErg <> '') THEN sErg := sErg + '0'; fin := fin + 1; END; END; IF (inicio <= STRLEN(pCuenta)) THEN resto := resto + COPYSTR(pCuenta, inicio); EXIT(resto); |
Código 2. Algoritmo del cálculo del módulo para el IBAN.
Para la llamada a la función podríamos utilizar un report de proceso donde en el OnAfterGetRecord del DataItem correspondiente pongamos algo así:
IF "Bank Account"."CCC No." <> '' THEN BEGIN VALIDATE("Bank Account".IBAN, 'ES' + CalcularIBAN("Bank Account"."CCC No.", 'ES') + "Bank Account"."CCC No."); MODIFY; END; |
Código 3. Ejemplo de llamada a la función.
Hola
He intentado probar el desarrollo que has descrito y no he ocnseguido hacerlo funcionar,
me duce que esta sentancia EVALUATE(k,Modulo(ccc,97)) espera una variable donde esta el 97 y no me deja hacer nada, si me puedes ayudar,
SAlu2
Hola Jorge,
Lo primero de todo es crearte un report y una vez te hayas definido y codificado las funciones comprueba que te compila todo, no hagas copy-paste porque no te va a funcionar, por ejemplo, hay variables locales que tendrás que definirte.
Salu2.
Hola yo había hecho esto mismo y lo he repetido con el tuyo pero al ejecutarlo me dice que el número que sale de unir CCC+142800 no está permitido, ni como BigInteger, Integer ni decimal, que está fuera de los rangos.
¿qué puedo hacer?¿estoy definiendo algo mal?
Estoy en Nav4