Cas d'école : comment décaler un numéro d'ordre dans une table PRODUITS par exem

Signaler
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012
-
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012
-
bonjour,
je suis sûr qu'on doit trouver un script déjà écrit pour changer un ordre dans une base. Mon souci est bête : changer l'ordre d'apparition des produits d'un catalogue. Par exemple j'ai 10 produits numérotés de 1 à 10. Mais je veux changer l'ordre d'apparition, par exemple passer le produit 3 en position 7. Du coup tout se décale de 1 vers le bas, entre 4 et 7 ( 4 devient 3 , 5 dvient 4 , 6 devient 5 , 7 devient 6 et la place est libre en 7 qui va contenir l'ancien 3)
vous voyez le topo ?
j'avais ça, mais le souci c'est que dès la 1ere itération, on a 3 positions identiques quand on a remplacé la première ... bref je suis perdu :


$ordre1=$_POST['ancienordre']; // 3
$ordre2=$_POST['ordre']; // 7
if ($ordre2 > $ordre1) // oui
{
$iterations=$ordre2 - $ordre1; // 7-3 = 4
for ($i=0; $i<=$iterations; $i++) // de 0 à 4
{
$sql="select ProductID from produits where ordre = $ordre1+$i and famille = ".$_POST['famille'];
$result = Executer($sql);
$ligne = mysql_fetch_array($result)
$sql="update produits set ordre = $ordre1+1+$i where ProductID = ".$ligne['ProductID'];
$result = Executer($sql);
$i++;
}
}

merci pour votre aide

17 réponses

Messages postés
14813
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
25 juillet 2021
156
Bonjour,

Regardes plutôt la clause ORDER BY de SQL.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

merci, mais ce n'est pas ça.
dans une base, on a 10 enregistrements de 0 à 9 , qui contiennent chacun un chiffre, DNAS LE DESORDRE
0 - 3
1 - 7
2 - 5
etc ...
je veux mettre le 3 de l'enregistrement 0 à la place du 5 dans l'enregistrement 2, et ça décale vers le bas, ce qui doit donner :

0 - 7
1 - 5
2 - 3

comment faire ?
merci
michel
Messages postés
14813
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
25 juillet 2021
156
Bonjour,

Tu fais un SELECT ... ORDER BY ... DESC
Puis, dans la boucle, tu fais ton UPDATE pour chaque ligne.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

bonjour henry, il y a peut être quelquechose effectivement dans ta réponse, mais je ne vois pas ...
je complique mon exemple :
le produit 7 a l'ordre 1
le produit 9 a l'ordre 2
le produit 20 a l'ordre 3
le produit 50 a l'ordre 4
le produit 40 a l'ordre 5
le produit 18 à l'ordre 6

j'aimerais que le produit 40 n'apparaisse plus en 5 ème position, mais en 2 ème, en décalant les produits intermédiaires de 1 vers le haut.
réultat attendu :

le produit 7 a l'ordre 1
le produit 40 a l'ordre 2
le produit 9 a l'ordre 3
le produit 20 a l'ordre 4
le produit 50 a l'ordre 5
le produit 18 a l'ordre 6

comment je fais CONCRETEMENT avec un select order by asc (je suppose ici, non pas desc ) , puis update ?
MERCI !
michel
Messages postés
14813
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
25 juillet 2021
156
Bonjour,

D'accord, je comprend mieux :
Il faut faire quelques requêtes :
- Mettre l'élément à déplacer en ordre=0
- Faire un SELECT ... WHERE Ordre>= "Ordre de destination de l'item" ORDER BY .. ASC
- Faire un Update avec une boucle et un compteur pour décaler les items sélectionnés
- Mettre la bonne valeur à l'item déplacé.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

je n'y arrive pas, j'aimerais bien le code complet du select et de la boucle update.
c'est possible ?
merci


michel
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
Bonjour,

As-tu essayé avec un case ?

Select case when product="produit 7" then 1
            when product="produit 40" then 2
            when product="produit 8" then 3
etc..
       end as tonOrdre
From ta_table
Order By tonOrdre



-------------------
Oderint dum metuant
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

merci pmcoste, mais je ne pense pas qeu ce soit si facile ( mais je me trompe peut être ) . Je ne donne que des exemples, mais il faut que ça marche tout le temps dans toutes les configs.
je repose le problème :

j'ai une pile de 1000 assiettes, numérotées de 1 à 1000 . je veux passer l'assiette 511 en 22, ou bien déplacer la 58 en 759 etc ... N'IMPORTE QUELLES PLACES à l'intérieur de la pile. On comprend bien que l'élément déplacé va bouger toute la pile entre les 2 positions, l'ancienne et la nouvelle. SI on déplace une assiette du bas VERS LE HAUT, alors toutes les assiettes intermédiares descendent de 1, et inversement, si on déplace une assiette du haut VERS LE BAS, alors toutes les assiettes intermédiaires montent de 1.


je vous donne un exemple de page : http://www.oxygenes.com/poeles-sauteuses.php
EXEMPLE SIMPLE : comment je fais pour passer le produit ordre 1 "ensemble de 5 poeles" à l'ordre 3 " ensemble de cuisson paella " ? ( ce qui aura pour effet de passer le produit actuel 2 en 1ere position et le 3 en 2ème position ). mais ça doit marcher pour toute la page, tous les changements qu'on passe le 5 en 18 , le 2 en 20 , le 56 en 33 etc ...
MERCI
michel
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
Bonjour,

J'imagine que dans ta base tu dois avoir une table contenant les produits et l'ordre dans lequel les produits s'affichent. Cette table ressemblerait à ca :
- product
- n_ordre

ce qui te donnerait par exemple :
product     |   n_ordre
____________|___________
product1    |   1     
product2    |   2
product3    |   3
product4    |   4
product5    |   5
product6    |   6

Maintenant, tu veux passer à cet affichage (le product 3 est passé en rang 5) :
Produit     |   N° ordre
____________|___________
product1    |   1     
product2    |   2
product4    |   3
product5    |   4
product3    |   5
product6    |   6



Donc l'algo c'est :
Connaitre le nouvel ordre pour le produit concerné. Dans l'exemple donné ci-dessus c'est 5.

1. Récupérer le N° d'ordre actuel du produit :
select n_order from table where product='p3'
2. Mettre à jour l'ordre pour tous les produits dont l'ordre est compris entre l'ordre actuel et le nouvel ordre :
update table set n_order=n_order-1 where n_order>ancienOrdre and n_order <= nouvelOrdre
3. Mettre à jour ta table avec le nouvel ordre pour le produit
update table set order=nouvelOrdre where product='p3'


-------------------
Oderint dum metuant
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

merci , c'est tout à fait ça , tu as parfaitement compris. je vais essayer de comprendre tes explications. Moi je buttais sur un update qui ne pouvait pas fonctionner car 2 numéros d'ordres étaient équivalent ( quand on met l'orde 2 à la place de ordre 3, il y a donc 2 fois l'ordre 2, l'ancien 2 et le nouveau 2 ... heuuu, je ne sais pas si je suis clair ... et c'est la dessus que je butte.
Bon je vais voir si je comprends tes explication et je te dis si j'ai trouvé à les appliquer !
merci

michel
Messages postés
14813
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
25 juillet 2021
156
Bonjour,

En y pensant cette nuit, une série de requête du genre :
IdTarget : Id de l'item à déplacer
IndexTarget : Index désiré de la cible à déplacer
IndexOrig : Index d'origine de la cilbe

Déplace les index de 1
UPDATE ... SET Index=INDEX+1 WHERE Index=>IndexTarget AND Index<IndexOrig
Définit la nouvelle valeur
UPDATE ... SET Inext=IndexTarget WHERE Id=Idarget

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

bonjour et merci à tous les 2. la solution de PM fonctionne. Le seul hic, c'est ma requète qui ne passe pas, je ne vois pas pourquoi, voici mon code :

$ordre1=$_POST['ancienordre'];
$ordre2=$_POST['ordre']; // nouvel ordre

if ($ordre2 > $ordre1)
{
$sql="select ProductID,ordre from produits where ordre > $ordre1 and ordre <= $ordre2 and famille = ".$_POST['famille'][0]." order by ordre asc";
$result = query($sql);
while($ligne = mysql_fetch_array($result))
{
$newordre = $ligne['ordre']-1;
$sql="update produits set ordre = $newordre where ProductID = ".$ligne['ProductID']; // mise à jour de tous les produits ENTRE les 2 ordres
$result = query($sql);
}
$sql="update produits set ordre = $ordre2 where ProductID = $param"; // mise à jour du produit qu'on a déplacé vers le haut
$result = query($sql);
}

la requete sql s'affiche à l'écran et ça ne va pas plus loin ( par exemple ça affiche

select ProductID,ordre from produits where ordre > 2 and ordre <3 and famille tire bouchons coffrets order by ordre asc

qu'est ce qui cloche encore ?
merci
michel
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
Il manque les caractères d'échappement des chaines de caractères !

$sql='select ProductID,ordre from produits where ordre > '.$ordre1.' and ordre <= '.$ordre2.' and famille = \''.$_POST['famille'][0].'\' order by ordre asc'; 



-------------------
Oderint dum metuant
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

merci, en fait j'avais trouvé, mais la boucle WHILE n'est pas exécutée .. pfouuu, je ne vois pas ce qui cloche. le script n'exécute que la dernière requête, à savoir qu'il place l'élément à déplacer au bon endroit, mais ne déplace pas les autres ( pas de boucle while ) donc il y a un numero d'ordre en doublon.
je vais chercher.
merci en tout cas ! et bonne journée ;o)

michel
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

rebonjour,
a priori ce genre de requete ne donne rien ou bien tourne indéfiniment dans le vide :

$sql="select ProductID,ordre from produits where ordre > '1' and ordre <= '7' and famille = 'toto'";

alors qu'il y a bien une famille toto avec un champ ordre qui comporte des valeurs entre 1 et 7 !

j'ai essayé toutes les syntaxes .. rien n'y fait !

vous voyez le souci ?
merci

michel
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
Je ne comprends pas pourquoi tu fais tant de requêtes inutiles :
Voici ce que tu fais :
- Tu récupères tous tes produits compris entre les 2 ordres.
- pour chaque produit, tu le mets à jour.

Or, tu peux faire ca en une seule requête, c'est même l'algorithme que je t'ai donné :

$ordre1=$_POST['ancienordre'];
$ordre2=$_POST['ordre']; // nouvel ordre

if ($ordre2 > $ordre1)
{ 
    // mise à jour de tous les produits ENTRE les 2 ordres
    $sql='update produits set ordre = ordre-1 where ordre> '.$ordre1.' and ordre <= '.$ordre2.' and famille = \''.$_POST['famille'][0].'\'';
    $result = query($sql);


}

-------------------
Oderint dum metuant
Messages postés
62
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
23 octobre 2012

purée de purée ça marche nickel ! ! !

MERCI 1000 fois , je suis un ane. trop content ! ! ! !
merci encore


michel