16/11/2016, 13:23
|
| | Fecha de Ingreso: junio-2013
Mensajes: 94
Antigüedad: 11 años, 5 meses Puntos: 0 | |
Respuesta: mostrar datos de forma horizontal en excel con php Cita:
Iniciado por VanFoster El problema que planteas lo puedes solucionar con más fácilmente con php y deberás realizar un pre proceso de tu set de datos para dejarlo como lo requieres en el reporte; este detalle es más común de lo que pensamos y no precisamente se debe a que tu diseño de base de datos sea incorrecto, al contrario en tu caso por lo que veo es totalmente correcto y no requieres realizar modificaciones a tu DB; simple y sencillamente los reportes cuanto mas complejos son o cambias la perspectiva desde la que se desea analizar los datos te alejas fácilmente de tu modelo de BD planteado. Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LISTA DE USUARIOS</title>
</head>
<body>
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<?PHP
include('conex.php');
$consul = "select nombre, cedula, conceptos, monto from autos";
$resulE = pg_query($consul);
$columnas=array('nombre','cedula');//Columnas del reporte, agregaremos posteriormente una posición por cada concepto distinto
$reporte=array();//Array Asociativo(Realmente Matriz), cada index es la cedula, estoy suponiendo que no hay mas de una persona con la misma cedula
while($res=pg_fetch_array($resulE)){//Recorremos todo el set de resultados para vaciar los datos en $reporte ya con la estructura que queremos
if(!in_array($columnas))$columnas[]=$res["conceptos"];//Si no existe el concepto en el array de columnas lo agregamos
if(!isset($reporte[$res["cedula"]]))$report[$res["cedula"]]=array(//Inicializamos una posicion del array $report por cada persona
'nombre'=>$res["nombre"],
'cedula'=>$res["cedula"]
);
$persona=&$reporte[$res["cedula"]];//Guardamos referencia, solo para no arrastrar teclas
//Parte central de la solucion del problema, aqui agregamos un indice al array $persona por cada concepto distinto,
// estamos trabajando sobre segundo nivel de array $reporte y $persona tomalo como un alias de $reporte[$res["cedula"]].
// El indice Será la descripcion del concepto.
if(!isset($persona[$res["conceptos"]]))$persona[$res["conceptos"]]=0;
//Sumamos el monto en el indice del concepto.
$persona[$res["conceptos"]]+=$res["monto"];
}
//--------------->Ahora Imprimimos el reporte
//Encabezado de reporte, el colspan depende de las columnas que se hayan detectado
echo '<tr><td colspan="'.($lencol=count($columnas)).'" bgcolor="skyblue"><CENTER><strong>REPORTE </strong></CENTER></td></tr>';
//--------------->Imprimir Titulos de columnas
echo '<tr bgcolor="red">';
for($i=0;$i<$lencol;$i++)echo "<td>{$columnas[$i]}</td>";
echo '</tr>';
//--------------->Imprimir Datos
foreach($reporte as $cedula=>$persona){
echo '<tr>';
for($i=0;$i<$lencol;$i++){
$valor=isset($persona[$columnas[$i]])?$persona[$columnas[$i]]:'';//SI no existe la columna en la persona no se imprime nada
echo "<td>{$valor}</td>";
}
echo '</tr>';
}
/*
Intentaré graficar la estructura que quiero que tenga la variable $reporte por si me equivoque arriba:
$reporte{
'0001'=>{
'nombre'=>'Yo',
'cedula'=>'0001',
'compensaciones '=>100,
'vacaciones'=>500
},
'0002'=>{
'nombre'=>'Tu',
'cedula'=>'0002',
'sueldos y salarios'=>1000,
'vales'=>'300'
}
}
$columnas{
0=>'nombre',
1=>'cedula',
2=>'compensaciones',
3=>'vacaciones',
4=>'sueldos y salarios',
5=>'vales'
}
*/
?>
</table>
</body>
</html> disculpa que tarde tanto en responder es que estaba en otras cosa, pero muchas gracias probare este codigo a ver que tal y despues doy respuesta de como me fue con el |