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 :

Le problème de la lenteur du transfert des données vers une autre table


Sujet :

Bases de données Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut Le problème de la lenteur du transfert des données vers une autre table
    bonjour
    language : delphi7
    base de donnees : absolute database

    J'ai besoin d'ajouter de vitesse pour la mise en œuvre de ce code
    Parce que dans le cas où la base de données contient un grand nombre d'enregistrements de mise en œuvre est très lente
    J'ai donc besoin d'un moyen de faire une mise en œuvre rapide
    voila le code qui j'utilisé
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    procedure TForm1.BitBtn2Click(Sender: TObject);
    Var tNM_Client:String;
        tCde_Cne,tCode,tAnnee:integer;
        tPyt:Boolean;
        tMt:real;
    begin
      if MessageDlg('Voulez vous Transfére vos tâche',mtWarning,mbOKCancel,0)=mrOK then begin
      with DM do begin
      begin
        TRecap.Close;
        TRecap.EmptyTable;
        TRecap.Open;
        TRecap.Refresh;
      end;
      end;
      DM.TClient.Open;
      DM.TClient.DisableControls;
      DM.TClient.First;
      while not DM.TClient.Eof do begin
        DM.TProduit.Open;
        DM.TProduit.DisableControls;
        DM.TProduit.First;
        while not DM.TProduit.Eof do
        begin
        {Keep Previous values}
          tMt:=DM.TProduitTaxe_Total.asfloat;
          tCde_Cne:=DM.TProduitCde_Cne.asinteger;
          tCode:=DM.TProduitCode.asinteger;
          tAnnee:=DM.TProduitAnnee.AsInteger;
          tNM_Client:=DM.TProduitNM_Client.AsString;
          tPyt:=DM.TProduitPayement.value;
          DM.TProduit.Next;
              if DM.TRecap.Locate('Code;Annee;Cde_Cne;Payement',vararrayof([tCode,tAnnee,tCde_Cne,tPyt]),[locaseinsensitive,lopartialkey]) then
              begin
                DM.TRecap.Edit;
                DM.TRecapCde_Cne.AsInteger:=tCde_Cne;
                DM.TRecapCode.AsInteger:=tCode;
                DM.TRecapAnnee.AsInteger:=tAnnee;
                DM.TRecapMontant.asfloat:=tMt;
                DM.TRecapNM_Client.AsString:=tNM_Client;
                DM.TRecapPayement.value:=tPyt;
                end
              else
                begin
                  DM.TRecap.Insert;
                  DM.TRecapCode.AsInteger:=tCode;
                  DM.TRecapAnnee.AsInteger:=tAnnee;
                  DM.TRecapCde_Cne.AsInteger:=tCde_Cne;
                  DM.TRecapNM_Client.AsString:=tNM_Client;
                  DM.TRecapPayement.value:=tPyt;
                  DM.TRecapMontant.AsFloat:=tMt;
                  DM.TRecap.Post;
                  DM.TRecap.Refresh;
             DM.TProduit.EnableControls;              
              end;
            end;
     
             DM.TClient.Next;
          DM.TClient.EnableControls ;
        end;
          showMessage('Votre Transfére est Terminé');
      end;
    Close;
    end;

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Désolé d'être sévère mais...

    D'une part, votre code est très mal écrit (indentation, bloc de code, instructions comme DisableControls, EnableControls, Refresh mal placées et mal comprises (regardez l'aide de Delphi), algorithme).

    D'autre part, cette méthode est complètement inadaptée aux transferts en masse !
    En effet, vous réalisez côté application des opérations de tri, recherche, sélection pas à pas et recopie au lieu de faire réaliser cela par le moteur de base de données qui sera infiniment plus efficace. Comment ? par 1 requête SQL du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into RECAP (...)
    select ...
    from PRODUITS P, CLIENT C
    where ...
    Les points de suspension '...' indiquant les éléments à compléter
    Cette requête serait placée dans un composant TABSQuery
    Le site Component Ace fournit plusieurs exemples dont vous pouvez vous inspirer.
    --
    Philippe.
    Philippe.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into RECAP (...)
    select ...
    from PRODUITS P, CLIENT C
    where ...
    Philippe.
    Merci pour l'aide
    Monsieur, ne pas utiliser les instructions SQL ne ne sais pas comment je traite avec cette composante
    J'espère donc que vous, Monsieur, expliquez-moi le contenu du code par lequel il avait attaché
    Je veux dire je veux que vous pour compléter l'instruction à moi que tu m'as donné
    Merci beaucoup

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Monsieur, Si cette méthode ne convient pas pour la conversion de masse de données que vous monsieur
    J'espère que l'erreur appropriée qui y sont contenues, s'il vous plaît
    Avec tout le respect dû à vos efforts et je suis désolé de vous Saspb la perte de votre temps avec moi
    Que dois-je faire si je ne comprends pas
    S'il vous plaît être patient avec vous et me donner même un tempérament simple de votre temps pour corriger ce code
    J'ai besoin d'achever ce processus

    J'attends votre aide ne sera pas quitter ma place même de répondre aux
    Notez que je ne suis pas un programmeur, mais toutes les constatations de l'information dans la programmation a été juste par curiosité

  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
    quel est le type de ta base? FB, paradox....? je crois que c'est paradox ou autre type BD fichier, car tu utilise un emtytable.
    aussi tu utilise un locate pour insertion de masse, puis tu écrase la ligne trouvé,!!!!!!!!!!!!!!!!??????????

    alors, suit le coseilde Ph. B., lis un peut sur les requêtes, le transfert
    la lecture est la meilleur chose pour développé tes cellules grise
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bon,
    Je crois que vous êtes un grand débutant, mais tout le monde l'a été un jour.

    J'ai modifié votre code de manière à ce qu'il soit plus cohérent, plus structuré.
    Je ne garantis pas qu'il réponde exactement à votre besoin qui est assez flou.
    J'ai rajouté des commentaires et désactivé les parties de code inutiles.
    Vous parcourrez la table client sans l'utiliser
    L'instruction TRecap.Locate TRecap.Edit sont à mon avis inutiles en l'état.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    procedure TForm1.BitBtn2Click(Sender: TObject);
    var
      tNM_Client: String;
      tCde_Cne, tCode, tAnnee: Integer;
      tPyt: Boolean;
      tMt: Real;
    begin
      if MessageDlg('Voulez vous transférer vos tâches',
                    mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
        Exit;
     
      // Transfert accepté
      with DM do
      begin
        // Désactiver les contrôles orientés données
        {TClient.DisableControls;}
        TProduit.DisableControls;
        TRecap.DisableControls;
        try
          // Fermeture, vidage, et réouverture de la table
          TRecap.Close;
          TRecap.EmptyTable;
          TRecap.Open;
     
          // Ouverture de la table 'Clients'
          {TClient.Open;}
          // Ouverture de la table 'Produit'
          TProduit.Open;
     
          // Parcours de la table 'Clients'
          {while not TClient.Eof do}
          {begin}
            // On se place sur le 1° produit
            TProduit.First;
            // Parcours de la table 'Produit'
            while not TProduit.Eof do
            begin
              {Keep Previous values}
              tMt := TProduitTaxe_Total.AsFloat;
              tCde_Cne := TProduitCde_Cne.AsInteger;
              tCode := TProduitCode.AsInteger;
              tAnnee := TProduitAnnee.AsInteger;
              tNM_Client := TProduitNM_Client.AsString;
              tPyt := TProduitPayement.AsBoolean;
     
              // L'enregistrement existe ?
              if TRecap.Locate('Code;Annee;Cde_Cne;Payement',
                               VarArrayOf([tCode, tAnnee, tCde_Cne, tPyt]),
                               [loCaseInsensitive, loPartialKey]) then
              begin
                // Oui, on le modifie
                TRecap.Edit;
              end
              else
              begin
                // Non, on en crée un
                TRecap.Insert;
              end;
              // On renseigne les valeurs
              TRecapCde_Cne.AsInteger := tCde_Cne;
              TRecapCode.AsInteger := tCode;
              TRecapAnnee.AsInteger := tAnnee;
              TRecapMontant.Asfloat := tMt;
              TRecapNM_Client.AsString := tNM_Client;
              TRecapPayement.value := tPyt;
              // On enregistre dans la table 'Recap'
              TRecap.Post;
     
              // Produit suivant
              TProduit.Next;
            end;
            // Client suivant
            {TClient.Next;}
          {end;}
          MessageDlg('Votre transfert est terminé.', mtInformation, [mbOk], 0);
        finally
          // Réactiver les contrôles orientés données
          TRecap.EnableControls;
          TProduit.EnableControls;
          {TClient.EnableControls;}
        end;
      end;
      Close;
    end;
    Après, je vous conseille de regarder la documentation relative à Absolute Database ainsi que les exemples de code en suivant les liens :
    Manuel d'utilisation
    Exemples de code
    Exemples SQL
    --
    Philippe.
    Philippe.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bon,
    Je crois que vous êtes un grand débutant, mais tout le monde l'a été un jour.

    J'ai modifié votre code de manière à ce qu'il soit plus cohérent, plus structuré.
    Je ne garantis pas qu'il réponde exactement à votre besoin qui est assez flou.
    J'ai rajouté des commentaires et désactivé les parties de code inutiles.
    Vous parcourrez la table client sans l'utiliser
    L'instruction TRecap.Locate TRecap.Edit sont à mon avis inutiles en l'état.

    Philippe.
    Je vous remercie beaucoup sur l'amendement
    Mais l'amendement empêche un seul enregistrement d'une table de TClient

    J'ai besoin de convertir tous les enregistrements d'une table avec tous les dossiers liés à TClient TProduit
    Pour l'agenda de TRecap
    Et merci encore pour votre peine avec moi
    J'espère avoir réussi à expliquer le besoin
    Je suis obligé de lever la facilité à remplir par exemple d'explication
    et voila le lien de fichier d'execution de mon exemple
    zSHARE - Project1.rar - Free File Hosting Service | Audio and Video Sharing | Image Uploading | Web storage

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par medreg Voir le message
    Je vous remercie beaucoup sur l'amendement
    Mais l'amendement empêche un seul enregistrement d'une table de TClient

    J'ai besoin de convertir tous les enregistrements d'une table avec tous les dossiers liés à TClient TProduit
    Pour l'agenda de TRecap
    Et merci encore pour votre peine avec moi
    J'espère avoir réussi à expliquer le besoin
    Je suis obligé de lever la facilité à remplir par exemple d'explication
    et voila le lien de fichier d'execution de mon exemple
    zSHARE - Project1.rar - Free File Hosting Service | Audio and Video Sharing | Image Uploading | Web storage
    Est-ce le problème est compris ou la demande n'est pas claire
    Pourquoi n'avez vous pas revenir à cela, je besoin de répondre

  9. #9
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut DisableControls avant open pour voir
    DisableControls

    bonjour


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      DM.TClient.DisableControls;
    DM.TClient.Open;
    Cordialement

  10. #10
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par medreg Voir le message
    Est-ce le problème est compris ou la demande n'est pas claire
    Disons que l'expression de votre pensée (via un outil de traduction automatique ?) impose un travail supplémentaire d'analyse...
    Citation Envoyé par medreg Voir le message
    Pourquoi n'avez vous pas revenir à cela, je besoin de répondre
    Je vous ai donné un squelette de code où j'ai corrigé ce qui était mal placé et erroné. J'ai mis en commentaire du code inutile en l'état, mais il vous suffit d'enlever les commentaires et de le compléter pour terminer votre travail en vous inspirant de ce qui est déjà proposé...

    En conclusion, je veux bien vous aider et corriger ce qui est mal écrit, mais pas faire votre travail ! et j'ai la nette impression que c'est cela que vous attendez...
    --
    Philippe.
    Philippe.

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Disons que l'expression de votre pensée (via un outil de traduction automatique ?) impose un travail supplémentaire d'analyse...
    Je vous ai donné un squelette de code où j'ai corrigé ce qui était mal placé et erroné. J'ai mis en commentaire du code inutile en l'état, mais il vous suffit d'enlever les commentaires et de le compléter pour terminer votre travail en vous inspirant de ce qui est déjà proposé...

    En conclusion, je veux bien vous aider et corriger ce qui est mal écrit, mais pas faire votre travail ! et j'ai la nette impression que c'est cela que vous attendez...
    --
    Philippe.
    Respecté gratitude Monsieur Philippe à vous tous et vous remercier pour tous vos efforts pour aider, mais, Monsieur, J'ai besoin de vous aider beaucoup
    Je n'ai pas arriver au résultat à la mesure désormais
    J'ai besoin de votre aide

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par alheuredudejeuner Voir le message
    DisableControls

    bonjour


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      DM.TClient.DisableControls;
    DM.TClient.Open;
    Cordialement
    Monsieur
    j'ai ajouté
    dm.TClient.disablecontrols; et DM.Tclient.Open;
    mais le problème il reste toujour

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour,

    Tu n'as pas relu les explications et le commentaire de Ph. B..

    Comment veux-tu utiliser une itération sur la table client puisque tu ne l'utilise pas...

    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
    procedure TForm1.BitBtn2Click(Sender: TObject);
    Var tNM_Client:String;
        tCde_Cne,tCode,tAnnee:integer;
        tPyt:Boolean;
        tMt:real;
    begin
      if MessageDlg('Voulez vous Transfére vos tâche',mtWarning,mbOKCancel,0)=mrOK then begin
      with DM do begin
      begin
        TRecap.Close;
        TRecap.EmptyTable;
        TRecap.Open;
        TRecap.Refresh;
      end;
      end;
      DM.TClient.Open;
      DM.TClient.DisableControls;
      DM.TClient.First;
      while not DM.TClient.Eof do begin
    //
    // TU N'UTILISES PAS DM.Tclient !!!!!
    //
      end;
    A quoi sert donc ta boucle while not DM.TClient.Eof do begin puisque tu n'utuilise jamais les valeurs de DM.TClient ????

    Règle déjà ce problème ensuite on pourra comprendre.

    a+

Discussions similaires

  1. [MySQL] Transfert des données vers une BDD
    Par johnrock dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/02/2013, 01h23
  2. [JMS] [ActiveMQ] Transfert des messages vers une autre queue
    Par austin P. dans le forum Java EE
    Réponses: 0
    Dernier message: 02/06/2009, 15h16
  3. insert des données sur une autre table
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 18/02/2009, 15h21
  4. update avec des données d'une autre table
    Par corto31 dans le forum Requêtes
    Réponses: 13
    Dernier message: 10/07/2008, 16h40
  5. Réponses: 3
    Dernier message: 09/12/2007, 18h07

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