Guía 16 – Totales en Grupo en páginas LIST

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.

Adjuntos

Archivo Tamaño de archivo Descargas
zip Proyecto en PHPRunner 10.2 y backup de base de datos. 37 KB 454

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner