PDA

Ver la Versión Completa : Imprimir sólo información en pantalla


radenf
19-01-2009, 15:09:30
Un gran saludo a todos.

Quisiera vuestra ayuda con un problema de impresión que no he podido solucionar a pesar de haber buscado en este y otros foros y leído distintos tópicos.
He desarrollado una aplicación que utiliza como base de datos ADO. Estos datos se muestran en el form de la aplicación. Confeccioné un report en Quickreport conectado al dataset y cuando le doy a imprimir en el botón Imprimir que puse en la aplicación, en vez de imprimir el registro visible en la pantalla, imprime todos los registros existentes en la base de datos.
¿Cómo debo proceder? ¿Sería recomendable utilizar un ADOQuery? y si es así ¿alguien puede ayudarme con el código sql?

Desde ya agradezco cualquier ayuda.

luisgutierrezb
19-01-2009, 16:22:27
deja en blanco la propiedad dataset al quickreport

radenf
19-01-2009, 17:53:52
Estimado luisgutierrezb:

Gracias por tu respuesta.
Eso ya lo hice, siguiendo tu consejo en otro hilo y no funcionó.
¿Conoces alguna otra opción?

Salu2

Bpascal
20-01-2009, 00:21:40
Para hacer un reporte que no imprima los registros del dataset y solo el registro actual entonces elimina la banda de detalle, Los campos del registros actual ponlos en en la banda PAGEHEADER por ejemplo la cual el tamaño se puede modificar al gusto.

Yo he utilizado esa tecnica para imprimir informacion que incluso no sale de ninguna tabla, si no de datos desde variables de memoria, por ejemplo un desglose de monedas de una planilla de pago de empleados

att

radenf
20-01-2009, 02:07:39
Gracias Bpascal pero tu método no me funciona. Imprime un sólo registro, pero no el que está en pantalla.

Salu2

toni.vi
20-01-2009, 09:44:47
Debes de utilizar para el informe el mismo dataset que utilizas en el formulario.

radenf
20-01-2009, 11:00:07
Gracias tonivi por tu respuesta.
Tanto el formulario como el qreport están conectados al mismo dataset. La aplicación funciona y el comando imprimir ejecuta la orden de impresión, pero no logro que imprima los registros que estoy viendo en la pantalla y me imprime todos los registros que se encuentran en la BD.

Saludos y gracias

roman
20-01-2009, 12:48:23
Una opción sería la de llenar a mano el reporte.

1. Desconectas el QuickRep del dataset, como te dice Luis.

2. En la banda detalle, en lugar de colocar controles QRDBText conectados a tus campos, colocas etiquetas QRLabel.

3. En el evento OnNeedData del QuickRep, asignas los valores de tu registro activo a tus etiquetas:


QRLabel1.Caption := ADOTable[...];


// Saludos

Bpascal
20-01-2009, 16:30:11
Gracias Bpascal pero tu método no me funciona. Imprime un sólo registro, pero no el que está en pantalla.

Salu2


Entonces me gustaria que describieras que controles estas usando para desplegar la informacion en pantalla y si haces algun proceso para llenarlos con datos.

Si yo tengo un DBGRID con muchos registros y a medida que seleciono un registro con las teclas del cursor, al llamar un quickreport.preview donde esta puesto un qrdbtex en la banda de TITULO (y no existe la banda de detalle) siempre aparece el dato del registro que tengo selecionado en el dbgrid.

Si el quickreport esta enlazado a un querry que tiene mas de un registro entonces la banda de detalle mostrará todos los registros de ese querry; haci que la solucion es o filtrar el querry para que solo tenga un registro que es el que deseas o no utilices la banda de detalle.

radenf
20-01-2009, 19:07:12
Estimado Bpascal:

Agradezco sinceramente tu ayuda.
El qreport está estructurado en base a dbtext y dbmemo conectados a una tabla. Hay datos (nombre de la persona) en el pageheader y otros datos varios en el detail. Luego de tu sugerencia probé cambiando la estructura del qreport pero sólo obtuve que imprimiera un registro, pero no el que aparece en la aplicación en pantalla.
No utilizo query porque desconozco la sentencia sql para filtrar el registro que se encuentra en pantalla y que es el que deso imprimir.

Salu2 y gracias

Bpascal
20-01-2009, 19:24:37
Luego de tu sugerencia probé cambiando la estructura del qreport pero sólo obtuve que imprimiera un registro, pero no el que aparece en la aplicación en pantalla.


Eliminastes la banda de detalle del reporte?, esta no debe de existir ni siquiera vacia o de lo contrario tan pronto haces el preview la tabla se mueve al primer registro.

