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

Macros et VBA Excel Discussion :

jointure de tables dans une 3e table par vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut jointure de tables dans une 3e table par vba
    Bonjour,
    Comme aucun forum ne me repond, j'essay ici
    Alors je repose ma question.
    Je voudrais faire une jointure de deux tables dans deux bases differentes, et mettre le resultat dans une autre table dans la base ou je suis ( la currentdb)
    ex :
    table1 dans la base 1 : nom, taux
    table2 dans la base 2 : nom, value
    table3 dans la base3: nom, taux, value
    ma table 3 a deja les bons noms de champs, je voudrais la completé avec ma jointure.
    Je fais ca depuis excel, pour les connections je n'ai pas de pb, mais je n'arrive pas faire une jointure ds une 3table dans une autre base.
    Merci
    Allez le RC LEns

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Sql ="select * Fom Table1 as T1 inner join (select * From Tabl2 In 'c\rep\base.?' 'driver;') as T2 on T2.id =T1.id;"http://www.developpez.net/forums/d15...o/#post8352820

  3. #3
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Oui mais mon problème réside dans le fait d'utiliser un insert into , pour remplir mon template avec la jointure, attention , je sais pas si c'est possible,
    en fait je souhaiterais que la jointure remplisse ma table qui est une sorte de template, vide avec juste les bons champs.
    Je sais pas si je suis claire , et surtt si c'st possible merci
    Allez le RC LEns

  4. #4
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut voila pb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Template (ValueDate,Index, Bucket,Delta)
    SELECT DataDelta.ValueDate,DataDelta.Index, DataDelta.Bucket,DataDelta.Delta
    FROM DataDelta in 'C:\Users\Anthony\Documents\OOP\VBA\Test\Deltabase.accbd
    LEFT JOIN DataTaux in 'C:\Users\Anthony\Documents\OOP\VBA\Test\TauxBase.accdb'
    ON DataDelta.Nom = DataTaux.Nom;
    Un truc comme ca mais ca marche pas :/
    Une jointure dans un insert into en gros
    Allez le RC LEns

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    D'abord, vue que tu travail sur une requête Access, alors je ne comprends pas pourquoi tu n'utilises pas sont requêteur!
    Bien sur il ne te donnera pas la solution pour le in mais si tu lui donne une base pas de problème!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DataDelta.ValueDate,DataDelta.Index, DataDelta.Bucket,DataDelta.Delta
    FROM DataDelta in 'C:\Users\Anthony\Documents\OOP\VBA\Test\Deltabase.accbd', DataTaux in 'C:\Users\Anthony\Documents\OOP\VBA\Test\TauxBase.accdb'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Template (ValueDate,Index, Bucket,Delta)
    SELECT DataDelta.ValueDate,DataDelta.Index, DataDelta.Bucket,DataDelta.Delta
    FROM DataDelta in 'C:\Users\Anthony\Documents\OOP\VBA\Test\Deltabase.accbd' 
    LEFT JOIN DataTaux in 'C:\Users\Anthony\Documents\OOP\VBA\Test\TauxBase.accdb'
    ON DataDelta.Nom = DataTaux.Nom;
    de mémoire, je ne sais plus si dans Dao la syntaxe est vraiment identique à Ado!
    In ['']?????

    Avec le crurentDb d'Access, tu pourrais insérer une jointure Sql sever et oracle dans MySql!

  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci
    Bjr, Merci pour ton aide, le projet est en excel vba , j'utilise ado, je n'utilise pas du tt access , seulement pour la base de données.
    Je vais tester le code mais sinon je le fais en plusieurs fois, (comme hier, et ca marche je posterais le code ce soir)
    Mais je te remercie je testerais dans la journée.

    Anthony
    Allez le RC LEns

  7. #7
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Template (ValueDate,Index, Bucket,Delta)
    SELECT DataDelta.ValueDate,DataDelta.Index, DataDelta.Bucket,DataDelta.Delta
    FROM DataDelta in 'C:\Users\Anthony\Documents\OOP\VBA\Test\Deltabase.accbd' 
    LEFT JOIN DataTaux in 'C:\Users\Anthony\Documents\OOP\VBA\Test\TauxBase.accdb'
    ON DataDelta.Nom = DataTaux.Nom;
    En fait je pense que l'on ne peut pas mettre quelque chose apres le premier in , car il ya tjs une erreur a partir de LEFT JOIN, c'est le meme problème depuis hier, il semblerait que l'on ne puisse pas le faire.
    Allez le RC LEns

  8. #8
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    Bonjour,

    Un petite idée en passant qui pourrait simplifier la chose

    1° Mettre un table liée à la db de départ
    2° Contruire une requete d'insertion avec parametres sur cette meme base entre les deux tables.
    3° lancer la requete parametrée via excel...

    Perso je trouverai cela un peu plus propre

    Aussi, pour le left join, est-ce que les champs de la table à insérer sont bien nullable??
    sinon, cela risque de poser problemes
    Alleï Bonjour chez vous!

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO Table5 ( Champ1 )
    SELECT toto.Champ1
    FROM (SELECT *  FROM  Table1 in 'C:\Users\RDurupt\Base de données1.accdb')  AS toto LEFT JOIN (SELECT *  FROM  Table1 in 'C:\Users\RDurupt\Base de données2.accdb')  AS titi ON toto.Id = titi.Id;
    c'est trop complique pour Access de faire une jointure direct alors qu'exécuter le 2 sous requête avant la requête d'insertion ça lui est possible!

    Edit: pour information, notre ami à posté sur le forum Excel VBA en désespoir de cause! et vue qu'ACCESS prévoit des liaison externe pourquoi pas les utiliser!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Template (ValueDate,Index, Bucket,Delta)
    SELECT DataD.ValueDate,DataD.Index, DataD.Bucket,DataD.Delta
    FROM (select * FROM  DataDelta in 'C:\Users\Anthony\Documents\OOP\VBA\Test\Deltabase.accbd') as DataD
    LEFT JOIN (select * DataTaux in 'C:\Users\Anthony\Documents\OOP\VBA\Test\TauxBase.accdb') as DataT
    ON DataD.Nom = DataT.Nom;
    Sql ="select * Fom Table1 as T1 inner join (select * From Tabl2 In 'c\rep\base.?' 'driver;') as T2 on T2.id =T1.id;"
    Dernière modification par Invité ; 31/08/2015 à 10h42.

  10. #10
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Merci beaucoup pour votre aide, je pense que le problème est réglé:
    Effectivement une jointure direct , apparement n'est pas possible, je rechercherais plus en details ce week end mais , la methode et l'aide de rdurupt m'a permis e régler le problème même si ma requete mouline pas mal ( je suis a ado , et j'exute les requete avec un execute.
    Pensez vous que un recordset.open est plus rapide qu'un connection.execute ?
    En tout cas merci mon code est propre et fonctionne malgrs qu'il mouline pas mal mais je vais essayer de comprendre pourquoi.
    Allez le RC LEns

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Regardes le poids se tes bases et compacte les qi besoin, malheureusement difficile se réduire le temps d'exécution.

    Recorset.ope n'est pas plus rapide que exécute mais moins capricieux selon les systèmes d'exploitation!

  12. #12
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci
    Je vais me pencher sur la question et revoir ce que j'ai fait , ce week end mais comme tu me le dis, je pense que probablement n je ne pourrais pas trop améliorer le temps d'execution qui est de 4,35 min , pour un enchenement de 5 requetes action avec 80 000 enregistrements et 13 champs. Je dois peut etre accepter que ca se fasse en plus d'une minute , mais bon je vais un peu potasser les documentations pour voir si je peux ameliorer mon code , je posterais mon code , ca pourra aider d'autres personnes ( je ne l'ai pas la)
    Allez le RC LEns

  13. #13
    Invité
    Invité(e)
    Par défaut
    Le compactage des bases peut te faire gagner un temps considérable.

    Index également les champs [Non] de tes tables!

    Un jour je suis intervenus pour optimiser une requête, j'ai compacté la base j'ai gagné 6 heures!

  14. #14
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci
    Merci pour tes conseils, peux tu m'en dire plus sur le compactage des données,
    et sur l'indexation?
    ca m'interesse bcp, j'ai la main sur les tables qui fournissent les données puisque c'est mois qui les remplis avec une macro , donc je peux y faire ce que je veux .
    si je peux gagner deux minutes avec tes conseils je suis preneur
    Allez le RC LEns

  15. #15
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, plus pour info qu'autre chose, voir ici, il y a un exemple montreant comment effectuer une jointure entre 2 feuilles d'un classeur fermé. La procédure compare 2 colonnes dans des onglets différents, et liste les données communes.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Access gère des base de données SGBD???
    ce sont des fichier texte structuré à accès directe. en d'autre terme un fichier de typer record, parcouru de haut en bas et de bas en haut en déplacent un masque affichant les données en fonctionne de la structure du masque!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type Champ
           Nom as string
           type    as string
           Valeur as string      
    End Type
     
    dim table as record
    dim Fied as Champ
     
    Fied. name="Nom"
    Fied.Type="String"
    Fied.Valeur "Rdurupt"
    table.add  Fied
    le problème est que comme tous fichier texte il n'est pas possible de supprimer un enregistrement! vue qu'il s'agit d'un fichier structuré typé, il es possible de le modifie. ici l'idée est de modifier l'enregistrement pour lui dire Supprimé! il appartiendra au moteur de base de données de ne pas tenir compte des enregistrements supprimé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type Champ
           Nom as string
           type    as string
           Valeur as string 
          Supp as boolean     
    End Type
    la seule façon de supprimer définitivement les enregistrement et la table temporaire généré par les requêtes est de créer une nouvelle base avec que les données valide de supprimer l’ancienne et de renommer la nouvelle!

    Nom : Sans titre.png
Affichages : 547
Taille : 64,1 Ko
    l'indexation:
    quand tu exécute un requête avec des liens et/ou une close where, la requête parcoure toute la table pour trouver les occurrences car les données ce trouve placé n'importe ou dans la table!

    l'indexation ajoute une table qui contient les valeur du champ et sa position dans la table et en plus trié alphabétiquement. dans le cas d'un champ indexé, la recherche ce fait sur la table d'index de façon dichotomique!
    Nom : Sans titre.png
Affichages : 558
Taille : 12,6 Ko

  17. #17
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Voici le code comme prévu
    Voila j'en profite pour mettre mon code,
    DailyExplanationDBConnection est une propriété get d'un objet adodb.connection

    J'enchaine des execute :

    Donc j'exporte dans mon template une table d'une autre base pour completer les champs de montemplate
    je fais la meme avec ma deuxieme base et apres je fais une jointure
    Voila , au début je voulais faire directement ma jointure mais bon c'est pas grave, le mauvais cotés c'est que ca mouline grave..., le code est plus long mais cette partie prend 4 minutes, je vais essayer les methodes données.. mais bon c'est ultra long ( surtout la jointure).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With DailyExplanationDBConnection(ID, d)
            .Execute GetDataFactor(ReplaceDate(MyFactor("DeltaGV33B").DBLink, theDayBefore(d)), theDayBefore(d))
            .Execute "UPDATE Analysis SET Analysis.[RiskFactor] = 'Delta' WHERE Analysis.[RiskFactor] is Null"
            .Execute GetDataFactor(ReplaceDate(MyFactor("BasisGV33B").DBLink, theDayBefore(d)), theDayBefore(d))
            .Execute "UPDATE Analysis SET Analysis.RiskFactor = 'Basis' WHERE Analysis.[RiskFactor] is Null"
            .Execute "UPDATE Analysis SET Analysis.Source = 'RM' WHERE Analysis.Source is Null"
            .Execute MyJoinRqte
        End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function GetDataFactor(ByVal MyLink As String, ByVal MyDate As Date) As String
        GetDataFactor = "INSERT INTO Analysis ( [Book], [Currency], [ExpCurrency], [Product], [Index], [Term], [Sensitivity] )"
        GetDataFactor = GetDataFactor & " SELECT Data.[Book], Data.[Currency], Data.[ExpCcy], Data.[Product], Data.[SurIndex], Data.[Bucket], Data.[ValueEUR]"
        GetDataFactor = GetDataFactor & " FROM Data IN '" & MyLink & "'"
        GetDataFactor = GetDataFactor & " WHERE Data.[ValueDate]  =" & dateSQL(MyDate) & ";"
    End Function

    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function MyJoinRqte() As String
        MyJoinRqte = "Update(SELECT * FROM Analysis WHERE Analysis.[Source] = 'RM') as DataRM"
        MyJoinRqte = MyJoinRqte & " LEFT JOIN Rates"
        MyJoinRqte = MyJoinRqte & " ON (DataRM.[Index]=Rates.[Index]) AND (DataRM.[Term]=Rates.[Bucket]) AND (DataRM.[Currency]=Rates.[Ccy])"
        MyJoinRqte = MyJoinRqte & " SET DataRM.[MktdataD-1] = Rates.[MktDataD], DataRM.[MktdataD-2] = Rates.[MktDataLD],DataRM.[Curve] = Rates.[Market]"
    Allez le RC LEns

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/06/2014, 21h21
  2. jointure de 2 tables dans une 3e table
    Par hannibal813 dans le forum Requêtes
    Réponses: 9
    Dernier message: 30/05/2012, 18h14
  3. Plusieurs indicateurs d'une meme table dans une seule requete
    Par arnaud.barre dans le forum Débuter
    Réponses: 5
    Dernier message: 12/04/2007, 17h23
  4. Réponses: 4
    Dernier message: 15/03/2007, 20h32
  5. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19

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