FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
¿Cálculo de la Identificación de Acreedor?
¿Alguien tiene hecho el cálculo de la Identificación de Acreedor para las domiciliaciones en formato SEPA?.
Uno de los pasos es tomar el resto de la división de un numero de p.e. 1185626240142800 entre 97. Dicho número sale de formar un string según varias formulas. Pues el caso es que no se como hacer esa división, ya que no se puede a entero para realizar un mod y obtener el resto. Ando espeso espeso. Se agradecen sugerencias. La explicación completa y más clara que la mía aquí.
__________________
http://www.gestionportable.com |
#2
|
||||
|
||||
Bueno, dejé de obsesionarme con hacerlo de una forma más directa y estoy haciendolo así
__________________
http://www.gestionportable.com |
#3
|
||||
|
||||
Cita:
Código:
AnsiString cAux; Cuenta = Cuenta + "142800"; cAux = FormatFloat("0", StrToInt(Cuenta.SubString(1, 9)) % 97); Cuenta = Cuenta.SubString(10, Cuenta.Length()); while (!Cuenta.IsEmpty()) { if (StrToInt(cAux) < 10) { cAux = cAux + Cuenta.SubString(1, 8); Cuenta = Cuenta.SubString(9, Cuenta.Length()); } else { cAux = cAux + Cuenta.SubString(1, 7); Cuenta = Cuenta.SubString(8, Cuenta.Length()); } cAux = FormatFloat("0", StrToInt(cAux) % 97); } return "ES" + FormatFloat("00", 98 - StrToInt(cAux)); |
#4
|
||||
|
||||
Gracias Angel.Matilla, pero mi problema no es con el IBAN ya que las formulas que habeis puesto funcionan bien.
El error ha sido mío por no abrir otro hilo, pero como en el fondo si guarda relación por eso lo he comentado aquí. El problema es que al hacer las domiciliaciones bancarias hay que calcular la Identificación de Acreedor de acuerdo a la fórmula que comenté antes partiendo del Pais, un sufijo (000) y el CIF. Esto nos da en un determinado momento un número entero de 16 dígitos del que hay que sacar el resto de la división entre 97 y ese cálculo excedía el rango numérico de los enteros que conocía (nunca usé ningún entero mayor que longInt). Acabo de ver que hay un Int64 y un StrToInt64 que no sabía que existían. Con eso supongo que me arreglaré. Cuando lo tenga funcionando publicaré el código en un nuevo hilo.
__________________
http://www.gestionportable.com |
#5
|
||||
|
||||
Vale. También tengo el código para hacer el cálculo a partir del CIF. Es este, en Builder:
Para el primer registro obligatorio del Cuaderno 19-14 Código:
String Registro; Regsitro = "0119143001" + AjustaCadena("ES" + Modulo9710(cIdPre + "ES00") + cSufPre + cIdPre, ' ', 35, 'D') + AjustaCadena(cTitPre, ' ', 70, 'D') + Date().FormatString("yyyymmdd") + AjustaCadena("PRE" + Now().FormatString("yyyymmddhhnnss00000") + cRefInt + Now().FormatString("yymm"), ' ', 35, 'D') + cCtaPre.SubString(5, 8) + AnsiString::StringOfChar(' ', 434));
Código:
AnsiString AjustaCadena(AnsiString cCadena, char cRelleno, int nLong, char cJust) { cCadena = Trim(cCadena.SubString(1, nLong)); switch (cJust) { case 'I': cCadena = AnsiString::StringOfChar(cRelleno, nLong - cCadena.Length()) + cCadena; break; case 'C': cCadena = AnsiString::StringOfChar(cRelleno, (nLong - cCadena.Length())/2) + cCadena + AnsiString::StringOfChar(cRelleno, (nLong - cCadena.Length())/2); if (cCadena.Length() < nLong) cCadena += AnsiString(cRelleno); break; case 'D': cCadena = cCadena + AnsiString::StringOfChar(cRelleno, nLong - cCadena.Length()); break; } return (cCadena); } Código:
AnsiString Modulo9710(AnsiString Cadena) { AnsiString cValor; cValor = ""; for (int nPos = 1; nPos <= Cadena.Length(); nPos ++) { if (isalpha(Cadena.c_str()[nPos - 1])) cValor = cValor + FormatFloat("00", Cadena.c_str()[nPos - 1] - 55); else cValor = cValor + Cadena.SubString(nPos, 1); } Cadena = cValor; cValor = FormatFloat("0", StrToInt(Cadena.SubString(1, 9)) % 97); Cadena = Cadena.SubString(10, Cadena.Length()); while (!Cadena.IsEmpty()) { if (StrToInt(cValor) < 10) { cValor = cValor + Cadena.SubString(1, 8); Cadena = Cadena.SubString(9, Cadena.Length()); } else { cValor = cValor + Cadena.SubString(1, 7); Cadena = Cadena.SubString(8, Cadena.Length()); } cValor = FormatFloat("0", StrToInt(cValor) % 97); } return cValor; } Última edición por Angel.Matilla fecha: 05-02-2014 a las 11:11:53. |
#6
|
||||
|
||||
Cita:
|
#7
|
||||
|
||||
Voy a probar, aunque veo que la forma de calcularlo es distinta a la que yo había encontrado y no se dan números enteros tan largos. Y lo del sufijo ya lo tengo en cuenta,
__________________
http://www.gestionportable.com |
#8
|
||||
|
||||
Para hacer el cálculo seguí las sugerencias que encontré en una web; no recuerdo si es la del enlace que puse más arriba. Si se puede trabajar con la cadena completa se hace de una vez.
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Cálculo de los dígitos IBAN | Troffed | Trucos | 9 | 26-07-2020 18:08:27 |
validación | Nelly | Varios | 8 | 12-10-2005 19:32:33 |
validacion | halifax | Tablas planas | 7 | 06-02-2005 23:25:53 |
Validacion | Carlex | Conexión con bases de datos | 1 | 08-09-2004 23:53:41 |
Como calcular codigo IBAN | cinecito | Varios | 2 | 11-05-2004 18:49:44 |
|