Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Generación automatica de Reports

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Generación automatica de Reports Responder citando

Uso Qreport en BCB5. Creo un Tquickreport dinamicamente, siguiendo el Ejemplo de _LEO.
El usa como Origen de datos un TTable. Yo quiero usar un TDataset.
Pues bien no se en que fallo porque las TQRExpr no me funcionan.

Código:
TQRExpr *QRDB;
                                            QRDB                = new TQRExpr(bandDetail);
                                            QRDB->Parent        = bandDetail;
                                            QRDB->Master        = qr;
                                            QRDB->AutoSize      = false;
                                            QRDB->Transparent   = true;
                                           
                                            QRDB->Expression    = cadena_q;


Donde cadena_q es: '123'+datos.nombre

y en la creación del
Código:

qr = new TQuickRep(Application);
qr->DataSet = datos;  //datos es un TDataSet

No hay forma!! alguien ve el error!!! Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Por si te sirve de algo, aquí el mismo ejemplo que había puesto, pero ahora como una función totalmente independiente, y como ejemplo en vez de usar un TQRDBText uso un TQRExpr:

Código:
// Añadimos las siguientes cabeceras
//    #include <QuickRpt.hpp>
//    #include <Qrctrls.hpp>

void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
    if (campos->Count < 1)
        throw Exception("No hay campos seleccionados.");

    static TQuickRep* qr = 0;

    if (qr)
        delete qr;

    qr = new TQuickRep(Application);
    qr->DataSet = dataset;

    TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
    TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
    TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
    TQRBand* bandDetail       = qr->CreateBand(rbDetail);

    qr->Units = MM;

    bandPageHeader->Size->Height      = 10;
    bandPageHeader->Frame->DrawBottom = true;
    bandPageHeader->Frame->Color      = clSilver;
    bandPageHeader->Frame->Width      = 2;

    bandPageFooter->Size->Height   = 15;
    bandPageFooter->Frame->DrawTop = true;
    bandPageFooter->Frame->Color   = clSilver;
    bandPageFooter->Frame->Width   = 2;

    bandColumnHeader->Color = clSilver;

    TQRSysData* QRSysData  = new TQRSysData(bandPageHeader);
    QRSysData->Parent      = bandPageHeader;
    QRSysData->Data        = qrsReportTitle;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Font->Style = TFontStyles() << fsBold;
    QRSysData->Top        += 10;

    QRSysData              = new TQRSysData(bandPageFooter);
    QRSysData->Parent      = bandPageFooter;
    QRSysData->Data        = qrsPageNumber;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Text        = "Página ";
    QRSysData->Top        += 4;

    // Calcula el alto y el ancho medio de una letra
    TForm* mainForm = Application->MainForm;
    mainForm->Canvas->Font->Assign(bandDetail->Font);
    int charWidth  = mainForm->Canvas->TextWidth("x");
    int charHeight = mainForm->Canvas->TextHeight("Xg");
    mainForm->Canvas->Font->Assign(mainForm->Font);

    // Definimos la altura de las bandas de cabecera y detalle
    bandColumnHeader->Height = charHeight + 6;
    bandDetail->Height       = charHeight + 2;

    // Añade el texto
    TQRLabel *QRLabel;
    TQRExpr *QRExpr;
    int pos = 0;
    for (int i=0; i<campos->Count; i++)
    {
        String fieldName = campos->Strings[i];
        TField* field = qr->DataSet->Fields->FieldByName(fieldName);

        QRLabel              = new TQRLabel(bandColumnHeader);
        QRLabel->Parent      = bandColumnHeader;
        QRLabel->AutoSize    = false;
        QRLabel->Transparent = true;
        QRLabel->Caption     = fieldName;
        QRLabel->Width       = field->DisplayWidth * charWidth;
        QRLabel->Left        = pos;
        QRLabel->Top         = 2;

        QRExpr = new TQRExpr(bandDetail);
        QRExpr->Parent    = bandDetail;
        QRExpr->AutoSize  = false;
        QRExpr->Color     = bandDetail->Color;
        QRExpr->Left      = pos;
        QRExpr->Top       = 2;
        QRExpr->Width     = QRLabel->Width;
        QRExpr->Expression = "'->'+" + dataset->Name + "." + fieldName;

        // Justificar a la derecha si es un campo numerico
        switch(field->DataType)
        {
            case ftSmallint:
            case ftInteger:
            case ftAutoInc:
            case ftLargeint:
                QRExpr->Alignment = taRightJustify;
        }

        pos += QRLabel->Width + QRLabel->Font->Size;
    }

    // Cambia la orientación del papel dependiendo del ancho del texto
    if (pos < bandDetail->Width)
        qr->Page->Orientation = poPortrait;
    else
        qr->Page->Orientation = poLandscape;

    qr->ReportTitle = titulo;

    // Mostramos el report
    qr->Preview();
}


