PDA

Ver la Versión Completa : como poder imprimir en diferentes tamaños de Papel


oscarac
14-04-2011, 17:37:04
buenos dias...
esta es una duda que tengo.... (si alguien tiene alguna idea)

Se puede "acomodar" la informacion que se muestra en cualquier Reporte en funcion al tamaño de la pagina???

ejemplo en A4 tengo X cantidad de espacio Caracateres en Portrait y Y cantidad en Landscape... pero si ese mismo reporte lo quisiera usar en un A3 por ejemplo.... como poder utiilzar el espacio de sobra

espero que alguien me haya entendido

gracias

rolandoj
23-04-2011, 16:04:10
Ante todo, no entiendo porque quieres desperdiciar hojas grandes en reportes que caben en unas más pequeñas. En últimas, si es porque ustedes tienen un gran stock de hojas grandes, me parece más práctico simplemente recortarlas después de imprimir y reusar el sobrante para memos, que es lo que usualmente se hace.

Dicho lo anterior, intentaré responder la pregunta con cierto detalle desde el punto de vista técnico.

En teoría, usualmente sí es posible; pero, en la práctica no es precisamente facil, ni los resultados muy buenos.

De entrada, como dices, la idea sería usar papel de tamaño mayor al original porque, si es menor, aunque el reporte puede caber, a menudo resultará ilegible, en especial para quienes no tengan buena vista.

Hay dos maneras de proceder:

1. La más facil es usar la capacidad que para tal fin tenga la impresora, ya que en las más modernas suele haber una opción para imprimir a escala; pero, no todas las impresoras la tendrán. Por otro lado, esta opción es propensa a imprimir en tamaño ilegible, o por lo menos antiestético. A menudo hay que probar bastante para conseguir una buena imágen

2. La otra opción es ajustar las dimensiones por programación y eso depende del reporteador que se tenga. En el caso de Quick Report, parte del trabajo lo hacen automáticamente las propiedades de alineamiento de algunos componentes; pero, en general sería necesario escalar las fuentes y redistribuír las posiciones de ciertos campos.

Para escalar las fuentes, podría escribirse una rutina general que calcule la proporción entre el tamaño original y el tamaño actual, y en base a eso ajustar la fuente de default del reporte; pero, habría también que recorrer todos los componentes porque no puedes garantizar que todos usen la fuente de default.

Ese método funcionaría en teoría; pero, debido a los redondeos necesarios para ajustar los tamaños de fuentes y a la disponibilidad de tamaños de las mismas (en especial porque tampoco puede garantizarse que todas sean true type), aplica lo mismo que he dicho antes : Es probable que el resultado automático no sea satisfactorio.

Lo anterior obliga a hacer frecuentes ajustes personalizados a cada reporte. Como si fuera poco, también tocaría tener en cuenta la posición de campos que no estén centrados en el reporte, ni en los extremos del mismo. y eso si muy dificil de calcular de manera automática

Palabras más, palabras menos, una rutina genérica se puede hacer; pero, a menudo los resultados no serán muy buenos. Mi consejo es no gastarle tiempo a eso; mejor utiliza la solución normal que mencioné al principio

oscarac
27-04-2011, 16:09:20
Ante todo, no entiendo porque quieres desperdiciar hojas grandes en reportes que caben en unas más pequeñas.


Creo que me explique mal.....
lo que quiero hacer es basicamente 2 reportes uno en hoja A4 landscape y el otro en hoja A3 (el Formulario de donde invoco al reporte tendria opciones como.... Hoja A4 / Hoja A3

pero en lugar de crear 2 unidades, hacerla en una sola, porque los procedimientos (reporte) seria el mismo... aunque para ser sinceros el que se usuaria en A3 tendria mas informacion en columnas

entonces... lo que se me ocurrio era crear un reporte con Labels los cuales cambiaran de valor en el OnPrint de la linea detalle

con esto creo que estaria solucionado, ademas que me ayudaria mucho con un tema que aun esta rondando mi cabeza.. que es el como saber la longitud maxima de un campo para determinar el tamaño del componente QrdbText

no les ha pasado que colocan el componente asociado a un datasource dentro del reporte y en algunas ocasiones o es muy grande o muy chico el espacio que le asignamos al componente?


espero sus comentarios

rolandoj
27-04-2011, 16:45:27
Hola,

Si ese es el caso, una mejor solución es usar la herencia:

Simplemente, son dos reportes diferentes; pero, comparten la mayoría de los campos. El padre sería el que tuviera menos campos y el hijo el otro. De esa forma, al crear el formulario hijo, solo tendríasque cambiarle el tamaño a la hoja, adicionarle los campos, y reemplazar los métodos virtuales a que hubiera lugar. Claro, eso en el supuesto que tú reporteador no ponga mayores problemas con el tamaño de la hoja (no sé las versiones más nuevas de QuickReport; pero, como he comentado en varias ocasiones, al menos las versiones viejas tienen problemas con eso).

Esa es la forma standard para desarrollar reportes. De hecho, yo tengo jerarquicamente varios formularios modelos que me permitan, vía herencia, desarrollar rápidamente formularios específicos.

Con respecto al tema del tamaño de los campos y que hacer cuando este es excedido, para eso también hay una metodología; pero, sería un poco más compleja de explicar aquí. Tan solo dire que en QuickReport se basa en el uso de bandas hijas y en la propiedad AutoStretch combinada con AutoSize

oscarac
27-04-2011, 17:32:22
Tienes un ejemplo que puieda aplicar?

rolandoj
29-04-2011, 04:47:22
Hola,

La verdad, no tengo ejemplos a la mano porque hace años adopté una metología que no usa los TDataSet. Sin embargo, no es dificil armar un ejemplo conceptual:

Supongamos que tenemos una tabla con los campos CODIGO, NOMBRE y VALOR (dato Currency). Se necesita listar todos los registros y al fin imprimir la suma de la columna VALOR. Digamos que tenemos otra tabla, con los mismos campos y con uno adicional llamado ESTADO, que debe también imprimir la suma de la columna VALOR. Para imprimir ambas tablas, sigue estos pasos :

1, Para la primera, crea un formulario de impresion en la forma usual, colocando una banda detalle y sobre esta los campos CODIGO, NOMBRE y VALOR. Llamalo frmQRTabla1 del tipo TfrmQRTabla1.

2. Agrega una banda resumen y coloca en ella un TQRLabel para imprimir la suma.

3. Implementa la lógica de la suma.

4. Para la segunda crea un formulario heredado de TfrmQRTabla1. Cambia el tamaño de la hoja. Con ello se amplia la banda detalle; sobre ella coloca el campo para ESTADO. Luego cambia la fuente de datos para el QRReport y para los 3 campos. Ya puedes usarlo, sin necesidad de reescribir la lógica de la suma

Analizalo con calma y verás que es muy facil crear modificaciones sencillas a los reportes, sin necesidad de reproducir toda la lógica de un formulario.