PDA

Ver la Versión Completa : Uso de QRStringsBand


Gabo
08-10-2007, 13:38:31
Hola,

he comenzado un hilo sobre como se efectúan las consultas entre varias tablas con SUM aquí (http://www.clubdelphi.com/foros/showthread.php?p=236856#post236856). En realidad, y como comento en dicho hilo, la consulta es para un reporte, concretamente un QReport y, la consulta la hago mediante un TIBQuery.

He pensado en que otra solución para mi problema es recorrer el Dataset para efectuar la sumatoria, y luego, mostrar los campos en un QRStringsBand. El problema es que no tengo ni idea de como hacerlo :D.

He consultado el manual de QReport disponible en el sitio de Qusoft. Pero sólo te dicen para que sirve el QRStringsBand y nada más. En el foro, sólo hay un hilo (http://www.clubdelphi.com/foros/showthread.php?t=5214&highlight=qrstringsband)donde se comentó la posibilidad de usarlo pero sin entrar en mayores detalles. ¿Alguien me podría dar más detalles?

Hasta ahora llevo hecho esto:


IBQdetalle->Close();
IBQdetalle->ParamByName("codPago")->AsInteger=codigoPago;
IBQdetalle->Prepare();
IBQdetalle->Open();
DSdetalle->DataSet->First();
while(!DSdetalle->DataSet->Eof)
{
QRStringsBand1->Items->Add(DSdetalle->DataSet->FieldByName("NOMBRE")->AsString);
DSdetalle->DataSet->Next();
}
QuickRep1->PreviewModal();

y luego:

void __fastcall TfrmResumenPago::QRLabel8Print(TObject *sender,
AnsiString &Value)
{
Value = QRStringsBand1->Item;
}

Con esto, me imprime varias veces el nombre del personal, pese a que la consulta sólo devuelve 6 registros de 4 campos.

Lo dicho, ¿alguien me podría dar más detalles sobre como usar las QRStringsBand?

Nota 1: Como habrán notado programo en BuilderC++. Pero no tengo problemas en que me respondan con código de Delphi, ya que la idea me valdrá.

Nota 2: No quise continuar las preguntas en el hilo anterior y espero con eso, no estar infringiendo la regla de no duplicar mensajes. Pero me parece que esto es un caso distinto, ya que éste hilo aborda un tema que no tiene nada que ver con el otro.

Caro
08-10-2007, 16:19:52
Hola Gabo, no he manejado QrStringBand del quickreport, pero podrias tambien recorrer tu dataset utilizando el evento OnNeedData del quickReport.

En dicho evento debes colocar lo siguiente para recorrer tu dataset, el resultado se mostrara en un QRLabel, en este caso lo que estoy usando es una banda Detail ahi dentro el QRLabel.


procedure TForm1.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
var
cadena : string;
begin
MoreData := not Query1.Eof;
if MoreData then
begin
cadena:=Query1.Fields[1].AsString;
QRLabel1.caption := cadena;
Query1.Next;
end;
end;


y despues en tu evento BeforePrint del quickReport inicializas tu dataset con Query1.First;

Tambien puedes usar el componente QrExpr para hacer la sumatoria, con la función de sum que tiene, solo tienes que indicarle sobre que campo quieres que haga ese sum.

Espero te sirva.

Gabo
08-10-2007, 17:09:39
Lo he traducido:


void __fastcall TfrmResumenPago::QuickRep1NeedData(TObject *Sender,
bool &MoreData)
{
AnsiString cadena;
MoreData=IBQdetalle->Eof;
if (MoreData)
{
cadena= IBQdetalle->Fields->Fields[0]->AsString;
//FieldByName("NOMBRE")->AsString; También lo he probado así
QRLabel8->Caption=cadena;
IBQdetalle->Next();
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmResumenPago::QuickRep1BeforePrint(
TCustomQuickRep *Sender, bool &PrintReport)
{
IBQdetalle->First();
}
//---------------------------------------------------------------------------


Ahora si me entrega seis filas, conforme al número de registros que son, pero no cambia el Caption, de hecho he probado con:


QRLabel8->Caption="hola"; y tampoco lo cambia. :confused:

Seguiré intentándolo. :)

fjcg02
08-10-2007, 17:52:58
Hola Gabo,
informarte de que el QReport incluye objetos de tipo expresión que realizan las sumas, medias, etc, sin que tengas que intervenir más que para definir que tipo de calculo quieres realizar.
Para probar, ouedes incluir un TQRExpr de la paleta QReport en la banda que quieras, definir una expresión y ver qué ocurre.

Si quieres ver los pagos a los empleados, listalos todos, incluye una banda de grupo y un objeto del que te he indicado. Te ahorra un montón de trabajo. El valor de expresion en la banda de grupo es el que indica cuando se imprime; puede ser un campo ( se imprime cada vez que cambai el valor de un campo)una expresión ,...

Imagino que no tendrás demasiados problemas.

Suerte y saludos

Gabo
08-10-2007, 18:16:54
Pero, tengo entendido que sólo se puede usar el TQRExpr sólo se puede usar con Table y yo uso Query.

Lo he probado, por si acaso y no me coge los campos del IBQdetalle.

Gabo
08-10-2007, 18:21:19
Acabo de ver el tutorial de QuickReport de Qusoft y allí el ejemplo es con Table y trabajan con la propiedad IndexName que no está disponible en Query.

Caro
09-10-2007, 02:40:19
Hola de nuevo Gabo, como te decia puedes usar el qrexpr del quickreport para hacer la suma, tambien funciona con query, solo que tu consulta ya tiene que estar hecha y su propiedad active tiene que estar en true en tiempo de diseño.

Colocas el componente qrexpr en tu banda, seleccionas su propiedad Expresion ahi te aparecera un Wizard, escojes function -> SUM -> continue, despues debes introducir el campo sobre el que se hara la suma, donde escojeras Database field, ahi te aparecera el query con sus respectivos campos, ahora escojeras sobre el campo que quieres hacer la sumatoria, despues aceptas todo lo que hiciste y listo.

Saluditos

Gabo
09-10-2007, 09:14:21
Lo probaré.

Verás las veces que he intentado ocuparlo no me aparecen los campos de la Query, sólo las o las Querys disponibles. Cuando hacía clic en alguna de ellas no me aparecían los campos. Di por sentado que era porque no usaba el IBTable que sugerían en el manual.

Voy a probarlo cambiando el Active del Query a True.

¡Gracias!

Gabo
11-10-2007, 12:46:20
¡Gracias Caro y fjcg02!

Ya pude ver por que no conseguía hacer las sumatorias...

Al poner la propiedad Active del TQuery en True, comencé a ver los campos en el asistente del TQRExpr. Yo pensaba que era por no usar el control IBTable, pero ya veo que no. :p

De nuevo, ¡muchas gracias! :):):)