Un ejemplo de como usarla:
Código:
TStringList* campos = new TStringList;
campos->Append("Nombre");
campos->Append("Provincia");
campos->Append("Fax");
GenerarInforme(Table1, "prueba", campos);
delete campos;

También esta probada con DBExpress:
    GenerarInforme(SQLTable1, "prueba", campos);

con Interbase:
    GenerarInforme(IBTable1, "prueba", campos);

con ADO:
    GenerarInforme(ADOQuery1, "prueba", campos);

...teóricamente debería funcionar con cualquier descendiente de TDataSet.

-----------------------------------------------------------------------

Bueno, lo anterior era como ejemplo de TQRExpr, la versión con TQRDBText quedaría así:
Código:
void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
    if (campos->Count < 1)
        throw Exception("No hay campos seleccionados.");

    static TQuickRep* qr = 0;

    if (qr)
        delete qr;

    qr = new TQuickRep(Application);
    qr->DataSet = dataset;

    TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
    TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
    TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
    TQRBand* bandDetail       = qr->CreateBand(rbDetail);

    qr->Units = MM;

    bandPageHeader->Size->Height      = 10;
    bandPageHeader->Frame->DrawBottom = true;
    bandPageHeader->Frame->Color      = clSilver;
    bandPageHeader->Frame->Width      = 2;

    bandPageFooter->Size->Height   = 15;
    bandPageFooter->Frame->DrawTop = true;
    bandPageFooter->Frame->Color   = clSilver;
    bandPageFooter->Frame->Width   = 2;

    bandColumnHeader->Color = clSilver;

    TQRSysData* QRSysData  = new TQRSysData(bandPageHeader);
    QRSysData->Parent      = bandPageHeader;
    QRSysData->Data        = qrsReportTitle;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Font->Style = TFontStyles() << fsBold;
    QRSysData->Top        += 10;

    QRSysData              = new TQRSysData(bandPageFooter);
    QRSysData->Parent      = bandPageFooter;
    QRSysData->Data        = qrsPageNumber;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Text        = "Página ";
    QRSysData->Top        += 4;

    // Calcula el alto y el ancho medio de una letra
    TForm* mainForm = Application->MainForm;
    mainForm->Canvas->Font->Assign(bandDetail->Font);
    int charWidth  = mainForm->Canvas->TextWidth("x");
    int charHeight = mainForm->Canvas->TextHeight("Xg");
    mainForm->Canvas->Font->Assign(mainForm->Font);

    // Definimos la altura de las bandas de cabecera y detalle
    bandColumnHeader->Height = charHeight + 6;
    bandDetail->Height       = charHeight + 2;

    // Añade el texto
    TQRLabel *QRLabel;
    TQRDBText *QRDBText;
    int pos = 0;
    for (int i=0; i<campos->Count; i++)
    {
        String fieldName = campos->Strings[i];
        TField* field = qr->DataSet->Fields->FieldByName(fieldName);

        QRLabel              = new TQRLabel(bandColumnHeader);
        QRLabel->Parent      = bandColumnHeader;
        QRLabel->AutoSize    = false;
        QRLabel->Transparent = true;
        QRLabel->Caption     = fieldName;
        QRLabel->Width       = field->DisplayWidth * charWidth;
        QRLabel->Left        = pos;
        QRLabel->Top         = 2;

        QRDBText            = new TQRDBText(bandDetail);
        QRDBText->Parent    = bandDetail;
        QRDBText->AutoSize  = false;
        QRDBText->Color     = bandDetail->Color;
        QRDBText->Left      = pos;
        QRDBText->Top       = 2;
        QRDBText->Width     = QRLabel->Width;
        QRDBText->DataSet   = dataset;
        QRDBText->DataField = fieldName;

        // Justificar a la derecha si es un campo numerico
        switch(field->DataType)
        {
            case ftSmallint:
            case ftInteger:
            case ftAutoInc:
            case ftLargeint:
                QRDBText->Alignment = taRightJustify;
        }

        pos += QRLabel->Width + QRLabel->Font->Size;
    }

    // Cambia la orientación del papel dependiendo del ancho del texto
    if (pos < bandDetail->Width)
        qr->Page->Orientation = poPortrait;
    else
        qr->Page->Orientation = poLandscape;

    qr->ReportTitle = titulo;

    // Mostramos el report
    qr->Preview();
}


