Saltar al contenido principal

Diseñar un informe

Objetivo​

Maquetar un informe dentro de la plataforma —en un lienzo, junto a las consultas que lo rellenan— en lugar de dibujarlo en una herramienta aparte y volver a pegar el JSON.

Dónde se abre​

Abra su solución, elija Informes, seleccione un informe y pulse Diseñar. El lienzo se abre en el mismo sitio, bajo la misma ruta de navegación y los mismos selectores de entorno y solución con los que ya estaba trabajando. No es una segunda aplicación ni una pestaña nueva: diseñar un informe es trabajo de creador, y este es el portal del creador.

Diseñar y Editar son dos comandos porque se ocupan de dos mitades distintas:

  • Diseñar es la maquetación: la página, sus bandas, sus tablas, su logotipo.
  • Editar es todo lo que un lienzo no puede saber: qué consultas guardadas rellenan la plantilla, y qué campo reduce cada una de ellas cuando alguien imprime un solo registro.

En la mayoría de los informes usará los dos, y ninguno sobrescribe la mitad del otro.

Requisitos previos​

  • Ha iniciado sesión como creador, con una solución y un entorno seleccionados.
  • El informe ya existe. Créelo primero —consulte Crear un informe— y después diséñelo.

Pasos​

  1. Abra su solución y elija Informes.
  2. Seleccione el informe y pulse Diseñar.
  3. Si el informe nunca se ha diseñado, el lienzo se abre solo con el tablero Styles: los colores y estilos de texto de los que parte un diseño, que nunca se imprimen. Use Insertar → Página de informe para colocar una página, y maquete el contenido dentro de ella.
  4. Dibuje el informe: bandas para el encabezado y el pie, un repetidor para las filas, texto enlazado a los campos de su conjunto de datos. La paleta y el panel de capas funcionan como siempre; el inspector tiene ahora dos pestañas; consulte más abajo.
  5. Pulse Guardar.

Empezar a partir de un ejemplo​

Insertar → Informes de ejemplo coloca una página de informe terminada en el lienzo junto a lo que ya haya dibujado —no se sustituye nada— y carga sus datos de ejemplo en el editor de datos del informe, así que la vista previa aparece de inmediato.

La lista tiene dos mitades, y responden a preguntas distintas.

Los cinco primeros son documentos terminados —Factura, Ventas, Lista de contactos, Resumen, Panel— y están ahí para mostrar el aspecto que puede tener un informe.

Los cuatro siguientes demuestran cada uno una función, que es lo que necesita cuando sabe el efecto que busca pero no el gesto. Cada uno lleva una línea en su propio pie de página que indica dónde mirar:

EjemploMuestra
Estilo (cebra + formato condicional)Filas alternas, un color y un grosor que cambian por encima de un umbral, un color de estado y una marca que aparece solo en las filas a las que se aplica
Marca de aguaUn sello BORRADOR sobre cada página, y un bloque de control documental en la esquina
Encabezado y pie repetidosUn membrete y un pie en cada hoja, encabezados de columna que vuelven allí donde continúa la tabla, y un subtotal por hoja junto a un total de toda la tabla
GráficosUn gráfico de barras y un gráfico de líneas, y debajo una tabla que lee el mismo conjunto de datos

Abra uno, seleccione una banda o una celda y lea sus expresiones en el inspector o en la página Código. Son dibujos normales: edítelos, quédese con la parte que quería y elimine el resto.

Estos cuatro enlazan una tabla real

Sus celdas leen row.par_name, row.par_amount, row.par_currency y row.par_status —las columnas de la tabla de ejemplo de gastos— en lugar de nombres inventados. Eso es lo que permite instalar el mismo dibujo como un informe que funciona con filas reales detrás, en lugar de uno que se ve bien en la vista previa y se imprime en blanco. Rediríjalos a su propia tabla editando el conjunto de datos y los enlaces; las técnicas no cambian.

Copie la regla de filas alternas

El rayado en cebra es Fondo en el marco de fila del repetidor, y dice rowIndex % 2 == 1 ? '#f8fafc' : '': el número de fila, no un campo. Leer un valor parece idéntico hasta que alguien vuelve a ordenar la tabla.

Una comprobación encadenada necesita paréntesis

