entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

mostrar resultado de consulta como calendario

Hola de nuevo yo con duda respecto a Mi pregunta anterior de este mismo problema. Dándole al problema de mil y una forma he conseguido como mostrarlo mi problema ahora es que no me agrupa los del mismo año sino que me muestra las filas diferente

Este es el código que me muestra los resultados

</tr>
<?php
$i=0;
while($fila=pg_fetch_array($consultar)) {
echo "<tr bgcolor='whitesmoke' align='center'>";
$fecha=$fila['fecha'];
        echo "<td bgcolor='DarkRed' style='color:white;'>".$fecha."</td>";
        switch($fecha) {
            case ($fila['mes']==1) : 
                echo "<td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==2) : 
                echo "<td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==3) : 
                echo "<td></td>  <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==4) : 
                echo "<td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==5) : 
                echo "<td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==6) : 
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td> </td> <td></td> <td></td>";
                break;
            case ($fila['mes']==7) : 
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==8) : 
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==9) :  
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td> <td></td>";
                break;
            case ($fila['mes']==10) : 
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td> <td></td>";
                break;
            case ($fila['mes']==11) :  
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td> <td></td>";
                break;
            case ($fila['mes']==12): 
                echo "<td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td bgcolor='Crimson' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td>";
                }
echo "</tr>";
}

?>
</tr>

Y así es como me lo muestra:

enter image description here

Como pueden ver me muestra los años tantas veces se como encuentre una cantidad en un mes, Como podría hacer para agarrar el año y verificar los meses.

carlossevi comentado Sep 14, 2016

¿La pregunta anterior está solucionada y esta es una pregunta relacionada o estás duplicando la pregunta? Si la anterior está solucionada márcala como tal.

doblea_pg comentado Sep 14, 2016

No, no esta solucionada esta es otra visión que le di a la misma pregunta.

1 Respuesta

4votos

Leonardo-Tadei Puntos216110

Hola @doblea_pg,

tu problema está en la lógica del bucle: estás abriendo y cerrando una fila (los TR) en cada iteración, y por eso se genera una fila del mismo año por cada dato.

Lo que tenés que hacer es abrir el primer TR afuera del WHILE, y adentro del WHILE cerrarlo y volverlo a abrir solo cuando cambie el año.

Luego, mientras el año no cambie, podrías poner un acumulador para ir totalizando la cantidad de cursos en el año y mostrarlos al final de cada fila, haciendo ambas tareas en la misma pasada. Mostrarás el valor del acumulador el momento de detectar el cambio de año y volverás el acumulador a cero.

Saludos cordiales!

doblea_pg comentado Sep 15, 2016

Si esa es la lógica pero lo que no he podido hacer es como determinar ese cambio de año, por que si te das cuenta el resultado de mi consulta me toma el mes y la cantidad como una fila nueva y se repite el año es lo mismo que muestro. No se si entiende mi duda y tiene alguna sugerencia de como aplicarlo.

Gracias de antemano.

Leonardo-Tadei comentado Sep 15, 2016

No hay una única forma de hacer esto... yo lo haría usando una variable como bandera (flag) que tenga el año que estás consultando, y al cambiar el año, haría el cierre del TR, la apertura del nuevo y actualizaría el valor del flag.

Es un uso típico de una bandera en el código...

doblea_pg comentado Sep 16, 2016

Hola @Leonardo-Tadei, Gracias con eso pude medio solventar el problema ahora me surge otros inconvenientes, simplifique un poco mi código y quedo asi:

<?php
echo "<tr bgcolor='whitesmoke' align='center' >";
$bandera=2011;
$suma=0;
$total=0;
while($fila=pg_fetch_array($consultar)) 
{
    $fecha=$fila['fecha'];
    $mes=$fila['mes'];

    if($bandera==$fecha) 
    {
        for($i=1; $i<=12; $i++)
        {
            if ($mes==$i)
            {   
                echo "<td bgcolor='IndianRed' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td>"; 
                $suma=$suma+$fila['cantidad'];
                $total=$total+$fila['cantidad'];
            }
        }
    }
    else 
    {
        echo "<td bgcolor='white'>".$suma."</td>";
        $suma=0;
        echo "</tr><tr bgcolor='whitesmoke' align='center'>";
        $bandera=$fila['fecha'];
    }
}
echo "<td bgcolor='white'>".$suma."</td>";

?>

y el resultado me lo muestra asi:

enter image description here

Como haría para posicionar la celda correspondiente a su mes porque me lo muestra todo desde el inicio así, por ejemplo en el único curso vencido que se tuvo en el 2011 es de agosto. Otro problema que surge es que no me esta tomando el primer mes de cada año, en el primer año no tengo problema no se si sea porque solo es un dato que trae, pero los demás años omite el primer mes.No se si entiendes mi problema y tienes algunas sugerencias de como solventarlas.

Si saco el bucle for de mi condición que verifica mi cambio de año los meses se muestran correctamente pero me toma el primer mes del otro año como el ultimo del año anterior, y dentro de esa condición me omite el primer mes. No se si me explico bien.
Es decir asi queda mi tabla sacando mi bucle for de mi condicion:
enter image description here

El dato adicional de los años 2011-2015, en comparacion con la imagen anterior son los que deberian ir en primer lugar en el año siguiente

Leonardo-Tadei comentado Sep 16, 2016

Hola @doblea_pg,

no me doy cuenta para qué sirve el FOR que tenés adentro del WHILE, porque en cada iteración del WHILE estás tratando con solo 1 mes, y no con los 12...

Si no veo mal, bastaría con sacar el FOR y dejar el IF así:

...
            if ($mes==$i)
            {   
                echo "<td bgcolor='IndianRed' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td>"; 
                $suma=$suma+$fila['cantidad'];
                $total=$total+$fila['cantidad'];
            } else {
                // Fila vacía, sin datos
                echo "<td>&nbsp;</td>".
            }
...

Si tu query original generaba la tabla de tu pregunta, con esto se te soluciona el problema.

Saludos cordiales!

PD: el uso de tu bandera funciona solo si las cosas empiezan en 2011, lo cual limita bastante la aplicación de este algoritmo. Podrías inicializar $bandera = 0; y ajustar la lógica para que se saltee el primer cambio.

doblea_pg comentado Sep 19, 2016

Lo que pasa es que si quito el for ya no me muestra nada, no se porque... Y lo de 2011 es solo para prueba porque lo que haría es tomar el año minimo que me da consulta para mi variable $bandera, y el problema sigue porque no me muestra los datos como debería. No se si debería buscarle otro lógica o que estoy haciendo mal.

Leonardo-Tadei comentado Sep 19, 2016

Poné acá abajo tu código entero sin el FOR para ver por qué... si te fijás el código que te pongo, tiene salida tanto para el IF como para el ELSE, así que la tabla tiene que verse siempre, salvo claro que tengas algún error de sintaxis en el código...

doblea_pg comentado Sep 19, 2016

Trato de poner mi codigo y me sale el siguiente error: Unexpected response from server - please try again or switch off Javascript.

Leonardo-Tadei comentado Sep 19, 2016

Sin ver el código es casi imposible saber qué es lo que no te funciona... revisá en los log para ver si no tenés un error con más datos que ese, porque con un "Respuesta inesperada" tampoco podremos hacer mucho...

doblea_pg comentado Sep 19, 2016

$hoy=date("d/m/Y");//fecha actual
$consultar= pg_query("SELECT fecha,cantidad, mes
            FROM ( SELECT to_char(fecha_ven_c,'yyyy') AS fecha, EXTRACT (MONTH FROM fecha_ven_c) AS mes, count(*) AS cantidad FROM curso_pers WHERE fecha_ven_c<'$hoy' GROUP BY fecha, mes ORDER BY fecha, mes) as consulta");

$years="select min(EXTRACT (YEAR FROM fecha_ven_c)) as minimo, MAX(EXTRACT (YEAR FROM fecha_ven_c)) as maximo from curso_pers where fecha_ven_c<'$hoy'";
$year=pg_exec($years);
$resultado=pg_fetch_array($year);
$inicio=$resultado['minimo'];//año inicial del resultado
$fin=$resultado['maximo'];//año final
echo "<tr bgcolor='whitesmoke' align='center' >";
$bandera=$inicio;
$suma=0;
$total=0;
$i=1;
while($fila=pg_fetch_array($consultar)) 
{
    $fecha=$fila['fecha'];
    $mes=$fila['mes'];

    if($bandera==$fecha) 
    {
                echo "<td bgcolor='IndianRed' style='color:white;font-weight: bold;'> ".$fila['cantidad']." </td>"; 
                $suma=$suma+$fila['cantidad'];
                $total=$total+$fila['cantidad'];
    }
    else 
    {
        echo "<td bgcolor='FireBrick' style='color:white; font-weight: bold;'>".$suma."</td>";
        $suma=0;
        echo "</tr><tr bgcolor='whitesmoke' align='center'>";
        $bandera=$fila['fecha'];
    }

}
echo "<td  bgcolor='FireBrick' style='color:white; font-weight: bold;'>".$suma."</td>";

?>

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta