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.