{Access} liaison Dorsale/frontale

Résolu/Fermé
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 - 29 nov. 2009 à 19:23
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 - 1 déc. 2009 à 16:39
Bonjour,

J'ai un soucis de liaison entre mes bases frontale et dorsale pour une base de donnée créée sous Access 2007.

J'ai créé une base contenant toutes les info : tables, requête, formulaire, etc.. puis je l'ai fractionnée en deux :
Base frontale = Bourse.accdb
Base dorsale = Bourse_table.accdb
C'est une application qui est utilisée 2 à 3 fois par an uniquement pour des bourses aux vêtements ou aux jouets d'une association et les membres de l'association utilisent donc leurs ordinateurs portables personnels (2 ou 3 ordinateurs maximum).
La responsable installe donc à chaque fois les documents nécessaires sur chaque ordinateur puisque ce ne sont pas toujours les mêmes soit :
La base frontale sur les 3 ordinateurs. La base dorsale sur 1 des 3 ordinateurs dans un dossier partagé.

Il faut signaler que les utilisateurs sont tous des utilisateurs relativement non expérimentés et que je n'interviens au niveau de ce programme que pour la création et la programmation, ensuite sauf cause de gros problème ils doivent ce débrouiller sans moi.

Pour des raisons de sécurités, je leur ai retiré l'accès aux menus d'Acces et donc, ils ne peuvent pas à l'ouverture de leur base accéder à la gestion de tables liées de l'onglet Outils de base de données pour lier la base frontale et la base dorsale.

J'ai fait des recherches sur internet et j'ai trouvé un site qui disait qu'il était possible de créer un code VBA pour demander à l'ouverture de la base frontale sur le premier formulaire ouvert (qui n'a aucun lien avec les tables) où ce trouvent la base dorsale mais qui ne donne aucun exemple et aucun lien pour m'aider plus juste le nom de livres que je ne possède pas.

Mon problème c'est que malheureusement, je ne sais pas programmer en VBA seulement bidouiller un code déjà existant en modifiant les noms de champs, de table, etc...
J'ai cherché sur internet et en fait tout ce que j'ai trouvé ne correspond pas à ma demande.

Quelqu'un peut-il venir à mon secourt.

Merci pour toute aide

25 réponses

blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 11:10
Salut,

tu peux effectivement mettre à jour les attaches de base avec du code VBA et la propriété connect d'une table.

Voici un bout de code qui te permet d'afficher les attaches courantes :
Set Db = CurrentDb
For Each Tb In Db.TableDefs
    If Left(Tb.Name, 4) <> "MSys" Then
        If Tb.Connect <> "" Then
            MsgBox Tb.Name & "-" & Tb.Connect
        End If
    End If
Next

Teste-le et ensuite on s'attaquera à la partie modification.
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 13:11
Salut,

D'abord, merci pour ton aide car je suis une grande novice en VBA même si ça fait des années que j'utilise Access.

Je viens de saisir ton code en le créant sur l'événement "Sur ouverture" de mon formulaire de bienvenue.

Lorsque j'ouvre ma base après avoir activer les macros, pour chaque table (j'en ai plus de 30), j'ai une boite de message qui apparaît avec à l'intérieur l'information suivante :

Nomtable-;DATABASE=chemin base dorsale

et un bouton pour valider

le chemin étant celui utilisé lors de la liaison précédente, ce qui me paraît logique et donc si j'ai déplacé ma base, lorsque je valide mon premier formulaire et qu'alors je doit avoir accès à mes tables, à ce moment j'ai le message que j'avais auparavant.

Voila, encore merci et j'attends la suite
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 13:46
Pour mettre à jour une liaison, il suffit de rajouter quelques lignes :

Set Db = CurrentDb
Unc = ";Database=chemin_répertoire_souhaité"
For Each Tb In Db.TableDefs
    If Left(Tb.Name, 4) <> "MSys" Then
        If Tb.Connect <> "" Then
            MsgBox Tb.Name & "-" & Tb.Connect
            If Tb.Connect <> Unc Then
                Tb.Connect = Unc
                Tb.RefreshLink
            End If
        End If
    End If
Next

Ca suit toujours, au fond ? ;-)

Ensuite, on verra comment gérer le choix du répertoire.
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 13:56
oui oui, ça suit toujours,

