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 

Reporte Dinámico

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Reporte Dinámico Responder citando

Hola!
Deseo hacer un report dinámico, es decir que el usuario a partir de unos campos de una tabla o Query

alguien sabe como crear las bandas dinamicamente y tambien los QRDBlabel?

Muchas gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola rockfavc:

Tengo por aquí un pequeño ejemplo que le hice a un amigo hace algún tiempo, quizás te sirva como base. Sigue estos pasos:

1.- Crea un nuevo proyecto vacío y añade las siguientes cabeceras:
Código:
     #include <memory>
     #include <QuickRpt.hpp>
     #include <Qrctrls.hpp>


2.- Añade los siguientes componentes:
Código:
    2 TButton (Button1 y Button2)
    1 TCheckListBox (CheckListBox1)
    1 TTable (Table1)


3.- Pon el siguiente código en el OnClick del Button1:
Código:
    std::auto_ptr<TOpenDialog> dlgAbrir(new TOpenDialog(0));
    dlgAbrir->Title  = "Abrir Tabla";
    dlgAbrir->Filter = "Tablas (*.db,*.dbf)|*.db;*.dbf";
    if (dlgAbrir->Execute())
    {
        Table1->Active    = false;
        Table1->TableName = dlgAbrir->FileName;
        Table1->Open();

        if (Table1->Active)
            Table1->GetFieldNames(CheckListBox1->Items);
    }


4.- Y por ultimo pon lo siguiente en el OnClick del Button2:
Código:
    // Comprueba que haya campos seleccionados
    bool seleccionados = false;
    int i = CheckListBox1->Items->Count;
    while (i-- && !seleccionados)
    {
        if (CheckListBox1->Checked[i])
            seleccionados = true;
    }
    if (!seleccionados)
        throw Exception("No hay campos seleccionados.");

    // Creamos el informe
   static TQuickRep* qr = 0;
    if (qr)
        delete qr;
    qr = new TQuickRep(this);
    qr->DataSet = Table1;

   // Añadimos las bandas
   TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
    TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
    TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
    TQRBand* bandDetail       = qr->CreateBand(rbDetail);

    // Unidades en milimetros
   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;

    // Añadimos una etiqueta de titulo a la banda de cabecera de página
   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;

   // Añadimos una etiqueta de número de página en el pie de página
   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
    Canvas->Font->Assign(bandDetail->Font);
    int charWidth  = Canvas->TextWidth("x");
    int charHeight = Canvas->TextHeight("Xg");
    Canvas->Font->Assign(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<CheckListBox1->Items->Count; i++)
    {
        if (CheckListBox1->Checked[i])
        {
            String fieldName = CheckListBox1->Items->Strings[i];
            TField* field = Table1->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   = Table1;
            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 = Table1->TableName;

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


Y para probarlo, pulsa sobre el Button1, que sirve para cargar alguna base de datos (Paradox o DBase), luego selecciona en el CheckListBox1 los campos que quieres imprimir y finalmente para generar el informe dinámicamente pulsa sobre el Button2.

Saludos:
 _Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo, lo voy a probar.

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Usando este mismo procedimiento _Leo, he realizado el siguiente procedimiento, implementando para una tabla de interbase, todo funciona correctamente, en cuanto al codigo. jeje pero al mostrar las imagenes, estas se descuadran. es decir toman mas de la hoja de impresion

ejemplo:



y el codigo es el siguiente

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uRepDinamico.h"
#include "UDMFIREBIRD.h"
#include <memory>
#include <QuickRpt.hpp>
#include <Qrctrls.hpp>
#include "LIBS.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFDinamico *FDinamico;
//---------------------------------------------------------------------------
__fastcall TFDinamico::TFDinamico(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFDinamico::Button1Click(TObject *Sender)
{

   if(!DMREMOTO->InventarioFot->Active)
      DMREMOTO->InventarioFot->Open();
   DMREMOTO->InventarioFot->GetFieldNames(CheckListBox1->Items);
}
//---------------------------------------------------------------------------
void __fastcall TFDinamico::Button2Click(TObject *Sender)
{
// Comprueba que haya campos seleccionados
   bool seleccionados = false;
   int i = CheckListBox1->Items->Count;
   while (i-- && !seleccionados)
   {
      if (CheckListBox1->Checked[i])
         seleccionados = true;
   }
   if (!seleccionados)
      throw Exception("No hay campos seleccionados.");

   // Creamos el informe
   static TQuickRep* qr = new TQuickRep(this);
   qr->DataSet = DMREMOTO->InventarioFot;

   // Añadimos las bandas
   TQRBand* bandPageHeader   = qr->CreateBand(rbPageHeader);
   TQRBand* bandPageFooter   = qr->CreateBand(rbPageFooter);
   TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
   TQRBand* bandDetail       = qr->CreateBand(rbDetail);

   // Unidades en milimetros
   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 = clBlue;

    // Añadimos una etiqueta de titulo a la banda de cabecera de página
   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;

   // Añadimos una etiqueta de número de página en el pie de página
   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
    Canvas->Font->Assign(bandDetail->Font);
   int charWidth  = Canvas->TextWidth("x");
    int charHeight = Canvas->TextHeight("Xg");
    Canvas->Font->Assign(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;
   TQRImage *imagen;
   int pos = 0;
   for (int i=0; i<CheckListBox1->Items->Count; i++)
   {
      if (CheckListBox1->Checked[i])
      {
         String fieldName = CheckListBox1->Items->Strings[i];
         TField* field = DMREMOTO->InventarioFot->Fields->FieldByName(fieldName);
         if(field->DataType == ftGraphic)
         {

            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;


            TJPEGImage *tjpg2 = new TJPEGImage();
            Graphics::TBitmap *tbmp2 = new Graphics::TBitmap();
            imagen = new TQRImage (bandDetail);

            imagen->Parent = bandDetail;
            imagen->AutoSize = true;
            imagen->Stretch = true;
            this->Caption = AnsiString(bandDetail->ClientHeight)+" "+AnsiString(bandDetail->ClientHeight);
            imagen->Width = bandDetail->ClientHeight;
            imagen->Height = bandDetail->ClientHeight;
            tjpg2 = ::BlobToJpg(DMREMOTO->InventarioFotFOTO);
            tbmp2->Assign(tjpg2);
            imagen->Picture->Bitmap->Assign(tjpg2);
         }
         else
         {
            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   = DMREMOTO->InventarioFot;
            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 = DMREMOTO->InventarioFot->Name;

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

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.