SVN Alba r5440 - prosistem/alba/trunk/alba/apps/principal/modules/boletin/actions
Author: josx Date: 2008-01-29 13:05:26 -0200 (Tue, 29 Jan 2008) New Revision: 5440 Modified: prosistem/alba/trunk/alba/apps/principal/modules/boletin/actions/actions.class.php Log: Modificacion de consulta que trae la totalizacion de asistencias e inasistencias de un alumno para soportar pg Modified: prosistem/alba/trunk/alba/apps/principal/modules/boletin/actions/actions.class.php =================================================================== --- prosistem/alba/trunk/alba/apps/principal/modules/boletin/actions/actions.class.php 2008-01-28 14:46:59 UTC (rev 5439) +++ prosistem/alba/trunk/alba/apps/principal/modules/boletin/actions/actions.class.php 2008-01-29 15:05:26 UTC (rev 5440) @@ -508,31 +508,40 @@ public function getAsistenciaTotal($alumno_id, $fecha_inicio, $fecha_fin) { $aAsistencia = array(); - - $con = sfContext::getInstance()->getDatabaseConnection($connection='propel'); - // consulta muy fea que supongo que se puede hacer mas elegante y simple - $sql = " -( - SELECT ta.grupo as grupo, 0 as valor, asistencia.id as id - FROM tipoasistencia ta - LEFT JOIN asistencia ON asistencia.fk_tipoasistencia_id = ta.id AND asistencia.fk_alumno_id = %s AND asistencia.fecha >= '%s' AND asistencia.fecha <= '%s' - GROUP BY ta.grupo - HAVING asistencia.id IS NULL - ) - UNION - ( - SELECT ta.grupo as grupo,SUM(ta.valor) as valor, a.id as id - FROM tipoasistencia ta, asistencia a - WHERE a.fk_tipoasistencia_id = ta.id AND a.fk_alumno_id = %s AND a.fecha >= '%s' AND a.fecha <= '%s' - GROUP BY ta.grupo - ) - "; - $stmt = $con->createStatement(); - $aDatos = $stmt->executeQuery(sprintf($sql,$alumno_id, $fecha_inicio, $fecha_fin, $alumno_id, $fecha_inicio, $fecha_fin), ResultSet::FETCHMODE_ASSOC); - foreach($aDatos as $dato) { - $aAsistencia[$dato['grupo']] = $dato['valor']; + + // En teoria esta dos consultas pueden reemplazarse con una solo usando LEFT JOIN y CASE + + $c = new Criteria(); + $c->addGroupByColumn(TipoasistenciaPeer::GRUPO); + $c->addSelectColumn(TipoasistenciaPeer::GRUPO); + $rsColumna = TipoasistenciaPeer::doSelectRS($c); + + $c = new Criteria(); + $c->clearSelectColumns(); + $c->addGroupByColumn(TipoasistenciaPeer::GRUPO); + $c->addSelectColumn(TipoasistenciaPeer::GRUPO); + $c->addSelectColumn('SUM('.TipoasistenciaPeer::VALOR.') AS valor'); + $c->addJoin(TipoasistenciaPeer::ID, AsistenciaPeer::FK_TIPOASISTENCIA_ID); + $c->add(AsistenciaPeer::FK_ALUMNO_ID, $alumno_id, Criteria::EQUAL); + $c2 = new Criteria(); + $criterion = $c2->getNewCriterion(AsistenciaPeer::FECHA, $fecha_inicio, Criteria::GREATER_EQUAL); + $criterion->addAnd($c2->getNewCriterion(AsistenciaPeer::FECHA, $fecha_fin, Criteria::LESS_EQUAL)); + $c->add($criterion); + $rsValor = TipoasistenciaPeer::doSelectRS($c); + + if($rsColumna) { + while($rsColumna->next()) { + $aAsistencia[$rsColumna->getString(1)] = 0; // indice: nombre del Grupo, contenido: + } } + if($rsValor) { + while($rsValor->next()) { + // indice: nombre del Grupo, contenido: sumatoria de valor + $aAsistencia[$rsValor->getString(1)] = $rsValor->getFloat(2); + } + } + return $aAsistencia; }
participants (1)
-
commits@pressenter.com.ar