PDA

Ver la Versión Completa : Exportar con TQRCommaSeparatedFilter


Angel.Matilla
20-03-2013, 11:06:22
Estoy usando este código para exportar un QReport en fomato CSV:
TQRCommaSeparatedFilter *filtro = new TQRCommaSeparatedFilter(cInforme);
Informe->ExportToFilter(filtro);
delete filtro;siendo cInforme un AnsiString con el nombre del fichero e Informe el QR.
El problema que tengo es que el fichero que saca no usa el punto y coma como separador de campos y me saca esto:
"\"\0\"\"\0\"\"\0\"= RELACIÓN DE RECIBOS DOMICILIADOS - F. DE CARGO: 17/03/2013 =\"\0\"\"\0\"\"\n\"\"\0\"Referencia\"\0\"Titular\"\0\"\"\0\"Cuenta de cargo\"\0\"Cuenta de Cargo\"\n\Sé que cada combinación "\0\ debería ser un punto y coma pero no encuentro la forma de asignar el separador en este filtro, y no quiero hacerlo desde el botón guardar del Preview del informe, o bien automatizarlo de forma que se guarde sin tener que visualizarlo.

ecfisa
20-03-2013, 19:41:16
Hola Angel.Matilla.

El problema que tengo es que el fichero que saca no usa el punto y coma como separador de campos
Agrega un TQRCSVFilter y proba de este modo:

void __fastcall TForm1::ExportToCVS(const char *FileName)
{
TQRCommaSeparatedFilter *CommaSF = new TQRCommaSeparatedFilter(FileName);
__try {
QRCSVFilter1->Separator = ';';
QuickRep1->ExportToFilter(CommaSF);
}
__finally {
delete CommaSF;
}
}


Llamada:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ExportToCVS("C:\\REPORTE.TXT");
}


Saludos.

Angel.Matilla
21-03-2013, 10:06:08
Muchísimas gracias. Llevaba mucho tiempo tratando de encontrar una solución. Sólo he encontrado un problema y es que me llena el listado de comillas, así:
"";"Referencia";"Titular";"";"Cuenta de Cargo";"Importe"y cuando hace el salto de página añade una columna más; así:
1ª página: "GESTIÓN DE AFILIADOS";"";"";"";"";"Pág.: 1"
2ª página: "";"GESTIÓN DE AFILIADOS";"";"";"";"";"Pág.: 2"pero esto se puede resolver con StringReplace.

ecfisa
21-03-2013, 13:44:20
Hola Angel.Matilla.

pero esto se puede resolver con StringReplace.
Pienso del mismo modo, no se me ocurre otra manera mas simple de salvar ese detalle:

void __fastcall TForm1::ExportToCVS(const char *FileName)
{
TQRCommaSeparatedFilter *CommaSF = new TQRCommaSeparatedFilter(FileName);
TStringList *SL = new TStringList;

__try {
QRCSVFilter1->Separator = ';';
QuickRep1->ExportToFilter(CommaSF);
SL->LoadFromFile(FileName);
SL->Text = StringReplace(SL->Text, '"', "", TReplaceFlags() << rfReplaceAll);
SL->SaveToFile(FileName);
}
__finally {
delete SL;
delete CommaSF;
}
}


Saludos. :)

Angel.Matilla
21-03-2013, 14:23:47
Gracias por tu ayuda. Permite que te haga otra pregunta.

La exportación, dado que la uso en varios sitios distintos de la aplicación, la tengo metida en una función. Me ha llamado la atención que no pueda crear un TQRCSFilter de forma dinámica. Da lo mismo que ponga
TQRCSVFilter *csv = new TQRCSVFilterque
TQRCSVFilter *csv = new TQRCSVFilter()siempre me da este error:
[C++ Error] Funciones.cpp(457): E2285 Could not find a match for 'TQRCSVFilter::TQRCSVFilter()'
y no entiendo por qué.

ecfisa
21-03-2013, 15:22:43
Hola de nuevo.

Tenes que indicar el propietario (Owner) en la creación. Por lo que creo interpretar de tu mensaje, bién puede ser NULL.

void __fastcall ExportToCVS(TQuickRep *QR, const char *FileName)
{
TQRCSVFilter *CVSF = new TQRCSVFilter(NULL);
TQRCommaSeparatedFilter *CommaSF = new TQRCommaSeparatedFilter(FileName);
TStringList *SL = new TStringList;

__try {
CVSF->Separator = ';';
QR->ExportToFilter(CommaSF);
SL->LoadFromFile(FileName);
SL->Text = StringReplace(SL->Text,'"',"", TReplaceFlags()<<rfReplaceAll);
SL->SaveToFile(FileName);
}
__finally {
delete SL;
delete CVSF;
delete CommaSF;
}
}


Saludos.:)

Angel.Matilla
21-03-2013, 17:54:40
¡Perfecto! No se me había ocurrido. Muchas gracias.