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

Calendarizar consulta php, sql

Hola tengo una duda, hay la posibilidad de hacer un pequeño calendario para mostrar la cantidad de unos cursos agrupado por el mes de vencimiento y año. Esta es mi consulta

SELECT año,cantidad, mes
      FROM ( SELECT to_char(fecha_ven_c,'yyyy') AS año, EXTRACT (MONTH FROM fecha_ven_c) AS mes, count(*) AS cantidad 
      FROM curso_mar 
      WHERE fecha_ven_c<'24/01/2017'
      GROUP BY año, mes
      ORDER BY año) as consulta

y este es el resultado que obtengo de ella:
enter image description here

Lo que me gustaria ver es como tomar ese resultado y colocarlo asi:

enter image description here

No se si es factible o es mucho lo que pido; pude lograr hacer uno general sin años y asi quedo:

enter image description here

1 Respuesta

4votos

cobasESP Puntos19520

Sabiendo el año y el mes, solo necesitas una función que te cree un calendario, yo usé esta para una herramienta mia de citas previas por internet.

<?php
# Obtenemos el dia de la semana del primer dia
# Devuelve 0 para domingo, 6 para sabado
$diaSemana=date("w",mktime(0,0,0,$month,1,$year))+7;
# Obtenemos el ultimo dia del mes
$ultimoDiaMes=date("d",(mktime(0,0,0,$month+1,1,$year)-1));

$meses=array(1=>"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");

$last_cell=$diaSemana+$ultimoDiaMes;
        // hacemos un bucle hasta 42, que es el máximo de valores que puede
        // haber... 6 filas de 7 dias(columnas)
        for($i=8;$i<=42;$i++){
            if($i==$diaSemana)
            {
                // determinamos en que dia empieza
                $day=1;
            }
            if($i<$diaSemana || $i>=$last_cell)
            {
                // celca vacia
                echo "<td> </td>";
            }else{
                // mostramos el dia
                if(comprobarDia($day, $month, $year) >= 1){
                    echo "<td class='hoy'>$day</td>";
                }else{
                    echo "<td>$day</td>";
                }
                //if($day==$diaActual)  
                $day++;
            }
            // cuando llega al final de la semana, iniciamos una columna nueva
            if($i%7==0)
            {
                echo "</tr><tr>\n";
            }
        }//Fin bucle for para crear el calendario
    ?>

Almaceno las variables de los días, meses, etc, y con la función de abajo voy creando la tabla, esa función la tienes que meter en un <tr> de la tabla que tu quieras, solo monta la tabla como lo necesites y en un <tr> metes la funcion de arriba.

Cambia la función para que cuando llegue a un mes/año en el que tienes un dato, te coloree esa celda y puedas añadir un botón o un enlace, si no, lo dejas en blanco y listo.

Y este es el css que use para el calendario, por si quieres retocarlo para amoldarlo a tu web:

#calendar {
            font-family:Arial;
            font-size:20px;
            margin-left: 30%;
        }
        #calendar caption {
            text-align:left;
            padding:5px 10px;
            background-color:#003366;
            color:#fff;
            /*font-weight:bold;*/
        }
        #calendar th {
            background-color:#006699;
            color:#fff;
            width:70px;
            font-weight: normal;
            padding-left: 8px;
        }
        #calendar td {
            border: 3px solid #FFFFFF;
            text-align:right;
            padding:20px 5px;
            background-color:#EBEBEB;
        }
        #calendar tr{
            border: 3px solid #FFFFFF;
        }
        #calendar tr.head{
            border: 0px;
        }
        #calendar td:hover{
            background-color:#D5D4D4;
        }
        #calendar td.hoy:hover{
            background-color:red;
        }
        #calendar .hoy {
            color: #000000;
            background-color:red;
        }

Espero que te sirva, saludos :)

doblea_pg comentado Sep 14, 2016

Estuve intentando de mil maneras como adaptar tu función a mi problema y la verdad no supe como hacerlo, lo que yo quiero mostrar son los meses, los años y la cantidad de cursos vencidos que hay en ese mes cada por cada año. Ya tengo la consulta que me trae los datos que quiero el problema que tengo es como mostrarlo en una tabla. ¿Alguna otra sugerencia?

cobasESP comentado Sep 23, 2016

pues es más fácil que todo eso, solo tienes que trar los datos ordenados por año y mes, de modo que con un solo bucle while detectes el cambio de año y de mes.
En cada mes pintas un reacuadro con los viajes, al siguiente mes, otro cuadro, cuando cambie de año, al estar ordenados sabrás que has terminado con 2011 y empezarás con 2012 por enero, y asi hasta terminar la tabla.

El calendario lo diseñas como quieras en css y listo. Es mas sencillo que mi función.

doblea_pg comentado Sep 26, 2016

Si pero ahora el problema es el posicionamiento de los datos de cada mes, no he encontrado como resolverlo. Aquí lo que he podido lograr hasta ahora:
Pregunta Relacionada

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