From 70d3be6a0ce0745f8e5c9f9f3d6f918cad6ef1e5 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Fri, 2 Jul 2021 15:50:31 +0200 Subject: [PATCH] Desormais `{par num xxx}` integre automatiquement un `{par sinum xxx}` avant, ce qui permet de classer les lignes sans rang a la fin par defaut. La combinaison `{!par sinum xxx}{par num xxx}` permet de retrouver le classement historique avec les lignes sans rang en premier (On integre un peu d'intelligence sur le critere sinum pour eviter de dupliquer l'expression CASE(...) dans ce dernier cas) + fix sur sql genere par le sinum qui bizarrement ne l'empechait pas de marcher --- ecrire/public/criteres.php | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 71f6d154d3..94086a9d12 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -890,9 +890,13 @@ function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $cham if ($suite !== "''") { $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \""; } - $as = 'num' . ($boucle->order ? count($boucle->order) : ""); - $boucle->select[] = $texte . " AS $as"; - $order = "'$as'"; + $asnum = 'num' . ($boucle->order ? count($boucle->order) : ""); + $boucle->select[] = $texte . " AS $asnum"; + + $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ); + $orderassinum = trim($orderassinum, "'"); + + $order = "'$orderassinum, $asnum'"; return $order; } @@ -924,8 +928,23 @@ function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $ch if ($suite !== "''") { $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \""; } - $as = 'sinum' . ($boucle->order ? count($boucle->order) : ""); - $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as; + + $as = false; + $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS "; + foreach ($boucle->select as $s) { + if (strpos($s, $select) === 0) { + $as = trim(substr($s, strlen($select))); + if (!preg_match(",\W,", $as)) { + break; + } + $as = false; + } + } + + if (!$as) { + $as = 'sinum' . ($boucle->order ? count($boucle->order) : ""); + $boucle->select[] = $select . $as; + } $order = "'$as'"; return $order; } -- GitLab