Saltar al contenido
Vaadin Create 2026e-cometa en Vaadin Create, 27 oct→
← e-cometa Metadata Language

Especificación

Modificadores de etiqueta

Los modificadores que la plataforma lee tras la primera @ de la etiqueta de un campo: dónde se lee cada uno, qué valor lleva, cómo se combina con los demás, qué hace y cómo falla cuando está mal puesto. También las marcas de la etiqueta que no son modificadores, y lo que un botón necesita de la opción de menú o del proceso que abre.

v0.1.0-draft34 modificadores

Los tokens, las columnas, los ejemplos y los mensajes del core van tal cual. El contrato se escribe en inglés y, si la traducción y el original difieren, manda el original.

Cómo se lee una etiqueta

La etiqueta es todo lo que va tras el primer '#' de colOrder, fieldOrder o queryOrder. Lo que va delante sólo ordena los campos. No hay un analizador común: cada zona corta la etiqueta a su manera. El listado quita '@color@…' y después '@path@…' y traduce el resto. La ficha y la búsqueda sólo quitan un '#' final (alineación a la derecha), así que cualquier '@…' se muestra como texto, salvo '@CPOption' en los diálogos de petición de datos y un '@TAB' final. Un botón muestra su etiqueta hasta la primera '@' y decide su acción buscando tokens fijos en cualquier parte de la etiqueta, en el orden de button_dispatch. Las marcas que no son modificadores '@' (alineación, texto condicional, grupos, HTML, listados hijos incrustados) están en label_markers.

Qué hace un botón: orden de despacho

Cada token se busca en toda la etiqueta. Decide la acción la primera fila de esta tabla que coincida, sea cual sea el orden de los tokens en la etiqueta.

#TokenAcción
1@PICK@elegir un registro de otro recurso para la ficha
2@POP@IDMabrir una opción de menú
3@IDPejecutar un procesodentro de un popup
4@BUTTON@rechazar con un errordentro de un popup
5@URLabrir una URL externa o relativa en una pestaña nueva del navegador
6@IDMabrir una opción de menú
7@IDPejecutar un proceso
8@COPY@copiar el registro para pegarlo después
9@PASTE@abrir un registro nuevo con los valores copiados
10@VALIDATEvalidar el registro
11@COPY&SAVE@rellenar el registro desde otro recurso y guardarlo
12@CPOptioncontinuar un proceso
13@VALUE@continuar un proceso con un valor
14@DirectPrintenviar el registro a un agente de impresión en el equipo del usuario
15@GenerateXMLenviar los datos de factura del registro a un agente en el equipo del usuario
16@RPTabrir un informe en una pestaña nueva del navegador
17@CCTASKlanzar una tarea del servidor de informes
18@SUMGRIDavisar cuando el listado es demasiado largo para sumarlo

Etiquetas de campo

@color@

ListadocolOrder

Da estilo a las celdas del cuerpo de la columna (fondo y texto) con la regla del tema de ese nombre. La cabecera conserva su estilo por defecto. Un valor vacío deja las celdas sin estilo.

Valor
Hasta el final de la etiqueta · valores definidos por el tema

Uno o varios nombres de part de CSS separados por espacios. Cada uno se añade al atributo part de todas las celdas del cuerpo de la columna.

Los nombres de part a los que da estilo el tema de la aplicación en su hoja de estilos del listado ([part~="<nombre>"]). Los temas de tys y galera definen red, grey, grey1 y pink. Los temas de la aplicación herbo y del core no definen ninguno, así que ahí el modificador no pinta nada.

Ejemplos
@color@grey@color@pink@path@Documents@color@grey
Requiere
  • El campo se muestra en el listado.
  • La columna no es de imagen ni HTML. Esas lo ignoran.
Composición
Tiene que ir al final · se combina con @path@

Todo lo que va tras '@color@' se toma como valor, así que cualquier modificador escrito después pasa a formar parte de los nombres de part y se pierde.

# Un '#' antes de '@color@' no es una marca de alineación en el listado: se muestra en la cabecera de la columna, y el color se aplica igualmente.

Dónde no se lee
En la ficha y la búsqueda el modificador no se lee: '@color@<valor>' se muestra como parte del texto del campo, junto con cualquier '#' anterior, y el campo no se alinea a la derecha. En los listados en árbol la cabecera también lo muestra literal.

Falla sin avisar o rompe cuando

  • Un nombre que el tema no define no pinta nada y no da error.
  • Si hay varios nombres separados por espacios se aplican todos. Un valor con una palabra suelta pinta igualmente si una de las palabras es un nombre definido.

Ver también @path@

@path@

ListadocolOrder

Fija la carpeta de la columna de subida que el listado añade junto a cada campo de subida. Un fichero subido desde una fila se guarda en esa carpeta (que se crea si no existe) y su nombre se escribe en el campo de esa fila del listado. La subida en sí no guarda el registro.

Valor
Hasta el final de la etiqueta · valores definidos por el despliegue

Una ruta de carpeta relativa a la raíz de la carpeta compartida configurada, o 'row.<columna>' para tomar la carpeta de esa columna de la misma fila. La columna es la posición del campo en el registro tal como lo ve el listado (col0, col1…), no su nombre: 'row.col24', no 'row.Notific'. Lo que vaya antes de 'row.' se ignora.

Carpetas de la carpeta compartida configurada para la aplicación.

Ejemplos
@path@Catalogue/ProductDocuments@path@row.col3
Requiere
  • El campo se muestra en el listado.
  • El despliegue configura una carpeta compartida (SMB) para las subidas.
Composición
En cualquier posición · se combina con @color@

Tiene que ir antes de '@color@' cuando están los dos. El valor llega hasta el final de lo que queda tras quitar '@color@…'.

Dónde no se lee
La ficha y la búsqueda muestran '@path@<valor>' como parte del texto. Las subidas sólo están disponibles desde el listado.

Falla sin avisar o rompe cuando

  • Un campo de subida que se muestra en el listado sin '@path@' recibe la columna de subida, pero todas las subidas fallan, porque no hay carpeta donde guardar el fichero.
  • Sin carpeta compartida configurada el fichero no se guarda, pero su nombre se escribe igualmente en el campo.
  • Con 'row.<columna>' y esa columna vacía en la fila, el fichero se guarda en la raíz de la carpeta compartida.
  • Con 'row.<nombre>' escrito con el nombre del campo en lugar de su columna, la carpeta no se puede leer y el fichero se guarda en la raíz de la carpeta compartida, sin avisar.
  • Si la carpeta compartida rechaza el fichero (una carpeta sin permiso de escritura, por ejemplo), no se guarda nada y el usuario no ve ningún error, pero el nombre del fichero se escribe igualmente en el campo.

Ver también @color@

@CPOption

FichafieldOrder

Escribe los campos del diálogo en su registro (validándolos) y continúa el proceso que abrió el diálogo: en el paso cuyo idNextStep es igual a la clave, o en la siguiente sequence si la clave está vacía. En un campo de datos del diálogo, pulsar Intro en el campo hace lo mismo (no en las áreas de texto de varias líneas).

Valor
Hasta el final de la etiqueta · valores definidos por los metadatos

Vacío, o la clave del paso en el que continuar: el valor de ProcessStep.idNextStep de un paso del mismo proceso.

Valores de ProcessStep.idNextStep del proceso en marcha.

Ejemplos
@CPOption@CPOptionPasarTarifa@AutoHide@CPOptiondestinoTienda0
Requiere
  • El recurso es un diálogo de petición de datos ('AD-…') abierto por un paso de un proceso en marcha.
Composición
Tiene que ir al final · se combina con @AutoHide@

Todo lo que va tras '@CPOption' es la clave del paso, así que los demás modificadores van delante. Una '@' doble delante ('@@CPOption') es inofensiva. En un campo de datos tiene prioridad sobre '@TAB', que ahí no hace falta: Intro ya continúa el proceso.

# En un campo de datos de un diálogo de petición de datos, un '#' antes de '@CPOption' alinea el campo a la derecha. El modificador se quita del texto.

Variantes

@CPOption@NP: En la barra de botones del listado no exige una fila seleccionada, pero '@NP' pasa a ser la clave del paso, así que el proceso sólo continúa si algún paso tiene idNextStep '@NP'.

Dónde no se lee
Fuera del diálogo de petición de datos de un proceso en marcha, el botón no continúa nada y muestra un error que dice que no se ha podido recuperar el contexto del proceso. En un campo de datos de un recurso que no es 'AD-…', se muestra como parte del texto.

Falla sin avisar o rompe cuando

  • Una clave que no corresponde a ningún idNextStep del proceso acaba el proceso y cierra el diálogo, sin error.
  • En la barra de botones del listado exige una fila seleccionada.
  • Un '@TAB' escrito después pasa a formar parte de la clave del paso ('@CPOptionNext@TAB' busca el paso 'Next@TAB'), así que el proceso acaba sin error.

Ver también @VALUE@, @AutoHide@, @IDP, @TAB

@TAB

FichaBúsquedafieldOrderqueryOrder

En la ficha, pulsar Intro en el campo lleva el foco al siguiente campo de la ficha, como hace la tecla Tab, en el orden de fieldOrder y saltando los campos deshabilitados, de sólo lectura y ocultos (también los de una pestaña oculta). En el último campo que puede recibir el foco, Intro no hace nada. El Intro no llega al resto de la pantalla, así que no lanza la búsqueda. El modificador se quita del texto.

Valor
Sin valor

Sin valor.

Ejemplos
@TAB#@TAB
Requiere
  • El modificador es el final de la etiqueta. Los espacios finales se ignoran.
  • El campo no es un área de texto de varias líneas, donde Intro es un salto de línea.
Composición
Tiene que ir al final

En un campo de un diálogo de petición de datos que además lleva '@CPOption', gana '@CPOption' y '@TAB' no hace falta. Juntos permiten rellenar un diálogo sólo con Intro: '@TAB' en los campos intermedios y '@CPOption' en el último.

# Un '#' antes de '@TAB' alinea el campo a la derecha. Un '#' después también alinea, pero el core deja de ver '@TAB' y lo muestra en el texto.

Dónde no se lee
En la búsqueda sólo se quita del texto, porque ahí Intro lanza la búsqueda. En un botón no se lee. En la cabecera del listado se muestra como texto.

Falla sin avisar o rompe cuando

  • Cualquier cosa tras '@TAB', '#' de alineación a la derecha incluido, hace que el core no lo vea: Intro no salta y el texto muestra '@TAB' tal cual.

Ver también @CPOption

Botones

@IDM

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre la opción de menú: su recurso con su layout, en un popup ('@POP') o en una pestaña nueva del navegador. La opción de menú se busca con el API de la aplicación en ejecución, no con el API de la ficha del botón. Su columna application no se comprueba salvo que la forma 'APIname~application~idMenu' indique una. En una pestaña nueva el filtro del botón pasa a la página nueva, y sólo hace falta una fila seleccionada cuando el filtro lleva 'row.'.

Valor
Hasta la siguiente @ · valores definidos por los metadatos

El idMenu de una opción de menú. También 'APIname~application~idMenu' para indicar el API y la aplicación. Un id que acaba en 'int' está pensado para buscarse en la aplicación de opciones internas, pero ver failure_modes.

Opciones de menú (menu.idMenu) del API de la aplicación.

Ejemplos
@IDM900@POP@IDM940@IDM203201200201@FILTERrow.XNIF=rowtarget.XNIF
Requiere
  • En una pestaña nueva, la página sale del layoutPage de la opción de menú: PAGE_DYNAMIC_QGD (consulta, listado y registro, también si es NULL o vacío), PAGE_DYNAMIC_QG (consulta y listado), PAGE_DYNAMIC_GD (listado y registro) o PAGE_DYNAMIC_D (un único registro), escritos exactamente así. PAGE_DYNAMIC_DDS, que el menú lateral acepta, aquí no se acepta. '@DG' llega a esa página.
  • En una pestaña nueva, el queryFormClassName y el displayFormClassName de la opción de menú nombran las clases que pintan la búsqueda y el registro. A un nombre sin paquete se le pone el paquete de vistas de la aplicación.
Composición
En cualquier posición · se combina con @POP, @POPINSERT, @FILTER, @DG, @target@

Los tokens se buscan en cualquier parte de la etiqueta, así que su orden no importa. '@POP@IDM' es '@POP' seguido de '@IDM', no un token propio. Escritos juntos, además, evitan que se abra dos veces el mismo popup.

Dónde no se lee
Sólo lo leen los botones. En un campo de datos se muestra como parte del texto.

Falla sin avisar o rompe cuando

  • Un id que no corresponde a ninguna opción de menú del API de la aplicación no abre nada y no muestra ningún error.
  • Un '#' pegado al número corta la petición en ese punto: la opción de menú se encuentra por su id en cualquier API, y la pestaña nueva se abre sin el filtro del botón (el recurso entero).
  • Un id que acaba en 'int' se envía sin comillas al backend, que rechaza la consulta: no se abre nada y no se muestra nada.
  • Un layoutPage con cualquier otro valor (una errata, otras mayúsculas, PAGE_DYNAMIC_DDS) muestra el error 'valor invalido para layoutPage…' y aun así abre la pestaña, en una dirección que no existe.
  • Un queryFormClassName o displayFormClassName NULL, vacío o que no nombra ninguna clase abre el listado, pero al seleccionar una fila no se muestra ningún registro, sin mensaje.
  • Una etiqueta con '@URL' o '@PICK@' hace eso en su lugar, esté donde esté '@IDM'.

Ver también @POP, @FILTER, @DG, @target@

@POP

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre la opción de menú en un diálogo sobre la pantalla actual en lugar de en una pestaña nueva. Lo que muestra el diálogo depende del layout de la opción de menú (popup_layouts): un listado (el filtro selecciona sus filas), una pantalla de consulta (el filtro se resuelve contra el recurso destino) o un único registro encontrado con el filtro, con o sin sus listados hijos. Cuando el filtro de un registro único encuentra varios, se muestra el primero en el orden del backend, sin avisar. Pulsarlo otra vez con el mismo popup abierto no abre un segundo. Los botones de la barra de botones de la ficha (idButtonBarForButtons 2) no se pintan dentro del popup. Los botones dentro de la ficha (3) sí, y pueden abrir otros popups.

Valor
Sin valor

Sin valor. Un bloque '#style#' en cualquier parte de la etiqueta, hasta la siguiente '@' o el final, da tamaño y estilo al popup: pares 'propiedad:valor' separados por ';'. width, height, min-width, min-height, max-width y max-height fijan el tamaño del diálogo ('with' se lee como width). Cualquier otra propiedad se aplica a su contenido. Los pares sin ':' se ignoran.

Ejemplos
@POP@IDM901@POP@IDM902@FILTERrow.CLAVE_ARTICULO=rowtarget.ARTICULO#style#width:1200px
Requiere
  • El botón abre una opción de menú ('@IDM').
  • La opción de menú tiene un layout (menu.layout), la clase que pinta el popup, escrito exactamente como en popup_layouts (mismas mayúsculas, sin espacios alrededor). Una pestaña nueva no lee esa columna, así que una opción que se abre bien desde el menú puede no tenerla.
  • Cuando el layout muestra un único registro, la opción de menú tiene además una clase de ficha (menu.displayFormClassName).
  • El filterForPopup de la opción de menú, si está informado, se antepone al filtro del botón, unido con ';', y el resultado sigue las reglas de '@FILTER' (si tiene una cláusula 'row.', su primera cláusula tiene que serlo). Un layout de registro único necesita que empiece por 'row.'.
Composición
En cualquier posición · se combina con @IDM, @FILTER, @POPINSERT
Dónde no se lee
En un botón que ejecuta un proceso ('@IDP') no tiene efecto.

Falla sin avisar o rompe cuando

  • Sin layout (NULL) en la opción de menú el popup no se abre. Un diálogo dice que el layout no está definido para el recurso ('Layout sin definir, se debe de especificar en la opción del menú').
  • Con una cadena vacía, una clase que no existe, otras mayúsculas o espacios alrededor en el layout, no se abre nada y no se le muestra nada al usuario.
  • Con un layout de registro único y sin clase de ficha (displayFormClassName NULL o vacío), no se abre nada y no se muestra nada.
  • Cuando el layout destino muestra un único registro, el filtro tiene que empezar por 'row.'. Si no, no se busca ningún registro y el diálogo dice que no hay datos. Esto incluye un filterForPopup sin 'row.' antepuesto a un filtro de botón que sí lo lleva.
  • Un filterForPopup sin 'row.' antepuesto a un filtro de botón con 'row.' rompe el filtro (se cortan sus primeros caracteres). Con un layout de listado el backend rechaza la consulta y el usuario ve el error del servidor.
  • En un layout de registro único, un campo de origen NULL encuentra los registros destino cuyo campo IS NULL, así que el popup muestra un registro sin relación en lugar de decir que no hay datos. Desde un registro nuevo aún sin guardar los valores de origen son cadenas vacías, que el backend también puede encontrar (una clave numérica compara '' como 0).
  • Los cambios de layout ('@DG' y sus variantes) y '@target@' se ignoran en un popup.
  • En una página sin listado (la página de registro único, PAGE_DYNAMIC_D) el popup no se abre, aunque el registro esté en pantalla: un error pide seleccionar un registro en el listado lateral ('debe de tener seleccionado un registro en el listado lateral').

Ver también @IDM, @POPINSERT, @FILTER

@POPINSERT

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre el registro destino en un popup. Si el filtro no encuentra ninguno, abre un registro nuevo con los valores por defecto del recurso y el campo destino relleno con el valor de origen, para que el registro se pueda crear desde ahí. El registro nuevo no muestra listados hijos hasta que se guarda.

Valor
Sin valor

Sin valor.

Ejemplos
@POPINSERT@IDM905@FILTERrow.CLAVE_ARTICULO=rowtarget.CLAVE_ARTICULO
Requiere
  • El botón abre una opción de menú ('@IDM') cuyo layout muestra un único registro.
  • El botón tiene un '@FILTER' con exactamente una cláusula 'row.<origen>=rowtarget.<destino>'.
Composición
En cualquier posición · se combina con @IDM, @FILTER
Dónde no se lee
Cuando el layout destino es un listado o una pantalla de consulta, se comporta como '@POP'.

Falla sin avisar o rompe cuando

  • Cuando el filtro no encuentra ningún registro y tiene más de una cláusula, o ninguna cláusula 'row.<origen>=rowtarget.<destino>', no se abre nada y no se muestra nada.

Ver también @POP, @FILTER

@DG

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre la opción de menú en la página de registro único con sus listados hijos, declare la opción de menú la página que declare. Con un '@FILTER', primero comprueba que el filtro encuentra un registro y, si no, dice que no hay datos sin abrir la pestaña. Sin filtro la pestaña se abre y la página dice que no hay datos.

Valor
Sin valor · valores definidos por el core

Sin valor. No distingue mayúsculas, y tiene que ir seguido de '@', '#' o el final de la etiqueta.

Ejemplos
@DG@IDM203201200202@FILTERrow.PROVEEDOR=rowtarget.CLAVE_PROVEEDOR
Requiere
  • El botón abre una opción de menú ('@IDM') en una pestaña nueva (sin '@POP').
Composición
En cualquier posición · se combina con @IDM, @FILTER

Cuando hay varios cambios de layout, gana el primero de @DG, @GD, @QGD, @QG, @G.

Variantes

@GD: Abre la página de listado y registro.

@QGD: Abre la página de consulta, listado y registro.

@QG: Abre la página de consulta y listado.

@G: Igual que @QG.

Dónde no se lee
En un popup se ignora: el popup usa el layout de la opción de menú.

Falla sin avisar o rompe cuando

  • Sustituye un layoutPage no válido de la opción de menú, pero el error sobre ese layoutPage se sigue mostrando antes de abrir la pestaña.

Ver también @IDM, @POP

@FILTER

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Filtra lo que abre la opción de menú con valores del registro de origen. En una barra de botones del listado, un filtro con 'row.' exige una fila seleccionada. Con 'FIX->' y un popup a una pantalla de consulta, el filtro queda aplicado a todas las búsquedas de ese recurso durante el resto de la sesión, también en otras pantallas del mismo recurso después de cerrar el popup.

Valor
Hasta la siguiente @ · valores definidos por los metadatos

Prefijo opcional 'FIX->' y después cláusulas separadas por ';' y unidas con AND. Una cláusula es una de estas: 'row.<campoOrigen><op>rowtarget.<campoDestino>' (el valor sale del registro de origen, y 'row.subgrid.<campo>' lo toma de la fila seleccionada del listado hijo), 'col<n><op>rowtarget.<campoDestino>' (una columna de la pantalla de origen), '#VALUE<valor><op>rowtarget.<campoDestino>' (un valor fijo), 'rowtarget.<campoDestino><op><valor>' (una condición fija sobre el destino) o '<campoDestino>=rowExtraFilterForChildren.<campo>'. <op> es uno de = <> <= >= < >. Las palabras 'rowExtraFilterForChildren' y 'extraFilterForChildrenMap' como cláusulas se quitan del filtro y activan el filtro extra para los hijos del destino. Un campo destino cuyo nombre contiene 'FECH' se compara como fecha. Si alguna cláusula empieza por 'row.', la primera tiene que hacerlo.

Nombres de campo de los recursos de origen y destino.

Ejemplos
@FILTERrow.CLAVE_CLIENTE=rowtarget.CLAVE_CLIENTE@FILTERrow.SERIE=rowtarget.SERIE;row.NUMERO=rowtarget.NUMERO@FILTERFIX->row.N_PEDIDO=rowtarget.N_PEDIDO
Requiere
  • El botón abre una opción de menú ('@IDM').
Composición
En cualquier posición · se combina con @IDM, @POP, @POPINSERT, @DG, @QryInForm

El filtro acaba en la siguiente '@'. Un bloque '#style#' se quita antes, así que puede ir detrás del filtro.

Dónde no se lee
Fuera de los botones de navegación no se lee de la etiqueta. Su uso en parentResource (filtros de selección y de combos) es otro contrato.

Falla sin avisar o rompe cuando

  • @OR@ y @AND@ se cortan: el filtro acaba en su primera '@' y el resto se pierde sin avisar. En un botón, sólo ';' combina cláusulas.
  • '@FILTER->row.…' no es una grafía válida: el valor no empieza por 'row.' y se interpreta mal.
  • 'FIX->' en una pestaña nueva sin 'row.' mantiene la condición sobre ese recurso durante el resto de la sesión: todas las búsquedas posteriores de ese recurso, en cualquier pantalla, quedan filtradas por ella hasta que acaba la sesión u otro 'FIX->' la sustituye. Con un popup a un listado, o con 'row.' en una pestaña nueva, muestra un error y funciona como un filtro normal.
  • Un valor de origen NULL muestra un diálogo de que no hay datos cuando el destino es un listado en un popup, y un listado vacío sin mensaje en una pestaña nueva. Cuando es un único registro en un popup, encuentra los registros cuyo campo IS NULL (ver '@POP').

Ver también @IDM, @POP, @QryInForm

@QryInForm

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

El listado del popup se filtra con el mismo filtro con el que se cargó el registro de origen, es decir, la búsqueda aplicada en ese momento en la pantalla de origen.

Valor
Sin valor

Sin valor. Se admite una '@' final.

Ejemplos
@POP@IDM940@FILTER@QryInForm@
Requiere
  • Va detrás de '@FILTER' ('@FILTER@QryInForm').
  • El botón abre un popup ('@POP') cuyo layout de menú es un listado.
Composición
En cualquier posición · se combina con @FILTER, @POP, @IDM
Dónde no se lee
En un popup a un único registro muestra un diálogo de que no hay datos. En una pestaña nueva se pasa como filtro literal, que el backend rechaza: el listado se abre vacío, sin mensaje.

Ver también @FILTER

@URL

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre la URL en una pestaña nueva del navegador.

Valor
Hasta el final de la etiqueta · texto libre

Una URL absoluta que empiece por 'http', 'row.<campo>' para abrir la URL guardada en ese campo del registro, o una ruta que empiece por '/' relativa a la aplicación. Un marcador '#PCUrlFiles#' en el valor del campo se sustituye por la URL de ficheros configurada.

Ejemplos
@URLhttp://www.example.org@URLrow.UrlVideo@URL/process-control/ui
Composición
Tiene que ir al final

Tiene prioridad sobre '@IDM': una etiqueta con los dos abre la URL. Se busca 'http', 'row.' y '/' en toda la etiqueta, por ese orden, así que el texto no puede contenerlos.

