Hola, ahora no estoy en el trabajo que es donde tengo montado todo, pero te dejo las funciones, tanto la del càlculo de horas como la que tengo para crear el arreglo encabezado:
calcularHoras (query de la bd, aquí hago el filtro de los datos, para éste caso sòlo mostrarè sòlo una parte)
Código PHP:
function calcularHoras($tipo_grafico, $dis_select, $ofic_select, $fechaInicio, $fechaFinal, $rango){
$horasP = array();
$horasA = array();
$link = conectarBD ();
$anualInicioAux = $rango[0];
$mesActual = $rango[1];
$anualFinalAux = $rango[2];
$mesFinalAux = $rango[3];
/**
* Verifica si se eligió la opción de disciplina 'Cualquiera' en
* la lista correspondiente del formulario, en cuyo caso no se toma filtro por
* disciplina
*/
if($dis_select == 'Todas'){
$consultDisc = " AND 1=1";
}else{
/**
* Si se incluyó, se realiza la consulta por dicha disciplina
*/
$consultDisc = " AND E.Nombre_Disciplina = '" . $dis_select. "' ";
}
/**
* Verifica si se elegió la opción de la oficina 'Cualquiera' en
* la lista correspondiente del formulario, en cuyo caso no se toma filtro
* por oficina
*/
if($ofic_select == 'Todas'){
$consultOfic = " AND 1=1";
}else{
/**
* Si se incluyó, se realiza la consulta por dicha disciplina
*/
$consultOfic = " AND E.Codigo_Oficina = '" . $ofic_select . "' ";
}
/**
* Cosulta para cuando el Tipo de Gráfico elegido es General
* el cual incluye los Proyectos y las Actividades
*/
if($tipo_grafico == 'G'){
$queryP = "SELECT Ano_Semana, Mes_Semana, SUM(P.Cantidad_Horas) AS Horas
FROM SPO2_Participa P, SPO2_Empleado E, SPO2_Evento EV
WHERE P.Codigo_Empleado = E.Codigo
AND P.Codigo_Evento = EV.Codigo"
. $consultDisc . $consultOfic ."
AND EV.Tipo = 'P'
AND (
(P.Ano_Semana > '" . $anualInicioAux . "' )
OR ((P.Ano_Semana = '" . $anualInicioAux . "') AND (P.Mes_Semana >= '" . $mesActual . "'))
)
AND (
(P.Ano_Semana < '" . $anualFinalAux . "' )
OR ((P.Ano_Semana = '" . $anualFinalAux . "') AND (P.Mes_Semana <= '" . $mesFinalAux ."'))
)
GROUP BY Ano_Semana, Mes_Semana
ORDER BY Ano_Semana, Mes_Semana";
$resultP = odbc_exec($link, $queryP)
or die("Fallo en la ejecución de la consulta sobre la Base de
Datos. Favor Notificar a Soporte Tecnico: " . odbc_errormsg());
$numero_filasP = odbc_num_rows ( $resultP );
for ($i = 1; $i <= $numero_filasP; $i++) {
$rowP = odbc_fetch_array($resultP);
$horasP[$i] = $rowP;
}
$queryA = "SELECT Ano_Semana, Mes_Semana, SUM(P.Cantidad_Horas) AS Horas
FROM SPO2_Participa P, SPO2_Empleado E, SPO2_Evento EV
WHERE P.Codigo_Empleado = E.Codigo
AND P.Codigo_Evento = EV.Codigo"
. $consultDisc . $consultOfic ."
AND EV.Tipo = 'A'
AND (
(P.Ano_Semana > '" . $anualInicioAux . "' )
OR ((P.Ano_Semana = '" . $anualInicioAux . "') AND (P.Mes_Semana >= '" . $mesActual . "'))
)
AND (
(P.Ano_Semana < '" . $anualFinalAux . "' )
OR ((P.Ano_Semana = '" . $anualFinalAux . "') AND (P.Mes_Semana <= '" . $mesFinalAux ."'))
)
GROUP BY Ano_Semana, Mes_Semana
ORDER BY Ano_Semana, Mes_Semana";
$resultA = odbc_exec($link, $queryA)
or die("Fallo en la ejecución de la consulta sobre la Base de
Datos. Favor Notificar a Soporte Tecnico: " . odbc_errormsg());
$numero_filasA = odbc_num_rows ( $resultA );
for ($i = 1; $i <= $numero_filasA; $i++) {
$rowA = odbc_fetch_array($resultA);
$horasA[$i] = $rowA;
}
/**
* Cierra la conexión abierta con la BD
*/
desconectarBD_Pronostico($link);
return array($horasP, $horasA);
}
}
obtenerEncabezadosGrafico (que es lo que utilizo cómo base para formar un arreglo que contiene todos los meses contenidos dentro de la fecha escogida y así formar el eje x del grafico, es decir, los meses)
Código PHP:
/**
* Función: obtenerEncabezadosGrafico
*
* @param string $desde
* @param string $hasta
* @return array $anualInicioAux|$mesActual|$anualFinalAux|$mesFinalAux
*
* Descripción: Devuelve los meses y el año, dado un rango de fechas para
* utilizarlo en la visualización de los gráficos.
*/
function obtenerEncabezadosGrafico($desde, $hasta){
$encabezados = array();
$i = 1;
/**
* Conversión de las fechas al formato Mes/Día/Año
* @example: $fecha= '02/08/2011'
* $fechaAux= '08/02/2011'
*/
$desdeAux = convertirFecha_MDA($desde);
$hastaAux = convertirFecha_MDA($hasta);
/**
* Tratamiento para la obtención de la Semana, Mes y Año de la fecha de inicio
*/
$semanaInicial = obtenerNumSemana($desdeAux);
$mesInicial = obtenerNumMes($desdeAux);
$anualInicio = obtenerNumeroAnual($desdeAux);
if($semanaInicial == 1 && $mesInicial == 12)
$anualInicioAux = $anualInicio + 1;
else if(($semanaInicial == 52 || $semanaInicial == 53) && $mesInicial == 1)
$anualInicioAux = $anualInicio - 1;
else
$anualInicioAux = $anualInicio;
$mesActual = obtenerNumMesDeSemana($semanaInicial, $anualInicioAux);
/**
* Tratamiento para la obtención de la Semana, Mes y Año de la fecha de final
*/
$semanaFinal = obtenerNumSemana($hastaAux);
$mesFinal = obtenerNumMes($hastaAux);
$anualFinal = obtenerNumeroAnual($hastaAux);
if($semanaFinal == 1 && $mesFinal == 12)
$anualFinalAux = $anualFinal + 1;
else if($semanaFinal == 52 && $mesFinal == 1)
$anualFinalAux = $anualFinal - 1;
else
$anualFinalAux = $anualFinal;
$mesFinalAux = obtenerNumMesDeSemana($semanaFinal, $anualFinalAux);
/**
* Se registra en la primera posición del arreglo, el Mes y Año de la fecha inicial
*/
$encabezados[$i] = array($mesActual, $anualInicioAux);
$mesActual++;
$i++;
if($semanaInicial == 52)
$semanaActual = 1;
else
$semanaActual = $semanaInicial + 1;
$anualActual = $anualInicioAux;
/**
* Recorrido para obtener el Mes y Año de los valores que se encuentran dentro
* de la fecha inicial y fecha final
*/
while($anualActual <= $anualFinalAux){
if($anualActual == $anualFinalAux){
while($mesActual < $mesFinalAux){
$encabezados[$i] = array($mesActual, $anualActual);
$i++;
$mesActual++;
}
/**
* Condicional para cuando el Mes y Año sean iguales a la fecha final, es decir,
* se haya llegado al tope del rango, dado por la fecha final
*/
if($mesActual == $mesFinalAux){
$encabezados[$i] = array($mesFinalAux, $anualFinal);
$i++;
}
} else {
while($mesActual <= 12){
$encabezados[$i] = array($mesActual, $anualActual);
$i++;
$mesActual++;
}
}
$mesActual=1;
$anualActual++;
}
return $encabezados;
}
Además lo que me arroja la BD es la siguiente:
Ano_Semana/Mes_Semana/Numero_Semana/Horas
2020 1 2 40
2020 1 3 40
2020 1 4 40
2020 1 5 40
2020 1 6 40
2020 1 7 40
2020 1 8 40
2020 1 9 40
2020 3 10 40
2020 3 11 8
2020 8 32 32
2020 8 33 40
2020 8 34 40
2020 8 35 40
2020 9 36 40
2020 9 37 40
2020 9 38 40
2020 9 39 40
2020 10 40 40
2020 10 41 40
2020 10 42 40
2020 10 43 40
2020 10 44 40
Mañana estaré colocando el contenido de los arreglos
Saludos vgonga1986!