PDA

Ver la Versión Completa : Alguien me enseña a hacer un preview?


MaMu
01-05-2007, 09:20:44
Tengo Rave Report 5, y Fast Report.

Pero quiciera poder hacer una vista previa en un Form, y realmente no se como. Todos los tutoriales que baje, solo enseñan a utilizar el diseñador.
Mi idea es hacer un reporte y dejarlo guardado en un archivo, y este poder visualizarlo antes de imprimir, en un form cualquiera.

Agradecere todo tipo de ayuda, ya sean sugerencias, tutoriales, una mano... lo que sea.

Gracias

Loviedo
01-05-2007, 19:20:59
Creo que esto puede ayudarte.
Saludos.

MaMu
02-05-2007, 01:11:58
Gracias por el ejemplo, esta muy claro. El unico problema que tengo ahora, es que si bien ya tengo creado los reportes con el Rave, no me deja precargarlos para compilarlos dentro del ejecutable, si lo intento al cargarlo me tira un error. Lo que pienso es que este error se puede deber a que la ruta de origen del archivo rav es muy larga, es decir exederia alguna limitacion de caracteres para la ruta de archivos, ya que si lo pongo en otra carpeta, mas corta, lo carga sin problemas, muy similar a cuando ensamblo con el MPLab para los uC, tenia el mismo error. No se si esto le sirve a alguien como dato.
Con esta ayuda que me diste, voy a diseñar algun reporteador y mandarlo al objet repository a ver que sale, un saludo y gracias.

MaMu
02-05-2007, 04:54:22
Bueno, a ver si entendi bien los pasos a seguir para generar un preview porque no lo logre hacer funcionar:

Los componentes Rave que necesito

- 1 RvProject que contiene el reporte "mi_reporte.rav"
- 1 RvNDRWriter
- 1 RvRenderPreview
- 1 RvRenderPrinter

Otros

- 1 ScrollBox
- 1 Button

Y los pasos a seguir para generar el reporte son los siguientes

1) Designo una variable a usar como TMemoryStream

var
NDRStream: TMemoryStream;


2) Creo el MemoryStream con el reporte que esta almacenado en RvProject

NDRStream := TMemoryStream.Create;
RvProject1.SaveToStream(NDRStream);


3) Al RvNDRWriter le asigo como Stream, la variable creada como
MemoryStream, la cual a esta altura, deberia contener el reporte

RvNDRWriter1.Stream := NDRStream;


4) Ejecuto el reporte, RvProject.Execute

RvProject1.Execute;


5) Cargo el RvRenderPreview con el Stream

RvRenderPrinter1.Render(NDRStream);


6) Si lo quiero visualizar, RvRenderPrinter.Render(mi_stream)

RvRenderPrinter1.Render(NDRStream);


7) Al salir, liberamos el Stream con Free.

NDRStream.Free;


Esta bien asi? me olvide de algo? Porque no lo puedo hacer andar.
Me dice, "el sistema no puede hallar la ruta especificiada" y no entiendo porque, el reporte existe, y esta en el mismo directorio del proyecto.

Saludos

MaMu
02-05-2007, 07:44:50
Lo mas sencillo que se me ocurrio, es hacerlo mediante:


RvRenderPreview1.Render(RvNDRWriter1.FileName);


Y bueno, todo lo demas, Reglas, Tamaño de hoja, Zooms, exportaciones, queda a criterio de cada uno.

Saludos

Loviedo
02-05-2007, 11:07:53
No tengo muchos conocimientos, los problemas los resuelvo con lo que aportan otros. Esto es como lo uso.
Saludos

MaMu
02-05-2007, 11:13:09
No tengo muchos conocimientos, los problemas los resuelvo con lo que aportan otros. Esto es como lo uso.
Saludos

Me salta demasiado error haciendo un TMemoryStream, pero si lo hago asi:


RvRenderPreview1.Render(RvNDRWriter1.FileName);


no me da problemas. El tema es que el Stream lo necesito, llegado el caso que quiera exportar a otro formato.

Saludos.

