Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Como Utilizo Correctamente FastReport (https://www.clubdelphi.com/foros/showthread.php?t=47740)

hmrvivas 06-09-2007 00:21:59

Como Utilizo Correctamente FastReport
 
Hola Comunidad.

Mi problema es que estoy trabajando con delphi 7 e instale fast report como reporteador. Lo que quiero saber es como se utilizan estos objetos.

Yo hice lo siguiente:
* Cree un Datamodulo
* Coloque un componente frxReport y un frxDBDataSet
* los vincule y diseño el reporte, lo guardo y me sale bien cuando lo invoco con ShowReports(true)

Hice pruebas modificando por codigo el Dataset del frxDBDataset y del frxReport modifique la propiedad IniFile que es donde relaciona el nombre fisico del archivo.fr3, pero esto no funciona, siempre me sale el mismo reporte cuando me debe salir en un lado uno y en otro el otro.

No se si deba crear un frxDBDataset por cada reporte, aunque tampoco me funciono.

Agradezco si me colaboran con esto.

hmrvivas 06-09-2007 22:48:14

yomismo
 
Bueno tengo los 3 manuales completos en ingles (Usuario, programer y Developer) los tratare de entender y les cuento, de todas formas si alguien tiene experiencia con este reporteador le agradezco.

nuk3zito 08-09-2007 00:31:55

en tiempo de ejecución
 
¿por que no pruebas a cargar el archivo del reporte en tiempo de ejecución?

Yo siempre algo algo como esto:
Código:

Screen.Cursor:=crHourGlass;
  try
    try
      aqryMaster.Open;

      with frxReporte do
      begin
        LoadFromFile( ExtractFilePath(Application.ExeName) +'Presupuesto.fr3', true);
        TfrxMemoView(FindObject('mvAsegCliente')).Memo.Text:= trim(dbePropietario.Text); // Equivalente a formulabyname
        ...
        ...
 
        PrepareReport(true);
        PrintOptions.Copies:= 1;
        PrintOptions.ShowDialog:= true;
        ShowReport; // o Print;
      end;
    except
      On E: Exception do
      begin
        Application.MessageBox(pchar('Ocurrió un error al generar el reporte!' + #13 + E.Message),
          pchar(Caption), mb_ok + mb_iconerror);
      end;
    end;
  finally
    aqryMaster.Close;
    Screen.Cursor:=crDefault;
  end;

Saludos

hmrvivas 08-09-2007 16:20:26

hmrvivas
 
Gracias Nuk3zito.

Me sirvio lo que enviaste, ya pude resolver el problema.

sinm embargo me queda la duda si es mejor trabajar con un solo frxReport, o realmente no importa tener uno para cada reporte.

nuk3zito 08-09-2007 17:09:15

Depende del tipo de pantallas: Modales o No modales
 
Cita:

Empezado por hmrvivas (Mensaje 229365)
Gracias Nuk3zito.

Me sirvio lo que enviaste, ya pude resolver el problema.

sin embargo me queda la duda si es mejor trabajar con un solo frxReport, o realmente no importa tener uno para cada reporte.

En un principio, en el desarrollo de mis primeras aplicaciones me fui con la idea (errónea para mí) de poner todo en módulos de datos. Eso te sirve para ciertas cosas, por ejemplo, el componente de la conexión y datasets que se usen en varias formas.
Ahora para la mayoría de las formas, pongo sus respectivos componentes de datasets, reporte, etc. dentro de la misma forma.
¿Por que?
Yo aquí prefiero dejar la programación muy clara y sobretodo porque mis aplicaciones utilizan pantallas heredadas y de tipo MDI child, por lo cual raramente utilizaré un mismo dataset u otro componente en más de una vez a la vez. No se si me explico... cuando tienes pantallas modales, te puede servir mucho hacer lo que tu haces (de poner los componentes del reporte en un modulo de datos en este caso) porque solo abres una pantalla (forma) a la vez... pero cuando abres varias pantallas a la vez, necesitamos asegurarnos de que los componentes que utilice, solo se utilicen en esa pantalla... y la manera de hacer esto es poniendo los componentes en dicha forma. Así, si usas pantallas no modales, puedes crear tantas instancias quieras de tu misma forma sin perjudicar el funcionamiento entre ellas.

Estoy hablando de instancias de clases (objetos), espero no haberte complicado más.

en resumen, te recomiendo usar un frxReport por forma (solo en donde aplique, claro) y no uno genérico en un módulo de datos.

Saludos.

hmrvivas 09-09-2007 14:58:31

entendido
 
Si, yo trabajo solo pantallas modales, y ya he hecho varios reportes y funciona bien. Tendre en cuenta tu recomendacion para las formas MDI.

Bueno tengo un problema ahora y es que no se como usar una variable global de mi aplicacion que tengo en una unidad en el reporte.

Es decir quiero asignarle a un frxMemoView el valor de una variable que no es del reporte, sino del proyecto.

He probado con los scrip pero no he podido conseguirlo.

Gracias.

nuk3zito 10-09-2007 16:45:33

En el primer ejemplo también viene la forma de hacer eso...

Desde Delphi debes hacer algo como esto:
Código:

TfrxMemoView(FindObject('mvAsegCliente')).Memo.Text:= trim(dbePropietario.Text);
En este caso, "mvAsegCliente" es el nombre del objeto de la clase TfrxMemoView del Reporte.

Y para poder visualizar la variable global en tu forma, basta que pongas en la clausula "uses" la unidad en donde esta variable global se encuentra declarada.

Saludos.

hmrvivas 11-09-2007 07:45:02

aclaracion...!!!!
 
Bueno, lo intente pero no me funciono nada.

Me explico nuevamente:

Quiero utilizar en el evento OnbeforePrint de un frxMemoView una funcion que esta definida en una unidad externa de mi aplicacion. No se come referenciarla, y lo mismo con las variables externas, las coloco y me dice que no la recoce.

Ej.

Código Delphi [-]
procedure Memo24OnBeforePrint(Sender: TfrxComponent);begin  Memo24.memo.text:= ArmaStrATMN(StrToInt(memo13.memo.text),'A','/');end;

La funcion ArmaStrATMN la tengo en una unidad de mi aplicacion.

error: Undeclarad Identifir 'ArmaStrATMN'

probe colocando en la parte superior de la ficha de code lo siguiente


Código Delphi [-]
uses'C:\davinci\dcu\ungeneral.dcu';

y me sale BEGIN 'expected'

agradezco la ayuda

nuk3zito 11-09-2007 17:17:14

Código Delphi [-]
procedure Memo24OnBeforePrint(Sender: TfrxComponent);
begin  
   TfrxMemoView(FindObject('Memo24')).Memo.Text:= ArmaStrATMN(StrToInt(memo13.memo.text),'A','/');
end;


y en el uses solo es necesario:
Código Delphi [-]
  uses ungeneral;
Siempre y cuando esa unidad esté declarada dentro de tu proyecto.

Saludos.


La franja horaria es GMT +2. Ahora son las 09:12:37.

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