| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
rockfavc Cmdr


Registrado: 23 Ago 2002Mensajes: 138Ubicación: Colombia (Medellín)
|
Publicado: Mie 26 May, 2004 10:26 pm Asunto: Reporte Dinámico |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 27 May, 2004 5:01 am Asunto: |
|
|
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 |
|
 |
rockfavc Cmdr


Registrado: 23 Ago 2002Mensajes: 138Ubicación: Colombia (Medellín)
|
Publicado: Jue 27 May, 2004 10:29 pm Asunto: |
|
|
Muchas gracias Leo, lo voy a probar.
Saludos |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 09 Jun, 2006 8:51 am Asunto: |
|
|
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();
}
//--------------------------------------------------------------------------- |
_________________
 |
|
| Volver arriba |
|
 |
|