Origine tables liées DAO/ADO [Résolu]

cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 22 oct. 2004 à 21:35 - Dernière réponse : cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention
- 25 oct. 2004 à 18:38
Salut le forum

Ca fait un moment que je n'ai pas posé de question alors en voici une à laquelle je n'ai pas trouvé de solution.

J'ai des bases ACCESS (ver : 97 par obligation de compatibilité) qui contiennent des liens vers des tables se situant dans d'autres bases.

CONTRAINTE : le chemin des bases d'origine des tables liées peut changer pour différentes causes (changement ou réorg des serveurs).
SOLUTION A LA CON : refaire à la mano tous les liens dans X bases. Impensable.
SOLUTION ACTUELLE : avec DAO on peut lire et modifier la propriété CONNECT d'une table liée en passant par les TABLEDEFS donc jusque là, pas de problème, on peut automatiser. Cool.

Le PROBLEME c'est la migration de DAO vers ADO !
Donc QUESTION : comment faire la même chose avec ADO ? hein ?

Un exemple qui fonctionne en DAO pour juste lister la chaine de connexion :

Sub cnx_DAO()
Dim db As Database
Dim tbl As TableDef

Set db = OpenDatabase("c:\temp\bd1.mdb")

For Each tbl In db.TableDefs
If tbl.Connect <> "" Then
List1.AddItem tbl.Name & " = " & tbl.Connect
End If
Next

End Sub

En ADO je ne peux faire que :

Sub cnx_ADO()
Dim cnx As New ADODB.Connection
Dim mycat As New ADOX.Catalog
Dim tbl As New ADOX.Table

cnx.Provider = "Microsoft.Jet.Oledb.3.51"
cnx.ConnectionString = "C:\temp\bd1.mdb"
cnx.Open

mycat.ActiveConnection = cnx

For Each tbl In mycat.Tables
If tbl.Type = "LINK" Then
List1.AddItem tbl.Name
End If
Next

End Sub

Bon, OK, je peux lister les tables liées mais le tbl.Connect de DAO c'est quoi en ADO ?

J'ai essayé les Properties, les Atributes, ..... RIEN.
J'ai parcourru la MSDN ........... RIEN.
J'ai fait des recherches sur le web ........... RIEN.
J'ai essayé plein de trucs bizarres ........ RIEN.

Si quelqu'un pouvait m'aider à trouver une solution viable, je lui en serai reconnaissant.

Sinon, je continuerai à penser ce que je pense : ADO est une régression de DAO et non pas une évolution.

Merci d'avance à ceux et celles qui répondront.

Cordialement, CanisLupus
Afficher la suite 

9 réponses

cs_frop01 1356 Messages postés lundi 27 octobre 2003Date d'inscription 19 novembre 2008 Dernière intervention - 23 oct. 2004 à 01:08
+3
Utile
Salut,

en ado, ont utiliser Properties

tbl.Properties(6) = chemin
tbl.Properties(4) = nom table


Dim cnx As New ADODB.Connection
Dim mycat As New ADOX.Catalog
Dim tbl As New ADOX.Table
List1.Clear
cnx.Provider = "Microsoft.Jet.Oledb.3.51"
cnx.ConnectionString = "C:\temp\bd1.mdb"
cnx.Open

mycat.ActiveConnection = cnx

For Each tbl In mycat.Tables
If tbl.Type = "LINK" Then
List1.AddItem tbl.Properties(4) & " " & tbl.Properties(6)
End If
Next



Bonne continuation.

:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)

Membre du club CodeS-SourceS
Cette réponse vous a-t-elle aidé ?  
cs_frop01 1356 Messages postés lundi 27 octobre 2003Date d'inscription 19 novembre 2008 Dernière intervention - 23 oct. 2004 à 15:06
+3
Utile
Moi je l'ai essayer et ca marche nickel à la seul difference que j'utilise Microsoft.Jet.Oledb.4.0 (access 2000).

Peut être ca vient de la !

:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)

Membre du club CodeS-SourceS
Cette réponse vous a-t-elle aidé ?  
cs_frop01 1356 Messages postés lundi 27 octobre 2003Date d'inscription 19 novembre 2008 Dernière intervention - 25 oct. 2004 à 01:32
+3
Utile
Je viens tout juste de faire un essai sur une base de donnée Access 97 et ca marche bien .

