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 :

problème de boucle.


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 479
    Points : 102
    Points
    102
    Par défaut problème de boucle.
    Bonjour


    J'ai une boucle comme ci-dessous qui s'execute correctement sauf qu'il
    me reste des enregistrements qu'elle n'a pas prise en compte.
    il me semble qu'elle prend un enregistrement sur deux Pourquoi?
    BOUCLE :
    while datamodule3.Repartitionmclasse.value= datamodule3.ClassegroupClasse.value do
    begin
    datamodule3.Repartitionm.Edit;
    datamodule3.RepartitionmEnseignant.Value :=edit1.text;
    datamodule3.Repartitionm.post;


    Merci d'avance.

  2. #2
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Il ne manquent pas des "NEXT" dans ta boucle ?
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 479
    Points : 102
    Points
    102
    Par défaut
    Merci pour ta réponse

    Mais si c'est une boucle elle doit continuer jusqu'a ce que la condition soit fausse non?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Je suis d'avis de rejoindre Bejaia_in

    En delphi, tu dois incrémenter le compteur dans la boucle while, contrairement à une boucle for.

    Donc,

    While myQuery.EOF do
    begin
    ...
    ...
    myQuery.next; // doit s'y trouver explicitement.
    end;

    Sauf erreur de ma part... mais ce qui me surprend c'est que tu dis que certains enregistrement ont bien été pris en compte ...
    Tu peux le faire, tu veux le faire tu vas le faire Bref, soyons positif

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 479
    Points : 102
    Points
    102
    Par défaut
    Exact

    donc ma boucle fonctionne mais par exemple sur 30 enregistrements il reste à la fin de la boucle 4 ou 5 qui n'ont pas été éxécutés.

  6. #6
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par pierrot67
    BOUCLE :
    while datamodule3.Repartitionmclasse.value= datamodule3.ClassegroupClasse.value do
    begin
    datamodule3.Repartitionm.Edit;
    datamodule3.RepartitionmEnseignant.Value :=edit1.text;
    datamodule3.Repartitionm.post;
    Quesqu'il y a ICI ?
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 479
    Points : 102
    Points
    102
    Par défaut
    rien à part le end;

  8. #8
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut.

    Alors dans ce cas Bejaia-In et dd_garion ont raison. Il te manque un next.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while datamodule3.Repartitionmclasse.value= datamodule3.ClassegroupClasse.value do
    begin
      datamodule3.Repartitionm.Edit;
      datamodule3.RepartitionmEnseignant.Value :=edit1.text;
      datamodule3.Repartitionm.post;
      datamodule3.Repartionm.Next;
    end;
    Une autre solution serait de faire une requête Update.

    @+

  9. #9
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par pierrot67
    Exact

    donc ma boucle fonctionne mais par exemple sur 30 enregistrements il reste à la fin de la boucle 4 ou 5 qui n'ont pas été éxécutés.
    Il ne manque pas forcément un Next.

    Il suffit que les champs modifiés fassent partie de l'index pour que l'ordre des enregistrements change pendant l'évolution de la boucle.

    --> Ce qui expliquerait pourquoi certains enreg sont modifiés et pas tous, et cela de manière aléatoire (enfin l'impression que c'est aléatoire...).

    Est-ce que "RepartitionmEnseignant" fait partie de l'index de la table ventilée ???
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  10. #10
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    +10 avec TicTacToe. C'est d'ailleurs pour ce genre de situation qu'il est fortement déconseillé d'utiliser une boucle While sur un critére d'égalité de valeur (valeurs prises directement dans la table concernée, bien sûr, tout autre critére d'égalité restant utilisable sans souci). Le mieux serait
    1. De filtrer la table afin de sélectionner les enregistrements valides pour le traitement
    2. De mettre une boucle for sur le nombre d'enregistrement renvoyé par le (1)
    3. D'effectuer le traitement
    4. Optionnel : refaire un tour afin de vérifier que tous les enregistrements traités sont valides

    Cordialement,
    Hauwke

  11. #11
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par TicTacToe
    Il ne manque pas forcément un Next.

    Il suffit que les champs modifiés fassent partie de l'index pour que l'ordre des enregistrements change pendant l'évolution de la boucle.

    --> Ce qui expliquerait pourquoi certains enreg sont modifiés et pas tous, et cela de manière aléatoire (enfin l'impression que c'est aléatoire...).
    C'est étonnent ce que tu écrit là !
    Ca veux dire que lorsqu'on parcours une table en la modifiant, les enregistrements de celle-ci changent de positions a chaque "post" selon l'ordre d'un index et qu'on risque de modifier une 2eme fois le même champ ?
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  12. #12
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Bejaia-In
    C'est étonnent ce que tu écrit là !
    Ca veux dire que lorsqu'on parcours une table en la modifiant, les enregistrements de celle-ci changent de positions a chaque "post" selon l'ordre d'un index et qu'on risque de modifier une 2eme fois le même champ ?
    Exact !

    Si la modification porte sur un champ, qui fait partie de l'index en cours, c'est exact, et cela débouche soit sur un parcours incomplet (visiblement le cas ici), soit sur une boucle infinie, selon la nature du changement (si l'édit du champ provoque par exemple une remise en tête de table pour une raison X).
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  13. #13
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Je viens de tester cette situation, il s'avère que le "post" n'a aucun effet sur l'arrangement de la table, ce qui veux dire qu'on ne passe pas a un autre enregistrement. mais losque aprés un "post" on utilse "next", la table est ventilée selon l'index et on saute plusieurs enregistrements.
    Comme notre ami pierrot67 n'utilise pas de "next", d'ou viens le problème alors ?
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Grrr, ...

    Que quelqu'un nous donne l'explication...

    ... un ptit problème, qui semble anodin au départ, retient l'haleine de millions de télespectateur

    Merci à tic tac toc, j'aurai au moins apris à ne pas utiliser de boucle while quand je travail sur un index.

    Bonne soirée
    Tu peux le faire, tu veux le faire tu vas le faire Bref, soyons positif

  15. #15
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Bejaia-In
    Je viens de tester cette situation, il s'avère que le "post" n'a aucun effet sur l'arrangement de la table, ce qui veux dire qu'on ne passe pas a un autre enregistrement. mais losque aprés un "post" on utilse "next", la table est ventilée selon l'index et on saute plusieurs enregistrements.
    Comme notre ami pierrot67 n'utilise pas de "next", d'ou viens le problème alors ?
    Attention, je n'ai pas dit que l'on changeait d'enreg, mais que l'enreg changeait de position tout en restant sur cet enreg, ce qui est différent.

    Pour s'en convaincre, creer une table, avec 'Designation' et 'Reference' par exemple. Créer un Index sur Designation.
    Afficher un DBGrid, avec cette table, avec cet Index.

    Modifier la désignation dans la DBGrid, et la ligne se replacera au bon endroit une fois le post effectué, pour que le tri soit tenu. Le curseur de la table sera toujours sur cet l'enreg venant d'être modifié.
    Si la référence change, l'ordre reste le même...

    Il y a plusieurs solutions pour palier a ceci, dont une requête SQL (mais je laisse soins aux spécialistes là...), ou utiliser un table parallèle, ou ne pas utiliser cet index mais un filtres (plus lent), ou bien marquer les clefs dans une liste, et faire des FindKey dans un 'for', on est sur de rien louper, c'en en général se que je fais (une clef est souvent un entier pour moi, donc même bcp d'enreg, ca tient bien, et c'est fiable).

    Tout dépend du contexte.

    bon code!
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  16. #16
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Perso, je n'ai jamais eu ce genre de problème étant donnée que j'utilise majoritarement le SQL.
    La solution la plus simple serait de désactiver l'index temporairement par les propriétés [IndexFieldNames=''] ou [IndexName=''], puis de le remettre aprés traitement.

    Citation Envoyé par dd_garion
    j'aurai au moins apris à ne pas utiliser de boucle while quand je travail sur un index.
    C'est pas seulement dans la boucle WHILE, mais dans tout traitement qui modifie le champ indexé.
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 479
    Points : 102
    Points
    102
    Par défaut
    Salut les gars


    Je suis content d'avoir créé une discussion au combien
    intéressante autour de mon sujet mais la clé du problème je l'ai trouvée. c'était un problème d'accent dans mon cas certains enregistrement n'avais pas d'accent donc la boucle s'arretait et il me restait les enregistrements sur les "bras".
    Merci encore pour votre aide.

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

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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