Loviedo
02-05-2007, 11:19:10
He intentado adjuntar otro archivo, pero no me lo ha admitido.
Este es el codigo del Datamodule.

implementation

uses mFunct, RVClass, RVProj, RVCsStd, Aviso1, Prever1;

{$R *.DFM}

procedure TDM.DataModuleCreate(Sender: TObject);
begin
RvProject1.ProjectFile := mPath+'\MiComunidad.rav';
end;


procedure TDM.VerDocumento1(numero:integer;Texto1:string);
var
MyPage: TRavePage;
MyText1,MyText2,MyText3,MyText14,MyText15,MyText6: TRaveText;
MyText16,MyText17,MyText18,MyText19,MyText20,MyText21,MyText22: TRaveText;
Texto2,Texto3: string;
begin
RvProject1.Engine := Rvwriter1;
RvProject1.open;
if Numero = 1 then
begin
With RvProject1.ProjMan do
begin
MyPage := FindRaveComponent('Diario1.Page1',nil) as TRavePage;
MyText1 := FindRaveComponent('Text9',MyPage) as TRaveText;
MyText1.Text := Texto1;
MyText2 := FindRaveComponent('Text2',MyPage) as TRaveText;
MyText2.Text := Texto2;
MyText3 := FindRaveComponent('Text3',MyPage) as TRaveText;
MyText3.Text := Texto3;
MyText14 := FindRaveComponent('Text14',MyPage) as TRaveText;
MyText14.Text := Format('%*.*f',[8,2,sumahaber-sumadebe]);
end;
RvProject1.SelectReport('Diario1',true);
end
else if Numero = 2 then
begin
With RvProject1.ProjMan do
begin
MyPage := FindRaveComponent('Mayor1.Page1',nil) as TRavePage;
MyText1 := FindRaveComponent('Text9',MyPage) as TRaveText;
MyText1.Text := Texto1;
MyText2 := FindRaveComponent('Text2',MyPage) as TRaveText;
MyText2.Text := Texto2;
MyText3 := FindRaveComponent('Text3',MyPage) as TRaveText;
MyText3.Text := Texto3;
MyText14 := FindRaveComponent('Text14',MyPage) as TRaveText;
MyText14.Text := Format('%*.*f',[8,2,sumahaber-sumadebe]);
end;
RvProject1.SelectReport('Mayor1',true);
end;

Fprevio := TFprevio.Create(Application);
try
Fprevio.ShowModal;
finally
Fprevio.Free;
end;
RvProject1.close;
end;

end.


saludos

MaMu
02-05-2007, 11:26:43
EL codigo del DM esta muy claro, no tengo problemas en la generacion del reporte, puedo generarlo por codigo o simplemente con el designer, mi problema esta en el Stream:


NDRStream := TMemoryStream.Create;
RvProject1.ProjectFile:='c:\mi_programa\mi_reporte.rav';
RvProject1.Engine := RvNDRWriter1;
RvProject1.open;
RvProject1.SaveToStream(NDRStream);
RvNDRWriter1.Stream := NDRStream;
RvRenderPrinter1.Render(NDRStream); //ERROR


EL error que me salta es : Invalid Project Format.

Saludos

Loviedo
02-05-2007, 11:33:00
A mi no me da ningún tipo de error, quizás el problema esté en los 'uses'.
Saludos.

MaMu
02-05-2007, 11:38:40
Mmm a esta altura no se


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, RpRenderPrinter, RpRender, RpRenderCanvas,
RpRenderPreview, RpBase, RpFiler, RpDefine, RpRave, RpCon, RpConDS,
StdCtrls, RpSystem;



var
Form1: TForm1;
NDR: TMemoryStream;


Tendre que seguir buscandole la vuelta.

Saludos

MaMu
02-05-2007, 12:10:11
Hasta ejecutanto:


RvRenderPreview1.Render('mi_reporte.rav');


Me funciona, pero sigue el mismo error en el TMemoryStream, no se, "cosa e mandinga, vio?"

Saludos

MaMu
02-05-2007, 12:16:02
Hasta ejecutanto:


RvRenderPreview1.Render('mi_reporte.rav');


Me funciona, pero sigue el mismo error en el TMemoryStream, no se, "cosa e mandinga, vio?"
Necesito una recomendacion, quiero armar un procedure que me imprima directamente el reporte, sin abrir ningun dialgo de imprimir ni nada, asi directamente como esta y setear todo por codigo. Que consideraciones debo tener? (tamaño papel, color o negro, copias, etc..)Una suerte de...


procedure imprimedirecto(ProjectFile:string);


Saludos

Loviedo
02-05-2007, 15:19:09
El fallo puede ser que destruye el NDRStream antes de tiempo. Yo lo hago cuando cierro el form del previo.
Saludos.

MaMu
03-05-2007, 06:00:39
Lo destruyo al salir en el evento OnClose del Form principal de la aplicación.
A mi entender, es como que el Stream está vacio, otra explicación no tengo.

Saludos

Loviedo
03-05-2007, 11:15:06
En el componente TRvNDRWrite la propiedad StreamMode debe ser smUser.

El RvProject.Engine apunta al TRvNDRWrite.
El NDRStream debes destruirlo en el onClose del previo, ya que lo estás creando en el onCreate del mismo, evitará crear múltiples instancias cada vez que visualice un report.
Saludos.

MaMu
04-05-2007, 04:49:09
Y como puedo hace para mandar a imprimir un reporte ya creado, por ejemplo "mi_reporte.rav", pero quiero mandarlo a imprimir directamente sin hacer ningun preview.

Saludos

Caral
04-05-2007, 05:00:30
Hola mamu
No se en rave, pero en qreport:
Para imprimir, directamente:

begin
try
QReport1.Print;
finally
QReport1.Free;
end;
end;
Para hacer un Preview:

begin
try
QReport1.Preview;
finally
QReport1.Free;
end;
end;
Asi de simple, la verdad no se porque no usas QReport, que viene con delphi.
Saludos

MaMu
04-05-2007, 10:48:40
Asi de simple, la verdad no se porque no usas QReport, que viene con delphi.


Porque no lo tengo instalado, al menos no me aparece en la paleta de componentes, en que bpl esta?. Uso Delphi 7.
Ahora bien, yo elegi Rave, porque me es muy comodo modificar los reportes con el Designer, lo que me ahorra tiempo a la hora de tener que modificar el codigo del programa y hasta a veces ni es necesario. De todas maneras son muchos los que me han sugerido que me vuelque al QReport, asi que proximamente voy a empezar a ver el tema.

Saludos y gracias.

Loviedo
04-05-2007, 12:01:25
Esto me funciona perfectamente.


procedure TFMain.Button1Click(Sender: TObject);
var
NDRStream: TMemoryStream;
begin
DM.Query5.Open;
NDRStream := TMemoryStream.Create;
try
DM.RvProject1.open;
DM.RvProject1.SelectReport('DomiciliarRecibos',true);
DM.RvProject1.SaveToStream(NDRStream);
DM.RvWriter1.Stream:=NDRStream;
DM.RvProject1.Execute;
DM.RvPrinter1.Render(NDRStream);
DM.RvProject1.close;
DM.Query5.Close;
except
NDRStream.Free;
end;
end;



Saludos.

Loviedo
04-05-2007, 12:49:37
Se me olvidaba. No es bueno abandonar cuando encontramos un problema, hay que intentarlo siempre, despúes podemos decidir cambiar a lo que más nos intereses. Lo que aprendemos con esfuerzo, nunca se olvida.
Solo es un consejo amigable.
Saludos.

MaMu
04-05-2007, 13:39:28
Si loviedo, yo opino lo mismo que vos.
Ahora tengo un problema, y la verdad es que no puedo determinar la causa. Yo tengo varios reportes ya creados: Empleados.rav y Remitos.rav, pero...

yo ejecuto esto al mostrar el form del preview


