Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Exportar con TQRCommaSeparatedFilter (https://www.clubdelphi.com/foros/showthread.php?t=82571)

Angel.Matilla 20-03-2013 10:06:22

Exportar con TQRCommaSeparatedFilter
 
Estoy usando este código para exportar un QReport en fomato CSV:
Código:

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:
Cita:

"\"\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 18:41:16

Hola Angel.Matilla.

Cita:

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:
Código:

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

Llamada:
Código:

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

Saludos.

Angel.Matilla 21-03-2013 09: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í:
Cita:

"";"Referencia";"Titular";"";"Cuenta de Cargo";"Importe"
y cuando hace el salto de página añade una columna más; así:
Cita:

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 12:44:20

Hola Angel.Matilla.

Cita:

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

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 13: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
Código:

TQRCSVFilter *csv = new TQRCSVFilter
que
Código:

TQRCSVFilter *csv = new TQRCSVFilter()
siempre me da este error:
Cita:

[C++ Error] Funciones.cpp(457): E2285 Could not find a match for 'TQRCSVFilter::TQRCSVFilter()'
y no entiendo por qué.

ecfisa 21-03-2013 14: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.
Código:

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 16:54:40

¡Perfecto! No se me había ocurrido. Muchas gracias.


La franja horaria es GMT +2. Ahora son las 09:57:49.

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