Mon besoin :
Je pars d'une liste d'éléments triés, mais je n'en n'affiche qu'une partie (les visibles) je veux faire monter ou descendre un élément dans la liste sans perdre l'ordre avec ceux non affichés.
Un exemple complet en SQL :
CREATE TABLE dbo.trimoi (
tri int not null,
nom varchar(50) not null,
visible bit not null)
La colonne tri sert a trier la liste, la colonne nom identifie un élément de la liste et la colonne visible simule mon filtre d'affichage des éléments.
Un petit jeu de tests :
INSERT INTO dbo.trimoi (tri, nom, visible)
VALUES (1, 'Trois', 1),
(2, 'second', 0),
(3, 'premier', 1),
(4, 'quatre', 1),
(5, 'cinq', 1)
Les données en liste filtrée donnent :
SELECT * FROM dbo.trimoi WHERE visible = 1 ORDER BY tri
donne :
tri nom visible
1 Trois 1
3 premier 1
4 quatre 1
5 cinq 1
Imaginons que je veuille "monter" l'élément cinq d'un cran. Dans ce cas, il doit passer avant quatre.
Voici la procédure que je propose pour "monter un élément"
DECLARE @nom VARCHAR(50) = 'cinq'
DECLARE @pos INT
SELECT TOP 1 @pos = tri FROM dbo.trimoi WHERE visible = 1
AND tri < (SELECT tri FROM dbo.trimoi WHERE nom = @nom) ORDER BY tri DESC
IF (@pos IS NOT NULL)
BEGIN
UPDATE dbo.trimoi SET tri = tri + 1
FROM dbo.trimoi
WHERE tri >= @pos
AND tri < (SELECT tri FROM dbo.trimoi WHERE nom = @nom)
UPDATE dbo.trimoi SET tri = @pos WHERE nom = @nom
END
L'exécution donne le bon résultat.
Si l'on réitère plusieurs fois l'exécution l'élément cinq monte progressivement, en sautant bien l'élément qui est masqué : second.
Quelques commentaires :
Le premier SELECT permet de trouver et d'affecter à la variable @pos la position finale de l'élément à monter.
On applique dans la requête le filtre qui nous intéresse (ici : visible = 1) ainsi que la recherche de l'élément tri le plus grand en dessous de l'élément 'cinq' (TOP 1 + ORDER BY tri DESC)
Si on a trouvé une position (cas ou cinq est en tête de liste) alors on fait les 2 updates :
1) Ajouter 1 à la colonne tri de tous les éléments entre @pos inclus et la position de l'élément cinq
2) La colonne tri de l'élément cinq prend la position @pos.
Pour être complet voici la procédure qui permet de redescendre 'cinq'
DECLARE @nomDesc VARCHAR(50) = 'cinq'
DECLARE @posDesc INT
SELECT TOP 1 @posDesc = tri FROM dbo.trimoi WHERE visible = 1
AND tri > (SELECT tri FROM dbo.trimoi WHERE nom = @nomDesc) ORDER BY tri ASC
IF (@posDesc IS NOT NULL)
BEGIN
UPDATE dbo.trimoi SET tri = tri - 1
FROM dbo.trimoi
WHERE tri <= @posDesc
AND tri > (SELECT tri FROM dbo.trimoi WHERE nom = @nomDesc)
UPDATE dbo.trimoi SET tri = @posDesc WHERE nom = @nomDesc
END
Enjoy
20 novembre 2013
07 novembre 2013
c# : Formater un booléen en Oui/Non
Pour formater un booléen en Oui/Non
string.Format("{0:Oui;;Non}", Convert.ToInt32(nombool));
ou
$"gna gna gna {Convert.ToInt32(nombool):Oui;;Non}";
N'oubliez pas le Convert en int sinon le résultat affiché ne sera pas le bon !!!!
On utilise ici le format personnalisé des entiers avec deux points virgules :
Premier format pour les entiers positifs : ici on force le Oui
Second format pour les entiers négatifs : ici on ne met rien pour dire de faire comme les entiers positifs
Troisième format pour la valeur zéro : ici on force à Non
Convert.ToInt32(Bool) renvoie 1 ou 0 on gère ainsi tous les cas
string.Format("{0:Oui;;Non}", Convert.ToInt32(nombool));
ou
$"gna gna gna {Convert.ToInt32(nombool):Oui;;Non}";
N'oubliez pas le Convert en int sinon le résultat affiché ne sera pas le bon !!!!
On utilise ici le format personnalisé des entiers avec deux points virgules :
Premier format pour les entiers positifs : ici on force le Oui
Second format pour les entiers négatifs : ici on ne met rien pour dire de faire comme les entiers positifs
Troisième format pour la valeur zéro : ici on force à Non
Convert.ToInt32(Bool) renvoie 1 ou 0 on gère ainsi tous les cas
Inscription à :
Articles (Atom)