From 0c66db714301639cfb67e6ae0e0abdda186c62fa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 24 Sep 2007 17:50:49 +0000 Subject: [PATCH] Fix: On ne doit pas utilise de fonction week, month, year dans les sql. Peu portables et surtout empeche utilisation d'index. Il vaut mieux calculer les bornes en PHP (temps fixe et negligeable) puis executer la requete avec filtre sur ces bornes. L'index du champ date fonctionne alors evitant le full scan. --- htdocs/projet/activity/index.php | 63 +++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/htdocs/projet/activity/index.php b/htdocs/projet/activity/index.php index f9732044fc7..f03b9af27e8 100644 --- a/htdocs/projet/activity/index.php +++ b/htdocs/projet/activity/index.php @@ -101,14 +101,36 @@ print ""; print ''; +$var=true; + +// Defini les bornes date debut et fin de semaines, mois et annee pour le jour courant +$now=mktime(); +$info=dolibarr_getdate($now); +$daystartw=$now-(($info['wday'] - 1)*24*3600); +$dayendw =$now+((7 - $info['wday'])*24*3600); +$infostartw=dolibarr_getdate($daystartw); +$infoendw =dolibarr_getdate($dayendw); +$datestartw=dolibarr_mktime(0,0,0,$infostarwt["mon"],$infostartw["mday"],$infostartw["year"]); +$dateendw=dolibarr_mktime(23,59,59,$infoendw["mon"],$infoendw["mday"],$infoendw["year"]); +$datestartm=dolibarr_mktime(0,0,0,$info["mon"],1,$info["year"]); +$dateendm=dolibarr_mktime(23,59,59,$info["mon"],30,$info["year"]); +$datestarty=dolibarr_mktime(0,0,0,1,1,$info["year"]); +$dateendy=dolibarr_mktime(23,59,59,12,31,$info["year"]); +//print mktime()." - ".gmmktime().'
'; +//print dolibarr_print_date(mktime(0,0,0,1,1,1970),'dayhour')." - ".dolibarr_print_date(gmmktime(0,0,0,1,1,1970),'dayhour').'
'; +//print dolibarr_print_date($datestartw,'dayhour')." - ".dolibarr_print_date($now,'dayhour')." - ".dolibarr_print_date($dateendw,'dayhour').'
'; +//print dolibarr_print_date($datestartm,'dayhour')." - ".dolibarr_print_date($now,'dayhour')." - ".dolibarr_print_date($dateendm,'dayhour').'
'; +//print dolibarr_print_date($datestarty,'dayhour')." - ".dolibarr_print_date($now,'dayhour')." - ".dolibarr_print_date($dateendy,'dayhour').'
'; + + /* Affichage de la liste des projets du mois */ print ''; print ''; print ''; -print ''; +print ''; print "\n"; -$sql = "SELECT p.title, p.rowid, sum(tt.task_duration)"; +$sql = "SELECT p.title, p.rowid, sum(tt.task_duration) as total"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user"; $sql .= " FROM ".MAIN_DB_PREFIX."projet as p"; $sql .= " , ".MAIN_DB_PREFIX."projet_task as t"; @@ -117,10 +139,10 @@ if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", ".MAIN_DB_PR $sql .= " WHERE t.fk_projet = p.rowid"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; $sql .= " AND tt.fk_task = t.rowid"; -$sql .= " AND week(task_date) = ".strftime("%W",time()); +$sql .= " AND task_date >= '".$db->idate($datestartw)."' AND task_date <= '".$db->idate($dateendw)."'"; $sql .= " GROUP BY p.rowid"; -$var=true; +dolibarr_syslog("Index: sql=".$sql); $resql = $db->query($sql); if ( $resql ) { @@ -129,11 +151,11 @@ if ( $resql ) while ($i < $num) { - $row = $db->fetch_row( $resql); + $obj = $db->fetch_object( $resql); $var=!$var; print ""; - print ''; - print ''; + print ''; + print ''; print "\n"; $i++; } @@ -150,10 +172,10 @@ print "
Activité sur les projets cette semaineTemps'.$langs->trans("Hours").'
'.$row[0].''.$row[2].''.$obj->title.''.$obj->total.'

"; print ''; print ''; print ''; -print ''; +print ''; print "\n"; -$sql = "SELECT p.title, p.rowid, sum(tt.task_duration)"; +$sql = "SELECT p.title, p.rowid, sum(tt.task_duration) as total"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user"; $sql .= " FROM ".MAIN_DB_PREFIX."projet as p"; $sql .= " , ".MAIN_DB_PREFIX."projet_task as t"; @@ -162,7 +184,7 @@ if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", ".MAIN_DB_PR $sql .= " WHERE t.fk_projet = p.rowid"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; $sql .= " AND tt.fk_task = t.rowid"; -$sql .= " AND month(task_date) = ".strftime("%m",$now); +$sql .= " AND task_date >= '".$db->idate($datestartm)."' AND task_date <= '".$db->idate($dateendm)."'"; $sql .= " GROUP BY p.rowid"; $var=true; @@ -174,11 +196,11 @@ if ( $resql ) while ($i < $num) { - $row = $db->fetch_row( $resql); + $obj = $db->fetch_object($resql); $var=!$var; print ""; - print ''; - print ''; + print ''; + print ''; print "\n"; $i++; } @@ -195,10 +217,10 @@ print "
'.$langs->trans("Project").' ce mois : '.strftime("%B %Y", $now).'Nb heures'.$langs->trans("Hours").'
'.$row[0].''.$row[2].''.$obj->title.''.$obj->total.'
"; print '
'; print ''; print ''; -print ''; +print ''; print "\n"; -$sql = "SELECT p.title, p.rowid, sum(tt.task_duration)"; +$sql = "SELECT p.title, p.rowid, sum(tt.task_duration) as total"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user"; $sql .= " FROM ".MAIN_DB_PREFIX."projet as p"; $sql .= " , ".MAIN_DB_PREFIX."projet_task as t"; @@ -207,7 +229,7 @@ if (!$user->rights->commercial->client->voir && !$socid) $sql .= ", ".MAIN_DB_PR $sql .= " WHERE t.fk_projet = p.rowid"; if (!$user->rights->commercial->client->voir && !$socid) $sql .= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; $sql .= " AND tt.fk_task = t.rowid"; -$sql .= " AND YEAR(task_date) = ".strftime("%Y",$now); +$sql .= " AND task_date >= '".$db->idate($datestarty)."' AND task_date <= '".$db->idate($dateendy)."'"; $sql .= " GROUP BY p.rowid"; $var=true; @@ -219,11 +241,11 @@ if ( $resql ) while ($i < $num) { - $row = $db->fetch_row( $resql); + $obj = $db->fetch_object($resql); $var=!$var; print ""; - print ''; - print ''; + print ''; + print ''; print "\n"; $i++; } @@ -239,6 +261,5 @@ print "
'.$langs->trans("Project").' cette année : '.strftime("%Y", $now).'Nb heures'.$langs->trans("Hours").'
'.$row[0].''.$row[2].''.$obj->title.''.$obj->total.'
"; print ''; $db->close(); - -llxFooter("Dernière modification $Date$ révision $Revision$"); +llxFooter('$Date$ - $Revision$'); ?>