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

Langage Delphi Discussion :

Boucle while avec base de données


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut Boucle while avec base de données
    Bonjour,

    Je bloque sur un problème simple à mon sens.

    J'ai besoin de mettre à jour une base de données par rapport à des données.

    Un champ N° employé contient par exemple :

    1
    2
    2
    2
    3
    4

    Le but c'est de mettre dans un champ nommé pli
    DF si une seule fiche ayant le N° d'employé et D pour début M milieu et F pour F lorsqu'il y a plusieurs N° d'employé identiques :

    1 | DF
    2 | D
    2 | M
    2 | F
    3 | DF
    4 | DF

    Merci popur vos idées car j'ai l'impression de faire une usine à gaz.

    Laurent

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    A la va vite il me semble que

    D'abord ils sont tous au Milieu puis il y a un Dernier et enfin il y a un Premier.

    Evidemment cela fait que certain enregistrement seront mis à jour plusieurs fois.

    Le cas simple il ny a qu'un enreg
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      Update XX maTable
        set maTable.pli = 'DF'
       group by maTable.Num
       having count( maTable.Num) = 1
    ----
    initilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       Update XX maTable
         set maTable.pli = 'zz'
        group by maTable.Num
        having count( maTable.Num) >= 2
    Le premier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      Update XX maTable 
        set maTable.pli = 'D'
       where maTable.Num = (select min(maTable2.num) 
                                         from XX maTable2 
                                      where maTable2.num=maTable.num)
       group by Num
       having count( Num) >= 2
    le dernier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       Update XX maTable 
         set maTable.pli = 'F'
       where maTable.Num = (select max(maTable2.num) 
                                         from XX maTable2 
                                      where maTable2.num=maTable.num)
        group by Num
        having count( Num) >= 2
    et le reste s'il en reste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Update XX maTable 
          set maTable.pli = 'M'
        where maTable.pli = 'zz'
       group by Num
         having count( Num) >= 2
    Maintenant si tu as du volume peut-être dois tu songer à une procédure stockée.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Merci pour cette solution mais j'aurais préféré une solution en delphi.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    pour ma part je te conseilles d'opter pour la solution SQL, tu obtiendras de bien meilleures performances que via le code Delphi.

  5. #5
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Évidemment c'était écrit.

    alors en delphi il faut savoir comment tu met à jour ton ensemble de donnée

    Alors en faisant preuve d'imagination.

    Un Query en cacheUpdate via le BDe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select matable.num, matable.pli, (select min(maTable2.num)
                                                   from XX maTable2
                                                  where maTable2.num=maTable.num) as NombreEnreg
     from XX matable
    order by matable.num
    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
    40
     
     
    procedure KiFaitCeQueJeVeux;
    Var 
      Qry        : TQuery;
      Num, Nb  : Integer;
    begin
      Qry := TQuery.create;
      try
       //... initialisation - mise ne place TupdateSql- connection - etc...
     
        Qry.Open;
        Num := 0;
        While not Qry.Eof do
        begin
          if Qry.fields[0].AsInteger <> Num then
            Nb := 1;
          Num := Qry.fields[0].AsInteger;
     
          if Qry.fields[2].AsInteger = 1  then
              Qry.fields[1] := 'DF'
          else 
          begin
             if Nb=1 then
               Qry.fields[1].AsString := 'D'
             else  
             if Nb=Qry.fields[2].AsInteger then
               Qry.fields[1].AsString := 'F'
             else 
               Qry.fields[1].AsString := 'M';
             end; 
          inc(Nb);
          Qry.next;
        end;
     
        // Appel des procedure cacheupdate qui vont bien
      finally
      end;
     
    end;
    Voilà tous cela à main levée.

    Il faudrait savoir comment tu accèdes aux données et comment tu mets à jour tes données
    .

  6. #6
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Bonjour,

    pour ma part je te conseilles d'opter pour la solution SQL, tu obtiendras de bien meilleures performances que via le code Delphi.
    Je suis d'accord c'est statistiquement vrai.
    Après combien a-t-il de paquet de trois enregistrement, sur quelles colonnes sont les index, etc...

    En fin bon,
    c'est vous qui voyez,
    y'en a qui ont essayé mais ils ont eu des problèmes.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Je ne suis pas contre la solution SQL mais en MySQL j'obtiens une erreur


    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
    'group by num_employe having count( num_employe) > 2' at line 3

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Il y a quelque chose qui me perturbe :
    Lorsque tu as 3 lignes avec le même n° d'employé, tu fais comment pour décider celui qui est le premier, celui qui est le dernier et ceux qui sont entre ?

    Tu choisis arbitrairement selon l'humeur du moment ou tu as d'autres champs pour les trier et décider ordonner les fiches avec le même n°.

    Si tu ne peux pas définir un ordre de tri précis et que tu n'as que le numéro d'employé tu ne t'en sortira jamais avec du SQL normal.
    Il faudra faire le traitement dans Delphi ou avec un curseur.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Il y a un champ numéro de page sur lequel j'effectue un order by

  10. #10
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Ce Sql n'aurait pas du être dans les balises Code.

    Je pense qu'on ne peut pas faire de group by dans un update

    je n'ai pas de base sous la main alors tu peux voir en modifiant le SQL ou en repostant dans un forum où des spécialistes SQL se délecteront à te répondre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Update XX maTable
         set maTable.pli = 'F'
       where   maTable.Num in (select maTable3.num
                                 from XXX maTable3
                             group by maTable3.Num
                         having count( maTable3.Num) >= 2)
                and
     
                maTable.Num = (select max(maTable2.num)
                                         from XX maTable2
                                      where maTable2.num=maTable.num)

Discussions similaires

  1. Lecture en boucle de la base de donnée avec JS, AJAX
    Par Romaiiiiiin dans le forum Django
    Réponses: 11
    Dernier message: 09/04/2015, 21h45
  2. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11
  3. InstallShield avec base de données
    Par duga dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/03/2005, 15h44
  4. CD ROm avec base de données
    Par marcoco dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 10/02/2005, 14h16
  5. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33

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