Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier
    MoveUp/MoveDown d'une ligne dans une base de données
    Bonjour,

    Dans une application, je remplis une TreeView pour alimenter une DB. Jusque là tout est OK.

    J'ai deux fonctions MoveUp et MoveDown qui me permettent de monter ou descendre l'item sélectionner dans ma Treeview. Je voudrais qu'en même temps je MoveUp ou MoveDown dans ma TreeView, ça le fasse dans ma base de données.

    Pour information ma base de données à trois colonnes: 2 colonnes basic et 1 colonne rowid

    Je ne sais pas exactement quelle commande utiliser? Est-il possible de bouger une ligne en fonction de l'autoincrement?

    Merci par avance pour vos retour.

  2. #2
    Modérateur

    bonjour,

    Il faut ajouter une colonne qui contiendra l'ordre relatif de la ligne.

  3. #3
    Membre régulier
    AH.... Je ne souhaitai justement pas passer par cette solution là

  4. #4
    Modérateur

    pourquoi
    Que représente la colonne rowid ? est-ce la clef primaire ?

  5. #5
    Membre régulier
    Oui, elle représente la clé primaire.

    Pour être plus précis, je stocke dans ma TreeView une liste de production donc les lignes doivent être modifiables, supprimables, et déplaçables dans la liste...

  6. #6
    Expert éminent sénior
    Citation Envoyé par Supernatural Voir le message
    Est-il possible de bouger une ligne en fonction de l'autoincrement?
    Surtout pas ! l'autoincrément est un identifiant technique, sans signification fonctionnelle, qui ne doit JAMAIS être utilisé comme critère de rangement chronologique !

    La bdd stocke une nomenclature genre composant / composé ?

  7. #7
    Membre régulier
    Alors comment dois-je faire si on ne dois pas utiliser une clef primaire? J'en ai besoin pour savoir quelle ligne je dois modifier, déplacer, etc... Si on ne peut pas déplacer par exemple la ligne avec la clef primaire 6 devant la ligne avec la clef primaire 3, que faire?

  8. #8
    Expert éminent sénior
    Je n'ai pas dit qu'il ne fallait pas de PK, j'ai dit que si la PK était de type "auto_incrément" il ne fallait surtout pas l'utiliser comme critère temporel.

    Les identifiants attribués par le SGBD ne sont pas obligatoirement distribués selon un ordre chronologique, surtout si les accès concurrents sont nombreux.
    L'identifiant 500 peut tout à fait avoir été ajouté après l'identifiant 510

  9. #9
    Membre régulier
    Ah ok, car je ne l'utilise pas, je veux juste déplacer les lignes dans la DB mais je ne sais pas quelle fonction utiliser voilà

  10. #10
    Expert éminent sénior
    Oui mais "déplacer des lignes dans la DB" ne veut rien dire : dans une BDD relationnelle, contrairement à une BDD hiérarchique, il n'y a pas d'ordre de rangement.
    Vous n'avez pas répondu à ma question sur la nature du contenu, est-ce une nomenclature arborescente de type parent/enfant ou composant/composé ?
    Si c'est bien le cas, la position relative dans l'arborescence se calcule via une requête reflexive

  11. #11
    Membre régulier
    Citation Envoyé par escartefigue Voir le message
    Vous n'avez pas répondu à ma question sur la nature du contenu, est-ce une nomenclature arborescente de type parent/enfant ou composant/composé ?
    Si c'est bien le cas, la position relative dans l'arborescence se calcule via une requête reflexive
    Je n'ai pas compris votre question.

  12. #12
    Expert éminent sénior
    La question est de savoir à quoi sert cette BDD, avec quelques exemples de contenu éventuellement

  13. #13
    Membre régulier
    Citation Envoyé par escartefigue Voir le message
    La question est de savoir à quoi sert cette BDD, avec quelques exemples de contenu éventuellement
    Ah ok, en fait comme je l'ai expliqué un peu plus haut, je rempli une Treeview pour définir un plan de production (référence à produire et la quantité) rien de compliquer jusque là.

    Pour des raison de flexibilité, je dois être en mesure de pouvoir modifier les données, les supprimer ou même de déplacer certains items si mon plan de production évolue.

    Faire tout cela dans ma Treeview est ok, mais je voudrais qu'en parallèle je modifie ma DB pour me retrouver en temps réel avec la même image de ma TreeView dans ma DB.

    Les données sont du style Colonne référence: '0123321123-00' Quantité:'100'

  14. #14
    Membre habitué
    Bonjour

    Citation Envoyé par aieeeuuuuu Voir le message
    bonjour,

    Il faut ajouter une colonne qui contiendra l'ordre relatif de la ligne.
    Et pourtant c'est la meilleur solution, où rajouté une table avec ton ID de la première et un champ ordre, à mon avis tu seras obligé de passer par là.

  15. #15
    Expert éminent sénior
    OK donc rien à voir avec une nomenclature et en ce cas je rejoins la réponse de aieeeuuuuu, à savoir : ajouter une colonne pour préciser l'ordre

  16. #16
    Expert éminent
    Citation Envoyé par escartefigue Voir le message
    OK donc rien à voir avec une nomenclature et en ce cas je rejoins la réponse de aieeeuuuuu, à savoir : ajouter une colonne pour préciser l'ordre
    Par contre, je te conseille grandement de gérer le changement d'ordre par procédure stockée ou trigger.
    Ceci permettra :
    - De gérer plus facilement la concurrence d'accès
    - D'avoir une transaction implicite et pouvoir tout rollbacker en cas d'anomalie
    - D'avoir un code réutilisable si tu dois gérer ces changement d'ordre à plusieurs endroit et/ou depuis plusieurs logiciels différents
    On ne jouit bien que de ce qu’on partage.

  17. #17
    Membre régulier
    Ok, donc j'ai créé ma colonne supplémentaire.

    Maintenant comment dois-je faire dans le principe?

    Je fais un MoveUp dans ma liste (je passe de la position 5 à la position 4), j'utilise
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    curseur.execute("UPDATE "+SELECTED_LINE+" SET RELATIVE_ORDER...
    RELATIVE_ORDER étant la colonne dédiée à l'ordre.

    Je pense qu'il que je passe par un
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    CASE
    , mais je galère un chouya

  18. #18
    Expert éminent sénior
    il faut modifier l'ordre dans la nouvelle colonne pour au moins deux lignes dans le cas le plus simple (inversion de deux lignes seulement) ;
    Reste à savoir comment vous allez initialiser cette colonne

  19. #19
    Membre régulier
    Au final, je ne comprends toujours pas pourquoi on ne peut pas travailler avec la colonne clef primaire?

    Si je lui dis tu prends les valeurs de la ligne ID 3 que tu remplaces par celles de la ligne 2 et inversement... Ce que l'on peut appeler 'SWAP' je ne suis pas obligé de passer par une colonne supplémentaire... non?

  20. #20
    Membre habitué
    Bonjour,

    On ne modifie jamais une clé primaire, surtout si elle est clé étrangère d'une autre table.