Saltar al contenido
Volver a PlantillaERP Centro de ayuda

Listados a medida: columnas calculadas y «suma de otra tabla»

Además de los campos de las tablas, un listado puede llevar columnas que se calculan: el margen, un porcentaje, una diferencia, lo que vale el stock… Y columnas que suman filas de otra tabla, como lo pendiente en recibos de cada cliente.

Columnas calculadas

En el paso 2 · Columnas, debajo de las columnas del listado, pulsa Columna calculada. Se añade al final una columna con su letra; ábrela con Formato, ancho y más y elige la cuenta:

Una columna calculada: Margen % = G (Margen) sobre D (Base imponible)

  1. A: la primera columna de la cuenta.
  2. Cuenta: A + B, A − B, A × B, A ÷ B, A sobre B (%) (A dividido por B, por cien) o Variación de A sobre B (%) (cuánto ha subido o bajado A respecto de B).
  3. B: la segunda columna, o un número fijo (para multiplicar por 1,21, restar una cantidad…).

Las columnas se eligen por su letra y solo valen las que están antes que la calculada; si mueves columnas, las letras cambian solas. Una columna que solo hace falta para la cuenta (el coste unitario, por ejemplo) se marca Oculta (solo para cuentas): entra en el cálculo pero no se ve.

Ejemplo: el margen por familia y artículo

Es el modelo de fábrica Ventas por familia y artículo con margen (tabla: líneas de facturas de clientes):

LetraColumnaQué es
CCantidadcampo de la línea, total Suma
DBase imponibleel neto de la línea, total Suma
ECostecoste unitario de la línea, oculta
FPrecio de costecalculada: C × E
GMargencalculada: D − F
HMargen %calculada: G sobre D (%), total La cuenta con los totales

El resultado: margen y margen % por familia y referencia

El total de un porcentaje: «La cuenta con los totales»

El total de una columna de porcentaje no es la suma de los porcentajes de las filas (ni su media). Para que el subtotal de la familia diga el margen de verdad de la familia, la columna lleva el total La cuenta con los totales: repite la cuenta con los totales del grupo (margen del grupo sobre base del grupo). Úsalo siempre en las columnas de porcentaje y de variación.

Una columna que cuenta solo «cuando…»

El modelo Clientes: facturado en el año y pendiente pone dos veces el total de las facturas: una tal cual (Facturado) y otra que solo cuenta cuando la factura no está pagada (Pendiente). Con las dos, una calculada «Pendiente sobre Facturado (%)».

Lo facturado y lo pendiente de cada cliente, con el % pendiente

Esa condición («cuenta solo cuando la casilla Pagada es no») viene en la plantilla; para tenerla en otro listado, parte de este modelo (ver Plantillas y duplicar) o ponla en el JSON, como en el apartado siguiente.

Columnas «suma de otra tabla»

A veces el dato está en una tabla que apunta a la fila del listado: los recibos pendientes de un cliente, los apuntes de una subcuenta. No es una tabla relacionada (de un cliente salen muchos recibos), así que se usa una columna suma de otra tabla: suma (o cuenta) las filas de esa otra tabla que son de la fila del listado, con sus propios filtros.

Ejemplo: lo pendiente de cada cliente frente a su saldo contable

Dos números que deberían coincidir y que, cuando no lo hacen, hay algo que mirar: lo que dicen los recibos pendientes de cada cliente y el saldo de su subcuenta en la contabilidad.

Clientes en que lo pendiente en recibos no cuadra con el saldo contable

  • Pendiente en recibos: suma del importe de los recibos del cliente que no están pagados.
  • Saldo contable: suma del debe menos el haber de los apuntes de su subcuenta.
  • Diferencia: una calculada A − B.
  • Y la opción «solo las filas en que las dos columnas no coinciden», para ver solo los clientes que no cuadran.

Estas columnas no se crean desde el diseñador: se montan con un JSON y se traen con Importar JSON en la lista de listados. Después, en el diseñador, se les puede cambiar el título, el formato, el orden y los totales como a cualquier otra. Este es el JSON del ejemplo; guárdalo en un fichero .json e impórtalo:

{
  "nombre": "Clientes: recibos pendientes frente al saldo contable",
  "descripcion": "Lo pendiente en recibos de cada cliente contra el saldo de su subcuenta; solo los que no cuadran.",
  "apartado": "contabilidad",
  "definicion": {
    "tabla": "clientes",
    "columnas": [
      { "id": "c1", "origen": "t0", "campo": "codcliente" },
      { "id": "c2", "origen": "t0", "campo": "nombre" },
      { "id": "c3", "origen": "t0", "campo": "codsubcuenta" },
      { "id": "c4", "titulo": "Pendiente en recibos", "formato": "moneda", "total": "suma",
        "agregado": { "tabla": "recibospagoscli", "columna": "codcliente", "origen": "t0", "destino": "codcliente",
          "campo": "importe", "op": "suma", "filtros": [{ "campo": "pagado", "op": "no" }] } },
      { "id": "c5", "titulo": "Saldo contable", "formato": "moneda", "total": "suma",
        "agregado": { "tabla": "partidas", "columna": "idsubcuenta", "origen": "t0", "destino": "codsubcuenta",
          "campo": "debe", "menos": "haber", "op": "suma",
          "via": { "tabla": "subcuentas", "clave": "idsubcuenta", "campo": "codsubcuenta" } } },
      { "id": "c6", "titulo": "Diferencia", "calculo": { "op": "resta", "a": "c4", "b": "c5" }, "formato": "moneda", "total": "suma" }
    ],
    "orden": [{ "col": "c2", "dir": "asc" }],
    "distintas": { "a": "c4", "b": "c5" },
    "totalGeneral": true
  }
}

Cómo se lee la columna agregado:

  • tabla y columna: la otra tabla y su columna que apunta a la fila (los recibos guardan el codcliente).
  • destino: la columna de la fila del listado con la que se compara (el codcliente del cliente).
  • campo (y menos): lo que se suma (importe; o debe menos haber). Con "op": "cuenta" cuenta filas en vez de sumar.
  • filtros: solo las filas de la otra tabla que cumplen eso (los recibos con pagado = no). Valen los mismos operadores y atajos de fecha que en los filtros normales.
  • via: cuando la otra tabla no guarda el dato de la fila sino la clave de una intermedia. Los apuntes guardan la subcuenta por su número interno (idsubcuenta), y el cliente la tiene por su código (codsubcuenta): via dice cómo pasar de una a otra.
  • por (opcional): solo las filas cuyo «padre» cumple unos filtros, por ejemplo los apuntes de los asientos de este año: "por": { "columna": "idasiento", "tabla": "asientos", "destino": "idasiento", "filtros": [{ "campo": "fecha", "op": "entre", "atajo": "este-anio" }] }.

Y distintas (a, b) deja solo las filas en que esas dos columnas no coinciden. La empresa activa se aplica también a la otra tabla. Al importar, el listado queda solo para ti; luego decides con quién compartirlo.

Última actualización: 14 de octubre de 2026

Más artículos de esta categoría