Ver Mensaje Individual
  #5 (permalink)  
Antiguo 21/12/2009, 17:41
Avatar de zacktagnan
zacktagnan
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Respuesta: Listado agrupado por fecha

Pues este es el código que tengo para crear la consulta:

Código PHP:
$querylimit        '';

$q = new DB_Sql_ext;
$q->connect($panel_Database$panel_Host$panel_User$panel_Password);
$q->Debug $panel_Debug;
$q->Halt_On_Error $panel_Halt_On_Error;

// FILTRO

    
if ($diaactual == '') {        // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";

    } else {                    
// Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
    }
//    // Solamente se muestran los registros cuya fecha no haya pasado aún
    
$WhereQuery    .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";

$OrderBy    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';

// contar el total de todos los registros sin limitarlos
$querycount "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if (
$q->query($querycount)) {
    
$q->next_record();
    
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
    
$tot_registros $q->f('contador');
}

// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado     "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado    .= $WhereQuery.$OrderBy.$querylimit." ;";

if (
$q->query($q_listado)) {
    if (
$q->num_rows() >= 1) {
        while (
$q->next_record()) {
            
$id                $q->f('id');
            
$fecha            $q->f('fecha_formateada');
            
$titulo            $q->f('titulo_'.$pref_idioma[$s_lng]);

            
$tablistado[]    = array('id' => $id'fecha' => $fecha'titulo' => $titulo);
        }
    }


Y luego saco un mensaje si no hay resultados, y sino saco los registros:

Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
        <div class="listado_agenda">
          <? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
        </div>
<?
} else {

    for (
$t 0$t count($tablistado); $t++) {
        
$el_enlace_detalle '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext(''$seo_siglas[12], $tablistado[$t]['titulo'], $tablistado[$t]['id']); ?>
        <div class="listado_agenda">
          <div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div><br />
          <div class="titulo_agenda">
            <a href="<? echo $el_enlace_detalle?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>">&nbsp;<? echo $tablistado[$t]['titulo']; ?></a>
          </div>
        </div>
<?
    
// fin for
}
// Mostrando listado de Registros - Final
?>

De primeras, me ha gustado la solución de AndrewFace, pero tal y como tengo montado para mostrar los resultados con <div> me resulta algo complicado plasmarla.
Así que con vuestras sugerencias, se me ha ocurrido hacer una doble consulta:
- primero, una consulta sobre fechas distintas que tengan eventos y las recorro con un primer bucle 'for'.
- segundo, recorriendo el primer 'for', hago la segunda consulta para sacar los datos según la fecha recorrida en el primer for. Y entonces, para los datos hago un segundo 'for'.

Bueno, ya lo he probado y me sale como quería.

Ahora el nuevo código es como sigue:

Código PHP:
$querylimit        '';

$q = new DB_Sql_ext;
$q->connect($panel_Database$panel_Host$panel_User$panel_Password);
$q->Debug $panel_Debug;
$q->Halt_On_Error $panel_Halt_On_Error;

// FILTRO

    
if ($diaactual == '') {        // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";

    } else {                    
// Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
    }
// Solamente se muestran los registros cuya fecha no haya pasado aún
$WhereQuery    .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";

$OrderBy    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';

// contar el total de todos los registros sin limitarlos
$querycount "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if (
$q->query($querycount)) {
    
$q->next_record();
    
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
    
$tot_registros $q->f('contador');
}

// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado     "SELECT DISTINCT DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado    .= $WhereQuery.$OrderBy.$querylimit." ;";

if (
$q->query($q_listado)) {
    if (
$q->num_rows() >= 1) {
        while (
$q->next_record()) {
            
$fecha            $q->f('fecha_formateada');

            
$tablistado[]    = array('fecha' => $fecha);
        }
    }


Ahora, mientras recorro cada fecha resultante, voy consultando los datos de eventos que haya en la misma, y los voy sacando con el segundo 'for':

Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
        <div class="listado_agenda">
          <? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
        </div>
<?
} else {

    for (
$t 0$t count($tablistado); $t++) { ?>
        <div class="listado_agenda">
          <div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div>
<?
        $la_fecha        
explode('/'$tablistado[$t]['fecha']);
        
$la_fecha_dia    $la_fecha[0];
        
$la_fecha_mes    $la_fecha[1];
        
$la_fecha_anio    $la_fecha[2];
        
$q_datos = new DB_Sql_ext;
        
$q_datos->connect($panel_Database$panel_Host$panel_User$panel_Password);
        
$Where_Datos    =  " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$la_fecha_dia."' AND DATE_FORMAT(fecha, '%y') = '".$la_fecha_anio."' AND DATE_FORMAT(fecha, '%m') = '".$la_fecha_mes."' ";
        
$Order_datos    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';
        
$q_limit_datos    '';
        
$q_listado_datos     "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
        
$q_listado_datos    .= $Where_Datos.$Order_datos.$q_limit_datos." ;";

        if (
$q_datos->query($q_listado_datos)) {
            if (
$q_datos->num_rows() >= 1) {
                
// Iniciando array en cada vuelta para que no acumule datos anteriores
                
$tablistadatos = array();
                while (
$q_datos->next_record()) {
                    
$id                $q_datos->f('id');
                    
$fecha            $q_datos->f('fecha_formateada');
                    
$titulo            $q_datos->f('titulo_'.$pref_idioma[$s_lng]);
        
                    
$tablistadatos[]= array('id' => $id'fecha' => $fecha'titulo' => $titulo);
                }
            } else {
                echo 
'no hay datos';
            }
        }

        for (
$z 0$z count($tablistadatos); $z++) {
            
$el_enlace_detalle '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext(''$seo_siglas[12], $tablistadatos[$z]['titulo'], $tablistadatos[$z]['id']);
?>
          <br />
          <div class="titulo_agenda">
            <a href="<? echo $el_enlace_detalle?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>">&nbsp;<? echo $tablistadatos[$z]['titulo']; ?></a>
          </div>
<?
        
// fin for datos
?>
        </div>
<?
    
// fin for
}
// Mostrando listado de Registros - Final
?>

Pues nada, ahí se queda por si alguna vez a otro le hace falta algo parecido.

Gracias por la inspiración que me habéis facilitado. ¡¡¡Feliz año y tal y tal!!!
__________________
Saludos,

zacktagnan.
=================================================