a ? b : c ? d : e no se puede analizar. Escriba row.status == 'Approved' ? '#059669' : (row.status == 'Rejected' ? '#be123c' : '#b45309'). Una expresión que no se puede analizar deja la propiedad exactamente como la dibujó, así que el síntoma es un color que nunca cambia en lugar de un error.

Generar con IA​

Generar con IA describe una página con palabras y la dibuja. Describa lo que quiere —el cuadro es grande a propósito: una página que merezca la pena generar ocupa un párrafo— y pulse Generar, o Ctrl/⌘+Intro. Lo que vuelve se agrega a lo que ya hay en el lienzo; no se sustituye nada de lo que dibujó. Para empezar de cero, vacíe primero el lienzo y después genere.

Lo que vuelve se comprueba antes de que aparezca nada —cada forma tiene que ser una que este editor pueda construir realmente—, así que una respuesta que nombra una forma que no existe no pone un cuadro roto en su página.

Se corrige a sí mismo antes de rendirse. Cuando no vuelve nada aprovechable, la plataforma devuelve la respuesta directamente al modelo con el problema indicado, en lugar de pedirle a usted que corrija un error que nunca escribió. Lo intenta hasta tres veces, y mientras tanto el botón dice Corrigiendo… intento 2 de 3.

Una respuesta aprovechable en parte se conserva, no se desecha. Las formas que se pudieron dibujar quedan en el lienzo y el cuadro de diálogo sigue abierto enumerando lo que quedó fuera, así que una respuesta de diez formas en la que dos no eran aprovechables llega como ocho formas y dos frases, en lugar de ocho formas y silencio. Un resultado parcial del que no se le informa es uno que usted leería como si su propia descripción hubiera pedido menos.

Usted describe el diseño, y nada más. Qué modelo de IA responde lo configura una sola vez para toda la plataforma un administrador: no hay clave que pegar ni proveedor que elegir.

Si no hay botón de IA, esta plataforma no tiene IA configurada. Pregunte a un administrador; es un ajuste del servidor, no algo que un creador pueda activar.

Las dos pestañas del inspector​

El panel de propiedades de la derecha tiene dos pestañas, y responden a dos preguntas distintas:

  • Gráfico: qué es el objeto: dónde está, qué tamaño tiene, su relleno, su trazo, su texto.
  • Informe: qué significa el objeto para el informe: que este marco es la página, o una banda de encabezado, o un repetidor, y a qué está enlazado un texto o una imagen.

Un punto en la pestaña Informe significa que el objeto seleccionado ya forma parte del informe —la página, una banda, un texto enlazado—, así que lo ve sin abrir la pestaña. La pestaña que deje abierta sigue abierta mientras selecciona otros objetos.

Algunos objetos no tienen nada que poner en la pestaña Informe: solo un marco puede ser la página o una banda, y solo un texto o una imagen pueden enlazarse a datos. La pestaña lo indica en lugar de abrirse vacía.

Guardar hace dos cosas a la vez, y esta es la parte que merece la pena entender: compila lo que ha dibujado en la plantilla que se imprime, y guarda su dibujo junto a ella. Por eso puede pulsar Diseñar mañana y recuperar su maquetación en lugar de una reconstrucción de ella: se conserva el dibujo, no solo su resultado.

Un diseño de página, por muchas hojas que imprima​

Un diseño de página se pagina: el cuerpo fluye por tantas hojas como necesite el contenido, y el encabezado y el pie de página se vuelven a dibujar arriba y abajo de cada una. Una lista de cien facturas es un diseño de página y cuatro páginas impresas.

Varios diseños de página en un informe: secciones​

Dibuje un segundo marco de Página de informe en el lienzo y obtendrá una sección: una portada maquetada de una manera, el cuerpo de otra, los términos y condiciones al dorso. Cada marco etiquetado como página de informe es una sección, en el orden en que están en el lienzo, y cada sección empieza en una hoja propia.

Cada sección tiene sus propios márgenes y su propio encabezado de página, pie de página, membrete y marca de agua: una portada sin encabezado ni número de página, y un cuerpo que tiene ambos, en un mismo informe. Una sección sin nada dentro no imprime nada en absoluto, en lugar de una hoja en blanco.

Los números de página cuentan todo el informe, no la sección: la portada es la página 1 de n, donde n cuenta también todas las hojas que ocupan el cuerpo y los términos. Quien tiene en la mano una página impresa quiere «3 de 9».

nota

