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 :

Conseil d'optimisation de requete


Sujet :

Bases de données Delphi

  1. #1
    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 Conseil d'optimisation de requete
    Bonjour à toutes et à tous,

    Voilà j'ai besoin dans mon applicatif de réaliser des requetes updates.
    Il arrivera souvent un nombre important de requete.

    A ce jour cela fonctionne mais devenir super lent à l'exécution.

    Je m'explique.

    J'ai une tables Article comportant 40000 article, j'ai besoin d'ajouter par exemple un suffixe au code article genre
    code avant := DF-44544
    Code apres := RTDF-44544
    Pour ce faire je doit évidement changer le code par un update dans la table article mais également sur 39 autres tables ce référent à ce code.

    Donc 40000 * 39 = 1 560 000 Update (et je peux pas faire autrement)

    Je voudrais savoir si je mis prends bien et is il n'existe pas des méthodes super rapide pour régler mon problème.

    1) voilà la procédure qui execute les requetes

    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
    procedure TForm1.ExecuterRequete(xTableDeRef, xChampDeRef, xParam: String;Req: Array of String);
    Var
      i: Integer;
    Begin
      With DataModule1.ADOQry2 do
      Begin
        Sql.Clear;
        Sql.Add('SELECT * FROM '+ xTableDeRef);
        Sql.Add('ORDER BY ' + xChampDeRef);
        Try
          Open;
          First;
          Application.ProcessMessages;
          With JvXPProgressBar1 do
          Begin
            Visible := True;
            Min := 0;
            Max := Recordset.RecordCount;
            Position := 0;
          end;
          While not Eof do // On parcours la table xTabledeRef
          Begin
            for i:= Low(Req) to high(Req) do
            Begin
              With DataModule1.ADOQry1 do
              Begin
                SQL.Clear;
                SQL.Add(Req[i]);
                Parameters.ParamByName('Param1').Value := xParam+DataModule1.ADOQry2.Fields.FieldByName('Code').AsString;
                Parameters.ParamByName('Param2').Value := DataModule1.ADOQry2.Fields.FieldByName('Code').AsString;
                Try
                  ExecSQL;  // On execute les 39 mise à jour pour le code encours
                Finally
                  Close;
                end;
              end;
            end;
            Application.ProcessMessages;
            JvXPProgressBar1.Position := JvXPProgressBar1.Position + 1;
            Next; // Article suivant
          end;
        finally
          Close;
        end;
      end;
    end;

    2) voilà l'appel à la requete

    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
     
    ExecuterRequete('Article','Code',EditCritere1.text,
    [
    'UPDATE '+TableArticle[0]+' Set '+TableArticle[0]+'.'+ChampsArticle[0]+ ' = :Param1 Where ' + TableArticle[0] +'.' + ChampsArticle[0]+ ' = :Param2',
    'UPDATE '+TableArticle[1]+' Set '+TableArticle[1]+'.'+ChampsArticle[1]+ ' = :Param1 Where ' + TableArticle[1] +'.' + ChampsArticle[1]+ ' = :Param2',
    'UPDATE '+TableArticle[2]+' Set '+TableArticle[2]+'.'+ChampsArticle[2]+ ' = :Param1 Where ' + TableArticle[2] +'.' + ChampsArticle[2]+ ' = :Param2',
    'UPDATE '+TableArticle[3]+' Set '+TableArticle[3]+'.'+ChampsArticle[3]+ ' = :Param1 Where ' + TableArticle[3] +'.' + ChampsArticle[3]+ ' = :Param2',
    'UPDATE '+TableArticle[4]+' Set '+TableArticle[4]+'.'+ChampsArticle[4]+ ' = :Param1 Where ' + TableArticle[4] +'.' + ChampsArticle[4]+ ' = :Param2',
    'UPDATE '+TableArticle[5]+' Set '+TableArticle[5]+'.'+ChampsArticle[5]+ ' = :Param1 Where ' + TableArticle[5] +'.' + ChampsArticle[5]+ ' = :Param2',
    'UPDATE '+TableArticle[6]+' Set '+TableArticle[6]+'.'+ChampsArticle[6]+ ' = :Param1 Where ' + TableArticle[6] +'.' + ChampsArticle[6]+ ' = :Param2',
    'UPDATE '+TableArticle[7]+' Set '+TableArticle[7]+'.'+ChampsArticle[7]+ ' = :Param1 Where ' + TableArticle[7] +'.' + ChampsArticle[7]+ ' = :Param2',
    'UPDATE '+TableArticle[8]+' Set '+TableArticle[8]+'.'+ChampsArticle[8]+ ' = :Param1 Where ' + TableArticle[8] +'.' + ChampsArticle[8]+ ' = :Param2',
    'UPDATE '+TableArticle[9]+' Set '+TableArticle[9]+'.'+ChampsArticle[9]+ ' = :Param1 Where ' + TableArticle[9] +'.' + ChampsArticle[9]+ ' = :Param2',
    'UPDATE '+TableArticle[10]+' Set '+TableArticle[10]+'.'+ChampsArticle[10]+ ' = :Param1 Where ' + TableArticle[10] +'.' + ChampsArticle[10]+ ' = :Param2',
    'UPDATE '+TableArticle[11]+' Set '+TableArticle[11]+'.'+ChampsArticle[11]+ ' = :Param1 Where ' + TableArticle[11] +'.' + ChampsArticle[11]+ ' = :Param2',
    'UPDATE '+TableArticle[12]+' Set '+TableArticle[12]+'.'+ChampsArticle[12]+ ' = :Param1 Where ' + TableArticle[12] +'.' + ChampsArticle[12]+ ' = :Param2',
    'UPDATE '+TableArticle[13]+' Set '+TableArticle[13]+'.'+ChampsArticle[13]+ ' = :Param1 Where ' + TableArticle[13] +'.' + ChampsArticle[13]+ ' = :Param2',
    'UPDATE '+TableArticle[14]+' Set '+TableArticle[14]+'.'+ChampsArticle[14]+ ' = :Param1 Where ' + TableArticle[14] +'.' + ChampsArticle[14]+ ' = :Param2',
    'UPDATE '+TableArticle[15]+' Set '+TableArticle[15]+'.'+ChampsArticle[15]+ ' = :Param1 Where ' + TableArticle[15] +'.' + ChampsArticle[15]+ ' = :Param2',
    'UPDATE '+TableArticle[16]+' Set '+TableArticle[16]+'.'+ChampsArticle[16]+ ' = :Param1 Where ' + TableArticle[16] +'.' + ChampsArticle[16]+ ' = :Param2',
    'UPDATE '+TableArticle[17]+' Set '+TableArticle[17]+'.'+ChampsArticle[17]+ ' = :Param1 Where ' + TableArticle[17] +'.' + ChampsArticle[17]+ ' = :Param2',
    'UPDATE '+TableArticle[18]+' Set '+TableArticle[18]+'.'+ChampsArticle[18]+ ' = :Param1 Where ' + TableArticle[18] +'.' + ChampsArticle[18]+ ' = :Param2',
    'UPDATE '+TableArticle[19]+' Set '+TableArticle[19]+'.'+ChampsArticle[19]+ ' = :Param1 Where ' + TableArticle[19] +'.' + ChampsArticle[19]+ ' = :Param2',
    'UPDATE '+TableArticle[20]+' Set '+TableArticle[20]+'.'+ChampsArticle[20]+ ' = :Param1 Where ' + TableArticle[20] +'.' + ChampsArticle[20]+ ' = :Param2',
    'UPDATE '+TableArticle[21]+' Set '+TableArticle[21]+'.'+ChampsArticle[21]+ ' = :Param1 Where ' + TableArticle[21] +'.' + ChampsArticle[21]+ ' = :Param2',
    'UPDATE '+TableArticle[22]+' Set '+TableArticle[22]+'.'+ChampsArticle[22]+ ' = :Param1 Where ' + TableArticle[22] +'.' + ChampsArticle[22]+ ' = :Param2',
    'UPDATE '+TableArticle[23]+' Set '+TableArticle[23]+'.'+ChampsArticle[23]+ ' = :Param1 Where ' + TableArticle[23] +'.' + ChampsArticle[23]+ ' = :Param2',
    'UPDATE '+TableArticle[24]+' Set '+TableArticle[24]+'.'+ChampsArticle[24]+ ' = :Param1 Where ' + TableArticle[24] +'.' + ChampsArticle[24]+ ' = :Param2',
    'UPDATE '+TableArticle[25]+' Set '+TableArticle[25]+'.'+ChampsArticle[25]+ ' = :Param1 Where ' + TableArticle[25] +'.' + ChampsArticle[25]+ ' = :Param2',
    'UPDATE '+TableArticle[26]+' Set '+TableArticle[26]+'.'+ChampsArticle[26]+ ' = :Param1 Where ' + TableArticle[26] +'.' + ChampsArticle[26]+ ' = :Param2',
    'UPDATE '+TableArticle[27]+' Set '+TableArticle[27]+'.'+ChampsArticle[27]+ ' = :Param1 Where ' + TableArticle[27] +'.' + ChampsArticle[27]+ ' = :Param2',
    'UPDATE '+TableArticle[28]+' Set '+TableArticle[28]+'.'+ChampsArticle[28]+ ' = :Param1 Where ' + TableArticle[28] +'.' + ChampsArticle[28]+ ' = :Param2',
    'UPDATE '+TableArticle[29]+' Set '+TableArticle[29]+'.'+ChampsArticle[29]+ ' = :Param1 Where ' + TableArticle[29] +'.' + ChampsArticle[29]+ ' = :Param2',
    'UPDATE '+TableArticle[30]+' Set '+TableArticle[30]+'.'+ChampsArticle[30]+ ' = :Param1 Where ' + TableArticle[30] +'.' + ChampsArticle[30]+ ' = :Param2',
    'UPDATE '+TableArticle[31]+' Set '+TableArticle[31]+'.'+ChampsArticle[31]+ ' = :Param1 Where ' + TableArticle[31] +'.' + ChampsArticle[31]+ ' = :Param2',
    'UPDATE '+TableArticle[32]+' Set '+TableArticle[32]+'.'+ChampsArticle[32]+ ' = :Param1 Where ' + TableArticle[32] +'.' + ChampsArticle[32]+ ' = :Param2',
    'UPDATE '+TableArticle[33]+' Set '+TableArticle[33]+'.'+ChampsArticle[33]+ ' = :Param1 Where ' + TableArticle[33] +'.' + ChampsArticle[33]+ ' = :Param2',
    'UPDATE '+TableArticle[34]+' Set '+TableArticle[34]+'.'+ChampsArticle[34]+ ' = :Param1 Where ' + TableArticle[34] +'.' + ChampsArticle[34]+ ' = :Param2',
    'UPDATE '+TableArticle[35]+' Set '+TableArticle[35]+'.'+ChampsArticle[35]+ ' = :Param1 Where ' + TableArticle[35] +'.' + ChampsArticle[35]+ ' = :Param2',
    'UPDATE '+TableArticle[36]+' Set '+TableArticle[36]+'.'+ChampsArticle[36]+ ' = :Param1 Where ' + TableArticle[36] +'.' + ChampsArticle[36]+ ' = :Param2',
    'UPDATE '+TableArticle[37]+' Set '+TableArticle[37]+'.'+ChampsArticle[37]+ ' = :Param1 Where ' + TableArticle[37] +'.' + ChampsArticle[37]+ ' = :Param2',
    'UPDATE '+TableArticle[38]+' Set '+TableArticle[38]+'.'+ChampsArticle[38]+ ' = :Param1 Where ' + TableArticle[38] +'.' + ChampsArticle[38]+ ' = :Param2',
    'UPDATE '+TableArticle[39]+' Set '+TableArticle[39]+'.'+ChampsArticle[39]+ ' = :Param1 Where ' + TableArticle[39] +'.' + ChampsArticle[39]+ ' = :Param2'
    ]);
    3) voilà les array de string déclarer en var dans le form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      TableArticle: Array[0..39] of String = ('Table1','Table2','Table3',etc...);
      ChampsArticle: Array[0..39] of String = ('Code','Cd','Code',etc...);

    Il y a-t-il pluis rapide que cela ?

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Avec quel SGBD travailles-tu ?
    As-tu des relations d'intégrité référentielle entre ta table Article et les champs correspondants des 39 autres tables ? Parce qu'il suffit que tes relations aient la clause ON UPDATE CASCADE pour que tu n'aies plus à gérer que ta table Article, lees autres mises à jour se feront... en cascade.
    Roland

  3. #3
    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
    Citation Envoyé par rsc Voir le message
    Avec quel SGBD travailles-tu ?
    As-tu des relations d'intégrité référentielle entre ta table Article et les champs correspondants des 39 autres tables ? Parce qu'il suffit que tes relations aient la clause ON UPDATE CASCADE pour que tu n'aies plus à gérer que ta table Article, lees autres mises à jour se feront... en cascade.
    Salut rsc,

    je suis sur des bases Access 97 et 2003.
    Evidement je n'ai pas de clause de ce type se serait le pied !! lol

    Merci

  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
    Apparemment cela pourrait exister sous Access (à prendre très au conditionnel).

    Néanmoins une idée pour régler ça serait de ne plus gérer un code changeant en tant que clé primaire (qui normalement n'est jamais sensée bouger justement) et gérer un id de type entier auto-incrémenté en plus du code. Ainsi quand tu changes le code, les liens entre les tables qui utilisent l'id n'ont pas besoin d'être mis à jour.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Il semble bien que ça existe sous Access. A vérifier si ça marche avec Access 97.

    [Aka Guymelef] Ta remarque est tout à fait juste. Une clé primaire qui a une signification particulière finit toujours par poser problème, même si on vous a juré que jamais il n'y aurait à la changer
    Roland

  6. #6
    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
    Je doit recentré ma problèmatique :

    Je n'ai pas le choix, la base de données n'ai aucunement créé par mes soins, je créé un utilitaire pour des logiciels à base d'access, je n'ai ni concu ni créé ces bases.
    Je connais simplement l'ensemble des tables et des champs, c'est pourquoi je peux pré-paramétrés les modifications par des Array de string qui deviennent en suite des requetes update.


  7. #7
    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
    Dans ce cas si tu ne peux pas toucher au modèle en quoi que soit j'ai peur que tu ne vas plus devoir prier qu'on ne fasse pas trop souvent cet exercice.

    Cela étant j'ai regarder le code de ta méthode d'exécution sql et je pense qu'au lieu d'exécuter requête par requête tes update tu devrais toutes les concaténées en un seul bloc SQL et faire un seul appel. Cela t'économiseras déjà une quantité de temps lié au transport.

    Le must ce serait d'encapsuler toutes ces requêtes avec une transaction par sécurité mais je ne me rappelles pas si c'est possible avec Access ()
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  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 170
    Points
    4 170
    Par défaut
    C'est le même préfix que tu ajoutes à tous les enregistrements de la table ?

    Si c'est le cas, tu n'as pas besoin de faire une requête par ligne. Il suffit d'un update global sur la table :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update Articles
    set code = 'PREFIX' + code

    Ce sera beaucoup plus rapide que de faire une requête par ligne... Si ce n'est pas le même préfix pour chaque enregistrement, il faudrait voir si tu n'as pas moyen néanmoins de calculer ce préfix dans la requête pour ne faire qu'une seule et unique requête.

    Par contre, a moins de l'UPDATE CASCADE, tu devras toujours fare au moins une requête par table à mettre à jour...

  9. #9
    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
    Merci à vous,

    Franck :
    C'est le même préfix que tu ajoutes à tous les enregistrements de la table ?
    je le fais sur 39 tables des fois c'est un champs code d'autre fois c'est codeelem etc...

    J'ai bien conscience de l'obligation de devoir effectuer 1 requete UPDATE par table.

    Aka :
    Cela étant j'ai regarder le code de ta méthode d'exécution sql et je pense qu'au lieu d'exécuter requête par requête tes update tu devrais toutes les concaténées en un seul bloc SQL et faire un seul appel
    J'aimerais bien voir une requete udpdate qui en comporte plusieur, sache que c'est 39 tables différente avec des champs pas toujours identique ?

    tu à un exemple de concaténation d'UPDATE de ce type ?

    MErci à vous

    EDIT : ok je viens de voir l'histoire de la concaténation je regarde le gain et je re.

  10. #10
    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
    bon,

    Je viens d'essayer mais je ton sur une erreur

    Objet Parameter défini de manière incorrecte. Des informations incohérentes ou incomplètes ont été fournies

    Voici la modif que j'ai faite :

    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
                for i:= Low(Req) to high(Req) do
                Begin
                  ConcatenationReq := ConcatenationReq + Req[i] + ' ;'+#13+#10;
                end;
                  With DataModule1.ADOQry1 do
                  Begin
                    SQL.Clear;
                    Sql.Add(ConcatenationReq);
    //                SQL.Add(Req[i]);
                    Parameters.ParamByName('Param1').Value := ActiveParam;
                    Parameters.ParamByName('Param2').Value := ArticleEnCours;
                    Try
                      Try
                        ExecSQL;
                      Except
    Quel syntaxe ?

  11. #11
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Buzz,

    Il va falloir que tu affiche la requête avant l'ExecSQL (un ShowMessage) et que tu poste ici le code afin d et'aider.

    A+
    On progresse .....

  12. #12
    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
    Buzz, tu as mal compris ce que je voulais dire visiblement.

    L'idée que j'indiquais était de ne pas faire un ExecSQL par requête mais de concaténer toutes les requêtes dans un string puis de passer ce string à l'ADOQuery pour qu'il fasse l'exécution.

    Evidemment cela implique que tu vas devoir générer toi même les reuqêtes et ne plus utiliser le systèmes de paramètres de l'ADOQuery (à remplacer par toi même dans la chaîne).
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  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
    Salut,

    AKa :
    C'est exactement ce que je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
               for i:= Low(Req) to high(Req) do
                Begin
                  ConcatenationReq := ConcatenationReq + Req[i] + ' ;'+#13+#10;
                end;
                  With DataModule1.ADOQry1 do
                  Begin
                    SQL.Clear;
                    Sql.Add(ConcatenationReq);
    non ?


    Andry :
    Concatenation Req donne ce genre de chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE Fichier Set Fichier.Code = :Param1 Where Fichier.Code = :Param2;
    UPDATE Client Set Client.Code = :Param1 Where Client.Code = :Param2;
    UPDATE Article Set Article.Code = :Param1 Where Article.Code = :Param2;
    etc...
    Avec un #13+#10 au bout de chaque ligne. de toute façon j'ai tout essayer avec/sans ';' avec/sans ',' avec/sans :Param1 (remplacer par un quotestr()) avec/sans #13 ou/et #10
    Aucune syntaxe ne correspond, en cherchant j'ai rien vue qui fonctionne sous access en fait.

    Merci.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    je prend le fil en cours de route . De toute façon apparemment tu es obligé de faire les 39 updates si tu n'as pas un serveur de base de données (Access donc) les 39 updates seront bien lancés sur le poste .
    La question n'est peut être donc pas "d'optimiser une requête" , difficile de faire plus simple que
    UPDATE MATABLE SET MONCHAMP=MAVALEUR WHERE MACONDITION
    ce qui cloche si j'ai bien compris c'est le temps d'exécution de ces requêtes qui seront faites 'sequentiellement' (que ce soit dans un script ou une a une)
    L'astuce est peut être là dans le mot séquentiel et si tu faisais un thread par requête ?

    pour rire : et si tu utilisais une base de données comme Firebird
    tu sais mon amour immodéré pour Access
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    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
    Citation Envoyé par SergioMaster Voir le message
    ...
    L'astuce est peut être là dans le mot séquentiel et si tu faisais un thread par requête ?
    J'ai 3 questions qui me viennent :

    Si un thread est lancé pour 1 requete parmis les 39 sachant que ces requetes se réalisent en parcourant une table.
    Je me ré-explique : J'ai une table de référence de 40000 (defois + defois -) codes différents et pour chaque code je ferais les 39 requetes (t'imagine le nbr)
    1) Est-ce que je vais pas alourdire la mémoire du poste ?
    2) dois-je faire un Thread pour les 39 requetes ou 1 par 1, sache qu'elles se font par le biais d'un autre table
    3) Ta un exemple de thread de requete ?


    vive Access.... mdr

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    salut,

    j'ai bien compris ton problème d'Acces

    c'est pas de thread de requête que je parlais mais de thread(s) dans le programme quant au nombre a toi de voir 39 , 10 avec 4 requête par thread etc ... enfin ce que j'en dit , c'est pour faire avancer le shimilibilic

    hélas non je n'ai pas de code en stock
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  17. #17
    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
    Alors l'idée du thread me parait pas mal.

    Mais en tout honnéter j'en ai jamais utilisé, existe-t-il un exemple sur un thread qui traiterait des requetes ? un lien ?

    Merci.

    PS : si tu veux guerrire vite j'ai une serringue d'ACCESS !!

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    existe-t-il un exemple sur un thread qui traiterait des requetes ? un lien ?
    des requêtes non, mais si tu as JVCL tu as un exemple de thread multiples
    l'exemple bouncing balls me parait pas mal , à la place des balles tu lis requête et tu commences à avoir une idée

    non pas de seringues je préfère ce genre de liquide
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    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
    Bon,

    J"ai rien trouvé de plus rapide, sans passé par un Thread.
    J'ai lu des infos sur la FAQ concernant des requetes envoyé dans un thread.

    J'ai regardé également la jvcl Serge et merci.

    Pour en finir par me dire, que je ne souhaite pas redonner la main à l'utilisateur pendant le traitement.
    Alors j'ai mis un panel principal enabled à false et je balance des ProccessMessages.

    Merci pour toutes vos idées et remarque

    PS : concaténation de SQL avec Access 97 ou autre !!! toujours pas trouvé...

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Lâcheur

    par concaténation tu veux pas plutôt dire Exécution d'un script (soit un ensemble de SQL ) ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  2. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  3. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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