Herramientas de usuario

Herramientas del sitio


usu:plantillas

Plantillas de impresión

  • Menú SmartTPV: /Configuración/Plantillas
  • Menú SmartOffice: /Configuración/General/Dispositivos usuario
  • Shortcut: -

Las plantillas definen en primer lugar el formato de todos los impresos que se imprimen directamente en un dispositivo de salida, al contrario a los informes que usan el generador de informes FastReport.

Existe también una manera para definir un informe de tipo FastReport para usarlo en la impresión de tickets o facturas, se explicará más adelante.

Existen varias plantillas que sirven como modelo para las distintas aplicaciones de Smart. Conviene hacer una copia del modelo apropiado y adaptar esta copia a sus necesidades. En general, todas las plantilla que acaban en _GEN, _GENERICO o _GENERICA no se deberían modificar porque es posible que se modifiquen en cualquier momento a través de un script de actualización.

Modelo Aplicación Uso
TICKET_GENERICO SmartTPV Impresión de tickets en una impresora de tickets.
TICKETMATR_GENERICO SmartTPV Impresión de tickets en una impresora matricial.
TICKET_REGALO_GEN SmartTPV Impresión de tickets de regalo en una impresora de tickets.
FACTURA_GENERICA SmartTPV Impresión de una factura en una impresora de tickets.
ETIQ_ZEBRA_GENERICA SmartTPV, SmartOffice Impresión de una etiqueta en una impresora Zebra.
ETIQ_ZPL_GENERICA SmartTPV, SmartOffice Impresión de una etiqueta en una impresora ZPL.
TICKET_ALB_GEN SmartOffice Impresión de tickets en una impresora de tickets.

La impresión de tickets en SmartTPV se basa internamente en las tablas de tickets, mientras en SmartOffice se usan las tablas de albaranes.

Ejemplo

COLUMNAS=40
[Cabecera]
select a.NOMBRE, a.MUNICIPIO, a.COD_POSTAL, a.TELEFONO, a.CIF_NIF, a.DIRECCION,
       b.FECHA_DEVENGO, b.NRO_ALBARAN