Dónde no se lee
En un campo de datos se muestra como parte del texto.

Falla sin avisar o rompe cuando

  • Cualquier cosa tras la URL o el nombre del campo pasa a formar parte de ella, '@target@' incluido.
  • Un valor que no tiene ninguna de las tres formas muestra un error de formato.
  • Con 'row.<campo>' y un campo que no existe en el registro, un error lo nombra.
  • Con 'row.<campo>' y un campo NULL, se abre el texto 'null' como dirección relativa a la página actual (una página que no existe). Un valor sin esquema también se abre relativo a la página actual.
  • Con 'row.<campo>' en la barra de botones del listado y sin fila seleccionada, no se abre nada y no se muestra nada.
  • La forma '/' abre '../..' seguido de la ruta, relativo a la dirección de la página actual.

Ver también @target@

@target@

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre la opción de menú en esa ventana del navegador en lugar de en una pestaña nueva (lo habitual).

Valor
Hasta la siguiente @ · texto libre

Un destino de ventana del navegador, como _self, _blank o un nombre de ventana.

Ejemplos
@IDM900@target@_self
Requiere
  • El botón abre una opción de menú ('@IDM') en una pestaña nueva (sin '@POP').
Composición
En cualquier posición · se combina con @IDM, @FILTER
Dónde no se lee
Se ignora en los popups y en '@URL', que siempre abre una pestaña nueva.

Ver también @IDM, @URL

@SelectedRow

Barra de botones del listadofieldOrder

El botón exige una fila seleccionada en el listado y actúa sobre ella. El token se quita antes de ejecutar la acción.

Valor
Sin valor

Sin valor.

Ejemplos
@IDP45@SelectedRow
Requiere
  • El botón está en la barra de botones del listado.
Composición
En cualquier posición
Dónde no se lee
En la barra de botones de la ficha o dentro de la ficha no se lee y se queda en la cadena de la acción.

Ver también @FILTER

@BUTTON@

Barra de botones del listadoFichafieldOrderqueryOrder

Dentro de un popup, el botón se rechaza con un error salvo que la etiqueta además elija filas, abra una opción de menú en popup o ejecute un proceso.

Valor
Sin valor

Sin valor.

Ejemplos
@BUTTON@
Requiere
  • El botón está dentro de un popup.
Composición
En cualquier posición
Dónde no se lee
Fuera de un popup no se lee. Sin otra acción, el botón avisa de que la acción no está implementada.

@IDP

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Ejecuta el proceso desde su primer paso: el de ProcessStep.sequence más baja (NULL cuenta como 0 y va el primero). Cada paso continúa en el paso cuya sequence es exactamente una más, o en el paso que indique la clave de un botón de continuar. El registro de entrada es la fila seleccionada del listado al que pertenece el botón o, si no la hay, el registro de la ficha, que se vuelve a leer del backend antes de empezar el proceso. Un paso que no se limita a un registro (groupBy 'row') ni a las filas seleccionadas (proccessOnlySelectedRow) procesa todas las filas del listado. Dentro de un popup el proceso se ejecuta sobre el registro del popup, '@IDP' tiene prioridad sobre '@URL' y '@IDM', y el popup se cierra al acabar el proceso.

Valor
Hasta @PAR o @VALUE@ · valores definidos por los metadatos

El idProcess de un proceso. Detrás sólo puede ir '@PAR…' o '@VALUE@…'. Cualquier otro modificador escrito después del número pasa a formar parte del id.

Procesos (Process.idProcess) del API de la aplicación: el proceso se busca por su id dentro de ese API, así que un proceso cuyo APIname es otro API no se encuentra. Desde una pantalla del editor de metadatos tiene que pertenecer al API 'metadata'.

Ejemplos
@IDP1@IDP52@PAR@@OUTR@0#@IDP54@VALUE@CONFIRMA_PED_ALB=0
Composición
En cualquier posición · se combina con @PAR, @VALUE@, @SubGToProcces, @SelectedRow, @AutoHide@

Los modificadores que no son '@PAR' ni '@VALUE@' tienen que ir antes de '@IDP', salvo '@SubGToProcces' (que se quita antes de leer el id) y '@SelectedRow' en la barra de botones del listado. '@POP' no tiene efecto. '@IDP' y '@VALIDATE' no se pueden combinar: el proceso no se ejecuta y no se muestra ningún error. Fuera de un popup, '@IDP' tampoco se puede combinar con '@URL', '@IDM' ni '@POP@IDM': el botón ni navega ni ejecuta el proceso, y no muestra ningún error.

Dónde no se lee
Sólo los botones lo leen de la etiqueta. En un campo de datos se muestra como parte del texto.

Falla sin avisar o rompe cuando

  • Un id que no corresponde a ningún proceso muestra un error con el id y el botón.
  • Un proceso sin pasos muestra un error.
  • Cualquier cosa pegada al número que no sea '@PAR' o '@VALUE@' (por ejemplo '@AutoHide@', o '@SelectedRow' fuera de la barra de botones del listado) pasa a formar parte del id, y el proceso no se encuentra.
  • Fuera de un popup, una etiqueta que además tiene '@PICK@' elige en su lugar. Con '@URL', '@IDM' o '@POP@IDM' el botón no hace nada y no muestra ningún error.
  • Con dos pasos de la misma sequence sólo se ejecuta el primero que devuelve el backend. Un hueco en la secuencia (1, 3) acaba el proceso tras el primero.
  • Desde la barra de botones del listado sin fila seleccionada, un paso que procesa el listado pide confirmar el número de filas y después las procesa todas. Un paso limitado a un registro falla sin mensaje.
  • Desde la ficha, un paso que procesa el listado procesa todas sus filas sin preguntar, aunque haya una fila seleccionada.
  • Una condición de paso (ProcessStep.conditionForProcess) sin prefijo 'rootRow', 'parentRow', 'rowAD' o 'rowQRY' se comprueba contra la primera fila del listado, no contra el registro de entrada, y esa fila sólo trae las columnas del listado, así que un campo que no se muestra en el listado se da por no definido.
  • Dos pasos de la misma ejecución que modifican el mismo registro fallan en el segundo con un error de bloqueo optimista.
  • Con un campo de la ficha cambiado y sin guardar, el botón se rechaza con un error que pide guardar antes.

Ver también @PAR, @VALUE@, @SubGToProcces, @SelectedRow, @CPOption

@PAR

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Pasa un parámetro de texto al proceso, disponible para todos los pasos de esa ejecución.

Valor
Hasta el final de la etiqueta · valores definidos por los metadatos

Texto libre, '@' incluida, que se pasa al proceso como parámetro. Lo leen dos sitios: en un paso cuyo methodAndParamsToRun contiene '<<@PAR>>' se sustituye por el parámetro, y un parámetro que contiene '@OUTR@' elige el recurso de salida ('@OUTR@').

Lo que los pasos del proceso esperan en '<<@PAR>>', por ejemplo una llamada a un informe.

Ejemplos
@IDP58@PAR@RPTArqueo.rpt@SF{SALIDAS_CAB.FECHA_ALBARAN}=<<col0>>@IDP52@PAR@@OUTR@1#
Requiere
  • El botón ejecuta un proceso ('@IDP').
Composición
Tiene que ir al final · se combina con @IDP, @OUTR@

Todo lo que va tras '@PAR' es el parámetro, así que los modificadores escritos después no se leen como modificadores del botón. Antes de ejecutar el proceso, el despacho del botón ya ha buscado sus tokens en toda la etiqueta, parámetro incluido: un '@RPT' dentro del parámetro es inofensivo sólo porque '@IDP' se despacha antes.

Dónde no se lee
En un botón que no ejecuta un proceso no se lee.

Falla sin avisar o rompe cuando

  • Un paso que usa '<<@PAR>>' cuando el botón no tiene '@PAR' muestra un error que lo pide y se ejecuta igualmente, con el literal '<<@PAR>>' en lugar del parámetro.
  • '@PAR' seguido de '@VALUE@' corta el id del proceso en '@VALUE@': el proceso no se encuentra. No se pueden combinar. Antes de eso, '@VALUE@' valida la ficha y se detiene si no es válida.

Ver también @IDP, @OUTR@