Todas las secciones se imprimen en el mismo tamaño de papel, tomado del primer marco de página. Una impresora tiene una bandeja, así que un informe que mezclara A4 y A5 no se imprimiría bien en ningún sitio. Cambie el tamaño de uno de los marcos y el diseñador lo indica al guardar, y luego imprime todo en el papel del primer marco. Los márgenes puede cambiarlos por sección; la hoja no.

Una sección es «a partir de aquí, la página tiene otro aspecto». Cuando solo quiere una hoja nueva con el mismo diseño, eso es la marca que se describe a continuación.

Empezar una zona en una página nueva​

La paginación corta una página cuando el bloque siguiente no cabe. Eso responde a «no dividas esta fila»; no puede responder a «esta parte empieza en su propia página», porque eso no tiene nada que ver con cuánto espacio queda.

Seleccione la zona —una banda, un repetidor, un contenedor de columnas, un gráfico— y marque Empieza en una página nueva en la pestaña Informe del inspector. El informe corta justo antes de ella, esté la página llena o no. Úselo para una serie de reclamaciones por cliente, o allí donde se quiera una hoja nueva con el mismo diseño de página. Cuando la propia página deba tener otro aspecto, dibuje un segundo marco de página y use una sección en su lugar.

Dos detalles que conviene saber:

  • Nunca deja una hoja en blanco. Un corte al principio de una página que ya está vacía no hace nada, así que marcarlo en la primera zona del informe —o en dos zonas seguidas— no le cuesta papel.
  • En una banda que se repite como encabezado de tabla, el corte cae antes del encabezado, que es lo que quiere: la nueva página se abre con los encabezados de columna y las filas siguen.

No recurra a esto para que una banda caiga en su sitio: rellenar una banda con espacio vacío hasta que se desborde parece correcto hoy y se rompe en cuanto cambian los datos. La marca es la forma duradera de decirlo.

Repetir sobre un conjunto de datos​

Un marco repetidor dibuja su contenido una vez por fila. Etiquete el marco como repetidor en la pestaña Informe del inspector y después elija qué recorre en Repetir sobre.

Repetir sobre es una lista desplegable de los conjuntos de datos de este informe —rows, invoices—, así que no hay ningún nombre que recordar ni que escribir mal. Si el que quiere no está en la lista, agréguelo en Editar en el panel de Informes y aparecerá aquí.

Una lista y no un cuadro donde escribir, a propósito: un repetidor recorre un conjunto de datos completo, así que «cuál» tiene exactamente tantas respuestas como conjuntos de datos tiene el informe. Reducir las filas —solo las reclamaciones aprobadas, por ejemplo— corresponde al propio conjunto de datos, donde está la consulta y donde cada banda que lee ese conjunto de datos obtiene la misma respuesta; póngalo en el cuadro de un marco y la siguiente banda necesitará su propia copia.

Qué muestra un texto o una imagen​

Un texto o una imagen dentro de un repetidor está enlazado, y el enlace se escribe en el mismo editor que cualquier otro fragmento de BS Lang de la plataforma: completa lo que se puede llamar, muestra qué recibe una función y subraya un error mientras escribe en lugar de imprimir después una celda en blanco.

En la pestaña Informe del inspector, Enlace es una lista desplegable de los campos a los que se puede enlazar, porque eso es lo que suele ser un enlace, y un nombre que se elige es un nombre que no se puede escribir mal.

Todo lo que sea más que un campo se escribe en la página de código: seleccione el texto y pulse Escribir código en la barra de herramientas (el botón </>). La lista de su lateral empieza por Qué muestra, el enlace, y sigue con cada propiedad que puede seguir a los datos (vea Estilo que viene de los datos, más abajo). El editor tiene espacio para trabajar: autocompletado, lo que recibe cada función y un subrayado rojo bajo un error mientras escribe; la lista marca cada entrada como Escrito o Tiene un error. Ahí va concat('Page ', pageNumber, ' of ', pageCount). La ✕ de su esquina le devuelve al dibujo, y lo que escribió se guarda con él cuando pulsa Guardar.