Si no existe la banda detalle en el reporte y el registro que aparece es un registro arbitrario entonces me hace sospechar que cuando llamas el quickreport.preview el registro actual no es el que esta mostrando la pantalla.

Por eso te pregunto, como haces para selecionar el registro en la pantalla?, si no usas querry para popular la tabla, entonces me imagino que usas un ttable y localizas los registros con ttable.next, ttable.prior or ttable.findkey ?

roman
20-01-2009, 19:35:20
Hola,

He estado intentando la opción de Bpascal, pero no he podido. Si sólo coloco una banda PageHeader, el reporte sale vacío. Si coloco una banda como Title o ColumnHeader, sí se imprime un registro, pero es siempre el primero, como dice radenf.

De hecho, aun cuando sólo se imprima un registro, el dataset se recorre completo, pues al cerrar el reporte veo que el formulario oiginal ya está en el último registro.

// Saludos

radenf
20-01-2009, 19:36:07
Por eso te pregunto, como haces para selecionar el registro en la pantalla?, si no usas querry para popular la tabla, entonces me imagino que usas un ttable y localizas los registros con ttable.next, ttable.prior or ttable.findkey ?

Utilizo un dbnavigator en la aplicación, conectado a una tabla a través de un datasource.

Salu2 y muchas gracias

Bpascal
20-01-2009, 20:26:29
De hecho, aun cuando sólo se imprima un registro, el dataset se recorre completo, pues al cerrar el reporte veo que el formulario oiginal ya está en el último registro.


Estoy seguro que tienes una linea de detalle agregada el quickreport.

Estoy usando delphi7 y quickreport 3.6.2

- Abro el projecto que esta en demos llamado fishfact el cual tiene una tabla sobre peces manejado con bde.
- agrego una nueva forma form2, y le pongo un quickreport.
- en la form1 agrego un boton y escibo en el evento form2.quickrepor1.preview;
- en la form2 me aseguro de uncluir correctamente unit1 para que el qucikreport pueda ver el dataset
- en el objectinspector en el quickrepor me voy a la Opcion Bands, todas las sub-opciones estan en falso, hago verdadero solo la opcion "HasTitle", una banda de titulo se agrega al quickrepor automaticamernte.
- Pongo un qrdbtext en la banda de titulo, enlazo el dataset y seleciono el un campo.

Eso es todo lo que hago, cuando corro el programa, selecciono cualquier registro usando el dbnavigator y le doy click al boton de preview, automaticamente me aparece la ventana del preview donde me muestra el lo que puse en la banda de titulo con el dato del registro actual.

Lo he probado con BDE y con ADO

att.

roman
20-01-2009, 20:32:22
Estoy seguro que tienes una linea de detalle agregada el quickreport.

Y yo estoy seguro que no ;) Estoy haciendo la pruebas especialmente para este problema de radenf, por lo que me he fijado en todos los detalles.

Ahora probaré con el FishFact.

Estoy usando también Delphi 7 y el quickreport que viene incluido.

// Saludos

roman
20-01-2009, 20:41:28
Veo entonces, que depende del dataset usado.

Ya he visto el FishFact y funciona como dices. Pero la prueba que hice con MyDac, no funciona.

Ahora, si probaste con ADO y también funciona, entonces el único detalle que veo en relación a radenf es que habías mencionado la banda PageHeader, pero en realidad es la Title. Son distintas.

// Saludos

roman
20-01-2009, 21:03:38
Ya está resuelto :)

Sólo había un detalle y éste era fundamental: Hay que enlazar únicamente los QRDBText y no el QuickReport.

Gracias Bpascal,

// Saludos

Bpascal
20-01-2009, 23:33:18
Sólo había un detalle y éste era fundamental: Hay que enlazar únicamente los QRDBText y no el QuickReport.


Oh!, ya me estaba quebrando la cabeza pensando por que no les funcionaba; supongo que estas cosas pasan con esos componentes que no tienen una documentacion formal y detallada como la tienen los componentes en el help de delphi; la verdad que el quickreport lo aprendí a usar a pura observacion; seguramente siempre he estado enlazando el dataset en los campos y nunca me fije que se podia enlazar una sola vez desde el quickreport.

roman
20-01-2009, 23:43:26
Je, je, así es. Hace mucho que no uso el QuickReport y cuando lo hacía siempre comenzaba conectando el reporte completo; ni siquiera se me había ocurrido probar conectando sólo los qrdbtext.

// Saludos

radenf
21-01-2009, 01:13:06
Ya está resuelto :)

Sólo había un detalle y éste era fundamental: Hay que enlazar únicamente los QRDBText y no el QuickReport.