from EMPRESA a
join CAB_ALBARAN_VENTA b on b.NRO_ALBARAN = :NRO_ALBARAN
# Abrir cajón al imprimir la primera copia
I.{IFDEF COPIA=1}{$1B700064FA}
I.{ENDIF}#NOMBRE
I.(#COD_POSTAL) #MUNICIPIO
I.Tlf.   #TELEFONO
I.C.I.F. #CIF_NIF
I.#DIRECCION
I.----------------------------------------
I.Fecha #FECHA_DEVENGO|T10       Ticket #NRO_ALBARAN
I.----------------------------------------
I.Articulo                   Und.  Importe
I.****************************************
[Lineas]
select c.DESCRIPCION, c.CANTIDAD, c.IMPORTE, c.IMPORTE_DTO, c.PORC_DTO
from LIN_ALBARAN_VENTA c
where c.NRO_ALBARAN = :NRO_ALBARAN
I.{DESCRIPCION|<20}      #CANTIDAD|D5 #IMPORTE|D7\
I.  {DESCRIPCION|<20}{IFDEF PORC_DTO<>0}
I.  Descuento de #PORC_DTO|I% (#IMPORTE_DTO|D){ENDIF}
[Pie1]
select S_BASE_IMPONIBLE_NETA, S_CUOTA_TOTAL, S_TOTAL
from RESUMEN_ALB_VENTA_TOTAL2(:NRO_ALBARAN)
I.****************************************
I.                TOTAL EUROS.   #S_TOTAL|D7
I.****************************************
I.  IVA  BASE IMP.    CUOTA     TOTAL
[IVA]
select S_BASE_IMPONIBLE_NETA, S_PORC_IVA, S_CUOTA_IVA, S_CUOTA_TOTAL, S_TOTAL
from RESUMEN_ALB_VENTA_IVA(:NRO_ALBARAN)
I.  #S_PORC_IVA|I3    #S_BASE_IMPONIBLE_NETA|D7  #S_CUOTA_TOTAL|D7   #S_TOTAL|D7
I.----------------------------------------
[Pie2]
select USER, S_BASE_IMPONIBLE_NETA, S_CUOTA_TOTAL, S_TOTAL
from RESUMEN_ALB_VENTA_TOTAL2(:NRO_ALBARAN)
I.Importe Cobrado (IVA Inc.)  #S_TOTAL|D7
I.Entregado                   #ENTREGADO|D7
I.Cambio                      #DEVOLVER|D7
I.---------------------------------------
I.       GRACIAS POR SU VISITA
I.{IFDEF CLIENTE=N}{IFDEF CONFIRMADO=N}
I.PC{ENDIF}{ENDIF}
I.Le atendio #USER
I.
[comentarios]
[GrupoCocina]
[extras]
# Cortar
I.{$1D564206}

En general, una plantilla empieza con unas líneas con parámetros, que suele añadir el programa SmartTPV o SmartOffice a la plantilla, como por ejemplo el número del ticket o albarán a imprimir, seguidos por varias secciones denominados por […].
Líneas cuyo primer caracter es un # son comentarios y se ignoran.

Parámetros

Parámetros se tienen que definir al principio de la plantilla, delante de cualquier sección.

Un parámetro tiene un nombre y un valor separado por el símbolo =. Por ejemplo:

COLUMNAS=40

En las secciones se puede hacer referencia a cualquier parámetro a través de las variables (ver abajo).

Se pueden definir dos tipos de parámetros, parámetros numéricos y parámetros de texto. Para poder distinguirlos hay que poner los valores de los parámetros de texto entre comillas (NOMBRE='valor').

Los programas añaden una serie de parámetros a las plantillas antes de imprimirlas:

Programa Proceso Parámetro Descripción
SmartTPV Impresión ticket ID_TICKET=12345 El ticket que se tiene que imprimir.
SmartTPV Impresión cierre y resumen caja ID_CAJA=12345 El núemro de la caja cuya resumen se quiere imprimir.
SmartOffice Impresión ticket NRO_ALBARAN=AB18-12345 El albarán a imprimir.
SmartOffice Impresión ticket ENTREGADO=50,00 El importe en efectivo entregado.
SmartOffice Impresión ticket DEVOLVER=21,44 El importe a devolver.
SmartOffice/SmartTPV Impresión ticket/etiquetas NRO_COPIAS=2 El número total de copias.
SmartOffice Impresión ticket COPIA=1 La copia actual que se imprime.
SmartOffice Impresión ticket CONFIRMADO='S' Si el albarán ha sido confirmado.
SmartOffice Impresión ticket CLIENTE='S'
SmartOffice/SmartTPV Impresión etiquetas de producto COD_PRODUCTO=12345 El código del producto para el que se quiere impromir la etiqueta.

Se puede poner el parámetro

IGNORAR_COPIAS

al principio de una plantilla para que no se repita la impresión NRO_COPIAS veces. Este parámetro no requiere ningún valor (también valdría IGNORAR_COPIAS=S). Esto es útil para la impresión en impresoras Zebra, donde se puede poner la cantidad de copias en la misma plantilla:

IGNORAR_COPIAS
[Etiqueta]
SELECT ...
I.N
...
I.P{NRO_COPIAS}

Parámetro CHARACTERSET

Con el parámetro CHARACTERSET se puede convertir el texto a imprimir del caracter set estándar, WIN1252, a otro set de caracters más apropiado para la impresora elegida. Lo valores permitidos son csOEM, csISO88591 y csUTF8.

CHARACTERSET='csOEM'
[Cabecera]
...

Parámetros de introducción

Es posible definir un parámetro en un formato especial, para que se pregunte al usuario por su valor en el momento de arrancar la impresión:

<Nombre parámetro>=?:"<Título dialogo>";"<Texto pregunta>";<Valor por defecto>

Por ejemplo:

NRO_COPIAS=?:"Etiquetas de producto";"Número de ejemplares";1
...

Secciones

Después de los parámetros pueden aparecer varias secciones. Una secciones siempre empieza con un nombre abritrario entre corchetes:

[Cabecera]

El contenido de una sección son todas las líneas hasta la siguiente sección. Comentarios se ignoran.

Justo despues del nombre de sección se puede poner una instrucción select para seleccionar los datos que se quiere imprimir en esta sección.

select c.DESCRIPCION, c.CANTIDAD, c.IMPORTE, c.IMPORTE_DTO, c.PORC_DTO
from LIN_ALBARAN_VENTA c
where c.NRO_ALBARAN = :NRO_ALBARAN

El una instrucción select se puede hacer referencia a un parámetro, por ejemplo :NRO_ALBARAN.

A continuación se pueden definir varias líneas de impresión, que siempre empiezan con I.:

I.{DESCRIPCION|<20}      #CANTIDAD|D5 #IMPORTE|D7\
I.  {DESCRIPCION|<20}{IFDEF PORC_DTO<>0}
I.  Descuento de #PORC_DTO|I% (#IMPORTE_DTO|D){ENDIF}

Se imprime la sección para cada registro que devuelve el select. Si no se ha puesto ningún select, se imprime la sección una vez.

Se imprimen todos los caracteres de cada línea a partir de la I. del principio.

Se puede hacer referencia tanto a los parámetros de la plantilla, como a los campos que devuelve el select. Estas referencias se llaman variables, y existen dos tipos de estos variables:

  1. Simple (#CANTIDAD|D5)
  2. Compleja ({DESCRIPCION|<20})

Además es posible usar un control de impresión, un {IFDEF}, para imprimir uno u otro texto dependiendo del valor de la variable que aparece después del IFDEF. Este concepto se explica más abajo.

Por último se puede usar cadenas codificada en hexadécimal, ej. {$1B700064FA}. Hay que incluir estas cadenas en {$…}. Se puede utilizar para imprimir cadenas de control de la impresora, por ejemplo para cortar el papel o abrir el cajón.

Variables simples

Las variables simples empiezan con #, seguido por el nombre de un parámetro o de un campo que devuelve el select. A continuación se puede poner, separado por el símbolo |, una letra para identifiar como formatear el valor a imprimir y/o una longitud.

#NOMBRE_CAMPO_O_PARAM[|[LETRA_FORMATO][LONGITUD_FORMATO]]
Letra de formato Descripción Longitud Ejemplo
Valor del campo/parametro Formato Impresión
I Formatear como número entero, sin décimales. La longitud define cuantos caracteres se imprimen como mínimo, contando también un posible - para indicar un número negativo. Si el valor tiene menos dígitos, se añaden espacios al lado izquierdo. Si el valor necesita más espacio, se imprime el número entero ignorando la longitud. 12345,678

nulo
I3
I7
I3
12346
__12346
___
D Formatear como número con 2 decimales. Siempre se imprimen los dos décimales, aunque sean cero. La longitud define cuantos caracteres se imprimen como mínimo, contando un posible - y el separador de décimales. Si el valor tiene menos dígitos, se añaden espacios al lado izquierdo. Si la longitud no vale para imprimir toda la parte entera del número, se amplia la longitud. 12345,678

nulo
D4
D9
D4
12345,68
_12345,68
____
E Formatear como número con 3 decimales. Siempre se imprimen los tres décimales, aunque sean cero. La longitud define cuantos caracteres se imprimen como mínimo, contando un posible - y el separador de décimales. Si el valor tiene menos dígitos, se añaden espacios al lado izquierdo. Si la longitud no vale para imprimir toda la parte entera del número, se amplia la longitud. -12345,678
E4
E11
-12345,678
_-12345,678
T Formatear como fecha, hora o fecha más hora, dependiendo de la longitud puesta. 10: Fecha en formato 31/11/2016.
8: Hora en formato 22:36:12.
5: Hora en formato 22:36.
19: Fecha y hora en formato 31/11/2016 22:36:12.
16: Fecha y hora en formato 31/11/2016 22:36.
Si se omite la longitud se supone una longitud de 10.
Cuando se omite un identificador de formato, se trata el valor del campo como una cadena de caracteres, un texto. La longitud define en este caso la longitud exacta a imprimir. Si el texto es más largo, se corta desde el lado derecho. Si el texto es más corto, se añaden espacios en el lado derecho. abcdef

nulo
4
8
4
abcd
abcdef__
____

Cuando un valor de un campo de texto contiene avances de línea (CRLF), se continua la impresión en la siguiente línea. Este asunto se explica más abajo.

Variables complejas

Las variables complejas se ponen entre llaves {…}. La primera parte obligatoria es el nombre de un parámetro o de un campo que devuelve el select. A continuación pueden seguir dos partes opcionales, ambos separados por el símbolo |. La primera parte es la longitud, igual con un caracter para definir el ajuste (izquierdo o derecho). La segunda parte es el formato, como está definido en las funciones de Delphi de formatear números, fechas o cadenas de texto. Si se usa un formato, también hay que usar la longitud.

{NOMBRE_CAMPO_O_PARAM[|[LETRA_AJUSTE]LONGITUD[|FORMATO]]

La interpretación de los distintos valores de LETRA_AJUSTE, LONGITUD y FORMATO depende del tipo del campo NOMBRE_CAMPO_O_PARAM.

Campos numéricos

Los campos numéricos se formatean con la función FormatFloat, si se ha dado un FORMATO. En caso contrario se usa un formato estandar.

Si se ha dado un LETRA_AJUSTE y una LONGITUD, y la longitud es mayor que el texto formateado, entonces se añaden espacios al principio (para LETRA_AJUSTE igual a R o >) o al final (para LETRA_AJUSTE igual a L o <).

Campos de fecha y/o hora

Los campos de fecha y/o hora se formatean con la función FormatDateTime, si se ha dado un FORMATO. En caso contrario se usa un formato estandar.

Para LETRA_AJUSTE y LONGITUD aplica lo mismo que para los campos numéricos.

Campos de texto

Los campos de texto se formatean con la función Format, si se ha dado un FORMATO. En caso contrario se usa el texto tal cual.

Si el texto es más corto que LONGITUD, se usa el ajuste derecho si LETRA_AJUSTE es R o >, y el ajuste izquierdo para L o <.

Los símbolos < y > tienen un significado especial para los campos de texto. Cuando se usan estos símbolos, se aplica el ajuste de línea para textos que exceden LONGITUD caracteres. Ver más explicaciones abajo en el párrafo correspondiente.

Campos vacíos (nulos)

Los campos vacíos se formatean con LONGITUD espacios. Si no se ha dado LONGITUD, se devuelve una cadena vacía.

Campos con caracteres de control

Se pueden enviar cualquier valor a la impresora con una variable de tipo {$…}, por ejemplo

{$AE3B}

Después del símbolo de dólar se tiene que poner la cadena de control en codificación hexadecimal. Así es posible enviar por ejemplo el código para imprimir un logotipo guardado en la impresora.

Control de impresión (IFDEF)

Existen dos formas para condicionar la impresión de la plantilla. Forma 1:

{IFDEF CONDICIÓN}
  bloque 1
{ENDIF}

Se imprime el bloque 1 cuando se cumple la CONDICIÓN.

Forma 2:

{IFDEF CONDICIÓN}
  bloque 1
{ELSE}
  bloque 2
{ENDIF}

Se imprime el bloque 1 cuando se cumple la CONDICIÓN, y en caso contrario se imprime el bloque 2.

La condición siempre tiene la forma

NOMBRE_CAMPO_O_PARAM<Operación>VALOR

o simplemente

NOMBRE_CAMPO_O_PARAM

Cuando solo se da el nombre de un campo o parámetro (sin operación), la condición se cumple si el campo o parámetro no es vacío (nulo).

La operaciones permitidas son <, , =, <>, > y >=.

No hace falta poner comillas alrededor de un VALOR de texto, y no se debe poner espacios delante o detrás de la operación. Ejemplos:

# Solo imprimir el descuento si es distinto a cero
I.  {DESCRIPCION|<20}{IFDEF PORC_DTO<>0}
I.  Descuento de #PORC_DTO|I% (#IMPORTE_DTO|D){ENDIF}

Ojo: Si se cambia lo anterior al siguiente ejemplo, se imprime una línea vacía si el descuento es cero:

I.  {DESCRIPCION|<20}
I.  {IFDEF PORC_DTO<>0}Descuento de #PORC_DTO|I% (#IMPORTE_DTO|D){ENDIF}

Ajuste de línea para campos de texto

Si un campo de texto contiene varias líneas separadas por avances de línea (CRLF), se formatea cada línea por separado y se imprimen todas las líneas una debajo de otra.

Suponemos que el campo DESCRIPCION contenga el siguiente valor:

Pan de molde
Paquete familiar

Y en la plantilla tenemos:

I.  #DESCRIPCION|10  #PRECIO|D7

Entonces se imprime

  Pan de mol     2,33
  Paquete fa

También podemos diferenciar el formato de la segunda y sucesiva línea de la primera línea:

I.  #DESCRIPCION|10  #PRECIO|D7\
I.  #DESCRIPCION|20

que resulta en

  Pan de mol     2,33
  Paquete familiar

Note por favor el símbolo \ al final de la primera línea de la plantilla, indicando que la siguente línea tiene el formato para textos multi-linea.

También es posible realizar un ajuste de línea automático, separando el texto en el último espacio que todavía cabe en la longitud de la variable. Para esto hay que usar los símbolos especiales < y > en la LETRA_AJUSTE del las variables complejas:

I.  {DESCRIPCION|<10}  #PRECIO|D7\

Si descripción tiene el valor

Pan de molde paquete familiar

Se formatea así:

  Pan de         2,33
  molde
  paquete
  familiar

Otra vez podemos definir un formato diferente para la segunda y sucesivas líneas:

I.  {DESCRIPCION|<10}  #PRECIO|D7\
I.  {DESCRIPCION|<30}

Que acaba en:

  Pan de         2,33
  molde paquete familiar
usu/plantillas.txt · Última modificación: 2021/12/07 18:45 por stefan