procedure TImpresion.FormShow(Sender: TObject);
var root,reporte,titulo:string;
begin
ADOQuery1.Open;
ADOQuery2.Open;
root:=ExtractFilePath(Application.ExeName);
titulo:='empleados';
Label2.Caption:='INFORME DE '+titulo;
reporte:=titulo+'.rav';
RvNDRWriter1.FileName:=root+reporte;
VrScrollText1.Active:=True;
RvRenderPreview1.Active:=True;
RvRenderPreview1.Render(RvNDRWriter1.FileName);
Label3.Caption:='Página'+IntToStr(RvRenderPreview1.CurrentPage)+' de '+IntToStr(RvRenderPreview1.Pages);
end;


Con el titulo, que en este caso vale "empleados", me ejecuta todo sin problemas, pero cuando le cambio el titulo a "remitos" (en ambos caso formo el nombre y ruta real de los reportes *.rav) me sale este error:


Unexpected header code [82] found in report file


Que es lo que pasa? Ambos reportes estan creados igual.

Help Me!!! es super importante.

Saludos y Gracias

Loviedo
04-05-2007, 14:58:27
No soy experto, lo poco que se lo he aprendido de otros.
No entiendo el motivo de dos ficheros '.rav'. Supongo que son dos aplicaciones distintas.
Cuando en mi aplicacion cambio el path tengo que indicarle al RvProject.ProjectFile el nuevo camino del .rav, por lo que parto de cero, es decir: RvProject.close....
Saludos y suerte.

MaMu
04-05-2007, 15:06:34
Usando el sentido comun, a mi entender, es como que el propio Rave me trunca las cabeceras de los reportes, como un error propio del Rave. No necesitare algun parche para delphi 7 ? algo que corrija esos errores? Porque ejecuto ambos reportes desde el designer y funcionan lo mas bien.
No estoy utilizando Stream ni RvProject1, simplemente lo paso de un RvWrite a un RvRenderPrepiview, asi:


RvRenderPreview1.Render(RvNDRWriter1.FileName);


Y de esta forma, me anda un solo rav, los demas no. Y cree uno atras de otro. Que puede ser?

Loviedo
04-05-2007, 15:17:29
Soy jubilado, no me dedico a esto de la programación, solo me gusta. Si me dices tu correo (mensaje privado) lo que puedo hacer es enviarte mi aplicación.
Saludos.

MaMu
04-05-2007, 15:45:28
Pero fijate, mira que curioso. Abri un rav que me anda y uno que no.

Este es el que me anda, se puede ver que tiene cuerpo completo



[delphi]Zá Rave Report  ' A 0A €> €>)\?=…ë>    D , P  A 0A)ÿÿÿ *+ 3Arial4 5? 7 9 8 : ; < = > 6 >Í̘@G HI JtÚ: ÈB ÈB  ÿ76 >ïîž@Sïîî=?Âõ<š™>ö(œ?Gestión de Remitos 2007ÍÌì?G€€€ €? €? ð@ €?" †Í BM†Í 6 ( ð I   PÍ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 33£@ €? ð@¤pÝ? €?ffæ? ð@ffæ??7 6A§
>tÚ¨@S0–ü=?Âõ<çû)>shÑ?LISTADO DE USUARIOS/EMPLEADOSÍÌŒ?S0–ü=?Âõ<çû)>G €?¦›ü? ð@¦›ü?? 6 >Í̘@S~±ä=tÚ<š™>ýbù?Empleado €?S~±ä=tÚ<š™>ýbù?Teléfono33@S~±ä=tÚ<š™>ýbù?Turnofff@S~±ä=tÚ<š™>ýbù?Fecha de RegistroÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>K@Mariano €?S~±ä=tÚ<š™>K@4522811033@S~±ä=tÚ<š™>K@ Full Timefff@S~±ä=tÚ<š™>K@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>±ä@Bruno €?S~±ä=tÚ<š™>±ä@4521836633@S~±ä=tÚ<š™>±ä@ Full Timefff@S~±ä=tÚ<š™>±ä@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>K~@Laura €?S~±ä=tÚ<š™>K~@4504581733@S~±ä=tÚ<š™>K~@ Turno Mañanafff@S~±ä=tÚ<š™>K~@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>å#@Fedra €?S~±ä=tÚ<š™>å#@4504581733@S~±ä=tÚ<š™>å#@Temporalfff@S~±ä=tÚ<š™>å#@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>~±,@Arthur €?S~±ä=tÚ<š™>~±,@
154973033133@S~±ä=tÚ<š™>~±,@
Indefinidofff@S~±ä=tÚ<š™>~±,@
02/05/2007ÍÌœ@S~±ä=tÚ<š™> €?š™!A ð@š™!AR
[/code]