Sin embargo cuando hago eso no imprime y en el preview no aparece nada.
Seguiré cabezeandome ya que este problema no lo he podido resolver desde hace mucho tiempo, tanto que había dejado de lado mi proyecto.

Agradezco todo su tiempo y dedicación y si tienen más ideas, bienvenidas

radenf
22-01-2009, 14:42:56
Saludos a todos

Aparentemente el problema se debe a que el qreport contiene datos de dos tablas enlazadas en que una es la Mastersource, por ello había colocado en la banda Title el campo correspondiente al nombre de las personas, que a su vez es el índice y en la banda detail los datos de cada uno de ellos, pudiendo ser que por ello no me funcionan sus sugerencias.
¿Debiera hacer algún procedimiento especial para esta situación?

Salu2 y gracias de antemano

radenf
01-02-2009, 22:57:00
Saludos nuevamente:

Retomo el hilo por si alguien me puede aportar alguna solución.
En mi aplicación desarrollada en Delphi7 y ADO existen dos tablas enlazadas cuyos datos se ingresan y visualizan en el form principal de la aplicación. Necesito imprimir los datos que tengo visibles en la pantalla, habiéndo accedido a ellos a través de dbnavigators para cada tabla. Tengo un qrReport con datos sólo de la tabla esclava y al ejecutar el print o preview se despliegan todos los registros de esta tabla y no los que estoy viendo y que son los que deseo imprimir. He leído completo el manual de QuickReport y he probado distintas estructuras de qrReport siguiendo las sugerencias y aportes de este y otros hilos y no logro dar con la solución.
¿Puede alguien por favor ayudarme con el código necesario para filtrar el registro en pantalla para que aparezca en la impresión?

Saludos a todos y muchas gracias

toni.vi
01-02-2009, 23:08:47
¿Que quieres imprimir solo el registro esclavo que estas posicionado, o todos los registros esclavos del registro maestro seleccionado?

radenf
02-02-2009, 11:01:04
Sólo el registro esclavo posicionado en pantalla.
Gracias toni.vi

toni.vi
02-02-2009, 11:14:07
Por tanto, en el dataset del quickreport no pongas nada.
Solo en la banda detalle pon el dataset y los campos que quieras.

radenf
02-02-2009, 13:57:43
Eso ya lo he hecho toni.vi y al imprimir me aparece una hoja en blanco. Si dejo activado el dataset se imprime una hoja por cada uno de los registros de la tabla y no sólo el que tengo en pantalla.

Saludos

toni.vi
02-02-2009, 15:35:53
Puedes hacer en el onclick del boton de imprimir:
Select * from TablaDetalle where Codigo = :CodigoDetalle
Utilizar el Dataset de la Query en el Quickreport, donde tendras un solo registro.

radenf
02-02-2009, 19:58:29
Muchas gracias toni.vi:

Esta tarde pruebo y te cuento.
¿Qué bandas me recomiendas para construir el qreport?
He utilizado Título, Detalle y Subdetalle con resultados diferentes, pero siempre sin mostrar lo que yo quiero.

Saludos y muchas gracias

toni.vi
02-02-2009, 23:15:56
Lo normal en programación, si es que hay algo normal sería.

Cabecera (PageHeader)
Listado de bla.bla. Fecha __/__/__ pagina
Codigo descripcion cantidad .............
------ ------------- -----------
Detalle (detailBand)
Aqui van los registros que contiene el dataset del informe quickreport

Subdetalle (subdetailband)
Aqui van los registros subdetalle ( 1 o mas por cada registro detalle)
Son los registros del dataset de la tabla o query detalle.

Totales (summary band)

Pie de pagina (PageHeader).

Para tu problema, en este caso como solo quieres un registro, debes de utilizar solo banda detalle que sea de una consulta que solo contenga un registro, tal como te he explicado en el post anterior.

radenf
02-02-2009, 23:43:12
Estimado toni.vi:

He seguido al pie de la letra tus recomendaciones. El qreport tiene sólo una banda de detalle conectada al Query y los campos también.
Se imprimen los campos que seleccioné, utilizando el Query, sin embargo siempre me arroja el primer registro (persona) de la tabla y no el que tengo en pantalla.
¿Es posible que el registro que selecciono y que aparece en la pantalla de la aplicación no sea el activo del dataset?
Para seleccionar un registro (personas) hago click en una dbgrid que contiene los datos de la tabla maestra y eso activa datos de la tabla esclava (eventos de esa persona) en los distintos campos de texto, memos e imágenes que posee la aplicación. Ahora si esa persona tiene eventos de distintas fechas, navego a través de ellas utilizando un dbnavigator.
Con esto no tengo problema para moverme entre los datos, incorporar datos nuevos o eliminarlos, sin embargo no logro imprimir los eventos que veo en pantalla.
¿En qué me estoy equivocando?