La référence Microsoft.Jet.Oledb.4.0 concu pour Access 2000 peut parfaitement ouvrir une base d'une ancienne version tel que Access 97 Donc on utilisant la version 4.0 du Moteur MS Jet on peut utiliser ADO pour les propriete du LINK.

:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)

Membre du club CodeS-SourceS
Cette réponse vous a-t-elle aidé ?  
cboulas 2641 Messages postés mercredi 2 juin 2004Date d'inscription 8 janvier 2014 Dernière intervention - 22 oct. 2004 à 22:28
0
Utile
Salut CanisLupus, bien j'ai pensé que pour stocké le chemin de la base, tu pourrais le mettre dans la base de registre.

Bien pour ADO : je sait le faire avec un controle Adodc.
La difference entre DAO et ADO c'est la méthode d'accès.
Si tu utilise une base avec un Mot de passe tu va surement avoir comme erreur : "Pilote ISAM introuvable" ou "Base déjà utiliser en mode Exclusif", ça c'est car la méthode d'ouverture est fausse.

Dans la form je place un control ADOdc nommé Adodc1

Look :

sub Form_Load
Adodc1.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};Dbq=essai.mdb;Uid=Administrateur;Pwd=Password;"
Adodc1.RecordSource = "Select * From MaTable"
Adodc1.Refresh
end sub


La première ligne permet d'ouvrir la base avec un mot de passe, mais la partie ";Pwd=Password;" est facultative si ta base n'a pas de mot de passe.
Ensuite Uid c'est l'utilisateur à utiliser pour ouvrir la Base.
Dbq le chemin de la base
Driver c'est le driver d'ouverture.

La 2nd Ligne c'est le fameux "Select"

La 3ème l'éxécution avec la mode d'éxécution du "Select" enfin du moins le texte de RecordSource

La 4ème met à jour l'affichage des infos.

A partir de là tu peux lié cet ADOdc directement avec un TextBox, ComboBox, etc... DataGrid....

Je suis passer sur les AdoDC la semaine dernière et je doit dire que c'est vachement plus simple de lié des controles avec la base directement que de noter : text1.text= rs.fields("toto")

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 22 oct. 2004 à 23:07
0
Utile
Merci pour tes expliks cboulas, mais mon prob est ailleurs.
Je ne veux pas connaître le contenu d'une table, ça je sais le faire en ADO comme en DAO, avec ou sans datacontrol (je préfère sans).
Je veux seulement connaître le chemin de la base d'origine de ma table liée (attachée) par ADO comme je peux le faire par DAO.

Pour être plus clair, dans ACCESS 97 (probable idem avec autre version), je clique dans le menu Fichier/Données externes/Lier les tables .........
Après avoir sélectionné la base puis la table, j'ai un lien dans ma base de départ.
C'est l'origine de ce lien que je veux connaitre avec ADO. (Je sais le faire en DAO comme j'ai dit plus haut).

Cordialement, CanisLupus
cboulas 2641 Messages postés mercredi 2 juin 2004Date d'inscription 8 janvier 2014 Dernière intervention - 22 oct. 2004 à 23:19
0
Utile
Ah, alors sorry, j'ai jamais vu ce genre de truc, va faloir que j'étudie quand même la question.

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 23 oct. 2004 à 14:04
0
Utile
Désolé frop01, ça ne marche pas.

Ca me donne toujours la même erreur :

Erreur d'exécution "3265" : Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé.

J'ai pensé aux properties aussi et j'ai essayé de les lister avec 'for each...' et en ADO ça donne rien ou une erreur. C'est comme si la table n'avait pas de Properties.

Cordialement, CanisLupus
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 23 oct. 2004 à 15:28
0
Utile
OK, c'est bien ce que je pensais.
Donc, tant qu'il existera des bases Access 97 dans la boîte, je serai obligé de recourir aux bonnes vieilles méthodes du DAO.
Finalement, Billou est de plus en plus déconnecté du terrain avec son ADO.

Cordialement, CanisLupus
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 25 oct. 2004 à 18:38
0
Utile
Super Extra Formid......
Mille mercis, ça marche effectivement.
Et moi qui m'entêtais avec le 3.51........
Je retire mes précédentes critiques.

Cordialement, CanisLupus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.