Ver Mensaje Individual
  #15  
Antiguo 05-02-2014
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 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