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 :

Comment figer une DBGrid ?


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de cdlr27
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 96
    Points : 76
    Points
    76
    Par défaut Comment figer une DBGrid ?
    Bonjour
    Avant l'affichage d'un DBGRID, j'effectue un calcul sur les enregistrements.

    En clair, j'effectue la somme résultante d'un champ calculé d'une requète, et je n'avais envie de refaire une requète sur le résultat. Aussi, une boucle sur les enregistrements faisait l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      for i:=0 to DBGprod.DataSource.DataSet.RecordCount - 1 do
        begin
        total := total + FlistProd.QarticleMagasinPrixHT.Value * (FlistProd.QarticleMagasinQuantit.Value - FlistProd.QarticleMagasinNbre.AsInteger);
        FlistProd.QarticleMagasin.Next;
        end;
       LabelTotal.Caption:=' Total HT : '+ CurrToStrF(total,ffCurrency,2);
    Mais voir le balayage à l'écran est trés moche.

    Comment figer l'affichage pendant le calcul ?.


    Marcel

  2. #2
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    voir dans l'aide de delphi:disablecontrol et enabelcontrol
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  3. #3
    Membre régulier Avatar de cdlr27
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 96
    Points : 76
    Points
    76
    Par défaut
    Merci pour l'aide.
    pas trouver comment figer le rafraichissement du DBGRID, mais je vais changer de méthode.

    Requète sur le dataset. le résultat de celui-ci change en fonction de choix dans des combobox sur la même forme,

    Là, les conseils sont encore les bienvenus.

    Marcel

    P.S. : je reconnais que je suis pas en forme cérébrale en ce moment.

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Je n'ai jamais utiliser la méthode que je vais décrire ci dessous mais le principe est justement de ne pas dessiner sur la DBGrid tant qu'on a pas effectué tous les calculs. Il faut regarder du coté du BeginUpdate et EndUpdate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DBGrid1.Columns.BeginUpdate;
      for i:=0 to DBGprod.DataSource.DataSet.RecordCount - 1 do
        begin
        total := total + FlistProd.QarticleMagasinPrixHT.Value * (FlistProd.QarticleMagasinQuantit.Value - FlistProd.QarticleMagasinNbre.AsInteger);
        FlistProd.QarticleMagasin.Next;
        end;
    DBGrid1.Columns.EndUpdate;
    LabelTotal.Caption:=' Total HT : '+ CurrToStrF(total,ffCurrency,2);
    Faut voir la syntaxe exactement car je ne saurais te dire exactement. Essaie de faire des recherches sur le net et avec F1

    Merci et bon courage
    A+

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    TDataSet.DisableControls

    TDataSet Voir aussi Exemple

    Désactive l'affichage des données dans les composants orientés données associés à l'ensemble de données.

    procedure DisableControls;

    Description

    Appelez DisableControls afin d'empêcher l'actualisation des contrôles orientés données à chaque fois que l'enregistrement actif change avant de parcourir un grand nombre d'enregistrements de l'ensemble de données. La désactivation des contrôles empêche le "sautillement" et améliore la rapidité car les données n'ont pas besoin d'être affichées.

    Si les contrôles ne sont pas déjà désactivés, DisableControls enregistre l'état actuel de l'ensemble de données, diffuse le changement d'état à tous les contrôles orientés données associés et aux ensembles de données détail, et incrémente la variable compteur des désactivations. Sinon, DisableControls incrémente simplement la variable compteur des désactivations.

    Le compteur des désactivations est utilisé en interne afin de déterminer si les données sont affichées ou non dans les contrôles orientés données. Lorsque la variable compteur des désactivations est supérieure à zéro, les données ne sont pas mises à jour.

    Si l'ensemble de données est le maître d'une relation maître/détail, l'appel de DisableControls désactive aussi la relation maître/détail. L'initialisation de BlockReadSize au lieu de l'appel de DisableControls actualise les ensembles de données détail pendant que vous faites défiler l'ensemble de données, mais n'actualise pas les contrôles orientés données.

    Remarque*: Les appels à DisableControls peuvent être imbriqués. Quand chaque appel de DisableControls concorde à un appel correspondant de EnableControls, l'ensemble de données met alors à jour les contrôles de données et les ensembles de données détail.
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Membre régulier Avatar de cdlr27
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 96
    Points : 76
    Points
    76
    Par défaut
    Toutes vos réponses sont intéressantes, mais il en reste que mon idée de base n'est pas la bonne car cela fait trop d'irération.

    Il faut que je change de solution.

    En clair, je suis à la recherche de l'événement qui me signalera la fin de la mise à jour de ma DBGRID.

    Celle-ci est connectée sur un DataSource, lui-même sur un ADOQuery.

    Durant l'utilisation, je joue sur la requète SQL et sur le filtre de l'ADOQuery.

    Vos conseils seront toujours les bienvenus.

    Marcel

  7. #7
    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

    En reprenant ton code du 1° post, il suffit de l'encadrer par Disable/EnableControls.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      DBGprod.DataSource.DataSet.DisableControls;
      try
        for i:=0 to DBGprod.DataSource.DataSet.RecordCount - 1 do
        begin
          total := total + FlistProd.QarticleMagasinPrixHT.Value * (FlistProd.QarticleMagasinQuantit.Value - FlistProd.QarticleMagasinNbre.AsInteger);
          FlistProd.QarticleMagasin.Next;
        end;
        LabelTotal.Caption:=' Total HT : '+ CurrToStrF(total,ffCurrency,2);
      finally
        DBGprod.DataSource.DataSet.EnableControls;
      end;
    Voilà !

    @+ Claudius

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    En reprenant ton code du 1° post, il suffit de l'encadrer par Disable/EnableControls.
    tu explique mieux que moi
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Membre régulier Avatar de cdlr27
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 96
    Points : 76
    Points
    76
    Par défaut
    Les amis, avec votre solution que j'avais déjà testé suite à vos conseils, l'écran se fige pendant plus d'une minute, et je finis sur un débordement de pile.
    Because : je reprend la première phrase du post précédent :
    Toutes vos réponses sont intéressantes, mais il en reste que mon idée de base n'est pas la bonne car cela fait trop d'irération.
    Plus de 2000 enregistrements dans ma base.

    La raison est que j'utilise l'évènement : TFListProd.DtArticleDataChange qui se déclenche à chaque enregistrement. TFListProd.QarticleMagasinCalcFields fait de même.

    Que pourrais-je utiliser pour qu'il n'intervienne qu'après la mise à jour de mon DataSet.

    J'avais oublié de préciser :
    Base de donnée ACCESS sous ADO avec DELPHI 7 professionnel

    Marcel

  10. #10
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    trés simple: met les evenement oncalcfield et l'autre à nil
    et à la fin de traitement remet les

    où est tu Cl@udius ??
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    En reprenant ton code du 1° post, il suffit de l'encadrer par Disable/EnableControls.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      DBGprod.DataSource.DataSet.DisableControls;
      try
        for i:=0 to DBGprod.DataSource.DataSet.RecordCount - 1 do
        begin
          total := total + FlistProd.QarticleMagasinPrixHT.Value * (FlistProd.QarticleMagasinQuantit.Value - FlistProd.QarticleMagasinNbre.AsInteger);
          FlistProd.QarticleMagasin.Next;
        end;
        LabelTotal.Caption:=' Total HT : '+ CurrToStrF(total,ffCurrency,2);
      finally
        DBGprod.DataSource.DataSet.EnableControls;
      end;
    Voilà !

    @+ Claudius
    ah à prpos c'est une mauvaise idée de faire le calcul comme sa, fait le en sql sera mieux,
    à toi Claudius d'expliqué tu es
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    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
    Citation Envoyé par edam
    où est tu Cl@udius ??
    à toi Claudius d'expliqué
    Merci Edam

    Citation Envoyé par edam Voir le message
    ah à propos c'est une mauvaise idée de faire le calcul comme sa, fait le en sql sera mieux
    Oui effectivement, Edam a raison.
    En examinant ton code plus en détail (chose que je n'avais pas faite ), et en lisant ce que tu as écrit:
    La raison est que j'utilise l'évènement : TFListProd.DtArticleDataChange qui se déclenche à chaque enregistrement. TFListProd.QarticleMagasinCalcFields fait de même.
    Là forcément, pour peu que ta table soit modérément importante, ça va forcément mettre 3 plombes à s'exécuter.

    Donc oublies le parcours de ta table pour effectuer ton calcul, et exécute plutôt une requête SQL qui sera beaucoup plus rapide.

    Voilà Edam et moi sommes d'accord sur ce point.

    @+ Claudius.

  13. #13
    Membre régulier Avatar de cdlr27
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 96
    Points : 76
    Points
    76
    Par défaut
    Les amis, effectivement, en ajoutant un message dans CalcField & DataChange, j'ai pu déterminer l'instant de déclenchement de chaque.
    CalcField à chaque enregistrement et DataChange aprés la mise à jour du Dataset (donc c'est lui qui m'interesse). Le souci est bien le nombre d'itération de ma boucle. Donc je passe à la requète SQL, mais là, pas moyen de trouver la bonne formule, quand je passe sur le OPEN de ma requète, j'ai un message d'erreur (sur la ligne en question du 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
    // Affiche le nombre d'enregistrements en cours
    procedure TFListProd.DtArticleDataChange(Sender: TObject; Field: TField);
    var som : real;
    begin
      som := 0;
      with TADOQuery.Create(self) do
      try   //finally
        ConnectionString:='Provider=Microsoft.jet.OLEDB.4.0; Data source='+ Bd_donnee +';';
        sql.add('Select QarticleMagasinPrixHT FROM QarticleMagasin');
        try  // except
          open; // defaut 'le moteur de base d edonnées Microsoft Jet ne peut trouver la table ou la requète 'QarticleMAgasin'
          with Fields[0] do
          if IsNull then som := 0
          else begin
            som := AsCurrency ;
          end;
        except
          raise
        end;
      finally
        free;
      end;
      LabelTotal.Caption := ' Total HT du stock : ' + CurrToStrF(som,ffCurrency,2);
      Nbref.Caption:= ' Nombre de références : ' + IntToStr(DBGprod.DataSource.DataSet.RecordCount);
    showmessage ('vérification du moment du DataChange');
    end;
    Je vous situe la situation dans les pièces jointes.
    Le DBGrid (DBGprod) a son Datasource "DtArticle" qui lui a son Dataset "QarticleMAgasin". J'ai mis ces objet dans la forme pour des raisons de facilité sur les traitements qu'ils subissent (évolution de requète et de filtre) en fonction des comboBox de la form.
    J'ai procédé à un essai : je n'ai pas de soucis si je connecte ma requète sur une base du Datamodule qui contient les bases et requètes de mon projet.

    Question : pourquoi ne puis-je accéder à QarticleMagasin situé sur ma form avec ma requète ?.

    Marcel

    Delphi 7 Professionnel avec Access 2003 en ADO
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Comment figer une fenêtre?
    Par fadsys dans le forum PureBasic
    Réponses: 1
    Dernier message: 12/11/2009, 18h47
  2. comment figer une cellule dans VBA
    Par fabien59420 dans le forum Excel
    Réponses: 18
    Dernier message: 30/06/2008, 13h28
  3. [Débutant] Comment utiliser une DBGrid ?
    Par braecking dans le forum Composants VCL
    Réponses: 4
    Dernier message: 07/02/2008, 17h30
  4. Comment figer une Form et l'afficher en plein éecran ?
    Par aaronw dans le forum Composants VCL
    Réponses: 3
    Dernier message: 26/03/2005, 11h09
  5. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18

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