IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Bases de données Delphi Discussion :

[DELPHI 7+FB 1.5] tri dynamic, et deplt sous DBgrid


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Par défaut [DELPHI 7+FB 1.5] tri dynamic, et deplt sous DBgrid
    Un sacré challenge pour moi, peut être une formalité pour vous : voici le casse-tête auquel je me heurte ces jours-ci*:

    Sous Delphi 7, j'utilise un composant TibTable, un datasource, et un dbgrid.

    J'affiche les enregistrements de ma table dans le DBGrid. Ils sont triés sur la clé primaire de la table (Inc avec générateur)

    Je voudrais pouvoir, insérer un enregistrement dans la table grâce à la grille, mais je voudrais que l'enregistrement inséré, reste à l'emplacement où je les créé dans la grille.

    Un exemple pour être clair :

    Soit 5 enregistrements dans une table à 3 champs. Champ 1 = PK, champ 2 = position, champ 3 = ville.

    Soit, les enregistrements suivants déjà existants dans la base :

    PK Pos Ville
    ___ ___ ___

    1 1 Lille
    2 2 Amiens
    3 3 Paris
    4 4 Lyon
    5 5 Marseille

    Je souhaite inséré dans ma grille la ville "Montélimar", entre Lyon et Marseille. J'ai donc créé un événement sur doubleclique dans la grille, je double clique sur Marseille, et j'insère mon enregistrement "devant "Marseille" parce que je récupéré en champ 2 (position), la valeur de Marseille.

    Le problème, c'est qu'avec ma méthode, après l'insertion, je dois renuméroter toute la table car Marseille ne doit plus être en 5 mais en 6. Et c'est la galère, car avant tri, Montelimar et Marseille ont maintenant la même valeur position = 5 ! Et Marseille repasse avant Montelimar dans ma grille !

    Et puis maintenant que j'ai 50 000 villes, le tri prend un temps considérable.

    Cette notion de position est essentielle, puis qu'il s'agit de créer des parcours, dans lesquels les villes sont traversées dans un ordre donné.

    L'autre souci majeur rencontré, comment changer la position d'une ville facilement et efficacement ? Un vrai cas d'école... Pour l'utilisateur, l'idéal est le Drag & Drop. Si la grille pouvait permettre d'insérer, ou de déplacer, et aussi supprimer des villes de manière visuelle, ça serait génial. J'imagine l'utilisateur qui glisse Lyon en position 2 car il change l'ordre de son parcours, c'est le top. Mais pour moi, c'est un cauchemar.

    Mais là, j'ai atteint mes limites !

    Évidemment, je ne demande pas un code tout prêt pour faire ça, mais un échange de point de vue sur la meilleure approche pour offrir un outil de gestion d'enregistrement via une grille avec pour enjeu majeur le confort de l'utilisateur.

    Merci pour vos idées.

  2. #2
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut,

    J'ai du mal à voir comment sont organisées tes données. Tu ne parles que d'une seule table (qui en l'occurence contiendrait 50 000 enregistrements).

    Je pense que ces 50 000 enregistrements représentent plusieurs parcours (ou itinéraires). Et dans ce cas je ne voie pas d'identifiant pour ton parcours !

    J'ai besoin d'un peu plus de détail pour pouvoir t'aider.

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Par défaut
    Citation Envoyé par Claudius40
    Salut,

    J'ai du mal à voir comment sont organisées tes données. Tu ne parles que d'une seule table (qui en l'occurence contiendrait 50 000 enregistrements).

    Je pense que ces 50 000 enregistrements représentent plusieurs parcours (ou itinéraires). Et dans ce cas je ne voie pas d'identifiant pour ton parcours !

    J'ai besoin d'un peu plus de détail pour pouvoir t'aider.

    @+
    Il y a effectivement une table maître "parcours". Et un champ Parcours PK dans la cette table parcours.

    Ce champ est aussi en FK dans la table des Etapes.


    PARCOURS 1 -------------------------->n ETAPES

    C'est précisément les étapes que je veux trier.

    La table ETAPES c'est :

    PK Pos Ville
    ___ ___ ___

    1 1 Lille
    2 2 Amiens
    3 3 Paris
    4 4 Lyon
    5 5 Marseille


    Le champ "Ville" de la table ETAPES puise juste dans une table "Villes" pour aider la saisie, mais ce champ pourrait aussi bien être saisi manuellement par l'utilisateur si la ville n'existe pas.

    Mon espoir de tri par Drag & Drop est bien sur les ETAPES d'un PARCOURS

    Merci.

  4. #4
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Re,

    Bon effectivement ton organisation est celle que j'avais imaginée.

    Je vois ça assez simplement (si on peut dire).
    Après l'insertion de ta nouvelle étape (par double-clic comme tu l'expliques) tu attribues à ta ville étape son n° d'ordre. Avant de le poster j'exécuterais une requête Update (via un TIBSQL par exemple) pour mettre à jour les villes à renuméroter.

    Requête Update 'UpdatePos':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update ETAPES
    set POS = POS + 1
    where PARCOURS = :PARCOURS and POS >= :NEW_POS;

    Dans ton evènement OnBeforePost de ETAPES:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with UpdatePos do begin
      ParamByName('PARCOURS').AsInteger :=   TablePARCOURS.FieldByName('NO_PARCOURS').Value;
      ParamByName('NEW_POS').AsInteger := TableETAPES.FieldByName('POS').Value; // la position de ville venant d'être insérée
      Prepare;
      ExecQuery;
      Close;
    end;
    Voilà pour le 1° point, quant au Drag & Drop (effectivement sympa pour le user), si tu as déjà un bout de code poste le.

    @+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Par défaut
    Citation Envoyé par Claudius40
    Re,


    Requête Update 'UpdatePos':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update ETAPES
    set POS = POS + 1
    where PARCOURS = :PARCOURS and POS >= :NEW_POS;

    Dans ton evènement OnBeforePost de ETAPES:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with UpdatePos do begin
      ParamByName('PARCOURS').AsInteger :=   TablePARCOURS.FieldByName('NO_PARCOURS').Value;
      ParamByName('NEW_POS').AsInteger := TableETAPES.FieldByName('POS').Value; // la position de ville venant d'être insérée
      Prepare;
      ExecQuery;
      Close;
    end;
    Voilà pour le 1° point, quant au Drag & Drop (effectivement sympa pour le user), si tu as déjà un bout de code poste le.

    @+
    Merci pour cette proposition. Mais dans cet exemple de code, l'étape que je viens d'insérer ne va t-elle pas être aussi updatée (pos = pos+1) ?

    Pour le drag & drop, je n'ai malheureusement même pas le début d'un petit bout de code !

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut
    Merci pour cette proposition.
    Réponse: avec plaisir !!

    Mais dans cet exemple de code, l'étape que je viens d'insérer ne va t-elle pas être aussi updatée (pos = pos+1) ?
    Non, puique que le code que je te propose se situe avant qu'il ne soit posté (OnBeforePost). Au moment où s'exécute la requête ton nouvel enregistrement n'existe pas encore.

    Je te propose de faire déjà un test avec ce que j'ai présenté (si ça te convient) et de regarder si les temps de réponse sont corrects.

    Si ce n'est pas le cas, relance le débat et on trouvera sûrement un moyen d'avancer.

    Pour le drag & drop, je n'ai malheureusement même pas le début d'un petit bout de code !
    Voyons déjà le pb de réorganisation des étapes au niveau de la BDD et après on se penchera sur l'interface.

    @+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Par défaut
    Citation Envoyé par Claudius40
    Salut
    Voyons déjà le pb de réorganisation des étapes au niveau de la BDD et après on se penchera sur l'interface.

    @+
    Top !

    J'ai juste rajouté une clause "and Pk de l'etape <> etape insérée", pour être sûr de ne pas updater le nouvel enregistrement. Ca marche super bien, et les temps de réponses sont nickels. Avant, j'updatais le TIBTable, ca mettait des plombes. Là c'est impec.
    Un GRAND merci.
    Et en prime, je viens de comprendre qu'une requete, pour updater, c'est mieux qu'une boucle de type "while eof" sur un TIBTABLE !

    Reste plus qu'a régler le drag & drop !

  8. #8
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Re,

    Et en prime, je viens de comprendre qu'une requete, pour updater, c'est mieux qu'une boucle de type "while eof" sur un TIBTABLE !
    Yep, t'as tout compris !

    Ravi de voir que les temps de réponse sont sympas. C'était le but !

    Bon le Drag'n'Drop est la prochaine étape. Penche-toi sur le problème, je ferais de même demain.

    Là je vais rejoindre Morphée.
    @+

Discussions similaires

  1. Tri des valeurs dans un DBGrid
    Par soviet dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/06/2015, 14h18
  2. [Struts] Dynamic web project sous Eclipse et ContextLoader
    Par onur dans le forum Spring Web
    Réponses: 1
    Dernier message: 03/08/2009, 17h13
  3. [E-03] Après un tri comment faire des sous totaux
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/10/2008, 09h17
  4. [Delphi 2005 Perso] In avec tableau dynamic
    Par Qwazerty dans le forum Delphi
    Réponses: 5
    Dernier message: 08/04/2007, 19h55
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo