Extensiones de impresión
<< Click to Display Table of Contents >> Navegación: Características avanzadas > Programas xjs > Extensiones de impresión |
El objeto impresor forma parte de las extensiones COM que la aplicación aporta a JScript, estas extensiones suministran a los programas xjs la funcionalidad necesaria para obtener informes o llevar a cabo otros procedimientos.
Las extensiones básicas son suministradas a través del objeto representativo de la aplicación, cuyos métodos y propiedades están disponibles para los programas xjs sin tener que crear o referenciar dicho objeto. Uno de los miembros de este objeto es el objeto impresor, este objeto permite dar formato a los datos y mostrarlos en pantalla o enviarlos a la impresora, constituyendo sus métodos y propiedades las extensiones de impresión.
Este tema explica la funcionalidad general del objeto impresor. En el tema referencia del objeto impresor se encuentra una lista de propiedades y métodos, y la lista de los modificadores de formato que se pueden utilizar para personalizar el aspecto de los informes.
Para crear una referencia a un objeto impresor se utiliza la siguiente sintaxis:
var imp = impresor ([cni[, co, ma]]);
El argumento cni es una cadena de texto conteniendo un nombre de archivo de tipo .cni o archivo de configuración de impresora, estos archivos se definen en Configuración Impresora, y se almacenan por defecto en el directorio o carpeta Informes.
El argumento co es un número que determina las columnas del informe, por defecto es una. Si se especifican más de una columna, las líneas se colocarán dentro de la primera columna hasta completar el alto de la página disponible, comenzando entonces la impresión en la segunda columna. Es decir, el orden de impresión de las líneas dentro de las columnas, es de arriba abajo y de izquierda a derecha.
Si se suministra el argumento co, hay que especificar también el argumento ma, que es el número que indica el espaciado entre las columnas expresado en milímetros.
Por ejemplo, la siguiente sentencia:
var imp = impresor ("A4h", 3, 10);
establece que el informe se obtendrá en papel A4 orientado horizontalmente según se establece en el archivo ...\Informes\A4h.cni, en tres columnas separadas entre sí 10 mm.
Una vez inicializado el objeto impresor hay que suministrarle la lista de datos o campos a imprimir. Para ello se utiliza el método campo:
imp.campo ([dato[, mod]]);
Este es el método por defecto del objeto impresor (método al que corresponde el índice 0 dentro del objeto), por lo que no es necesario incluir la palabra campo para invocarlo.
El argumento dato puede ser: una cadena de texto, o un número, o una expresión que pueda evaluarse a una cadena de texto o a un número, o un objeto subtabla, en este mismo tema se explica el objeto subtabla. El argumento mod es una cadena de texto conteniendo modificadores del formato del campo que determinarán el aspecto que tendrá el campo. Si no recibe ningún argumento, añadirá un campo vacío.
Definida la lista de campos estos se visualizarán con el método linea:
imp.linea ([mod[,une]]);
El argumento mod es una cadena de texto conteniendo modificadores de formato aplicables a la línea o modificadores de línea. El argumento une especifica, cuando es distinto de cero, que la línea actual deberá ir unida a la siguiente en el caso de producirse un salto de página, así si la línea actual y la siguiente no caben en la página actual se pararán ambas a la página siguiente sin separarlas.
Teniendo en cuenta el tamaño del papel, los márgenes establecidos, y el número de columnas del informe, el método linea divide el ancho disponible de la línea en partes iguales, asignando este espacio a cada campo de la lista, y colocando en este espacio el dato o valor de cada campo.
Por ejemplo:
var imp = impresor("A4h", 2, 10);
for (j=0; j<=60; j++)
{
for (i=0; i<=5; i++)
imp("C " + i);
imp.linea();
}
estas sentencias, al ejecutarlas pulsando Preliminar, muestran un informe de la forma siguiente:
el informe, según se especifica en la primera línea del ejemplo, se obtendrán en papel A4 (210x297mm), orientado horizontalmente, en dos columnas separadas entre sí 10 mm. Respetando los márgenes establecidos en la configuración de la página, se divide cada una de las columnas en 6 partes iguales, para mostrar los seis campos añadidos a la lista en el bucle interior del ejemplo.
Los datos numéricos se alinean por defecto en la esquina superior derecha del campo y los textos en la esquina superior izquierda. Si el espacio horizontal del campo no resulta suficiente para albergar el dato, y el dato es una cadena de texto conteniendo blancos, divide el texto pasándolo a la línea siguiente dentro del campo, y ampliando el tamaño vertical asignado al campo de forma que quepa el dato. Si esto no es posible, los datos quedarán superpuestos unos encima de otros.
El objeto impresor define internamente una tabla para mostrar los campos añadidos a la lista de campos, de forma que al invocar el método linea, divide el ancho disponible de la página en tantas columnas iguales como campos se ha añadido a la lista de campos.
El método tabla permite determinar el número total de columnas que se quiere mostrar cada vez que se llame al método linea, el ancho de cada columna y el aspecto que tendrán.
imp.tabla ([modc][, modt])
El argumento modc es una cadena de texto que contiene los modificadores para las columnas de la tabla, los modificadores de cada columna se separan con un espacio. Si el modificador de columna es un punto (.), significa que el ancho de la columna será el espacio disponible según el ancho de la línea de impresión y el ancho del resto de las columnas. Por ejemplo:
imp.tabla ("20 . 20 .");
define una tabla de cuatro columnas, la primera y la tercera tendrán 20 milímetros de ancho, la segunda y la cuarta se repartirán por igual el resto del ancho disponible de la zona de impresión o ancho de la línea.
Un valor negativo para el ancho de columna especifica un reparto proporcional del espacio. Por ejemplo:
imp.tabla ("-1 -2 - 3 -1");
define una tabla de cuatro columnas, la primera y la cuarta tienen el mismo ancho, la segunda tiene doble ancho y la tercera triple. El valor -1 es equivalente al punto (.). Esta forma de especificar el ancho de las columnas es de gran utilidad para poder obtener informes que no pierden su formato al utilizar distintos tamaños de papel o cuando se cambia la orientación del papel de vertical a horizontal o viceversa.
El argumento modt del método tabla es una cadena que especifica los modificadores aplicables a todas las columnas de la tabla o modificadores de tabla.
Si se invoca el método tabla sin suministrar ningún argumento, equivale a borrar la definición de tabla actualmente establecida.
Cada uno de los métodos del objeto impresor vistos en este tema, recibe como argumento una cadena de texto que permite establecer modificadores de formato a distintos niveles: de campo, de línea, de columna, y de tabla. Mediante los modificadores se puede establecer el tamaño horizontal y vertical de los campos, la alineación de dos datos dentro del campo, el tipo de letra y su orientación, el estilo de los bordes, el color del campo, etc.
El método global establece modificadores de formato que se aplicarán a todos los campos del informe.
imp.global (mod);
La cadena mod contendrá una combinación de modificadores de formato.
En los modificadores de color se especifica el color mediante tres bytes, correspondientes a los colores rojo, verde y azul respectivamente, del más al menos significativo. Para ver la combinación de rojo, verde y azul que requiere un color determinado, abra el diálogo de color de Windows.
Accederá a este diálogo por ejemplo cuando intenta establecer los colores para la letra y el fondo en las Opciones del programa. Pulse el botón Definir colores personalizados y vea la combinación rojo, verde y azul que corresponde a un color dado. Por ejemplo: 56, 173 y 95. La representación hexadecimal de estos números será la que tenga que utilizar para establecer el color en la cadena de modificadores. En este caso sería 38AD5F.
Se puede obtener fácilmente la representación hexadecimal de un número decimal aplicando el método toString al número decimal, y pasándole el argumento 16 correspondiente a la base de numeración:
(56).toString(16); // retorna 38
(173).toString(16); // retorn AD
(95).toString(16); // retorna 5F
Por ejemplo:
imp.global("b1b#38AD5F);
muestra los campos un borde continuo de color verde.
Cuando se definen modificadores a distintos niveles (invocando los distintos métodos del objeto impresor) que afectan al formato de un mismo atributo de un campo, se impone el siguiente criterio de precedencia de mayor a menor:
campo
línea
columna
tabla
global
En el tema referencia del objeto impresor encontrará la lista completa de modificadores aplicables.
Uno de los miembros del objeto impresor es el objeto subtabla. Este objeto tiene los mismos métodos y propiedades que el objeto impresor, siendo a su vez el objeto subtabla uno de sus miembros.
Para inicializar el objeto subtabla se utiliza la siguiente sintaxis:
s = imp.subtabla ([modsc[, mods[, modc]]]);
El primero de los argumentos especifica el ancho de las columnas de la subtabla y el número de estas, pueden también especificarse otros modificadores de formato que afectarán a las columnas de la subtabla. El segundo especifica los modificadores que afectarán a toda la subtabla. El tercero modifica el campo de la tabla en el que se está definiendo la subtabla.
Por ejemplo:
var imp = impresor
imp.global ("b1")
imp.tabla ("40 40 40");
imp("C 1")
imp("C 2")
imp("C 3")
imp.linea ();
imp ("C 1")
var sub = imp.subtabla ("20 20", "b1", "m#38AD5F")
{
sub ("SC 1");
sub ("SC 2");
sub.linea();
}
imp ("C 3")
imp.linea;
mostrará una tabla de tres columnas de 40 milímetros, en la segunda línea el segundo campo se divide en una subtabla de dos columnas de 20 milímetros cada una.
El objeto impresor cada vez que inicia una página llama a la función paginicia y antes de saltar página llama a la función pagtermina, definiendo estas dos funciones en el programa xjs se pueden imprimir cabeceras y pies de página personalizados
Por ejemplo:
var titulo = "TITULO DEL INFORME"
var pie = "Informe con cabecera y pie"
function paginicia ()
{
imp.tabla ("40 . 40")
imp (fecha (hoy, "dd/mm/aaaa"))
imp (titulo, "a4")
imp ("Pag: " + imp.pag + " de " + (pagtotal), "a2")
imp.linea ("v20");
}
function pagtermina ()
{
imp.hor
imp (pie, "lca4")
imp.linea
}
La función paginicia mostrará al comienzo de cada página una tabla de tres campos: en el primer campo aparecerá la fecha del sistema en el momento de ejecutar el informe, en el segundo muestra centrado el título del informe, y en el tercer campo a la derecha Pag: n de m. pag es una propiedad del objeto impresor que almacena el número de página actual del informe, y pagtotal es una expresión que se evalúa al número total de páginas del informe. Para poder evaluar pagtotal se ejecutará el informe sin mostrar nada, teniéndose que ejecutar una segunda vez normalmente para mostrar los datos del informe. Por lo que si se trata de un informe complejo esta evaluación ralentizará la ejecución del mismo.
La función pagtermina mostrará en el pie de página una línea horizontal, y en la línea siguiente el texto almacenado en la variable pie en cursiva (lc) y centrado en el espacio imprimible (a4).
Si se utiliza con frecuencia una misma cabecera y pie en los informes, es preferible definir dicha cabecera en un único programa, y utilizar el método incluir de las extensiones básicas en cada uno de los programas que necesiten utilizar ésta definición de cabecera y pie. Por ejemplo incluir ("cab") siendo cab.xjs el programa en que se han definido las funciones paginicia y pagtermina.
Como el texto del título y el pie de informe será distinto en cada programa, se pueden personalizar fácilmente definiéndolos como parámetros en el programa de definición de paginicia y pagtermina.
var titulo = "" //// Título del informe [[""]]
var pie = "" //// Texto del pie de informe [[""]]
Pulsando el botón Parámetros de la ventana Imprime se abrirá la ventana Parámetros del informe donde se pueden editar las variables titulo y pie.