Agradezco mucho tu dedicación toni.vi. No entiendo por qué es tan complicado. Todas los programas que conozco al darles imprimir, hacen justo eso, imprimen lo que estás viendo.

Un gran saludo y gracias, porque creo que algo más he avanzado.
Ojalá no se te hayan acabado los trucos.

toni.vi
02-02-2009, 23:57:27
Entiendo que tienes una tabla maestro de personas y una tabla detalle de eventos de cada persona.
Por tanto.
1.- Si quieres imprimir un solo evento de una persona debes poner:
Solo banda detalle y no conectar el dataset al quickreport, o bien
crear una consulta que solo nos vea este registro.
2.- Si quieres imprimir todos los eventos de una persona.
Solo banda detalle conectando el dataset del quickreport al dataset de la consulta del detalle eventos.
Si necesitas más ayuda puedes enviarme a traves del foro o privadamente el .pas o .dfm del quickreport e intentare ayudarte.

radenf
03-02-2009, 02:18:38
Quiero imprimir los eventos de una persona en una fecha dada, ya que se agrupan por fecha.
Si no conecto el qreport al dataset no me muestra nada.
Hice la prueba cambiando la base de datos a mysql, ya que he desarrollado la aplicación para este sistema también y el efecto es el mismo.
Creo que mi problema debe estar en cómo selecciono los datos, que es como te indiqué en el post anterior.
Este es el código del archivo .pas

unit Solicitud;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, QRCtrls, QuickRpt, DB, ExtCtrls, QRPrntr, OleCtrls;

type
TFormSolicitud = class(TForm)
QuickRep2: TQuickRep;
DetailBand1: TQRBand;
QRLabel1: TQRLabel;
QRDBText1: TQRDBText;
QRLabel2: TQRLabel;
QRDBText2: TQRDBText;
QRLabel4: TQRLabel;
QRDBText3: TQRDBText;
QRDBText4: TQRDBText;


private
{ Private declarations }
public
{ Public declarations }
end;

var
FormSolicitud: TFormSolicitud;

implementation

uses Registros;

{$R *.dfm}



end.


El Query lo tengo en el form principal (Registros)

Muchas gracias y por favor sigue iluminándome.

toni.vi
03-02-2009, 12:41:20
Descargate este ejemplo y ya me diras.

radenf
04-02-2009, 02:33:17
Estimado toni.vi :

Muchas gracias por tus aportes, por fin después de más de 2 años logré lo que quería.
Tus ejemplos me iluminaron ya que la solución era sumamente sencilla. Por alguna razón que no logro entender el qreport al estar en un form propio y llamarlo desde la aplicación siempre mostraba el primer registro de la tabla. Como tu ejemplo incluye el qreport dentro de la aplicación probé incorporándolo en ella y funcionó perfecto, simplemente desconectando el dataset. Ahora como tener el formulario del qreport a la vista no es aceptable, le ajusté el zoom a 20% y lo oculté detrás de un dbmemo. Probablemente no es la mejor solución pero quién tiene idea de lo que se esconde en las aplicaciones de los programas.

Nuevamente te agradezco tu paciencia y espero que no sea la última vez que nos comunicamos. Gente como tú hacen grande a este foro y renuevan la fe en las personas.

Saludos.

toni.vi
04-02-2009, 13:32:44
Si el problema era trabajar desde otro formulario, debes poner en el form2 un uses unit1 tal como te indico en el nuevo ejemplo.
Miratelo y veras que funciona tambien.

radenf
04-02-2009, 22:59:57
Hice la prueba con tu nuevo ejemplo, que era muy similar a cómo tenía originalmente estructurada mi aplicación y no funcionó. Vuelve a seleccionar sólo el primer registro de la base de datos. En todo caso estoy satisfecho con el resultado anterior y te agradezco nuevamente toda tu dedicación.

Un saludo toni.vi y muchas gracias

elsamurai
13-12-2010, 01:34:48
yo tengo el mismo problema que el,podrian ayudarme,primero no se como podre mandarle un cliente especifico para que se imprima en el reporte y tengo mas dudas

radenf
17-12-2010, 11:23:45
yo tengo el mismo problema que el,podrian ayudarme,primero no se como podre mandarle un cliente especifico para que se imprima en el reporte y tengo mas dudas

Baja los archivos zip que envió toni.vi Ahí esta la solución.
Salu2