@OUTR@

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Cada salida del proceso que crea registros, y cuyo recurso enumera varios recursos separados por '#', escribe en el de esa posición, así que varios botones pueden ejecutar el mismo proceso contra recursos destino distintos. Las salidas que modifican el registro de entrada (isUpdateFromInputResource) escriben siempre en el registro de entrada: para ellas la selección sólo muestra sus errores.

Valor
Hasta el final de la etiqueta · valores definidos por los metadatos

Un índice que empieza en cero seguido de un '#' de cierre, que tiene que ser el último carácter de la etiqueta: '@OUTR@0#', '@OUTR@1#'.

Posiciones de los recursos enumerados, separados por '#', en el recurso de salida.

Ejemplos
@IDP52@PAR@@OUTR@0#@IDP52@PAR@OUTR@1#
Requiere
  • Forma parte del parámetro de un botón de proceso ('@IDP<n>@PAR…@OUTR@<n>#').
  • Una salida del proceso enumera varios recursos separados por '#'.
Composición
Tiene que ir al final · se combina con @PAR

Distingue mayúsculas. '@PAR@@OUTR@' y '@PAR@OUTR@' son lo mismo: basta con que el parámetro contenga '@OUTR@'.

Dónde no se lee
Sin '@PAR' delante no se lee.

Falla sin avisar o rompe cuando

  • Sin el '#' de cierre, el recurso de salida pasa a ser el texto 'Invalid input format' y la salida falla.
  • Un índice fuera de rango muestra un error y la salida falla.
  • Un botón de proceso sin '@OUTR@' cuya salida enumera varios recursos escribe en la lista entera como si fuera un único nombre de recurso, que no existe. No recurre al primero.
  • Con '@OUTR@', todas las salidas de todos los pasos del proceso pasan por la selección, también las que nombran un único recurso (el índice 0 lo conserva, cualquier otro falla).
  • Una salida que crea registros y cuyo recurso seleccionado es el recurso del registro de entrada modifica el registro de entrada en lugar de crear uno nuevo.
  • En una salida que modifica el registro de entrada, un índice fuera de rango muestra su error y el registro se escribe igualmente. Si falta el '#' o falta '@OUTR@', se escribe sin error.

Ver también @PAR, @IDP

@SubGToProcces

FichafieldOrderqueryOrder

Ejecuta el proceso sobre la fila seleccionada de ese listado hijo en lugar del registro de la ficha.

Valor
Hasta el final de la etiqueta · valores definidos por el core

El id de componente de un listado hijo de la ficha.

Ids que el core da a los listados hijos que pinta en la ficha.

Ejemplos
@IDP12@SubGToProcces<child grid id>
Requiere
  • El botón ejecuta un proceso ('@IDP') desde una ficha que tiene listados hijos.
Composición
Tiene que ir al final · se combina con @IDP

El token y todo lo que va detrás se quitan antes de leer el id del proceso, así que hay que escribirlo con esa grafía (con la errata 'Procces').

Dónde no se lee
En un botón que no ejecuta un proceso no se lee.

Falla sin avisar o rompe cuando

  • Cualquier cosa tras el id del listado, '@' final incluida, hace que el botón falle con un error interno y el proceso no se ejecuta.
  • Un id que no corresponde a ningún listado hijo ejecuta el proceso sobre el registro de la ficha.

Ver también @IDP

@VALUE@

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Cada mapeo de salida del proceso cuyo valor es '@ButtonVALUE@' toma el valor que el botón da para su campo, así que varios botones pueden ejecutar o continuar el mismo proceso con valores distintos. Sin '@IDP' ni '@CPOption' el botón continúa el proceso desde su diálogo de petición de datos en el paso siguiente.

Valor
Hasta el final de la etiqueta · valores definidos por los metadatos

Pares '<campoSalida>=<valor>' separados por '#', donde <campoSalida> se escribe como en el mapeo de salida ('CAMPO', 'rowID.CAMPO'…). El valor es un literal y llega hasta el siguiente '#' o el final.

Campos de salida del proceso cuyo valor de mapeo es '@ButtonVALUE@'.

Ejemplos
@IDP54@VALUE@CONFIRMA_PED_ALB=0@VALUE@UNIDADES_RECIBIDAS=0#CANTPROP=0
Requiere
  • El botón ejecuta un proceso ('@IDP') o continúa uno desde su diálogo de petición de datos.
Composición
Tiene que ir al final · se combina con @IDP, @CPOption

Con '@IDP' el id del proceso acaba en '@VALUE@'. Con '@CPOption' sólo funciona la forma '@VALUE@<pares>#@CPOption<clave>': en cualquier otro orden un valor se traga al otro.

Dónde no se lee
Los pasos de impresión y exportación de un proceso también sustituyen cada texto '@ButtonVALUE@' del registro por el valor hasta la siguiente '@'. Un botón de impresión no lo hace: '@VALUE@' se despacha antes.

Falla sin avisar o rompe cuando

  • Un mapeo con '@ButtonVALUE@' cuyo campo no está en el botón muestra un error con el campo, y la salida escribe igualmente en él el texto '!fieldNotExistInButton!'.
  • Los nombres de campo se buscan como subcadenas. Un campo que es el principio de otro (CANT y CANTPROP) no se encuentra cuando el más largo va antes, como arriba. Un campo que es el final de otro (CANT y XCANT) toma el valor del más largo, sin error.
  • El botón cuenta como botón de continuar aunque lleve '@IDP', así que primero se escribe la ficha en su registro y se valida, y una ficha no válida lo detiene antes de empezar el proceso.
  • Sin '@IDP', se aplican las mismas condiciones que a '@CPOption'.

Ver también @IDP, @CPOption

@AutoHide@

FichaBúsquedafieldOrderqueryOrder

El botón se oculta al pulsarlo, antes de ejecutar su acción (también cuando después la acción falla), y sigue oculto durante el resto de la pantalla, en cualquier registro: pasar a otro registro y volver no lo recupera. Vuelve al abrir otra vez la pantalla.

Valor
Sin valor

Sin valor.

Ejemplos
@AutoHide@CPOptiondestinoTienda0
Requiere
  • El botón está en la barra de botones de la ficha o dentro de la ficha, no en la barra de botones del listado.
Composición
En cualquier posición · se combina con @CPOption, @VALUE@, @IDP

Se busca en cualquier parte de la etiqueta, pero tiene que ir antes de los modificadores cuyo valor llega hasta el final ('@CPOption', '@VALUE@', '@PAR') y no puede ir detrás del número de '@IDP'.

Dónde no se lee
En la barra de botones del listado no se lee y el botón sigue visible.

Falla sin avisar o rompe cuando

  • Escrito tras '@IDP<n>' pasa a formar parte del id del proceso y el proceso no se encuentra.

Ver también @CPOption

@VALIDATE

FichafieldOrder

Ejecuta a demanda las validaciones de la ficha, sin guardar: las restricciones de los campos y las reglas del registro declaradas en validationRuleName, mostrando sus mensajes y avisos.

Valor
Sin valor

Sin valor.

Ejemplos
@VALIDATE
Requiere
  • El botón está en la barra de botones de la ficha o dentro de la ficha.
Composición
En cualquier posición

No se puede combinar con '@IDP', '@COPY@' ni '@PASTE@': esos se despachan antes y después fallan sin avisar, porque '@VALIDATE' cambia la forma de invocar la acción. Junto a '@COPY&SAVE@', '@CPOption' o cualquier token posterior del despacho, el botón sólo valida.

Dónde no se lee
En la barra de botones del listado no hay ficha que validar.

@PICK@

FichafieldOrder

Abre el mismo diálogo de selección que un campo con selección, sobre el parentResource del botón (con su filtro). Las columnas del registro elegido se copian en la ficha según pickMapFields. No guarda. En la barra de botones de la ficha el botón sólo se muestra al insertar. Dentro de la ficha se muestra siempre.

Valor
Sin valor

Sin valor. La selección se configura en el parentResource y el pickMapFields del propio botón.

Ejemplos
@PICK@
Requiere
  • El botón está en la barra de botones de la ficha o dentro de la ficha, no en la barra de botones del listado.
  • La fila de campo del propio botón (buscada por su FieldNameInUI dentro del API de la aplicación) tiene parentResource, pickMapFields y queryFormForPickClassName, el formulario de búsqueda del diálogo.
  • No hay ningún campo de la ficha modificado y sin guardar. En un registro nuevo esto significa que la selección tiene que hacerse antes de que el usuario escriba nada.
