Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Consulta sobre el componente TQRexp (https://www.clubdelphi.com/foros/showthread.php?t=1709)

DanielAlexander 24-06-2003 23:11:03

Consulta sobre el componente TQRexp
 
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 24-06-2003 23: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 16: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 20: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 21: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 22: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 01: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 13: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 16: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 21: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/show...p?threadid=703

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

Código:

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 21:19:30

Muchas gracias !!!!!!!!!!!

andres1569 27-06-2003 23: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


La franja horaria es GMT +2. Ahora son las 20:28:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi