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

 Delphi Discussion :

Mettre à jour un ensemble de ligne dans une BDD à partir d'une valeur d'une colonne (DBTreeList)


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Mettre à jour un ensemble de ligne dans une BDD à partir d'une valeur d'une colonne (DBTreeList)
    Bonjour à tous en espérant avoir poster au bonne endroit,

    J'explique brièvement mon objectif. J'ai trois colonnes nommés S1 S2 et S3, où S3 ,est "l'enfant" de S2 et S2 "l'enfant" de S1. De ce fait, il y a donc le même S1 pour plusieurs S2 différents et ainsi le même S2 pour plusieurs S3. Mon objectif est de pouvoir, via un bouton, changer ce S2 et affecter ce changement à tout les S3 où le S2 est le même en restant dans le même S1.
    De ce fait il va y avoir des numéros S2 identiques dans différents S1. Donc avec le code suivant, mon problème est que si mon S2 vaut par exemple 010 et que je souhaite le changer en 030, la modification va être appliqué à tout les S2 égal à 010 quelque soit le S1, alors qu'il faudra que cela s'applique seulement par exemple où S1 = 010

    Exemple :
    S1 S2 S3
    010
    010 010 ==> changement
    010 010 010 ==> changement
    010 010 020 ==> changement
    020
    020 010
    020 010 010 ==> changement (X)
    020 010 020 ==> changement (X)

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    / S2 - Change code
    procedure TMAIN.PopMenu_SEC_ChangeS2Click(Sender: TObject);     // Cette fonction permet de changer le code S2 d'un centre de regroupement analytique. Il aut alors modifier toutes les sections FILLES qui ont ce code S2.
    var
       OldS2, S2: String;
    begin
    if (ZDBPGA.QRY_PGA_S1.State <> dsInactive)
    then begin
          OldS2 := ZDBPGA.QRY_PGA_S1S2.Value;
         inputquery('Change ' + ZDBPGA.QRY_PGA_S1S2.Value, 'Entrez le nouveau code S2', S2);
     
         if MessageDlg('Confirmez vous le changement de code ' + OldS2 + ' avec le nouveau code ' + S2, mtWarning, [mbYES, mbNO], 0) = mrYES
         then begin
              if (ZDBPGA.QRY_PGA_SECTIONS.State = dsInactive) or (ZDBPGA.QRY_PGA_SECTIONS.IsEmpty)
              then ZDBPGA.PGA_SEC_Liste(ZDBPGA.QRY_PGA_SECTIONS, '', true);
     
     
              if NOT ZDBPGA.QRY_PGA_SECTIONS.Locate('S2', S2, [])
              then begin
                   {PGA_S1 - S2 centre de regroupement analytique}
                   ZDBPGA.QRY_PGA_S1.Edit;
                   ZDBPGA.QRY_PGA_S1S2.Value := S2;
     
                   {PGA_S2  S2 FILLES}
                   ZDBPGA.PGA_S1_Liste(SYSDBS.STR_Soc, OldS2);
                   ZDBPGA.QRY_PGA_S1.First;
                   While NOT ZDBPGA.QRY_PGA_S1.Eof
                   do Begin
                      ZDBPGA.QRY_PGA_S1.Edit;
                      ZDBPGA.QRY_PGA_S1S2.Value := S2;
     
                      ZDBPGA.QRY_PGA_S1.Next;
                      End;
     
                   ZDBPGA.QRY_PGA_S1.ApplyUpdates;
                   ZDBPGA.QRY_PGA_SEC.ApplyUpdates;
                   end
              end;
         end;
    end;
    Dernière modification par Invité ; 23/04/2012 à 16h40.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 254
    Points
    25 254
    Par défaut
    Faudrait utiliser Filter à la place de Locate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Filter := 'S1 = ''010'' AND S2 = ''010''';
    Filered := true;
    L'idéal reste le SQL !

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table
    SET S2 = '030'
    WHERE S1 = '010' AND S2 = '010'

    version paramètrée

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table
    SET S2 = :NewS2
    WHERE S1 = :RefS1 AND S2 = :RefS2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with Query do
    begin
      SQL.Text := 'UPDATE table SET S2 = :NewS2 WHERE S1 = :RefS1 AND S2 = :RefS2';
      ParamByName('RefS1').AsString := '010'; 
      ParamByName('RefS2').AsString := '010'; 
      ParamByName('NewS2').AsString := '030'; 
      ExecSQL();
    end;
    Après, est-ce une table de relation N-N à trois tables ?
    Cette table aurait pu être décomposé en plusieurs !

    Table S1
    IDS1 CodeS1
    1 010
    2 020
    3 030

    Table S2
    IDS2 CodeS2
    1 010
    2 020
    3 030

    Table S3
    IDS2 CodeS2
    1 010
    2 020
    3 030

    Table S123
    IDS1 IDS2 IDS3
    1 1 1
    1 2 1
    1 3 1
    1 2 1
    ...


    Les tables S1, S2 et S3 pouvant être la même table si les codes sont les mêmes, c'est juste une relation arbre (une feuille contenant 1-N feuille)

    Concernant le TDBTreeList ignorant le comportement de ce composant, je ne peux pas me prononcer !
    J'en ai vu certains qui fonctionnait avec un seul DataSet avec un système de groupement\rupture et d'autres donc chaque niveau était une liaison Master\Detail (idéalement avec des Query paramètrées)
    A chaque fois, des performances médiocres, un comportement rigide permettant une ergonomie très limitée !

    Rien ne vaut gérer soit même un TTreeView standard et son propre système de manipulation de données !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Concernant le TcxDbTreeList, j'y suis contraint, je m'occupe d'améliorer ou de corriger une appli déjà existante.

    Ensuite par curiosité n'existe t-il pas un moyen d'éviter de passer par le SQL ? Non pas que je veux éviter de m'en servir mais je voudrais que mon S1 soit reconnus automatiquement et du coup ma modification de valeur ne se fasse qu'à "l'intérieur" de ce S1...

    Au niveau des mes tables je suis bien sur une seule et même table avec des colonnes de S1 à S5 qui correspondent en quelques sortes au niveau de détail dans l'arborescence. SI un élément n'a que le S1 de renseigner c'est un parent et donc pour le S5 c'est un sous enfant et donc c'est un élément qui est très précis. Mon arborescence représente un plan analytique où S1 est un centre analytique et les S2...S5 sont les sous sections de ce centre.

    En fait et en clair je voudrais traduire en delphi la chose suivante : 'Pour chaque S2 correspondant à ce S1 alors S2 = tant'
    Dernière modification par Invité ; 24/04/2012 à 10h09.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/02/2014, 10h29
  2. Extraction d'une liste à partir de la valeur d'une cellule
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2012, 20h07
  3. Réponses: 8
    Dernier message: 21/03/2011, 11h38
  4. ajouter une ligne dans un tableau et afficher la valeur d'une variable
    Par dede94 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/05/2010, 17h24
  5. Réponses: 6
    Dernier message: 29/11/2007, 16h15

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