Composición
Tiene que ir al final

El core encuentra la fila de campo del propio botón añadiendo su FieldNameInUI a la etiqueta, así que detrás de '@PICK@' no puede ir nada. Es el primer token del despacho: junto a cualquier otro, el botón elige.

Dónde no se lee
En la barra de botones del listado el botón no encuentra su propia fila y la selección no funciona.

Falla sin avisar o rompe cuando

  • Cualquier cosa escrita tras '@PICK@' impide que el botón encuentre su propia fila.
  • Con un campo modificado y sin guardar, el botón se rechaza con un error que pide guardar antes.
  • Sin queryFormForPickClassName el diálogo no se abre y no se muestra nada.
  • Con parentResource vacío, o con un recurso sin plantillas, un error lo nombra y no se abre ningún diálogo.
  • Sin pickMapFields el diálogo se abre y deja elegir. Al aceptar se muestra un error y el diálogo sigue abierto.
  • En pickMapFields, una entrada cuya columna destino no existe se ignora, una cuya columna origen no existe escribe el texto 'null', y un valor que no cabe en el destino (texto en una fecha) se descarta. Ninguno muestra mensaje y las demás entradas se aplican igualmente.
  • Un '@FILTER' en parentResource que no empieza por 'colN' muestra un aviso, y la selección funciona con él de todos modos.

Ver también @COPY&SAVE@

@COPY@

Barra de botones del listadoFichafieldOrder

Guarda una copia del registro (la fila seleccionada del listado de la pantalla cuando pertenece al mismo recurso, si no el registro de la ficha, y dentro de un popup el registro del popup) en el listado de la pantalla. No se escribe nada. Sin '@INCLUDE@' se copian todas las columnas, clave incluida, y la copia conserva la identidad del registro original (ver '@PASTE@').

Valor
Sin valor

Sin valor. Puede ir seguido de '@INCLUDE@' o '@EXCLUDE@'.

Ejemplos
@COPY@@COPY@INCLUDE@col7,col3,col4,
Composición
En cualquier posición · se combina con @INCLUDE@, @EXCLUDE@

'@PICK@', '@POP@IDM', '@URL', '@IDM' e '@IDP' tienen prioridad en el despacho. Con '@VALIDATE' el botón falla sin avisar.

Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Desde la barra de botones del listado sin fila seleccionada, no se copia nada y no se muestra nada.

Ver también @PASTE@, @INCLUDE@, @EXCLUDE@

@PASTE@

Barra de botones del listadoFichafieldOrder

Abre la ficha de alta del listado de la pantalla rellena con los valores copiados. No se guarda nada hasta que el usuario guarda el registro nuevo. Desde la barra de botones del listado la ficha de alta se abre detrás de la vista de listado y sólo se ve cuando el usuario cambia a la vista de ficha. Dentro de un popup se abre en la pantalla de detrás del popup, que sigue abierto.

Valor
Sin valor

Sin valor.

Ejemplos
@PASTE@
Requiere
  • Antes se pulsó un botón '@COPY@' de la misma pantalla, sin cerrarla.
Composición
En cualquier posición

Con '@VALIDATE' el botón falla sin avisar.

Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Sin una copia previa en la misma pantalla, el botón no hace nada y no muestra ningún mensaje.
  • Si la copia se hizo sin '@INCLUDE@', el registro pegado conserva la clave y la identidad del original, y al guardarlo se actualiza el registro original y se informa de que ha ido bien. No se crea ningún registro.

Ver también @COPY@

@INCLUDE@

Barra de botones del listadoFichafieldOrder

La copia conserva sólo las columnas indicadas. Las demás toman los valores por defecto de un registro nuevo.

Valor
Hasta el final de la etiqueta · valores definidos por el core

Nombres de columna 'colN' (no nombres de campo), cada uno seguido de una coma, también el último: '@INCLUDE@col7,col3,'.

Posiciones de las columnas del recurso (col0, col1…).

Ejemplos
@COPY@INCLUDE@col7,col3,col4,col5,col6,col1,col2,
Requiere
  • Va detrás de '@COPY@'.
Composición
Tiene que ir al final · se combina con @COPY@
Dónde no se lee
Sin '@COPY@' delante no se lee.

Falla sin avisar o rompe cuando

  • Una columna sin coma detrás (normalmente la última) no se copia.

Ver también @COPY@, @EXCLUDE@

@EXCLUDE@

Barra de botones del listadoFichafieldOrder

Pensado para copiar todas las columnas salvo las indicadas. Tal como está implementado, no copia ninguna: el pegado abre un registro nuevo vacío.

Valor
Hasta el final de la etiqueta · valores definidos por el core

Nombres de columna 'colN', cada uno seguido de una coma.

Posiciones de las columnas del recurso (col0, col1…).

Ejemplos
@COPY@EXCLUDE@col0,
Requiere
  • Va detrás de '@COPY@'.
Composición
Tiene que ir al final · se combina con @COPY@

@EXCLUDE@ tiene prioridad sobre @INCLUDE@ cuando se escriben los dos.

Dónde no se lee
Sin '@COPY@' delante no se lee.

Falla sin avisar o rompe cuando

  • No se copia ninguna columna, esté indicada o no.

Ver también @COPY@, @INCLUDE@

@COPY&SAVE@

FichafieldOrder

Una selección sin diálogo que guarda: lee el primer registro del parentResource del botón que cumple su '@FILTER' contra el registro actual, copia sus columnas en el registro según pickMapFields y guarda el registro en el backend sin preguntar y sin mensaje. No copia el propio registro. A diferencia de '@PICK@', en la barra de botones de la ficha también se muestra al editar.

Valor
Sin valor

Sin valor. El origen se configura en el parentResource y el pickMapFields del propio botón.

Ejemplos
@COPY&SAVE@
Requiere
  • El botón está en la barra de botones de la ficha o dentro de la ficha, no en la barra de botones del listado.
  • La fila de campo del propio botón (buscada por su FieldNameInUI dentro del API de la aplicación) tiene parentResource con '@FILTER', y pickMapFields.
  • El registro ya existe. En un registro nuevo el valor del filtro está vacío (ver failure_modes).
Composición
Tiene que ir al final

El core encuentra la fila de campo del propio botón añadiendo su FieldNameInUI a la etiqueta, así que detrás no puede ir nada. Junto a '@VALIDATE' el botón sólo valida.

Dónde no se lee
En la barra de botones del listado el botón no encuentra su propia fila y no hace nada.

Falla sin avisar o rompe cuando

  • Un error del backend al guardar muestra una caja de error vacía (el mensaje del backend se pierde) y el registro no se guarda.
  • Si el recurso de origen no tiene ningún registro que cumpla el filtro, el registro se guarda sin cambios.
  • Sin '@FILTER' no se lee nada, y sin pickMapFields o parentResource no se copia nada. En los tres casos el registro se guarda sin cambios y no se muestra nada.
  • Un '@FILTER' que no empieza por 'colN' muestra un aviso y se aplica igualmente.
  • Con '@FILTERFIX' se muestra el mismo aviso, el valor se pierde y el filtro compara con un valor vacío, que la base de datos puede hacer coincidir con otro registro (una clave 0). Los valores de ese registro se copian y se guardan.
  • En un registro nuevo aún sin guardar el valor del filtro también está vacío, y el botón inserta el registro sin la validación de la ficha (campos obligatorios incluidos).

Ver también @PICK@

@RPT

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Abre el informe en una pestaña nueva del navegador a través del servidor de informes del despliegue. Sin '@SF', el filtro actual del listado (el de la última búsqueda) se traduce a la fórmula de selección del informe, con cada campo precedido de la tabla tomada del nombre del recurso (o del nombre del informe cuando empieza por 'V_'). Sin búsqueda no hay fórmula, aunque se pulse desde la ficha. La empresa de la carpeta del informe y el origen de datos (DB11_<empresa><año>) salen de la sesión. Una aplicación sin empresa los deja vacíos.

Valor
Hasta @SF · valores definidos por el despliegue

El nombre del fichero del informe, pegado al token ('@RPTArqueo.rpt'), siempre relativo a la carpeta de informes del despliegue. Una '/' en el nombre sólo evita que se añada otro separador.