... es solo un ejemplo sencillo, habría que mejorarlo para que funcione bien con cualquier tipo de campo, etc.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Mil Gracias. Responder citando

Pues si ya se que esto es un foro y todo eso, pero viendo respuestas como esta me emociono!!! Crying or Very sad

Muchas Gracias LEO , por todo lo que has dejado de tu sabiduria en este foro, por todo lo que me has ayudado. Me quito el sombrero!!!

Estoy aprendiendo un monton con tus ejemplos!! Me faltan muchos quilometros para poder decir que soy un buen programador, por eso espero poder seguir aprendiendo de tus mensajes.

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Problema al eliminar Responder citando

Gracias de nuevo por tu inpagable!! repito inpagable consejo!!
Bien, el ejemplo de los reportes lo uso ,y tengo un pequeño problema con:
Código:

// Creamos el informe
    static TQuickRep* qri = 0;
    if (qri) delete qri;



La primera vez que leo este codigo todo correcto. Es la segunda vez, que intenta eliminar qri donde se produce el error. Si suprimo la linia todo funciona ok.

Mi pregunta es: Que pasa si no lo destruyo? donde podria destruirlo?
Gracias de nuevo!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Más de lo mismo Responder citando

Por cierto, no se si hay alguna forma de ajustar más la anchura de los campos a la real de las cadenas y no a la medida en caracteres de la tabla. O sea poder dar una anchura dependiendo de la cadena más larga que se tendra que imprimir y no de la medida del campo en la Tabla.

Yo recorro la tabla previamente pero no se si es muy optimo!!
Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, he usado esta funcion entregada por _Leo, sin ningun problema, hasta que instale la version 4.0 de QuickReport, ahora en la siguientes lineas me da problemas: (En las sentencias de asignacion)

Código:

  // Cambia la orientación del papel dependiendo del ancho del texto
    if (pos < bandDetail->Width)
        qr->Page->Orientation = poPortrait;
    else
        qr->Page->Orientation = poLandscape;

    qr->ReportTitle = titulo;


Y el error que me genera es el siguiente... Ojo compila perfectamente y solo se cae en teimpo de ejecucion.

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Siria.exe raised exception class EAccessViolation with message 'Access violation at address 004379DB in module 'Siria.exe'. Write of address 00000052'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------


Estuvimos varias Horas con Cesar tratando de solucionar el problema...

En otro post Kalux encontro la siguiente solucion:

Cita:

Lo he solucionado incluyendo en el proyecto la libreria: QR4RunC6.lib (para la version 6 del builder).


Pero al hacer eso, me da el siguiente error de compilacion:

Cita:

Build [Linker Error] Unable to open file 'QRSEARCHDLG.DFM'



Y la verdad ya estoy un poco perdido...

Alguien tiene alguna idea de lo que pueda estar pasando ???

Gracias por sus posibles respuestas...

Saludos!
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Anexo, los pasos que se ejecutaron, desde la pagina de www.qsoft.com

Código:
Installing QR402PC6.EXE

1. Remove the current QR and QRExports libraries from the design libraries list
using the Component|Install Package menu.
(cierras el builder)

remueves el archivo..de system32

Note that the libraries are now called QR4DesignXX and QR4RunXX.
Remove any copies of qrptX0.bpl from the Windows/System32 directory.

ejecutas el programa
2. Run the self installer EXE.

habres el bulder, y te dice que no puede encontrar la apliacion.. le dices que
no. y luego te vas a Componet - Install Packager - boton add
seleccionas el archivo  que contiene la palabra "designed" (QR4DesignC6.bpl)
y ya parece la dichosa paleta..

3. Install the QR4 components by using the Add button and browsing to -
Program files/Borland/Delp


Instalar los componetes, Component - Install - component
posteriormente habre en el directoiro CBuilder\qreport

