Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comment creer une table externe dans une base access avec ADO

4 réponses
Avatar
y_ade
Bonsoir,

Je me heurte à un problème simple pour un spécialiste mais bloquant pour
moi:
l'environnement est access 97 et visual basic 6
J'ai une base A comportant une table aa
base B comportant une table bb

je souhaite faire une extraction de données dans une mshflexgrid, avec
une connexion SQL du genre:
select aa.*, bb.* where aa.champ1=bb.champ2

Pour ce faire il faut:

soit créer une table externe liée dans l'une des 2 bases et là je ne
sais comment faire!

soit creer une troisième base comportant les 2 tables si l'on a pas de
droit d'écriture sur les bases d'origine, et là encore je ne trouve pas
la solution.

merci par avance si vous pouvez m'aider.

4 réponses

Avatar
Thierry Bertrand
Il faut utiliser la méthode CreateTableDef pour créer une table liée dans ta
base access.

Ci dessous un copier coller de deux sub qui font ce boulot dans un de mes
programmes où justement je crée un lien vers une base de données externe
fournie en paramètre.

Quelque explications:

CurrentDB est l'objet Database (DAO) qui pointe sur uine base de donnée
access déjà ouverte.

DupeTableName: Fonction qui vérifie si la table n'exite pas déjà. (pas de
commentaire quand à son utilité)

AddAttachement: Sub qui crée une table liée. Les paramètres sont
AttachName: Nom de la table liée à créer
ConnectStr vaut ";DATABASE=chemin vers la table" pour une table access
(:!!!! attention au ; de début)
Source: Nom de la table distante à attacher.
AttachSavePWD = 0 si pas de mot de passe.
exemple: si la base n° 2 est C:appbase2.mdb
et la table s'appelle bb
et que l'on veux créer une table liée qui s'apelle LinkBB

appeler AddAttachement "LinkBB",";C:appbase2.mbd","bb",0

ensuite la table LinkBB est accessible depuis la base currentb. Par exemple
par CurrentDB.openrecordset("LinkBB")

ci dessous le source des deux sub / function




Public Function DupeTableName(RName As String) As Integer
Dim tdf As TableDef
Dim Qdf As QueryDef
Dim I As Integer

For Each tdf In CurrentDb.TableDefs
If UCase(tdf.Name) = UCase(RName) Then
DupeTableName = True
Exit Function
End If
Next
For Each Qdf In CurrentDb.QueryDefs
If UCase(Qdf.Name) = UCase(RName) Then
DupeTableName = True
Exit Function
End If
Next
DupeTableName = False
End Function

Public Sub AddAttachment(AttachName As String, _
ConnectStr As String, _
Source As String, _
AttachSavePWD As Long)

Dim sConnect As String
Dim tbl As TableDef
Dim I As Integer
Dim sTmp As String

On Error GoTo ErrAttach
If DupeTableName(AttachName) Then
Exit Sub
End If
Screen.MousePointer = vbHourglass
sConnect = ConnectStr

' Définit les propriétés.
Set tbl = CurrentDb.CreateTableDef(AttachName)
tbl.SourceTableName = Source
tbl.Connect = sConnect
tbl.Attributes = AttachSavePWD
CurrentDb.TableDefs.Append tbl
Screen.MousePointer = vbDefault
Exit Sub
ErrAttach:
MsgBox "Erreur " & Err.Description & vbCrLf & "Numéro :" & Err.Number
Exit Sub
End Sub
Avatar
y_ade
Thierry Bertrand a écrit :
Il faut utiliser la méthode CreateTableDef pour créer une table liée dans ta
base access.

Ci dessous un copier coller de deux sub qui font ce boulot dans un de mes
programmes où justement je crée un lien vers une base de données externe
fournie en paramètre.

Quelque explications:

CurrentDB est l'objet Database (DAO) qui pointe sur uine base de donnée
access déjà ouverte.

DupeTableName: Fonction qui vérifie si la table n'exite pas déjà. (pas de
commentaire quand à son utilité)

AddAttachement: Sub qui crée une table liée. Les paramètres sont
AttachName: Nom de la table liée à créer
ConnectStr vaut ";DATABASE=chemin vers la table" pour une table access
(:!!!! attention au ; de début)
Source: Nom de la table distante à attacher.
AttachSavePWD = 0 si pas de mot de passe.
exemple: si la base n° 2 est C:appbase2.mdb
et la table s'appelle bb
et que l'on veux créer une table liée qui s'apelle LinkBB

appeler AddAttachement "LinkBB",";C:appbase2.mbd","bb",0

ensuite la table LinkBB est accessible depuis la base currentb. Par exemple
par CurrentDB.openrecordset("LinkBB")

ci dessous le source des deux sub / function




Public Function DupeTableName(RName As String) As Integer
Dim tdf As TableDef
Dim Qdf As QueryDef
Dim I As Integer

For Each tdf In CurrentDb.TableDefs
If UCase(tdf.Name) = UCase(RName) Then
DupeTableName = True
Exit Function
End If
Next
For Each Qdf In CurrentDb.QueryDefs
If UCase(Qdf.Name) = UCase(RName) Then
DupeTableName = True
Exit Function
End If
Next
DupeTableName = False
End Function

Public Sub AddAttachment(AttachName As String, _
ConnectStr As String, _
Source As String, _
AttachSavePWD As Long)

Dim sConnect As String
Dim tbl As TableDef
Dim I As Integer
Dim sTmp As String

On Error GoTo ErrAttach
If DupeTableName(AttachName) Then
Exit Sub
End If
Screen.MousePointer = vbHourglass
sConnect = ConnectStr

' Définit les propriétés.
Set tbl = CurrentDb.CreateTableDef(AttachName)
tbl.SourceTableName = Source
tbl.Connect = sConnect
tbl.Attributes = AttachSavePWD
CurrentDb.TableDefs.Append tbl
Screen.MousePointer = vbDefault
Exit Sub
ErrAttach:
MsgBox "Erreur " & Err.Description & vbCrLf & "Numéro :" & Err.Number
Exit Sub
End Sub




merci pour votre aide, je vois que vous utilisez DAO. Peut-on utiliser
dans le meme projet des instructions ADO et DAO sans trop de risques?
(le reste de mon aplication est en ADO)
Avatar
Driss HANIB
bonjour,

autre méthode directment dans une de tes bases
tu vas par exemple dans ta base aa
tu te mets dans la fenêtre tables
là tu cliques sur le bouton droit de ta souris et du sélectionne 'lier une
table".
access va alors te proposer la recherche de ta 2ème base : tu la
sélectionnes et tu choisis dans cette base la table à lier.
tu fais OK et c'est bon.
ensuite dans tes requêtes compilées dans ta base aa ou dans ton prog VB ta
table liée est considérée comme une table faisant partie de ta base aa :
donc requête normale.
de cette façon tu profiteras des modif de la table dans bb et tu pourras par
la même occasion faire des mises à jour à partir de la table aa

Driss

"y_ade" a écrit dans le message de
news:425d4f51$0$27277$
Bonsoir,

Je me heurte à un problème simple pour un spécialiste mais bloquant pour
moi:
l'environnement est access 97 et visual basic 6
J'ai une base A comportant une table aa
base B comportant une table bb

je souhaite faire une extraction de données dans une mshflexgrid, avec
une connexion SQL du genre:
select aa.*, bb.* where aa.champ1».champ2

Pour ce faire il faut:

soit créer une table externe liée dans l'une des 2 bases et là je ne
sais comment faire!

soit creer une troisième base comportant les 2 tables si l'on a pas de
droit d'écriture sur les bases d'origine, et là encore je ne trouve pas
la solution.

merci par avance si vous pouvez m'aider.


Avatar
Thierry BERTRAND
L'exemple que j'ai envoyé est en DAO.

Si on mélange les deux, il peut y avoir des problèmes lors des executions.
Il faudra soit faire attention à l'ordre de référencement des 2
bibliothèques microsoft Activex Data Object et Micorsoft DAO Object Library
(bug connu sous Access d'ailleurs),
soit MIEUX, bien préciser de quelle bibliotèque provient l'objet qu'on
déclare.
Exemple:

Dim Currentdb as DAO.database
Dim MaTable as DAO.Recordset
Dim MaCN As ADODB.Connection

A ces conditions, cela doit marcher.

Mais je pense que CreateTableDef doit être transposable en ADO.
Personnellement, les sources que j'ai ecris sont tous avec DAO (paresse
intellectuelle sans doute).