Ficheros de informe (.rpt) en el servidor de informes del despliegue.

Ejemplos
@RPTCompTicket.rpt@RPTVerCertificados.rpt@SF{COLADAS.ARTICULO} = <<ARTICULO>>
Requiere
  • El despliegue define el servidor de informes y la carpeta de informes (app_const_clear_report_server, app_const_report_path).
Composición
En cualquier posición · se combina con @SF

Su nombre llega hasta '@SF' o hasta el final, así que los demás modificadores van delante. Dentro del parámetro de un botón de proceso ('@IDP<n>@PAR@RPT…') no es un botón de informe: el paso del proceso lo recibe como id de un botón que ejecutar.

Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Un nombre de informe que no existe en el servidor falla en la pestaña del informe, no en la aplicación.
  • Sin la carpeta de informes en el despliegue, el botón no hace nada y no muestra nada.

Ver también @SF

@SF

Barra de botones del listadoFichaBúsquedafieldOrderqueryOrder

Filtra el informe con la fórmula, rellena con los valores del registro (o, si no lo hay, de la fila seleccionada del listado).

Valor
Hasta el final de la etiqueta · texto libre

Una fórmula de selección del motor de informes, '{TABLA.CAMPO}=<<campo>>' unidas con AND/OR, donde cada '<<campo>>' se sustituye por el valor del registro ('colN' o el nombre del campo). Una fecha pasa a CDate(a,m,d) y una etiqueta que no se puede resolver queda literal. Los valores se insertan tal cual, así que las comillas de los textos van en la fórmula, y un valor NULL se inserta como el texto 'null' (una fecha NULL también, sin CDate). Dos formas especiales: '#row.colN' (toda la fórmula es el valor de ese campo) y '@keepFIlter' (un filtro que conserva un proceso en marcha).

Tablas y campos tal como los ve el informe. Atado al motor de informes y a la base de datos.

Ejemplos
@SF{COLADAS.ARTICULO} = <<ARTICULO>> AND {COLADAS.COLADA}='<<COLADA>>'
Requiere
  • Va detrás de '@RPT'.
Composición
Tiene que ir al final · se combina con @RPT

Escrito antes de '@RPT', el botón falla con un error interno.

Dónde no se lee
Sin '@RPT' delante no se lee.

Falla sin avisar o rompe cuando

  • Sin registro ni fila seleccionada, un error pide seleccionar uno.
  • Un campo NULL acaba en la fórmula como el texto 'null'.

Ver también @RPT

@DirectPrint

Barra de botones del listadoFichafieldOrder

