comment creer une table externe dans une base access avec ADO
4 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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
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
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
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)
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
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)
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
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)
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.
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" <andre.y1@free.fr> a écrit dans le message de
news:425d4f51$0$27277$636a15ce@news.free.fr...
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.
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.
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).
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).
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).