Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2014
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
¿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
Responder Con Cita
  #2  
Antiguo 04-02-2014
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Bueno, dejé de obsesionarme con hacerlo de una forma más directa y estoy haciendolo así

Código Delphi [-]
var
 cfinal : String;
 cc, n, resto : integer;
 nn, cociente : Double;
begin

  ......

  nn:=StrToFloat(cFinal);
  cociente := nn / 97;
  cc := Trunc(cociente);
  resto := trunc(nn - (cc * 97));
  n := 98 - resto;
__________________
http://www.gestionportable.com
Responder Con Cita
  #3  
Antiguo 05-02-2014
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por pacopenin Ver Mensaje
¿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í.
El bucle para ir formando esas cadenas lo tienes en mi primer mensaje:
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));
En este caso se supone que la cuenta siempre es de España (de ahí la cadena 1428 del principio del código); de otra forma bastaría con pasar el parámetro del país.
Responder Con Cita
  #4  
Antiguo 05-02-2014
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 05-02-2014
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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));
Siempre suponiendo que el país es España; las variables son:
  • cIdPre es el CIF/NIF pedido (en este caso es el presentador).
  • cSufPre es el sufijo asigando apra ese CIF.
  • cTitPre es el nombre del titular de ese CIF.
  • cCtaPre es su cuenta bancaria en formato IBAN; en este caso, al ser la cabecera del presentador, se toman el código de entidad y oficina.
Las funciones que se llaman dentro de esa composición son estas:
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);
}
Esta primera función rellena a la longitud especificada (nLong) con el carácter indicado (cRelleno) justificando como indica cJust: Si cJust vale D añade caracteres al final; si es I los añade al principio y si es C centra la cadena. La otra función es esta:
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;
}
Que calcula los dígitos de control en base al módulo 97-10. Espero que sea esto lo que buscabas.

Última edición por Angel.Matilla fecha: 05-02-2014 a las 11:11:53.
Responder Con Cita
  #6  
Antiguo 05-02-2014
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por pacopenin Ver Mensaje
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.

Otra cosa: Ten en cuenta que el sufijo no siempre es 000; este dato te lo tiene que facilitar la entidad bancaria a través de la que se lleva a cabo el cobro de los recibos.
Responder Con Cita
  #7  
Antiguo 05-02-2014
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 05-02-2014
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 13:53:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi