Comment se connecter à 2 BDs? [Résolu]

Signaler
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Bonjour à tous,

j'aimerai me connecter à deux bases de données en même temps. En fait, une de mes applications a besoin des données d'une table provenant d'une autre de mes base de données. J'ai tenté de le faire dans un module mais non seulement c'est long mais en plus au bout mon application se plante.

Voici mon code :

Public Sub connect()

    Set cn = New ADODB.Connection
    cn.Provider = "microsoft.jet.oledb.4.0"
    cn.ConnectionString = "C:\Logiciels\DB\BDCaisse.mdb"
    cn.ConnectionString = "C:\Logiciels\DB\BDConsultation.mdb"

    cn.Open

End Sub


Merci d'avance pour votre très précieuse aide.

Cordialement

13 réponses

Messages postés
303
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
3 octobre 2013
1
Bonjour

Je n'ai pas suivi tout le raisonnement ùais sous access il existe la possibilité de récupérer des tables provenant d'une autre base
menu fichier
sous menu données externes
sous sous menu lier les tables
A ce niveau on choisi les tables souhaitées dans la base souhaitée.
Leur structure n'est pas modifiable mais les données le sont et on les utilisent comme si elle faisait partie intégrante de la base en cours

Bonne journée.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
salut,

ah non pas possible avec un seul objet CN, forcément
sinon comment veux-tu avoir accès aux 2 bases simultanément


dans un module de classe nommé clsADO par exemple
http://www.codyx.org/snippet_connexion-base-donnees-access_107.aspx#1907

Option Explicit
Private BDCaisse As New clsADO
Private BDConsultation As New clsADO

Private Sub Form_Load()
    BDCaisse.DBConnect "C:\Logiciels\DB\BDCaisse.mdb"
    BDConsultation.DBConnect "C:\Logiciels\DB\BDConsultation.mdb"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set BDConsultation = Nothing
    Set BDCaisse = Nothing
End Sub



tu as ensuite respectivement accès aux méthodes des classes qui pourront communiquer avec leur db

++

[hr]
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour PCPT et Merci pour ta réponse super rapide sans oublier tes précisions. En fait voici à peu près la requête que j'aimerai exécuter :

            cn.Execute " INSERT INTO tableimpconsultation " & _
            "   select TC.numticket AS NumTicket, TC.datevente AS DateVente, TTC.numtypevente AS NumTypeVente, TTC.typevente AS TypeVente , P.numproduit AS NumProduit, " & _
            "   P.desproduit AS DesProduit, TC.qtevente AS QteVente, P.puproduit AS PrixUnitaire, TC.remisevente AS Remise, TC.tvavente AS TVA " & _
            "   From tableconsultation TC, tableTypeconsultation TTC, tableProduit P " & _
            "   Where TC.numtypevente TTC.numtypevente AND TC.numproduit P.numproduit AND TC.numticket = " & txtnumticket & " "


PS : Je précise que les tables Consultation et TypeConsultation font partie de BD1 et que la table Produit de BD2.

Que me conseilles-tu s'il te plaît?

Merci d'avance.

Cordialement
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
From tableconsultation TC, tableTypeconsultation TTC, tableProduit P



donc la TABLE tableProduit n'est pas dans la même BASE que les TABLES tableconsultation et tableTypeconsultation ??

non! la seule possibilité est de créer une 3e table (temporaire ou pas) qui va recevoir les différentes tables de tes 2 bases si tu veux, pour ne pas altérer ces 2 bases.
et seulement ensuite, en te connectant à cette 3e base, tu fais ce que tu veux

ON NE PEUT PAS FAIRE UNE REQUÊTE AU TRAVERS DE PLUSIEURS BASES ACCESS

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
créer une 3e base je voulais dire (tu l'auras corrigé ^^)
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2

donc la TABLE tableProduit n'est pas dans la même BASE que les TABLES tableconsultation et tableTypeconsultation ??


C'est tout à fait ça. Merci beaucoup pour ton aide. Je vais cogiter un peu pour voir si je peux trouver une solution "un peu plus simple" à mon problème et/ou revenir sur ce post. J'avoue être déçu quand même. Merci pour tout et prends bien soin de toi.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
C'est encore moi . Je viens de penser à quelque chose. Étant donné que je n'ai pas besoin du contenu de toute la table Produit de BD1. Est-ce qu'il me serait possible de créer une table Produit identique à celle qui est dans BD1 (mais vide) dans ma BD2 et "rapatrier" juste les données du produit qui m'intéresse dans la table produit de ma BD2 et ensuite faire les traitements qui m'intéresse? Qu'en penses-tu?

NB: En fait je cherche une solution simple et très légère car il y aura près de 200 à 300 échanges en BD1 et BD2 concernant la table Produit. Mon application et les BD sont en mode multi-utilisateurs.

Merci d'avance.

Cordialement.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
soit plus précis dans tes questions réponses...

Est-ce qu'il me serait possible de créer une table Produit ...
c'est ce que j'ai suggéré oui. pourquoi pas dans l'autre base si tu peux altérer (ou une tampon si tu ne peux pas)


...identique à celle qui est dans BD1 (mais vide) dans ma BD2
ah? je croyais que Produit était déjà dans BD2, cf ton PS :
et que la table Produit de BD2



et "rapatrier" juste les données du produit
si c'est juste les données, c'est juste une requête, dépend de ce que tu dois faire de ces données et à quel niveau elles rentrent en compte pour l'autre base


et cet.. ajout de table presque vierge, tu parles bien toujours par code n'est-ce pas?


parce qu'en regardant ta requête, tu veux faire un INSERT uniquement dans tableimpconsultation
ton WHERE spécifie que TC.numproduit = P.numproduit

mais tu n'écris rien dans P (tableproduit)

on en revient donc à mon premier post au final

à supposer PRODUIT dans la BDCaisse.mdb :


BDCaisse.RSExecute "SELECT * FROM tableproduit WHERE numproduit = " & tavaleur & ";"

tu as donc BDCaisse.RS qui te fournit les éléments nécessaires

et tu fais ton INSERT sur BDConsultation
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Salut PCPT, tu as raison sur toute la ligne et je m'excuse pour mon erreur (Produit est bien dans BD2), la détresse m'embrouille . Donc je voudrai créer Produit dans BD1 et comme dans ta requête récupérer juste le numéro du produit dont j'ai besoin maintenant mon problème c'est ceci :

tu as donc BDCaisse.RS qui te fournit les éléments nécessaires

et tu fais ton INSERT sur BDConsultation


En fait c'est ça que je ne sais pas faire depuis le début et que j'aimerai faire. Une sorte de "fusion" entre le ou les numproduit et le insert étant donné que ce sont deux connexions différentes.

Merci d'avance pour ton aide.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
ou même si c'est la même connexion, comment faire pour faire un insert avec un recordset à partir du résultat d'un autre recordset?

Merci d'avance.

Cordialement.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
on insère (INSERT) des données, pas une structure
il faut donc d'abord être sur que tableimpconsultation a la bonne structure

on va réduite l'énoncé çà sera plus simple

tu as une base B1 contenant une table CONSULTATION avec
ID_C (id auto)
DATE_C (date du jour)
USER_C (utilisateur du programme donc de la requête au moment T)
LIB_P (libellé du produit)
COST_P (prix du produit)

tu as une base B2 contenant une table PRODUIT avec
ID_P (id auto)
LIB_P (libellé du produit)
QTE_P (quantité en stock)
COST_P (prix du produit)


ton but dans cet exemple est de récupérer toutes les infos du 10è produit (peut-être affichage etc) et de n'insérer dans consultation QUE le libellé et le prix

donc

Consultation.DBConnect "db1.mdb"
Produit.DBConnect "db2.mdb"

Produit.RSExecute "SELECT * FROM produit WHERE ID_P = 10;" 
Produit.RS.movefirst
msgbox "on va jouer avec " & Produit.RS.fields("LIB_P").value & " dont il reste " & Produit.RS.fields("QTE_P").value & " unité(s)"

Consultation.RSExecute "INSERT INTO consultation " & _
"(DATE_C, USER_C, LIB_P, COST_P) VALUES (" & _
"#" & format$(date, "YYYY-MM-DD") & "#, " & _
"'js8bleu', " & _
"'" & replace(Produit.RS.fields("LIB_P").value, "'", "''") & "', " & _
Produit.RS.fields("COST_P").value & ");"

Produit.RSClose
Consultation.RSClose


en gros, reste à adapter
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Super, je teste et je te tiens au courant. Merci déjà pour tout l'intérêt que tu as porté à mon problème.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour et Merci c148270 pour ton aide. Concernant ta proposition, c'est ce que j'ai dû faire et je te confirme que ça marche à merveille. Merci, excellente journée et prends bien soin de toi.