Expresiones del ERP — Guía rápida de usuario
Referencia práctica del lenguaje de expresiones (reports, columnas calculadas, condiciones). Para la especificación completa: GRAMATICA.md.
Lo básico
| Quiero... | Escribo | Resultado |
|---|---|---|
| Un campo de la fila | [Importe] · [Total Línea] | su valor |
| Un total precalculado | AGG(baseImponible) | su valor |
| Aritmética | [Cantidad] * [Precio] * 1.21 | número |
| Texto | "Cliente: " + [Nombre] | texto |
| Una condición | [Importe] > 1000 ? "VIP" : "normal" | una de las dos ramas |
| La misma, en estilo Python | "VIP" if [Importe] > 1000 else "normal" | idéntico |
| Valor por defecto si está vacío | [Descuento] ?? 0 | el primero no vacío |
| Una fecha fija | #2026-06-10# · #2026-06-10 14:30# | fecha |
- Los números siempre con punto decimal:
1.21(la coma no vale al escribir la expresión; - Mayúsculas y minúsculas dan igual en nombres:
[importe],Upper(...),UPPER(...). - Comparar es con
==(escribir=da error y te lo recuerda). También:!=o<>,<,<=,>,>=. - Condiciones:
&&/||/!o, si lo prefieres,and/or/not. - Si vienes de Python:
valor if condición else otroyNone(=null) también valen.
Vacíos (null): se comporta como la base de datos
- Cualquier operación con un vacío da vacío:
[Descuento] + 5→ vacío si no hay descuento. - Preguntar si está vacío:
[Fecha2] == null(esto sí da verdadero/falso). - Una condición vacía cuenta como falsa:
IIf([X] > 5, "a", "b")da"b"si X está vacío. Concat("a", [Nulo], "b")ignora los vacíos →"ab"(el+no: daría vacío).
Funciones más usadas
| Función | Ejemplo | Da |
|---|---|---|
Round(x, decimales) | Round([Importe] * 1.21, 2) | 121.00 |
Abs · Floor · Ceiling | Ceiling(2.1) | 3 |
Min(a, b) · Max(a, b) | Max([Stock], 0) | |
Upper · Lower · Trim | Upper([Nombre]) | "ACME" |
Len(s) | Len([NIF]) | 9 |
Substring(s, inicio, largo) | Substring([NIF], 1, 1) (¡desde 1!) | primera letra |
Replace · PadLeft · PadRight | PadLeft([Num], 6, "0") | "000043" |
Contains · StartsWith · EndsWith | StartsWith([CP], "28") | true/false |
Today() · Now() | constantes durante todo el report | |
Year · Month · Day | Year([Fecha]) | 2026 |
AddDays · AddMonths · AddYears | AddDays([Fecha], 30) (vencimiento) | fecha |
DateDiffDays(inicio, fin) | DateDiffDays([Fecha], Today()) (edad de la deuda) | días |
IIf(cond, siSí, siNo) | IIf([Cantidad] > 0, [Importe]/[Cantidad], 0) | solo evalúa la rama elegida |
Coalesce(a, b, ...) / IsNull(a, b) | Coalesce([Tarifa2], [Tarifa1], 0) | primer no-vacío |
Format(valor, "formato") | Format([Importe], "N2") · Format([Fecha], "dd/MM/yyyy") | texto ya formateado (español) |
ToDecimal · ToString · ToDate | ToDecimal([CodigoTexto]) | conversión explícita |
Errores que te avisan
Campo desconocido: [Cantida]. ¿Quiso decir Cantidad?— error de escritura en un nombre.'=' no es un operador de comparación. Para comparar use '=='.Sin acceso al área Costes— la expresión usa datos que tu perfil no puede ver.División por cero— protégete conIIf([Divisor] != 0, [X]/[Divisor], 0).
Scripts (avanzado: automatizaciones y plugins)
Donde el sistema lo permita (no en reports), una secuencia de sentencias acabadas en ;:
var total = 0;
foreach (var x in Lineas)
{
if (x > 10) { total = total + x; }
}
return total;
- Variables propias con
var; los datos del entorno son de solo lectura. if/else,while,foreach (var x in Lista),return valor;.- Los bucles tienen un límite de pasos: un bucle infinito se corta solo con error claro.
- Comentarios:
// líneay/* bloque */(también valen en expresiones).