Bon j'ai donc copié la suite du code et une fois qu'il a fini de m'afficher toutes mes boites de message, j'ai une nouvelle boite qui s'ouvre avec inscrit :

Erreur d'exécution '3024' :

Fichier "D:\-DOSSIERS PERSONNELS\chemin_répertoire_souhaité" introuvable.


Fin Débogage Aide



En sachant que le chemin complet était :

D:\- DOSSIERS PERSONNELS\- CORINNE\Associations\Le Chas et la Cigogne\ et donc que ne retrouve que la première partie du chemin. Je ne sais pas si c'est normal ou pas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 13:58
A priori si je fait Débogage, c'est la ligne

Tb.RefreshLink qui est en jaune
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 14:02
Je pense que as du confondre, il faut remplacer chemin_répertoire_souhaité par ce que tu veux...

Ensuite, j'ai des doutes sur les noms des sous-répertoires qui commencent par - et éventuellement dans le cas où ce sont des pseudo-répertoires (comme bureau, mes documents...)

Pourrais-tu poster le code que je regarde où est l'erreur ?
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 14:07
Le sous répertoire qui commence par - c'est moi qui l'avait mis dans le nom pour qu'il se trouve tout en haut lors des recherches mais on y a effectivement ensuite lié mes documents.

Par contre, au moment de l'utilisation ce ne sera pas ce répertoire qui sera utilisé puisque ce ne sera pas sur mon ordinateur mais sur d'autres ordi que je ne connais pas et donc je ne sais pas quel chemin il faudra utiliser d'ou mon soucis.

Voila le code que j'ai dans VBA


Private Sub Form_Open(Cancel As Integer)
Set Db = CurrentDb
For Each Tb In Db.TableDefs
If Left(Tb.Name, 4) <> "MSys" Then
If Tb.Connect <> "" Then
MsgBox Tb.Name & "-" & Tb.Connect
End If
End If
Next

Set Db = CurrentDb
Unc = ";Database=chemin_répertoire_souhaité"
For Each Tb In Db.TableDefs
If Left(Tb.Name, 4) <> "MSys" Then
If Tb.Connect <> "" Then
MsgBox Tb.Name & "-" & Tb.Connect
If Tb.Connect <> Unc Then
Tb.Connect = Unc
Tb.RefreshLink
End If
End If
End If
Next


End Sub


Je ne sais pas si c'est vraiment ce que tu veux, dit moi.
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 14:18
J'avais dit rajouter des lignes, dans mon message <3>, et je les avais mises en gras. Or là, tu as dupliqué la procédure, ce qui n'est pas ce qu'on attendait, d'où des messages quelques peu étranges.

Il serait plus opportun de ne garder que ce qui est donné en <3> (toutes les lignes).

Et il faut modifier la ligne Unc = ";Database=chemin_répertoire_souhaité" afin de remplacer la chaine 'chemin_répertoire_souhaité' par l'endroit qui contient les tables liées (ce que tu appelles 'dorsale'), mais c'est vrai que je ne l'avais pas expressément signalé. Pour simplifier, tu peux faire le test avec C:\
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 14:31
Je viens de faire un test en déplaçant ma base dorsale dans le répertoire partagé personnel qui me sert à faire les tests en multi poste et qui n'utilise pas de - dans le nom et en modifiant le code par ce nouveau chemin soit :

Et j'ai donc le code suivant

Private Sub Form_Open(Cancel As Integer)
Set Db = CurrentDb
For Each Tb In Db.TableDefs
If Left(Tb.Name, 4) <> "MSys" Then
If Tb.Connect <> "" Then
MsgBox Tb.Name & "-" & Tb.Connect
End If
End If
Next

Set Db = CurrentDb
Unc = ";Database=cD:\Partage Corinne\Bourse_table.accdb"
For Each Tb In Db.TableDefs
If Left(Tb.Name, 4) <> "MSys" Then
If Tb.Connect <> "" Then
MsgBox Tb.Name & "-" & Tb.Connect
If Tb.Connect <> Unc Then
Tb.Connect = Unc
Tb.RefreshLink
End If
End If
End If
Next


End Sub


Ca fonctionne m'ai par contre je n'ai plus 31 boites de messages qui s'ouvre et qu'il faut valider mais le double


Par contre, là je dois malheureusement partir pour le restant de l'après midi. Je pourrais revenir ce soir après 18 heures ou demain. Dis moi ce qui te convient le mieux car tes lumières intéressent énormément (j'ai encore 2 autres questions après celle là)
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 14:38
Nos messages ce sont croisées, bon j'ai donc corrigé en ne mettant que ce qui était sur ton message 3 et en changeant le chemin.
Désolé, je travaille avec deux écrans un tout beau tout neuf et un vieux prout prout et la page du forum ce trouve sur le vieux prout prout, je n'avais pas vu qu'il y avait des parties en gras.

Ca marche et je n'ai plus que mes 31 boites de messages qui s'ouvre.

Je te dis @+ car je me sauve

Merci pour ton aide et ta patience
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 15:18
Supprime la ligne msgbox qui provoque l'affichage...
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 17:37
Bon, me revoila

J'ai supprime la ligne msgbox, j'ai déplacé ma base dorsale lancé le programme qui du coup bug, remis la base dorsale dans le dossier qui est noté dans le code et ça fonctionne.

J'attends sagement la suite
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 18:35
On peut procéder de deux manières :

- boite de dialogue qui va demander l'emplacement de la base liée
- renseignement d'un paramètre dans une table qui sera interrogée au lancement
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 18:39
je préfère la boite de dialogue
merci
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 19:18
oui, mais si elle apparaît à l'utilisateur final (celui qui ne connait rien, mais qui appuie partout), on fait quoi ?
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 20:01
Un question d'abord. Lorsque les ordinateurs portables sont coupés le soir et réouvert le lendemain matin (la bourse dure environ 1 semaine et chacun ramène son ordi chez lui) est-ce que la liaison avec le dossier partagée est perdue ou non ?

Si elle est conservée, à ce moment là ne peut on pas faire une boite de dialogue qui n'apparaît que si la liaison n'est plus bonne.

Si elle n'est pas conservée, peut on rajouter un bouton avec un mot de passe derrière qui ouvre une boite de dialogue.

Pour moi le problème de la table interrogée au lancement c'est que le chemin peu modifié d'une bourse à l'autre car ils ne conservent pas les info sur l'ordi où alors, il y a une astuce que je ne comprends pas avec cette méthode : comment est saisie le paramètre dans la table.
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
30 nov. 2009 à 20:18
Une liaison est un nom stocké quelque part dans une "table système" access.

Il n'y a donc pas à proprement parler de 'liaison perdue'. Soit l'emplacement 'cible' (dorsal) est accessible et les tables sont accédées normalement, soit l'emplacement n'est pas accessible, et on a aucun accès aux données.

Si elle est conservée, à ce moment là ne peut on pas faire une boite de dialogue qui n'apparaît que si la liaison n'est plus bonne.
Je ne connais pas de méthode pour intercepter une liaison déficiente dans access.

Pour moi le problème de la table interrogée au lancement c'est que le chemin peu modifié d'une bourse à l'autre car ils ne conservent pas les info sur l'ordi où alors, il y a une astuce que je ne comprends pas avec cette méthode : comment est saisie le paramètre dans la table.
Tu lances ta base, elle se plante car les liaisons ne sont pas bonnes, tu modifies un champ dans une table (qui n'est pas une table liée), tu fermes et tu relances ta base, ça marche.
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
30 nov. 2009 à 21:29
J'ai un souci avec le réseau et de cela découlera peut être la réponse. Je suis en train de faire des tests et je te réponds
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
1 déc. 2009 à 00:48
Bon, j'ai patiellement résolumon problème de réseau.

Je t'explique, peut-être pourras tu m'aider.

Même si le programme doit normalement être utilisé par 3 postes en même temps, pour simplifier je ne parlerai ici que de 2 postes :

1 poste admin qui contient la base avec les formulaires sur un disque propre au poste ainsi que la base avec les tables dans un dossier partagé. Ce poste a un user = user_admin et un mot de passe = mdp_admin

1 poste utilisateur qui ne contient que la base avec les formulaires et qui a un user = user_poste et un mot de passe = mdp_poste.


J'avais installé le partage en créant un user sur le poste admin avec les infos user_poste et mdp_poste et j'avais donné les autorisations à ce user pour modifier et lire les fichiers se trouvant dans le dossier partagé par le biais du programme partage de windows.

Je lançais mon programme et pour le moment je le liais manuellement à la base des tables. L'ordi me demandait le user et le mot de passe, je saisissais ceux du poste admin. Ca fonctionnait. Si j'éteignais l'ordi utilisateur et que je le rallumais lorsque je lançais le programme, celui-ci était bloqué et aucune modification n'était possible que ce soit du poste admin ou du poste utilisateur. Il fallait relier de nouveaux les tables (d'ou ma question en <16> sur la perte des liens. En fait, le programme reconnaissait les liens mais il s'ouvrait non pas avec les user et mot de passe du poste admin mais avec ceux du poste utilisateur. J'avais d'ailleurs posé la question sur le forum dans la partie "Bureautique" il y a quelque jour mais je n'est reçu aucune réponse.

J'ai contacté la personne qui se charge du réseau de l'association (qui comme moi et une personne extérieur et donc absente au moment d'utiliser le programme) et il m'a expliqué que leur réseau était installé différemment (attention, j'ai testé chez moi, pas avec leur réseau donc je ne sais pas si je rencontrerai le même problème mais bon) :

Par le biais du poste de travail du poste utilisateur j'ai fait un clic droit sur ordinateur et Connecter un lecteur réseau. J'ai choisi la lettre Z pour le lecteur et par le biais de Parcourir je suis allée définir le chemin où ce trouve le dossier partagé sur le poste admin. A ce moment l'ordinateur me demande le nom d'utilisateur et le mot de passe. Je saisi donc user_admin et mdp_admin et je coche Mémoriser mon mot de passe.

Je lance mon programme Access, pour le moment, je sélectionne ma base de table manuellement. Tout fonctionne normalement, avec les deux PC en même temps.

J'éteins mon poste utilisateur et je le rallume, l'ordinateur me dit alors "impossible de reconnecter tous les lecteurs réseau" et donc il faut ressaisir à chaque fois user_admin et mdp_admin lorSque l'on rouvre un pc.


Je ne sais pas si tu as une solution pour ce problème.

Du coup pour en revenir à notre première question soit boite de dialogue ou table, si tu me dis que la table c'est plus sûr, partons pour la table. En fait, j'hésitais uniquement du fait de ma pseudo "perde de lien" que j'explique plus haut puisque selon moi, il fallait systématiquement à chaque ouverture de l'ordinateur reconfigurer le lien même s'il existait (mais avec le mauvais user) et donc je pensais que la boite de dialogue était du coup plus logique
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
1 déc. 2009 à 09:02
J'ai pas tout compris : le user/mot de passe, c'est celui du partage réseau ou celui de l'identification au domaine windows ?
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
1 déc. 2009 à 09:48
Le user/mot de passe que j'utilise c'est celui que je saisie à l'ouverture de mon ordinateur, je fais peut être une bétise et de la mon problème. Chaque ordi à un user et un mot de passe qu'on utilise à l'ouverture et c'est ceux la que j'utilise. Faut-il en créer un particulier pour le partage et si oui ou est-ce qu'on le crée
0
Co52 Messages postés 78 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 8 octobre 2016 3
1 déc. 2009 à 10:27
Laisse tomber pour le réseau, je verrai avec la personne qui l'installe pour l'asso pour qu'il me donne des cours. Je préfère avancer sur mon programme access on en était à la création d'une boite de dialogue ou d'une table et donc je te fais confiance pour la table.
0
blux Messages postés 26503 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 2 décembre 2024 3 317
1 déc. 2009 à 12:59
Donc tu crées une table locale (c'est à dire sur ta base frontale, sans liaison) avec un champ du nom que tu veux, par exemple : table "constantes", et champ "basdis"...

Tu remplis repdis avec le nom complet de ta base distante, genre : \\gnagnagna\toto\rep1\pling.mdb ou Z:\pouet\toto.mdb

Et ensuite tu modifies la procédure que je t'ai donnée :

Set Db = CurrentDb
Unc = DLookup("basdis", "constantes")
Unc = ";Database=" & Unc

For Each Tb In Db.TableDefs
If Left(Tb.Name, 4) <> "MSys" Then
If Tb.Connect <> "" Then
If Tb.Connect <> Unc Then
Tb.Connect = Unc
Tb.RefreshLink
End If
End If
End If
Next

Bien entendu, tu devras distribuer ta nouvelle base à tout le monde...

Pendant que tu y est, fais-en un .MDE, ça devrait décourager les impertinents du click...
0