los dos BPL, que aparecen, y segun esto ya quedo.. pero

nunca se pudo...


alguien pudo instalar correctamente, el QuickReport Ver 4.0.x. Profesional, en builder c++ 6.0

Gracias por sus respuestas
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Yo los instale tal y como indica Tugui en:
https://cppbuilder.es/viewtopic.php?t=9735

Es decir:
- Desistalas los antiguos. Vas a Component - Install pakages y remove sobre este paquete.
- Ejecutas la instalacion, le das el mismo directorio que el Builder (por las carpetas: lib, help, ...
- Luego, creo recordar, que fui a Component - Install pakages y add. Vas al directorio BIN del Builder y buscas: QR4DesignC6.bpl

Y ya lo tienes instalado. Entre medio de estas operaciones sali y volvi a entrar del C++Builder, por si tenia que actualizar los cambios (ante la duda)

La unica pega fue que tienes que añadir al proyecto la libreria: QR4RunC6.lib

Tambien hice la prueba de incluir en Proyect - Options Directories/Conditionals tanto en include como en lib path de la carpeta de quickrpt, pero no surgio efecto. Este paso lo realice para ver si no hacia falta incluir la libreria en el proyecto. Pero ... Crying or Very sad

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Bien, eso indica que te funciona correctamente, no se te pasa, el borrado de los archivos, del la carpeta ...\system32\qrxxxx para que se tomen los nuevos archivos


saludos..?
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

No he borrado ninguna carpeta, ni nada. Solo desistalar.

Ojo: estoy actualizando desde la version que viene por defecto con el C++ Builder ver. 6 Enterprise que es la 3 y algo.
Estoy mirando en la carpeta windows/system32 y aparecen los ficheros: QR4RunC6.bpl y qrpt60.bpl, que supongo que los a colocado el instalador.

Supongo que esa explicacion es para los que ya tenian instalada la version 4 y actualizan a otra posterior. Este no es mi caso.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Por fin lo consegui, aqui esta la manera correcta.
24 hrs, sin dormir, y reinstalando varias veces el borland ha quedado, jeje



Código:

Instalacion o (Actualizacion de la version 3.0.9) Correcta del QReport Ver. 40x

1.- Abres el builder cierras todo con "File-Close All", y te vas
    al menu "Component-Install Packages" dentro de ella seleccionas,
    el componente, QuickRepor y los que consideres que pertenecen al
    quickreport, y los eliminamos con el boton remove

2.- Cierras el builder y te vas a la carpeta de ...\system32, en ella
    borras los siguientes archivos..
    QR4RunC6.bpl -> alguna version anterior del QuickReport
    qrpt60.bpl   -> La version que viene con el Builder.
    Eliminas los 2

3.- Ejecutas el Instalador (QR40xpC6.exe) y despues continuas con el paso 4

4.- Abres el Builder, y te indica que no puede encontrar la libreria
    del Quickreport, presionas el boton aceptar, y te sale un msg
    Indicandote que si deseas buscar de nuevo la libreria cada vez
    que inicies el builder, seleccionas el boto no y listo.

5.- cierras todo con "File-Close All", te vas a "Component - Install
    Component...", y Habres el que dice QR4DesignC6.cpp y QR4DesignC6.bpk
    respectivamente, compilas / instalas y ya tienes la Carpeta de QReport
    Con los nuevos componentes.

6.- para que se compile tu proyecto, agrega, dentro del Menu
    "View-Project Manager", y agregas los archivos del QuickReport
    que se encuentren en el directorio "Lib" de CBuilder6 (QR4RunC6.lib),
    asi como el Archivo QR4DesignC6.cpp

suerte!!!!
   
   

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Saludos Gran Leo__ Responder citando

Hola leo... me preguntaba si se pudiera hacer lo mismo, pero en vez de una tabla cargada de una BD, pasarle un StringGrid.... será posible?


de antemano muchisimas gracias super Leo__
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: ayudaaaaa con report Responder citando

_Leo escribió:
Por si te sirve de algo, aquí el mismo ejemplo que había puesto, pero ahora como una función totalmente independiente, y como ejemplo en vez de usar un TQRDBText uso un TQRExpr:

Código:
// Añadimos las siguientes cabeceras
//    #include <QuickRpt>
//    #include <Qrctrls>

void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
    if (campos->Count <1>DataSet = dataset;

    TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
    TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
    TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
    TQRBand* bandDetail       = qr->CreateBand(rbDetail);

    qr->Units = MM;

    bandPageHeader->Size->Height      = 10;
    bandPageHeader->Frame->DrawBottom = true;
    bandPageHeader->Frame->Color      = clSilver;
    bandPageHeader->Frame->Width      = 2;

    bandPageFooter->Size->Height   = 15;
    bandPageFooter->Frame->DrawTop = true;
    bandPageFooter->Frame->Color   = clSilver;
    bandPageFooter->Frame->Width   = 2;

    bandColumnHeader->Color = clSilver;

    TQRSysData* QRSysData  = new TQRSysData(bandPageHeader);
    QRSysData->Parent      = bandPageHeader;
    QRSysData->Data        = qrsReportTitle;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Font->Style = TFontStyles() <<fsBold>Top        += 10;

    QRSysData              = new TQRSysData(bandPageFooter);
    QRSysData->Parent      = bandPageFooter;
    QRSysData->Data        = qrsPageNumber;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Text        = "Página ";
    QRSysData->Top        += 4;

    // Calcula el alto y el ancho medio de una letra
    TForm* mainForm = Application->MainForm;
    mainForm->Canvas->Font->Assign(bandDetail->Font);
    int charWidth  = mainForm->Canvas->TextWidth("x");
    int charHeight = mainForm->Canvas->TextHeight("Xg");
    mainForm->Canvas->Font->Assign(mainForm->Font);

    // Definimos la altura de las bandas de cabecera y detalle
    bandColumnHeader->Height = charHeight + 6;
    bandDetail->Height       = charHeight + 2;

    // Añade el texto
    TQRLabel *QRLabel;
    TQRExpr *QRExpr;
    int pos = 0;
    for (int i=0; i<campos>Count; i++)
    {
        String fieldName = campos->Strings[i];
        TField* field = qr->DataSet->Fields->FieldByName(fieldName);

        QRLabel              = new TQRLabel(bandColumnHeader);
        QRLabel->Parent      = bandColumnHeader;
        QRLabel->AutoSize    = false;
        QRLabel->Transparent = true;
        QRLabel->Caption     = fieldName;
        QRLabel->Width       = field->DisplayWidth * charWidth;
        QRLabel->Left        = pos;
        QRLabel->Top         = 2;

        QRExpr = new TQRExpr(bandDetail);
        QRExpr->Parent    = bandDetail;
        QRExpr->AutoSize  = false;
        QRExpr->Color     = bandDetail->Color;
        QRExpr->Left      = pos;
        QRExpr->Top       = 2;
        QRExpr->Width     = QRLabel->Width;
        QRExpr->Expression = "'->'+" + dataset->Name + "." + fieldName;

        // Justificar a la derecha si es un campo numerico
        switch(field->DataType)
        {
            case ftSmallint:
            case ftInteger:
            case ftAutoInc:
            case ftLargeint:
                QRExpr->Alignment = taRightJustify;
        }

        pos += QRLabel->Width + QRLabel->Font->Size;
    }

    // Cambia la orientación del papel dependiendo del ancho del texto
    if (pos <bandDetail>Width)
        qr->Page->Orientation = poPortrait;
    else
        qr->Page->Orientation = poLandscape;

    qr->ReportTitle = titulo;

    // Mostramos el report
    qr->Preview();
}


Un ejemplo de como usarla:
Código:
TStringList* campos = new TStringList;
campos->Append("Nombre");
campos->Append("Provincia");
campos->Append("Fax");
GenerarInforme(Table1, "prueba", campos);
delete campos;

También esta probada con DBExpress:
    GenerarInforme(SQLTable1, "prueba", campos);

con Interbase:
    GenerarInforme(IBTable1, "prueba", campos);

con ADO:
    GenerarInforme(ADOQuery1, "prueba", campos);

...teóricamente debería funcionar con cualquier descendiente de TDataSet.

-----------------------------------------------------------------------

Bueno, lo anterior era como ejemplo de TQRExpr, la versión con TQRDBText quedaría así:
Código:
void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
    if (campos->Count <1>DataSet = dataset;

    TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
    TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
    TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
    TQRBand* bandDetail       = qr->CreateBand(rbDetail);

    qr->Units = MM;

    bandPageHeader->Size->Height      = 10;
    bandPageHeader->Frame->DrawBottom = true;
    bandPageHeader->Frame->Color      = clSilver;
    bandPageHeader->Frame->Width      = 2;

    bandPageFooter->Size->Height   = 15;
    bandPageFooter->Frame->DrawTop = true;
    bandPageFooter->Frame->Color   = clSilver;
    bandPageFooter->Frame->Width   = 2;

    bandColumnHeader->Color = clSilver;

    TQRSysData* QRSysData  = new TQRSysData(bandPageHeader);
    QRSysData->Parent      = bandPageHeader;
    QRSysData->Data        = qrsReportTitle;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Font->Style = TFontStyles() <<fsBold>Top        += 10;

    QRSysData              = new TQRSysData(bandPageFooter);
    QRSysData->Parent      = bandPageFooter;
    QRSysData->Data        = qrsPageNumber;
    QRSysData->AlignToBand = true;
    QRSysData->Alignment   = taCenter;
    QRSysData->Text        = "Página ";
    QRSysData->Top        += 4;

    // Calcula el alto y el ancho medio de una letra
    TForm* mainForm = Application->MainForm;
    mainForm->Canvas->Font->Assign(bandDetail->Font);
    int charWidth  = mainForm->Canvas->TextWidth("x");
    int charHeight = mainForm->Canvas->TextHeight("Xg");
    mainForm->Canvas->Font->Assign(mainForm->Font);

    // Definimos la altura de las bandas de cabecera y detalle
    bandColumnHeader->Height = charHeight + 6;
    bandDetail->Height       = charHeight + 2;

    // Añade el texto
    TQRLabel *QRLabel;
    TQRDBText *QRDBText;
    int pos = 0;
    for (int i=0; i<campos>Count; i++)
    {
        String fieldName = campos->Strings[i];
        TField* field = qr->DataSet->Fields->FieldByName(fieldName);

        QRLabel              = new TQRLabel(bandColumnHeader);
        QRLabel->Parent      = bandColumnHeader;
        QRLabel->AutoSize    = false;
        QRLabel->Transparent = true;
        QRLabel->Caption     = fieldName;
        QRLabel->Width       = field->DisplayWidth * charWidth;
        QRLabel->Left        = pos;
        QRLabel->Top         = 2;

        QRDBText            = new TQRDBText(bandDetail);
        QRDBText->Parent    = bandDetail;
        QRDBText->AutoSize  = false;
        QRDBText->Color     = bandDetail->Color;
        QRDBText->Left      = pos;
        QRDBText->Top       = 2;
        QRDBText->Width     = QRLabel->Width;
        QRDBText->DataSet   = dataset;
        QRDBText->DataField = fieldName;

        // Justificar a la derecha si es un campo numerico
        switch(field->DataType)
        {
            case ftSmallint:
            case ftInteger:
            case ftAutoInc:
            case ftLargeint:
                QRDBText->Alignment = taRightJustify;
        }

        pos += QRLabel->Width + QRLabel->Font->Size;
    }

    // Cambia la orientación del papel dependiendo del ancho del texto
    if (pos <bandDetail>Width)
        qr->Page->Orientation = poPortrait;
    else
        qr->Page->Orientation = poLandscape;

    qr->ReportTitle = titulo;

    // Mostramos el report
    qr->Preview();
}


... es solo un ejemplo sencillo, habría que mejorarlo para que funcione bien con cualquier tipo de campo, etc.



leo, yo estoy tratando de hacer una Historia clinica, pero necesito que los datos vallan muy parejos, por ejemplo tengo dos campos una de enfermedad actual, y uno de examen fisico, el de enfermedad actual son como 1000 caracteres, y lo tengo en un lambel y el examen fisico son 400 caracteres y lo tengo en otro lambel la idea es que no todos los pacientes ocupa los 1000 caracteres y me queda un super espacio, y no se lograr que empalme cuando termina una comienze la otra gracias de antemano
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola a todos,

Os seria muy complicado hacer esta misma función pero para un StringGrid?

Quiero decir que los datos no vengan de un DataSet sino de un StringGrid.

Lo cierto es que seria comodisimo, tengo algunos listados en StringGrid y resulta muy engorroso cuando hay que hacer el QuickReport.

Un saludo a todos.

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.