Saludos

MaMu
04-05-2007, 15:46:35
Y este es el que no me anda

[delphi]
<DIV class=frame_codigo_delphi><DIV class=texto_codigo_delphi id=delphi_div_463b387dc5b5c>
RAVEœ Report2 TRaveProjectManager RaveProject
CompileNeeded FalseFullName RaveProject
Categories
Parameters PIVars UnitsFactor €ÿ?  DataView1
TRaveDataView € ¥B‘„ìe"N†±¤ÊwÂapØxÄ
!›Í§I°ÊN2™L’ Œa6Ì ‚1ÔØl'M¦P4F ‡Æ èɸÜe1?
&ótÆf
ŽÑ# LÊtžÏè43pÄ
`?c)$Üt2™Ì§"48Ød S"“£I?¾r2›M'Cx e2ÙèÓ@M¶ßq¹Ýe²ûÜÖýp¹] …3IèÊ 2U¨,½`±Y,Æ@…ªr11›!Õù]ß7…ètv dºa2šjtF]&/?È䂸9Lèr4›Œ÷‹8G=¸Í&+m×My2aAž_7[„غt©?߶Çd2@ –ò
2•
3>!?Ç?¨ƒ

ÛÛ…üŒN¾¾?ù|Æ??7••yÖ©ìfÀ×À1ñÉõsקd„a7õ…†!( Œx`VJW'¥ë^Ðb~ŸA|p‘¥=Ö…]d‹F¾1LÔ'z?ã˜î2??ø‚?žhš ŠY°^†c¨ÂD?wd”d8õÖ`ßäÒX‡¥¨ÍÞ€À‰Yy™u…c<SPAN class=comment>{^ôÝk G1¼b\f?Ùg)Ñ+—_‰ép™[” æ„1mƒ×D,l??âŠJ$þ?&P‰ãeÁoÑá„n{@ø

Loviedo
04-05-2007, 16:51:44
Si uno funciona tienen que funcionar los demás.
Sigo sin entender el ¿Por qué? de dos ficheros .rav, cuando en uno se puede almacenar todos los report que se deseen, sólo hay que indicarselo en la propiedad 'RvProject1.SelectReport'.
Por ejemplo: 'Empleados.rav' contiene los reports 'Domicilio', 'Turnos', 'Vestuario' etc.

RvProject1.ProjectFile := 'Empleados'
RvProject1.Engine := Rvwriter1;
RvProject1.open;
if n = 1 then
RvProject1.SelectReport('Domicilio',true)
else if n = 2 then
RvProject1.SelectReport('Turnos',true)
else if n = 3 then
RvProject1.SelectReport('Vestuario',true);
....

Saludos

MaMu
04-05-2007, 17:37:34
Si uno funciona tienen que funcionar los demás.
Sigo sin entender el ¿Por qué? de dos ficheros .rav, cuando en uno se puede almacenar todos los report que se deseen, sólo hay que indicarselo en la propiedad 'RvProject1.SelectReport'.
Por ejemplo: 'Empleados.rav' contiene los reports 'Domicilio', 'Turnos', 'Vestuario' etc.

Ahhh, es porque el programita que estoy haciendo es un visualizador de archivos rav, es decir de reportes en general, y de ahi exporto a pdf y html. Es para poder abrir reportes de cualquier otra aplicación.

Saludos

Loviedo
04-05-2007, 17:59:42
En www.nevrona.com existe algo similar ESBRaveViewer que es libre, la pena es que no viene con los fuentes.

Saludos.