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

Composants VCL Delphi Discussion :

Optimiser un ClientDataSet


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut Optimiser un ClientDataSet
    Bonjour, je recherche comment je pourrais optimiser le bout de code suivant. Pour vous mettre dans le contexte, j'ai une application qui, par le biais d'un SDK, donne accès à sa base de donnée. Je développe une applications tiers qui lit dans cette base de donnée et qui met les informations dans un DBGrid. Par contre, avec environ 10 000 records, cette opération prend environ 10 secondes ce qui est beaucoup trop long. Y'a-t-il moyen d'accélérer cette opération?

    Merci beaucoup pour votre aide!

    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
    41
    42
    43
    44
    45
    procedure TForm5.LoadProductList;
    var
      //Déclaration de l'interface
      ProductData : Product;
      //Déclaration des variables
      Error        : Longint;
      Compteur     : Longint;
      i            : Longint;
      Acomba       : AcombaX;
    begin
     
      Acomba := CoAcombaX.Create;
     
      //Initialisation de CustomerData
      ProductData := CoProduct.Create;
     
      //Déterminer le nombre total de fiches de client
      Error := Acomba.NumCards(ProductData, Compteur);
     
      ClientDataSet1.DisableControls;
     
      if Error = 0 then
      begin
        //Consulter les fiches une à une dans le fichier des clients
        for i := 1 to Compteur do
        begin
          Error := Acomba.GetCard(ProductData, i);
          if Error = 0 then
          begin
            //Affichage des clients actifs seulement
            if ProductData.PrActive <> 0 then
            begin
              ClientDataSet1.InsertRecord([ProductData.PrNumber, ProductData.PrDescription[1], ProductData.PrProductGroupNumber, ProductData.PrSortKey[1], ProductData.PrSortKey[2], '', '', '', ProductData.PrQtyOnHand, ProductData.PrQtyOrdered, ProductData.PrQtyPurchasing, ProductData.PrUnique]);
            end;
          end
          else
            ShowMessage('Erreur: ' + Acomba.GetErrorMessage(Error));
        end;
      end
      else
        ShowMessage('Erreur: ' + Acomba.GetErrorMessage(Error));
     
      ClientDataSet1.EnableControls;
      DBGrid1.DataSource.DataSet.First();
    end;

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Je ne suis pas sur d'avoir compris ton appli. mais je pense que ton
    DBGrid1 a comme DataSet ton ClientDataSet1 non ?
    Si c'est la cas tu peux essayer d'affecter ClientDataSet1 à ton DBGrid1 à la fin seulement de la boucle dans ton code.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut
    Bonjour, tout dabord, merci pour la réponse!

    En fait, j'ai un DBGrid1 qui a comme DataSource: DataSource1 et le datasource et lié à mon dataset (ClientDataSet1).

    J'ai essayé en n'affectant le ClientDataSet1 seulement qu'après la boucle, mais sa semble aussi long. Est-ce que j'utilise les bon composants? Sont-il lié de la bonne manière?

    Merci

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Vu que tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ProductData.PrActive <> 0 then
    Cela veut dire que dans tes 10 000 enregistrements une partie ne sont pas à traiter.
    Si tu veux gagner un peu de temps, il serait bon de filtrer cette entrée de manière à ne traiter que les cas qui t'interesse.
    Ca fera des

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error := Acomba.GetCard(ProductData, i);
    En moins pour le traitement.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut
    Bonjour Rayek, merci pour la réponse. Je ne peut malheureusement pas filtrer cette requête car le SDK ne me le permet pas. Sur la liste des 10 000 produits, il y a peut-être 10 produits qui sont inactif, donc je ne croit pas que le problème vient de ceci. Je vais tout de même essayé d'auter cette vérification voir si la vitesse sera mieux. Je suis sur qu'il est possible que cette liste s'ouvre très rapidement (moins que 1 secondes, à compararer au 10 secondes que sa prend présentement) car j'ai vu des applications utilisant ce SDK le faire très rapidement.

    Encore une fois, merci de m'aider!

  6. #6
    Membre Expert

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

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

    pour moi le problème est que tu fais un aller-retour client/server pour chacune de tes lignes de produits, et pour 10000 produits c'est sûr que tu plombe tes temps de réponses de même que ton réseau par la même occasion. Je pense qu'il faudrait plutôt que tu t'orientes à rechercher dans ton SDK s'il ne permet pas de ramener une liste de produit directement plutôt que de devoir aller chercher élément par élément.

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  3. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 13h27
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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