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

Requêtes et SQL. Discussion :

incorpore requete suivi d'une requete mise a jour dans vba


Sujet :

Requêtes et SQL.

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut incorpore requete suivi d'une requete mise a jour dans vba
    bonjour

    j'ai une requete de selection "mise a jour publipostage2" et une requete de mise a jour.

    je souhaite tous transformé en vba pour allégé ma base de donnée
    j'ai réusi a convertir la requete de mise a jour en vba mais je ne sais pas comment faire pour la requete de selection "mise a jour publipostage2" et faire que la requete de mise a jour pointe vers la requete de selection.

    voila la requete de selection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT recherAF_ETAT.NUM_LOGE, CLIENT.NUM_OPERATION, recherAF_ETAT.Solde AS Montant_Appel, CLIENT.TITREBIS_CLIENT, CLIENT.NOMBIS_CLIENT, CLIENT.PRENOMBIS_CLIENT, CLIENT.ADRESSE_CLIENT, CLIENT.ADRESSE2_CLIENT, CLIENT.CP_CLIENT, CLIENT.VILLE_CLIENT, CLIENT.CIVIL_CLIENT, CLIENT.NOMBQ_CLIENT, CLIENT.ADRESSEBQ_CLIENT, CLIENT.ADRESSEBQ2_CLIENT, CLIENT.CPBQ_CLIENT, CLIENT.VILLEBQ_CLIENT, CLIENT.NUMPRET, IIf([NUM_APPEL]=2,"aaa",IIf([NUM_APPEL]=3,"du Plancher haut RDC",IIf([NUM_APPEL]=4,"Menuiseries extérieures posées",IIf([NUM_APPEL]=5,"Remise des cles","ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR")))) AS AVANCEMENT1, IIf([NUM_APPEL]=2,"aaa",IIf([NUM_APPEL]=3,"PLANCHER HAUT RDC",IIf([NUM_APPEL]=4,"MENUISERIES EXTERIEURES POSEES",IIf([NUM_APPEL]=5,"REMISE DES CLES","ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR")))) AS AVANCEMENT2, IIf([ETALE]=1,IIf([NUM_APPEL]=1,[OUVERTURE_POURCE],IIf([NUM_APPEL]=2,[ACHEVEMENT_FONDATATION_POURCE]+[OUVERTURE_POURCE],IIf([NUM_APPEL]=3,[ACHEVEMENT_FONDATATION_POURCE]+[OUVERTURE_POURCE]+[PLANCHERHAUT_RDC_POURCE],IIf([NUM_APPEL]=4,[ACHEVEMENT_FONDATATION_POURCE]+[OUVERTURE_POURCE]+[PLANCHERHAUT_RDC_POURCE]+[MENUISERIE_POURCE],IIf([NUM_APPEL]=5,[ACHEVEMENT_FONDATATION_POURCE]+[OUVERTURE_POURCE]+[PLANCHERHAUT_RDC_POURCE]+[MENUISERIE_POURCE]+[REMISE_CLES_POURCE],0))))),0) AS CUMUL1, IIf([ETALE]=2,IIf([NUM_APPEL]=1,[OUVERTURE_POURCE2],IIf([NUM_APPEL]=2,[ACHEVEMENT_FONDATATION_POURCE2]+[OUVERTURE_POURCE2],IIf([NUM_APPEL]=3,[ACHEVEMENT_FONDATATION_POURCE2]+[OUVERTURE_POURCE2]+[PLANCHERHAUT_RDC_POURCE2],IIf([NUM_APPEL]=4,[ACHEVEMENT_FONDATATION_POURCE2]+[OUVERTURE_POURCE2]+[PLANCHERHAUT_RDC_POURCE2]+[MENUISERIE_POURCE2],IIf([NUM_APPEL]=5,[ACHEVEMENT_FONDATATION_POURCE2]+[OUVERTURE_POURCE2]+[PLANCHERHAUT_RDC_POURCE2]+[MENUISERIE_POURCE2]+[REMISE_CLES_POURCE2],0))))),0) AS CUMUL2, [CUMUL1]+[CUMUL2] AS CUMULAF, ORGAFINANCIER.NOM_ORGAFINANCIER, RIB_ORGAFINANCIER.CODE_BANQUE, RIB_ORGAFINANCIER.CODE_GUICHET, RIB_ORGAFINANCIER.N_COMPTE, RIB_ORGAFINANCIER.CLE_RIB, OPERATION.Photos, OPERATION.NOM_OPERATION, OPERATION.ADRESSE_OPERATION, OPERATION.VILLE_OPERATION, OPERATION.CP_OPERATION, CLIENT.APPORT_PERSO
    FROM ORGAFINANCIER INNER JOIN ((OPERATION INNER JOIN (recherAF_ETAT INNER JOIN CLIENT ON recherAF_ETAT.NUM_CLIENT = CLIENT.NUM_CLIENT) ON (OPERATION.NUM_OPERATION = CLIENT.NUM_OPERATION) AND (OPERATION.NUM_OPERATION = recherAF_ETAT.NUM_OPERATION)) INNER JOIN RIB_ORGAFINANCIER ON OPERATION.NUM_OPERATION = RIB_ORGAFINANCIER.NUM_OPERATION) ON (ORGAFINANCIER.NUM_ORGAFINANCIER = RIB_ORGAFINANCIER.NUM_ORGAFINANCIER) AND (ORGAFINANCIER.NUM_ORGAFINANCIER = OPERATION.NUM_ORGAFINANCIER);

    voila la requete de mise a jour en vba :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.RunSQL "INSERT INTO Z_CLIENT_PUBLIPOSTAGE ( NUM_LOGE, NUM_OPERATION, Montant_Appel, TITREBIS_CLIENT, NOMBIS_CLIENT, PRENOMBIS_CLIENT, ADRESSE_CLIENT, ADRESSE2_CLIENT, CP_CLIENT, VILLE_CLIENT, CIVIL_CLIENT, NOMBQ_CLIENT, ADRESSEBQ_CLIENT, ADRESSEBQ2_CLIENT, CPBQ_CLIENT, VILLEBQ_CLIENT, NUMPRET, AVANCEMENT1, AVANCEMENT2, CUMULAF, NOM_ORGAFINANCIER, CODE_BANQUE, CODE_GUICHET, N_COMPTE, CLE_RIB, Photos, NOM_OPERATION, ADRESSE_OPERATION, VILLE_OPERATION, CP_OPERATION, APPORT_PERSO ) IN 'C:\access_pc\publipostage.mdb'" & _
    " SELECT [mise a jour publipostage2].NUM_LOGE, [mise a jour publipostage2].NUM_OPERATION, [mise a jour publipostage2].Montant_Appel, [mise a jour publipostage2].TITREBIS_CLIENT, [mise a jour publipostage2].NOMBIS_CLIENT, [mise a jour publipostage2].PRENOMBIS_CLIENT, [mise a jour publipostage2].ADRESSE_CLIENT, [mise a jour publipostage2].ADRESSE2_CLIENT, [mise a jour publipostage2].CP_CLIENT, [mise a jour publipostage2].VILLE_CLIENT, [mise a jour publipostage2].CIVIL_CLIENT, [mise a jour publipostage2].NOMBQ_CLIENT," & _
    " [mise a jour publipostage2].ADRESSEBQ_CLIENT, [mise a jour publipostage2].ADRESSEBQ2_CLIENT, [mise a jour publipostage2].CPBQ_CLIENT, [mise a jour publipostage2].VILLEBQ_CLIENT, [mise a jour publipostage2].NUMPRET, [mise a jour publipostage2].AVANCEMENT1, [mise a jour publipostage2].AVANCEMENT2, [mise a jour publipostage2].CUMULAF, [mise a jour publipostage2].NOM_ORGAFINANCIER, [mise a jour publipostage2].CODE_BANQUE, [mise a jour publipostage2].CODE_GUICHET, [mise a jour publipostage2].N_COMPTE, [mise a jour publipostage2].CLE_RIB, [mise a jour publipostage2].Photos, [mise a jour publipostage2].NOM_OPERATION, [mise a jour publipostage2].ADRESSE_OPERATION, [mise a jour publipostage2].VILLE_OPERATION, [mise a jour publipostage2].CP_OPERATION, [mise a jour publipostage2].APPORT_PERSO FROM [mise a jour publipostage2];"
    qui peux m'aide??

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    si tu ne veux pas que ta requête de sélection "mise a jour publipostage2" soit une requête sauvegardée dans Access ça ne me paraît pas possible.

    Dans ta requête INSERT en vba il faut remplacer
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM [mise a jour publipostage2]
    par le contenu SQL de la requête "mise a jour publipostage2".

    Ou bien utiliser le contenu SQL de "mise a jour publipostage2" comme sous-requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO (ch1, ch2, ch3, ..., chi)
    SELECT ch1, ch2, ch3,...,  chi
    FROM (<sous-requête>) As [mise a jour publipostage2]
     
    où <sous-requête> est le SQL de "mise a jour publipostage2"

    Exemple:
    "mise a jour publipostage2"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Commandes.Client, Commandes.DateCmde, Clients.Addresse
    FROM Commandes INNER JOIN Clients ON Commandes.IDCLI = Clients.IDCLI
    requête AJOUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TEMPCMD (Client, DateCmde, Addresse)
    SELECT [mise a jour publipostage2].Client, [mise a jour publipostage2].DateCmde, [mise a jour publipostage2].Addresse
    FROM [mise a jour publipostage2]
    Option 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TEMPCMD (Client, DateCmde, Addresse)
    SELECT Commandes.Client, Commandes.DateCmde, Clients.Addresse
    FROM Commandes INNER JOIN Clients ON Commandes.IDCLI = Clients.IDCLI
    Option 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO TEMPCMD (Client, DateCmde, Addresse)
    SELECT [mise a jour publipostage2].Client, [mise a jour publipostage2].DateCmde, [mise a jour publipostage2].Addresse
    FROM (SELECT Commandes.Client, Commandes.DateCmde, Clients.Addresse
    FROM Commandes INNER JOIN Clients ON Commandes.IDCLI = Clients.IDCLI) As [mise a jour publipostage2]
    Vu la complexité de ta requête "mise a jour publipostage2" il serait peut-être mieux de la conserver en tant que requête Access et de ne mettre en vba que la requête INSERT.
    Si tu dois modifier ou déboguer ta requête de sélection ça sera plus simple dans Access que dans vba.

    A+

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci pour ta reponse je vais essai tout sa.
    Une autre question les requete classique face au requete en vba les quelles sont les plus rapide? les quelles prenne le moins de place?

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    En théorie les requêtes sauvegardées dans Access sont plus rapides car le plan d'exécution est déjà déterminé.
    Voici ce que j'ai lu quelque part:
    Les requêtes sont compilées et optimisées la première fois qu'elles sont exécutées.
    Une requête n'est plus recompilée par la suite sauf si on la sauve à nouveau puis qu'on l'exécute.
    Il est conseillé d'exécuter au moins une fois une requête après l'avoir sauvée avant de livrer une appli à un utilisateur.
    Dans le cas d'une requête en vba, comme on ne peut pas la sauver en tant qu'objet Access elle est recompilée à chaque fois.
    Le gain de temps entre requête Access et requête en vba est le temps de compilation et d'optimisation.

    Dans la pratique, je ne sais pas si la différence est perceptible. Je n'ai jamais fait de test comparatifs.

    A+

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    ok donc ci je te suis bien une requete en vba est donc plus rapide en théori c bien sa??

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Non c'est l'inverse.

    Une requête vba est compilée et optimisée à chaque exécution.
    Une requête Access n'est compilée et optimisée qu'à la première exécution.

    Compilation : Jet transforme le code SQL en un autre code qui lui est propre.
    Optimisation : Jet établit un plan d'exécution de la requête (voir tuto).

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    ok merci de ton explication je vais voir tout sa a tête repose

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Je me suis livré à un petit test avec cette requête.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO tblTestPerf (Société, Nom, Prénom, [N° commande], 
                             [À livrer avant], [Nom du produit], 
                             [Prix unitaire], Quantité )
    SELECT TOP 1 Clients.Société, Employés.Nom, Employés.Prénom, Commandes.[N° commande], 
                 Commandes.[À livrer avant], Produits.[Nom du produit], 
                 [Détails commandes].[Prix unitaire], [Détails commandes].Quantité
    FROM Produits INNER JOIN 
            (Employés INNER JOIN 
               ((Clients INNER JOIN 
                     Commandes ON Clients.[Code client] = Commandes.[Code client]) INNER JOIN 
            	     [Détails commandes] ON Commandes.[N° commande] = [Détails commandes].[N° commande])
            ON Employés.[N° employé] = Commandes.[N° employé])
         ON Produits.[Réf produit] = [Détails commandes].[Réf produit];
    Je l'ai sauvée en tant que requête Access.
    La différence entre l'exécution de la requête Access (DoCmd.OpenQuery) et l'exécution de son équivalent VBA (DoCmd.RunSQL) est d'environ 1mS.
    Si je fais une modif dans la requête Access, que je sauve, que j'enlève ma modif et que je sauve à nouveau (retour à la requette initiale),
    la requête Access dure 1mS de plus la première fois qu'elle est exécutée.

    Ça m'a donc l'air cohérent avec ce que j'ai dit plus tôt.

    J'ai essayé en enlevant les clés primaires et les index.
    Le temps des deux requête est multiplié par 3 mais la différence entre les deux reste d'environ 1mS

    Il y a peut-être des cas où la différence est plus significative (table liée ?).
    Sinon 1mS, pour moi c'est pas une différence perceptible.

    A+

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci bcp pour ce test
    c'est vrai que 1ms cela n'est rien je vai essai et voir avec le temps et le nombre de donne qui vont augmenter

    je connai maintenant la différence et les performences merci bcp encore une fois

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

Discussions similaires

  1. optimisé une requete SQl avec une requete imbriqués
    Par fabien14 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2009, 10h01
  2. Une requete à partir d'une requete
    Par pkrvz dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/04/2008, 19h39
  3. Comment faire une requete liée avec une requete ?
    Par DavidDeTroyes dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/04/2006, 13h18
  4. [TQuery]Réaliser une requete à partir d'une requete
    Par Eric SAULNIER dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/07/2004, 12h00
  5. Requete SQL permettent une mise a jour dans la base
    Par themagaly dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/06/2004, 09h32

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