Me consultaron cómo hacer totalizaciones por grupos, en las páginas LIST y me facilitaron enlaces de cómo hacerlo en versiones de PHPRunner, 6, 7 y 8. No fuimos capaces de encontrar referencias del mismo tema en versiones 10 de PHPRunner.
Estuve dando vueltas, sin querer modificar la plantilla de la pagina (como se hacía en versiones anteriores) y al final he encontrado una solución muy fácil, basada en obtener las totalizaciones y el registro donde hay que ponerla en SQL.
Objetivo
Producir totalizaciones de columna cuando se cambie de grupo en una página LIST
Solución técnica
DEMO: https://fhumanes.com/ruptura
Tiene algunas limitaciones, por ejemplo, que no se puede dejar que el usuario ordene las columnas, ya que requiere que vengan ordenadas de una forma especial.
El «secreto» es que los datos al ejecutar el SQL ya tenga calculado el total y la línea en donde hay que imprimir el total.
En este ejemplo, los datos se obtienen:
- Los datos del registro.
SELECT linea_factura.idlinea_factura, linea_factura.factura_idfactura, linea_factura.producto_idproducto, linea_factura.Nombre, linea_factura.Precio, linea_factura.Cantidad, linea_factura.Valor FROM linea_factura
- Para obtener el total se ejecuta este Select.
SELECT factura_idfactura factura_idfactura_t1, sum(Valor) Total FROM linea_factura group by factura_idfactura
- Para saber en qué línea hay que «imprimir» el total.
SELECT factura_idfactura factura_idfactura_t2, max(idlinea_factura) idlinea_factura_t2 FROM linea_factura group by factura_idfactura
Así, uniendo todo, este es el query resultante:
SELECT linea_factura.idlinea_factura, linea_factura.factura_idfactura, linea_factura.producto_idproducto, linea_factura.Nombre, linea_factura.Precio, linea_factura.Cantidad, linea_factura.Valor, T1.Total, T2.idlinea_factura_t2 FROM linea_factura join (SELECT factura_idfactura factura_idfactura_t1, sum(Valor) Total FROM linea_factura group by factura_idfactura) T1 on ( T1.factura_idfactura_t1 = linea_factura.factura_idfactura) left join (SELECT factura_idfactura factura_idfactura_t2, max(idlinea_factura) idlinea_factura_t2 FROM linea_factura group by factura_idfactura) T2 on ( T2.factura_idfactura_t2 = linea_factura.factura_idfactura and T2.idlinea_factura_t2 = linea_factura.idlinea_factura) Order by linea_factura.factura_idfactura, linea_factura.idlinea_factura
En la columna de idfactura ponemos el check de grupo para que no se repita el valor de la columna.
En la columna de valor ponemos el campo de valor y el del total. Para que queden uno encima de otro incluimos este valor en el campo Custom CSS de cada uno de ellos.
:host { display: block; }
Ya nos queda lo último y es indicar al campo Total cuándo y cómo se debe imprimir. Utilizamos una visualización Custom e incluimos este código.
if ( $data['idlinea_factura_t2'] == NULL){ $value = NULL; } else { $a = new \NumberFormatter("es-ES", \NumberFormatter::DECIMAL); $a->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 2); $a->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2); // by default some locales got max 2 fraction digits $value ='<strong>Total: </strong>'.$a->format($value); }
Lo que hace es:
- Se evalúa si es la línea en donde hay que imprimir el total
- Si es así, se prepara el sistema para imprimir los valores numéricos y se imprime anteponiendo el literal Total: .
Y así de fácil ha quedado.
Para cualquier duda o problema, poneros en contacto a través de email [email protected].
Os dejo el ejemplo para que lo podáis probar en vuestros PC’s.