El navegador del usuario envía el registro como JSON a un agente de impresión en su propio equipo (http://127.0.0.1:5001/print).

Valor
Sin valor · valores definidos por el despliegue

Sin valor. Puede ir seguido de '@PATH@<ruta>@NCOPIES@<n>': la ruta sustituye a 'print' sólo cuando están los dos. El número de copias sólo lo usa la impresión agrupada dentro de un proceso.

Rutas que sirve el agente de impresión instalado en el equipo del usuario.

Ejemplos
@DirectPrint@DirectPrint@RESOURCE@SumCount_Ventas_CAB__HojaCierre
Composición
En cualquier posición · se combina con @RESOURCE@

@VALUE@ se despacha antes, así que un botón de impresión no puede llevar valores.

Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Sin un agente de impresión en marcha, el usuario no ve que pase nada. El error sólo llega a la consola del navegador.
  • Desde la barra de botones del listado sin fila seleccionada (y sin '@RESOURCE@'), no se envía nada y no se muestra nada.

Ver también @RESOURCE@, @GenerateXML

@RESOURCE@

Barra de botones del listadoFichafieldOrder

Imprime el primer registro que devuelve el backend para ese recurso en lugar del actual (no la fila seleccionada), leído con el filtro actual del listado más el filtro de usuario de ese recurso. Los campos del filtro tienen que existir en él.

Valor
Hasta el final de la etiqueta · valores definidos por los metadatos

El nombre de un recurso del backend.

Recursos del API de la aplicación.

Ejemplos
@DirectPrint@RESOURCE@SumCount_Ventas_CAB__HojaCierre
Requiere
  • Va detrás de '@DirectPrint'.
Composición
Tiene que ir al final · se combina con @DirectPrint
Dónde no se lee
Sólo lo lee '@DirectPrint'.

Falla sin avisar o rompe cuando

  • Si el recurso no devuelve ningún registro, no se imprime nada y no se muestra ningún error.
  • Con una búsqueda activa en el listado, el filtro de usuario se añade aunque esté vacío (' AND ()'), el backend no devuelve ningún registro y no se imprime nada.

Ver también @DirectPrint

@GenerateXML

Barra de botones del listadoFichafieldOrder

El navegador del usuario envía el nodo 'datos_factura' del registro a un agente en su propio equipo (http://127.0.0.1:5001/genFacturaXML), que genera el XML.

Valor
Sin valor · valores definidos por el despliegue

Sin valor. Puede ir seguido de '@PATH@<ruta>@NCOPIES@<n>', como en '@DirectPrint'.

Rutas que sirve el agente instalado en el equipo del usuario.

Ejemplos
@GenerateXML
Composición
En cualquier posición
Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Un registro sin 'datos_factura' falla sin mostrar ningún error.
  • Sin el agente en marcha, el usuario no ve que pase nada.

Ver también @DirectPrint

@CCTASK

Barra de botones del listadoFichafieldOrder

El servidor de aplicación lanza la tarea en el servidor de informes con los parámetros (por ejemplo, enviar un informe por correo). El registro es primero el de la ficha y después la fila seleccionada.

Valor
Hasta el final de la etiqueta · valores definidos por el despliegue

'<idTarea>#<param>#<param>…': el id de la tarea llega hasta el primer '#' de la etiqueta, y cada parámetro es 'row.<campo>', 'rowParent.<campo>', 'user.<campo>' o el nombre de un campo del registro. 'MULTI' como id de tarea toma el id de cada empresa del 'idsTask' del registro.

Ids de tarea del servidor de informes del despliegue.

Ejemplos
@CCTASK6ucc197c27omfobbh8csfiss2#row.N_PEDIDO#row.CLAVE_ALMACEN
Composición
Tiene que ir al final

# No se admite: un '#' antes del token se toma como el final del id de la tarea y el botón falla.

Dónde no se lee
Sólo lo leen los botones.

Falla sin avisar o rompe cuando

  • Sin las propiedades de despliegue para tareas, se muestra un error y no se lanza nada.
  • Sin parámetros toda la etiqueta se toma como nombre de un campo, así que se muestra un error y la tarea se lanza igualmente con '###ERROR###'.
  • Un parámetro que no se puede resolver muestra un error, y la tarea se lanza igualmente con '###ERROR###' como valor.
  • Un id de tarea 'MULTI' en un registro sin 'idsTask' muestra un error y no se lanza nada.
  • Desde la barra de botones del listado sin fila seleccionada, no se lanza nada y no se muestra nada.

Ver también @RPT

@SUMGRID

Barra de botones del listadoFichafieldOrder

No activa las sumas del listado. Cuando el listado de la pantalla tiene más de 500 filas muestra un aviso con el número de filas, también si se pulsa desde la ficha. Si no, el botón no hace nada.

Valor
Sin valor

Sin valor.

Ejemplos
@SUMGRID
Composición
En cualquier posición
Dónde no se lee
Sólo lo leen los botones.

Marcas de etiqueta

Marcas de la etiqueta que no son modificadores @: alineación, texto condicional, grupos, HTML y listados hijos incrustados.

#

FichaBúsquedafieldOrderqueryOrder

Se quita el '#' y el campo se alinea a la derecha.

Gramática
Un '#' como último carácter de la etiqueta. Sólo se quita uno: '##' deja un '#' en el texto. Un '#' en cualquier otro sitio forma parte del texto.
Ejemplos
01#Amount#03#Weight (##.000)#
Dónde no se lee
En la cabecera del listado se muestra como texto y no se alinea nada. En un botón se muestra como texto, porque un botón sólo corta su texto en la primera '@'.

Falla sin avisar o rompe cuando

  • En un rango de fechas de la búsqueda (DatePickerRange) el '#' no se quita del texto de la caja del rango: se muestra como texto.
  • Cualquier cosa tras el '#', '@TAB' incluido, lo convierte en un '#' dentro del texto.

#tagForV#

FichaBúsquedafieldOrderqueryOrder

El texto es el de las alternativas cuyas etiquetas se cumplen, unidas con ','. Una alternativa simple se cumple siempre. El campo se pinta aunque no se cumpla ninguna alternativa, con el texto vacío.

Gramática
Una o varias alternativas separadas por ';', cada una '#tagForV#<tags>#endTag#<texto>' o un texto simple. <tags> usa las mismas condiciones que las etiquetas de visibilidad de un campo (tagsForVisibility).
Ejemplos
14##tagForV#company:GFER#endTag#GCOA code;#tagForV#company:TYSH#endTag#Distrits code
Dónde no se lee
En la cabecera del listado se muestra la etiqueta entera como texto.

Falla sin avisar o rompe cuando

  • Una sola alternativa (sin ';') funciona, pero cada vez que se abre la ficha el usuario recibe el error 'Si usamos #tagForV#, los tabs hay que separarlos por ; no por ,'.
  • Sin '#endTag#' el texto es 'TAG MAL definido' y se muestran dos errores cada vez que se abre la ficha.
  • Cuando se cumplen varias alternativas, se muestran todas, unidas con ','.

GRP#

FichaBúsquedafieldOrderqueryOrder

Los campos que siguen, en el orden de la columna, se pintan dentro de un recuadro con esa leyenda hasta que se cierra el grupo.

Gramática
'GRP#<leyenda>' abre un grupo y 'GRP/#' lo cierra. La leyenda es lo que sigue al último '#' de la etiqueta.
Ejemplos
16#GRP#Address20#GRP/#
Requiere
  • El campo es un espaciador (fieldName '#SPACE#', no un botón) o un campo HTML. En cualquier otro campo la etiqueta es un texto y 'GRP#' se muestra tal cual.

Falla sin avisar o rompe cuando

  • Los grupos no se anidan: abrir un grupo con otro abierto cierra el primero, y el siguiente 'GRP/#' cierra el segundo.
  • Un '#' dentro de la leyenda la corta: 'GRP#Dirección #2' muestra '2'.
  • Un 'GRP/#' sin grupo abierto no hace nada.
  • Un grupo que sigue abierto al final de una pestaña pasa, con los campos que ya contiene, a la pestaña siguiente, y se lleva los campos de esa pestaña hasta que otro grupo se abra o se cierre. La primera pestaña pierde esos campos. Hay que cerrar cada grupo en su pestaña.
  • Si las etiquetas de visibilidad ocultan el espaciador que abre el grupo, el grupo no se abre y sus campos se pintan fuera de cualquier grupo.

HTML

FichaBúsquedafieldOrderqueryOrder

La etiqueta se pinta como HTML, con cada '@' y cada '#' tal como están escritos. No se lee ningún modificador ni marca de alineación. Un campo HTML con otro fieldName muestra en su lugar el valor de ese campo como HTML.

Gramática
La etiqueta tras el primer '#' es HTML.
Ejemplos
81#<b>Notice</b> text
Requiere
  • El campo es un campo HTML cuyo fieldName es '#SPACE#'.

child_grid

FichafieldOrder

Se pinta un listado dentro de la ficha, en la posición del campo. Un listado hijo se filtra por la relación de la plantilla hija con el registro.

Gramática
La etiqueta es un nombre de recurso, no un texto: '<padre>.<hijo>' para un listado hijo del registro (una plantilla cuyo tableName es ese nombre), o 'rootGrid-<recurso>' para un listado de otro recurso, sin filtrar por el registro.
Ejemplos
00#CR-SUPPLIERS.formGrid-CONTACTS03#rootGrid-CR-V_WEB_CUSTOMERS
Dónde no se lee
En la búsqueda rompe todo el formulario de búsqueda: la pantalla se abre sin búsqueda y no se avisa al usuario.

Falla sin avisar o rompe cuando

  • Un hijo que no existe, o un nombre con un '#' final, pinta un listado vacío y dos errores cada vez que se abre un registro. Con el '#', el error lleva un error de sintaxis SQL del backend de metadatos.

child_display

FichafieldOrder

Se pinta la ficha del primer registro hijo del registro dentro de la ficha, en la posición del campo.

Gramática
La etiqueta es el nombre del recurso hijo, '<padre>.<hijo>'.
Ejemplos
220#CR-DISCOUNT_GROUPS.FormDisplay-DRAFT_DISCOUNT_GROUPS
Requiere
  • La plantilla hija tiene displaySubFormClassName en sus propiedades extendidas (extProp).

Falla sin avisar o rompe cuando

  • Sin displaySubFormClassName en la plantilla hija el usuario recibe el error 'sin definir displaySubFormClassName y/o querySubFormClassName en extended properties'.
  • Sin confirmar en pantalla: en un stack local de herbo, con la propiedad informada, el recuadro se pinta vacío y los campos de la ficha del hijo no se leen nunca.

Lo que un botón necesita del proceso

Columnas del proceso y de sus pasos que lee @IDP al pulsar el botón: qué es válido y qué recibe el usuario si no lo es.

Process.APIname

El proceso se busca por su idProcess dentro del API de la aplicación en ejecución, desde cualquier pantalla.

Válido

El API de la aplicación en ejecución.

  • El proceso pertenece a otro API.

    Rechazado

    El proceso no se ejecuta.

    Mensaje: No se encontró el proceso indicado en el botón: idProcess=<id> …

ProcessStep.sequence

El proceso empieza en el paso de sequence más baja, y cada paso continúa en el paso cuya sequence es exactamente una más. Los pasos a los que se llega por la clave de un botón de continuar (idNextStep) no participan.

Válido

Enteros consecutivos, un paso por valor.

  • NULL
    Funciona

    Cuenta como 0, así que el paso se ejecuta el primero.

  • Dos pasos comparten sequence.

    Sin aviso

    Sólo se ejecuta el primero que devuelve el backend. El otro no se ejecuta nunca.

  • Un hueco en la secuencia (1, 3).

    Sin aviso

    El proceso termina tras el paso anterior al hueco.

ProcessStep.groupBy

El alcance de un paso: un registro (groupBy que empieza por 'row'), las filas seleccionadas (proccessOnlySelectedRow) o, si no, todas las filas del listado.

Junto con
ProcessStep.proccessOnlySelectedRow
Válido

Un groupBy que empiece por 'row' para un paso sobre el registro de entrada, proccessOnlySelectedRow informado para las filas seleccionadas, o ninguno de los dos para todo el listado.

  • Ninguno de los dos, pulsado desde la ficha.

    Registros equivocados

    Se procesan todas las filas del listado sin preguntar, aunque haya una fila seleccionada.

  • Ninguno de los dos, pulsado desde la barra de botones del listado sin fila seleccionada.

    Funciona

    Pide confirmación y procesa todas las filas del listado.

    Mensaje: Se van a procesar <n> registros

  • groupBy 'row', pulsado desde la barra de botones del listado sin fila seleccionada.

    Sin aviso

    El proceso falla y no se muestra nada.

  • proccessOnlySelectedRow, pulsado desde la barra de botones del listado sin fila seleccionada.

    Rechazado

    El proceso no se ejecuta.

    Mensaje: debe de seleccionar el registro a procesar

ProcessStep.conditionForProcess

La condición para que se ejecute el paso. Su prefijo indica sobre qué registro se comprueba: rootRow. el registro de entrada, parentRow. su padre, rowAD. el diálogo de petición de datos, rowQRY. la búsqueda.

Válido

Una condición sobre un campo escrita con uno de los prefijos rootRow., parentRow., rowAD. o rowQRY.

  • Sin prefijo, sobre un campo que no es columna del listado.

    Rechazo engañoso

    La condición se comprueba sobre la primera fila leída del listado, que sólo trae las columnas del listado, así que el paso no se ejecuta aunque la ficha tenga el campo.

    Mensaje: Campo para condición de procesable (<field>) no definido en recurso

  • Sin prefijo, sobre un campo que es columna del listado.

    Registros equivocados

    La condición se comprueba sobre la primera fila del listado, no sobre el registro de entrada.

Contrato legible por máquina

label-modifiers.yaml, validado contralabel-modifiers.schema.json (JSON Schema 2020-12).Fuente: ecometa-core · 3a47fa3.