Abra el ojo para ver lo que puede escribir. Todos los cuadros de expresión de la plataforma llevan uno, y detrás está todo lo que esta expresión puede alcanzar: Página (pageNumber, pageCount, page.rows), Fila del repetidor (row, rowIndex, rows, rowCount), las columnas del conjunto de datos que recorre este repetidor, los agregados propios del informe con lo que recibe cada uno, y las funciones propias del lenguaje. Busque en él, haga clic en una entrada y se insertará donde está el cursor. Está ahí porque la finalización no puede responder a «¿qué hay en esta fila?»: la finalización le dice qué viene a continuación una vez que ha empezado a escribir, y el ojo le dice qué hay antes de que empiece.

Dentro de un repetidor las columnas se escriben como row.<field>: row es un registro de exactamente un conjunto de datos, y un campo de otro no se resolvería en nada. Fuera de un repetidor no hay ningún row, así que los mismos campos se direccionan a través de su conjunto de datos: rows[0].total.

Una columna de una tabla relacionada se escribe con el nombre que la consulta dio a la unión. Una consulta guardada que une el cliente como customer ofrece sus columnas como row.customer.par_name y row.customer.par_credit_limit, y las funciones de lista toman el mismo nombre entre comillas: sum(rows, 'customer.par_credit_limit'). Si cambia el nombre de la unión en la consulta, los enlaces tienen que seguirlo.

Y es una expresión, no solo un nombre de campo. row.amount * 1.2, row.status == 'Approved' ? 'Yes' : 'No', concat(row.first, ' ', row.last), sum(page.rows, 'amount') para un total por página: el mismo lenguaje que una regla de negocio, los enlaces de una pantalla y un script de solución.

Dónde estáQué hay en el ámbito
Una fila de un repetidorrow, rowIndex, rows, rowCount y cada conjunto de datos por su nombre
Un encabezado o pie de páginapageNumber, pageCount, page.rows, page.rowCount
En cualquier sitiolos conjuntos de datos por su nombre, data y los agregados de abajo

Totales, grupos y sumas acumuladas​

Un total de tabla va en una fila de total. Dibuje una banda debajo del repetidor y marque Fila de total del repetidor de arriba en la pestaña Informe. Se dibuja una vez después de la última fila y ve rows y rowCount para todo el conjunto de datos, así que sum(rows, 'amount') ahí es el total de la tabla.

Es una cifra distinta de un total de página, que es sum(page.rows, 'amount') en el pie de página y solo cuenta las filas que cayeron en esa hoja. Las dos son útiles; elija deliberadamente.

Un total acumulado es sum(take(rows, rowIndex + 1), 'amount') en la propia fila: cada fila hasta esta inclusive.

Agrupar es tarea del conjunto de datos. Guarde una consulta que agrupe —una fila por estado, con un recuento y un total (vea Guardar una consulta)—, añádala al informe como segundo conjunto de datos en Conjuntos de datos y repita sobre ella como sobre cualquier otro: cada fila que dibuja es un grupo, ya contado y totalizado, y una fila de total debajo suma los grupos. Un repetidor no puede ir dentro de la fila de otro repetidor, así que un informe no enumera las filas de cada grupo bajo un encabezado del grupo.

Llegar a un segundo conjunto de datos es lookup(regions, 'code', row.region).manager: la primera fila cuya columna coincide, para que pueda imprimir un nombre que su propia consulta no obtuvo.

Estilo que viene de los datos​

Seleccione una banda, una celda o una forma, pulse Escribir código y elija una propiedad de la lista bajo Propiedades: cada una acepta una expresión, que se responde por fila:

PropiedadEjemplo
Fondorow.amount > 1000 ? '#fee2e2' : ''
Color del textorow.overdue ? '#b91c1c' : ''
Grosor de fuenterow.isTotal ? '700' : ''
Se muestra cuandorow.note != ''

Vacío significa «déjelo como lo dibujé»: por eso los ejemplos tienen un simple '' en el otro lado en lugar de repetir su propio color, y por eso activar esto nunca puede dejar en blanco un informe que estaba bien. Se muestra cuando es la excepción: una respuesta falsa elimina el elemento por completo, fondo y borde incluidos, cosa que enlazar el texto a '' nunca podría hacer.

Para colorear una fila entera, establezca Fondo en el marco de fila del repetidor y no en una celda de dentro.

Los agregados: sum · count · avg · min · max · pluck · round · abs · upper · lower · concat · ifEmpty · format. Cada uno recibe una lista y, cuando la necesita, la columna que leer: sum(claims, 'par_amount').

