Hola qué tal. Te comento, estoy realizando un sistema en el que me piden que en un mismo formulario se pueda visualizar el documento final (la previsualización del reporte) y en otra parte del mismo formulario estén los controles
1 respuesta
Respuesta de davsoft
1
1
davsoft, Desarrollador con 10 años de experiencia en el area de Visual...
¿Cuándo te refieres a controles te refieres a los controles del form o los del report?, bueno, asumo que te refieres a los del form, lo que entiendo es que quieres que se haga el preview en una ventana y en la otra ventana el form, bueno, para ello la cláusula REPOR FORM posee la opción IN WINDOWS nombre de ventana, puedes definir una ventana con DEFINE WINDOWS y luego lo mostrás ahí tu repor y listo, no entiendo cual es el objetivo de tu cliente debido a que el report tiene su propia ventana y se ejecuta siempre separado del form, si minimizas un repor veras tu form detrás, otra forma fácil es tener un form vacío con la opción showwindows=2 (como nivel superior), luego ese form ejecuta el reporte y estará en la ventana en forma separada
La idea es tener la previsualización y los controles del form en la misma ventana, de lo que se trata es de poder realizar una cambio y casi al mismo tiempo visualizar el resultado; esto se debe a que tiene que revisar y corregir muchos dictámenes (en esta primera etapa son aprox. 43 mil), pero como son abogados (nadie es perfecto ;-) ), para ellos el hecho de que puedan ver el resultado final de toda la información que están generando, les da certeza en sus dictámenes. (También intenté convencerlos de que no era necesario, pero el que paga ordena). Disculpa si me extiendo en la explicación pero es para aclarar lo más posible y de éste modo me puedas orientar. Pues lo que estoy haciendo es: *Creo mi reporte. El reporte debe de presentar la información justificada, así que lo creo a partir de una clase en la cual ya tengo el procedimiento para que muestre los textos justificados. lparameters oRef rl =newobject("FullJustifyListener","progs\FJListener.prg") rl.ListenerType = 3 SET REPORTBEHAVIOR 90 REPORT FORM dictamen_just.frx OBJECT m.rl *Ahora por código puedo mostrar el reporte dentro de un control Shape x = newobject("myPreview") x.Listener = m.rl x.Show(1) *Creo el formulario en donde voy a mostrar el reporte define class myFrame as Container Width = 296 Height = 372 Left = 12 Top = 12 SpecialEffect = 1 BackColor = rgb(192,192,192) add Object target as myTarget enddefine define class myTarget as Shape Height = 330 Width = 255 Left = 20 Top = 20 BackColor = rgb(255,255,255) procedure MouseDown lparameters nButton, nShift, nXCoord, nYCoord offsetX = m.nXCoord - THIS.Left offsetY = m.nYCoord - THIS.Top THISFORM.MousePointer = 5 do while mdown() THIS.Left = mcol(0,3) - m.offsetX THIS.Top = mrow(0,3) - m.offsetY enddo THISFORM.MousePointer = 0 endproc enddefine define class myPreview as Form Width = 420 Height = 395 BorderStyle = 1 WindowType = 0 add object frame as myFrame add object cmdClose as myButton ; with Top=220, Caption = "Close" Listener = .null. PageNo = 1 procedure Outputpage() with THIS if not isnull(.Listener) and .Listener.PageTotal > 0 .Listener.OutputPage( ; .PageNo, .Frame.Target, 2, ; 0, 0 , 0 , 0 , ; .Frame.Left +2, ; .Frame.Top +2, ; .Frame.Width -4, ; .Frame.Height -4 ) .Caption = ; justfname(.Listener.commandClauses.file) ; + " - page " + trans(.PageNo) endif endwith endproc procedure Paint() THIS.OutputPage() endproc procedure cmdClose.Click THISFORM.Release() endproc procedure SetReport( oRef ) if not isnull(oRef) and vartype(oRef) = "O" THIS.Listener = m.oRef else THIS.Listener = .null. THIS.Hide() endif endproc procedure QueryUnload() nodefault THIS.Release() endproc procedure Release() if not isnull(THIS.Listener) THIS.Listener.OnPreviewClose(.F.) THIS.Listener = .null. endif THIS.Hide() endproc procedure Destroy() THIS.Listener = null dodefault() endproc enddefine define class myButton as CommandButton FontName = "Tahoma" FontSize = 8 Width = 84 Height = 27 Left = 320 enddefine *** Al momento de llamar a mi reporte me lo muestra dentro del control Shape y lo puedo mover sin ningún problema, ahora bien, yo quisiera manejarlo de dos modos: 1. Crear un formulario con el (asistente para formularios) y utilizar la mitad de éste para previsualizar el reporte y en la otra mitad tener los controles que me permitan modificar los datos (no sé si esto sea posible), por lo pronto me he encontrado con lo siguiente: a) Al momento de llamar a mi formulario (creado con el asistente), y aunque estén Declarados todos los métodos y propiedades, al momento de llamar a la Función OutPutPage() me manda el error de que no existe la propiedad .PageNo (lo Cual tiene lógica ya que no es una propiedad del formulario sino de ReportListener) 2. Crear el formulario por código y utilizar la mitad de éste para previsualizar el reporte y en la otra mitad tener los controles que me permitan modificar los datos, peeeroo a) Al crear mi formulario, como va a tener otros controles (grid, checkbox, option button, Text, etc.) necesito cargar el entorno de datos. Lo estoy haciendo de la siguiente forma: Como ya tengo un formulario con los controles que necesito y completamente funcional, guarde éste formulario como una clase, ahora lo que necesito es cargar el entorno de datos (que ya tengo también definido en otra clase). Por el momento es lo que llevo, la verdad no sé si lo estoy haciendo de manera correcta, pero mi cliente tiene esa necesidad (de poder hacer las dos cosas casi al mismo tiempo). Espero me puedas orientar, corregir, regañar, apoyar o lo que sea; porque YA ME EMPIEZO A SENTIR SOLO. Gracias.
Creo que vas por el camino correcto, pero quisiera hacerte una pregunta, ¿has planteado a tu cliente previsualizar el contenido en un control RichText?, solo pregunto para que des una ojeada por ella, sino, olvida lo que te dije y me avisas