Guía 37 – En exportación de datos, eliminar columnas sin contenido

Entre las muchas consultas de soporte que tengo y que intento buscar solución, me llegó esta de querer eliminar las columnas en la exportación, de aquellos campos que entre los registros seleccionados no haya ninguna información, es decir, que todos sus valores sean nulos.

La necesidad le surgió porque en el diseño de su modelo de datos se definen muchos campos y hay ocasiones donde muchos de ellos están vacíos.

Objetivo

En la exportación de los datos de una entidad, eliminarla información de los campos si todos los valores, de esos campos en los registros seleccionados tienen el valor nulo.

DEMO: https://fhumanes.com/export

Solución Técnica

He dividido la solución en 2 partes:

  1. Identificar qué campos, en todos sus contenidos sólo tienen el valor nulo.
    Lo que hago es aplicar la función de SQL “max()“. Si el resultado es nulo, es que todos sus valores son nulo.
  2. Una vez identificado los campos, eliminarlos de la exportación.
    He buscado en documentación y en el código generado, dónde podría intervenir para excluir los campos que en el paso anterior había identificado.

El código resultante sólo están en el evento “Before SQL query“:

// Obtener la columnas que todos sus valores son nulos
$sql = "SELECT max(campo1) campo1, max(campo2) campo2, max(campo3) campo3, max(campo4) campo4 FROM export";
if ( $strWhereClause <> '' ) {
    $sql .= " where ";
    $sql .= $strWhereClause;
}

$rs = DB::Query($sql);
$data = $rs->fetchAssoc();
$_SESSION["Exclusion"] = [];
$array_key = array_keys($data);
foreach ($array_key as &$valor) {
  if ( $data[$valor] == NULL ){
    $_SESSION["Exclusion"][] = $valor;
  }
}
// En variable de sesión "Exclusion", están las columnas que todos sus valores son nullos


// Eliminación columnas que todos sus valores son nulos de los campos a exportar
$length = count($pageObject->selectedFields);
for ($valor1 = 0; $valor1 < $length; $valor1++) {
  foreach ($_SESSION["Exclusion"] as &$valor2) {
    if ( $pageObject->selectedFields[$valor1] == $valor2 ) {
      unset($pageObject->selectedFields[$valor1]);
    }
  }
}

Quizá este ejemplo pueda ser de poca utilidad, pero es importante conocer la información de la variable “selectFields” del objeto “pageObject”, que parece ser común a todas las acciones/páginas de PHPRunner y que dispone de la relación de columnas que van a ser mostradas en el resultado de la salida.

Como siempre, cualquier duda comunicármela en mi email [email protected] y os dejo el proyecto por si deseáis hacer pruebas en vuestros Pc’s.

Adjuntos

Archivo Tamaño de archivo Descargas
zip PHPRunner 10.7 y backup de BD 34 KB 107

Blog personal para facilitar soporte gratuito a usuarios de PHPRunner