Las funciones de lista: where · exclude · take · skip · sortBy · groupBy · lookup · distinct. Todas nombran una columna, nunca una condición: where(claims, 'status', 'Approved'), no where(claims, row.status == 'Approved'). Es un límite real y no una cuestión de estilo: una función recibe sus argumentos ya calculados, así que una condición se respondería una sola vez en lugar de una vez por fila.

pluck es la que responde con una lista en lugar de un solo valor, y es a lo que se enlaza un gráfico. Un gráfico quiere una serie, y un conjunto de datos son filas; así que pluck(revenue, 'amount') le da los importes y pluck(revenue, 'month') le da las etiquetas correspondientes, ambos del mismo conjunto de datos, para que no puedan desfasarse ni una fila.

Un gráfico​

Insertar → Gráfico de barras o Gráfico de líneas coloca un gráfico en la página bajo el centro de su vista: un marco en el que dibuja el motor de informes, con un título. No hay nada que dibujar a mano: la escala, las marcas y las etiquetas se calculan a partir de los datos cada vez que se ejecuta el informe. En una pantalla el mismo menú ofrece más tipos, como dibujos; un informe ofrece los dos que puede imprimir.

Seleccione el marco, pulse Escribir código y rellene Valores del gráfico y Etiquetas del gráfico, ambos con pluck para que salgan a la par de un mismo conjunto de datos: pluck(bystatus, 'total') y pluck(bystatus, 'par_status'). Barras o líneas, y el color, están en la pestaña Informe. La vista previa y la página impresa dibujan el mismo gráfico.

Un gráfico que no cabe debajo de lo anterior pasa a la hoja siguiente, como cualquier otro bloque.

Códigos de barras y códigos QR​

Insertar → Código de barras o Insertar → Código QR coloca un código real y legible por escáner en el marco que está en el centro de la vista: si lo suelta en un encabezado de página, se imprime en cada hoja. En la pestaña Informe defina su Valor, su Zona de silencio (el margen en blanco que necesita un escáner) y, o bien Imprimir el valor bajo las barras (Code 128), o bien Corrección de errores (QR). Code 128 admite ASCII imprimible; un código QR admite cualquier texto, también un enlace.

Para un código distinto en cada fila, selecciónelo dentro del repetidor, pulse Escribir código y rellene Valor del código de barras: row.par_reference. El lienzo dibuja el valor fijo, porque un lienzo no tiene filas.

Papel y orientación​

El tamaño del marco de página es el papel, en puntos (72 por pulgada): 595 × 842 es A4. Para cambiar el papel de una página, escriba su An y su Al; los tamaños de Papel del menú Marco dibujan un marco nuevo.

Para la orientación horizontal, indique primero a las bandas que sigan al papel: ponga la restricción Horizontal de cada banda en Izquierda y derecha, y todo lo que esté pegado a su borde derecho en Derecha. Después haga la página de 842 × 595.

Margen, en la pestaña Informe de la página, es el espacio que queda libre arriba y abajo de cada hoja. A lo ancho, todo se imprime donde lo dibujó. Imprimir / PDF imprime cada página en una hoja exactamente del tamaño de la página, así que el navegador no tiene margen donde poner su propio encabezado y pie.

Un informe en persa o en árabe​

Escriba las palabras y el diseñador pone el texto de derecha a izquierda. Un texto cuyas palabras son persas, árabes o hebreas se pone De derecha a izquierda y se alinea a la derecha al terminar de escribir, y la página lo imprime así: un punto o un número al final de la línea se queda al final. Un texto enlazado no tiene palabras de las que deducirlo, así que ponga De derecha a izquierda usted mismo en la pestaña Gráfico, junto a los botones de alineación. Disponga las columnas desde la derecha, como las lee un lector persa.

Las cifras y el calendario son del lector. Un texto cuyo Formato es number o date se escribe en el idioma y el calendario de quien abre el informe: cifras persas para un lector que trabaja en persa, y una fecha jalalí para quien tenga Configuración de apariencia → Calendario en Persa. La Vista previa del diseñador sigue su propia configuración, la aplicación la de cada lector, y el mismo informe imprime 7,890.50 para uno y ۷٬۸۹۰٫۵۰ para otro.

Un número dentro de concat se escribe tal como está guardado, así que dele un formato propio: concat('صفحهٔ ', format(pageNumber, 'integer'), ' از ', format(pageCount, 'integer')).

Vista previa de un informe que se imprime para un registro​

Cuando el primer conjunto de datos tiene un campo de registro, el informe se imprime desde un registro, y la vista previa lo muestra así: toma la primera fila del primer conjunto de datos como el registro y limita a él cada conjunto de datos con campo de registro. Una factura se previsualiza como la primera factura con sus propias líneas, no con las de todas.

Un informe para el que subió una plantilla​

Los informes creados pegando una plantilla no tienen dibujo detrás. Pulsar Diseñar en uno abre un lienzo vacío en lugar de intentar reconstruir la maquetación a partir de la plantilla.

Es deliberado. Una plantilla registra bandas, repetidores y enlaces, no los marcos, guías y estilos que usted dispuso para llegar a ellos, así que cualquier cosa que la plataforma dibujara a partir de ella sería una suposición, y guardar esa suposición sustituiría su plantilla real por la suposición. Si quiere un informe subido en el lienzo, maquételo una vez y guárdelo; a partir de ahí va y vuelve sin pérdidas.

A la inversa es seguro: editar los conjuntos de datos de un informe diseñado desde el panel de Informes deja su dibujo intacto.

Guardar, y adónde va​

Hay exactamente un Guardar, y está en la barra de título de la parte superior de la pantalla: el mismo sitio que en cualquier otra pantalla del producto. Escribe el informe como un componente de solución: por capas, propiedad de su solución, validado y listo para exportar.

El menú Archivo propio del diseñador no se muestra aquí. Por separado, ese menú guarda un archivo JSON en su disco; dentro de la plataforma sería un segundo comando que parece haber guardado su trabajo y no lo ha hecho. Exportar (PNG, SVG) sigue disponible, porque una imagen de un informe es útil en cualquier caso.

Moverlo entre entornos​

No cambia nada: el informe es un componente de solución y viaja como siempre, con su plantilla dentro. Su dibujo también viaja con él, así que quien lo importe puede pulsar Diseñar y continuar su maquetación en lugar de empezar de nuevo.

Solución de problemas​

  • «Este diseño todavía no tiene ninguna página de informe.» — ha dibujado en el lienzo pero no dentro de una página de informe. Use Insertar → Página de informe y ponga el contenido dentro; el marco de página es lo que le dice al compilador dónde empieza el informe.
  • Guardar aparece atenuado. — nada ha cambiado desde que lo abrió. Dibuje algo primero.
  • El informe se imprime pero la página está vacía. — el repetidor no apunta a ningún conjunto de datos. Abra Repetir sobre: enumera todos los conjuntos de datos que tiene realmente este informe. Elija uno, o agregue el conjunto de datos que falta en Editar y después elíjalo.
  • «Cada marco de página es una sección de este informe, pero todos deben tener el mismo tamaño…» — uno de sus marcos de Página de informe tiene un tamaño distinto del primero. Cámbielo para que coincida; hasta que lo haga, todo se imprime en el papel del primer marco. Consulte Varios diseños de página en un informe, más arriba.
  • Mi maquetación volvió distinta. — está en un informe cuya plantilla se subió en lugar de diseñarse. Consulte Un informe para el que subió una plantilla, más arriba.
  • Una celda está en blanco y el resto del informe está bien. — su enlace no pudo ejecutarse. Ábralo: el editor subraya la parte que no pudo interpretar. Un enlace que falla deja un blanco a propósito en lugar de arrastrar consigo toda la página.
  • rows.length dice 'length' es un método: escriba length() para llamarlo. Es un método en BS Lang, así que necesita los paréntesis: rows.length(). De todos modos, count(rows) se lee mejor en un informe. (Antes respondía con toda la lista en lugar del recuento, y no decía nada. Ahora ya no).
  • sum aparece subrayado en rojo. — compruebe cómo está escrito con la lista de arriba. El editor conoce los agregados propios del informe y nada más; una función que la plataforma no tiene es una función a la que nada llamará.
  • Un enlace escrito antes de esta versión dejó de funcionar. — las expresiones de informe son ahora BS Lang, el mismo lenguaje que en el resto de la plataforma. Casi todo se mantiene sin cambios —rutas de campo, aritmética, comparaciones, ?:, los agregados—, pero conviene volver a abrir una expresión que dependía de algo que el antiguo evaluador permitía por casualidad, porque ahora el editor se lo dirá.

Escenarios relacionados​