PDA

Ver la Versión Completa : Consulta sobre el componente TQRexp


DanielAlexander
25-06-2003, 00:11:03
Hola a todos!!!!!!!
Tengo que poner en un componente TQRexp en un reporte la cantidad de lineas que muestro.
Me imagino que se hace con la propiedad expresión, con la función count, pero no se como usarla.
Muchas gracias..

andres1569
25-06-2003, 00:27:10
Si colocas un componente TQRSysData, tiene una propiedad Data donde un posible valor es DetailCount, que indica el número de lineas de detalle que aparecen en el informe.

DanielAlexander
25-06-2003, 17:28:27
Hola!!!!!!!
Hice un informe en el cual necesito mostrar la cantidad de lineas que aparecen por página, probé con un QRsysdata, puse la propiedad data en "qrsDetailNo", en el informe muestro los datos agrupados por farmacia, pero cuando cambio de farmacia no se resetea el contador, sino que los va incrementando.
Tambien probe en ponerlo en "qrsDetailCount", pero directamente me trae la cantidad de lineas que hay en todas las paginas de todas las farmacias.

Por favor si alguien me puede dar una mano .
Gracias.....

andres1569
25-06-2003, 21:55:59
Hola, efectivamente, para eso que buscas de mostrar el número de lineas por grupos no te sirve un TQRSysData, habría que recurrir a un TQRExpr y usar la función COUNT, pero no sé por qué no funciona en QReports.

Otra solución es que crees una variable global, pe. NumLineas : Integer, la inicializas a 0 en el evento BeforePrint del Informe y en el AfterPrint del QRGroupFooter. En el BeforePrint de la banda de detalle la incrementas y asignas su valor a mano a un TQRLabel, por ejemplo en su evento BeforePrint:

QRLabel1.Caption := IntToStr(NumLineas);

DanielAlexander
25-06-2003, 22:48:22
Funcionó!!!!!!!!!!.
Depaso te hago otra consulta, el reporte que tengo hecho agrupa por farmacia, el problema que tengo es cuando para una farmacia x los registros para esa farmacia no entra en una hoja, me muestra la proxima hoja en blanco y recien en la proxima la continuación de los detalles. o sea que mientra entra en una hoja funciona perfecto, el tema es cuando no entra en una siempre me genera una intermedia en blanco.
Tenes idea porque puede ser?
en el groupheader tengo la propiedad forcenewpage en true, porque no quiero que me mezcle las farmacias en una misma hoja.

Gracias.

andres1569
25-06-2003, 23:23:15
Siento no poder ayudarte, la verdad es que puede que sea un fallo de QReports, a veces me he desesperado con comportamientos sin explicación de este generador de informes (pero como llega gratuito con Delphi ...)

De todas formas, trata de jugar con esa propiedad ForceNewPage, mira que no esté activada en el GroupFooter. Otra cosa, mira si tienes activada la propiedad ForceNewColumn y trata de jugar con ella; por último si en algún evento BeforePrint desactivas la banda PageFooter, asegúrate de llamar al método ResetPageFooterSize del componente TQuickReport.

Son algunas ideas ...

DanielAlexander
26-06-2003, 02:07:18
Lo pude hacer funcionar en el beforeprint del detalle pregunto si la variable que uso para contar las lineas >= 8 lineas que son las que entran por hoja, pongo la propiedad forcenewpage del groupheader en false, de lo contrario en true;
y así salió andando.
Con el Qreports la unica forma de exportarlo es con excel en formato CSV, pero te deja los datos todos desparramados, hay alguna forma de exportarlo a excel o word y que me quede mas prolijo?, o me conviene utilizar otro reporte, por ejemplo el
cristal8, lo que no se es como funciona con delphi?
Salu2.

andres1569
26-06-2003, 14:26:39
Hola:

Tienes varias alternativas. Puedes pasar la consulta o Dataset en que se apoya el Informe directamente a Word o a Excel, ya sea mediante los componentes de la paleta de Servers (hay un foro dedicado a ellos exclusivamente), o hacerlo a la antigua (antes de Delphi 5.0), usando interfaces OLE, pero esto es algo que debes mirar en los foros de OOP o de Varios o en los Históricos, pues ya se ha tratado en otras ocasiones. Si no encuentras nada que te sirva, pregúntalo de nuevo y te contesto cómo hacerlo mediante OLE variants, prefiero no meterlo en este foro que no es el adecuado.

¿Otros generadores de informes? Bueno, la ventaja de los QReports es que te permiten imprimir lo que el usuario ve en pantalla, desde Delphi mismo, sin tener que rehacer la consulta con sus filtros etc... Esa ventaja no la tienes con CrystalReports. Hay algunos generadores de informes por ahí con una filosofía parecida a QReports pero más potentes y que seguro permiten exportar a Excel. Del que he oído hablar bastante bien es de FastReports, también se emplea por ahí el FreeReports, en este foro de Impresión se habla de ellos.

DanielAlexander
26-06-2003, 17:00:59
Si tenes un ejemplo de como hacerlo con los componentes de la paleta server, para exportar el informe a word, o excel
Muchas gracias.

andres1569
26-06-2003, 22:03:15
Hola de nuevo:

No he utilizado nunca estos componentes, sino que como te decía he generado archivos Excel a la vieja usanza, mediante OLE variants. De esto hay varios ejemplos en estos foros, en concreto en el foro de Servers, por ejemplo:

http://www.clubdelphi.com/foros/showthread.php?threadid=703

La clave es recorrer tu Dataset y a cada registro asignar las filas, algo así como:


var
ExcelObj : Variant; // variable global

procedure TForm1.Button1Click (...);
var
WBk, WSh : Variant;
i, j : Integer;
CodFarmacia : String;
begin
ExcelObj := CreateOleObject ('Excel.Application');
WBk := ExcelObj.Workbooks.Add('Farmacias.xlt'); // si usas una plantilla
WSh := WBk.WorkSheets[1];
Table1.First;
i := 0; // lleva el contador de filas
CodFarmacia := Table1CODFARMACIA.AsString;
while NOT Table1.EOF do
begin
for j:=0 to Table1.FieldCount - 1 do
Wsh.Cells[j, i] := Tabla1.Fields[j].AsString;
Inc (i);
// controlamos el cambio de grupo
if CodFarmacia <> Table1CODFARMACIA.AsString then
begin
CodFarmacia := Table1CODFARMACIA.AsString;
Inc (i); // una forma de dejar una linea en blanco
end;
Table1.Next;
end;
ExcelObj.Visible := TRUE;
WBk.SaveAs('Farmacias.xls');
end;

procedure TForm1.Destroy;
begin
if NOT VarIsEmpty(ExcelObj) then ExcelObj.Quit;
end;


Insisto en que esto se sale de este foro de Impresión, es mejor que lo mires en el foro adecuado o si vas a la opción Buscar y tecleas Excel te aparecerán varios hilos donde se trata este tema. En este ejemplo que te pongo te encargas tú mismo de controlar cuándo hay un cambio de grupo (CODFARMACIA) y ahí puedes hacer lo que creas oportuno, como muestra he dejado una linea en blanco.

De todas formas, esto es muy manual, quizás encuentres algún componente que haga algo parecido.

DanielAlexander
27-06-2003, 22:19:30
Muchas gracias !!!!!!!!!!!

andres1569
28-06-2003, 00:01:28
De nada !!!!!!!!!!!!!!!!

No sé si has seguido el mismo código que te he puesto o has optado por otra variante, pero me acabo de dar cuenta de que dentro del bucle, al controlar el cambio de grupo, hay que hacer antes el Table1.Next para que sea correcto.

Un saludo