begin process at 2012 02 13 23:29:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VBA

 > RATTACHEMENT DE TABLE AUTOMATIQUE ACCESS

RATTACHEMENT DE TABLE AUTOMATIQUE ACCESS


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VBA Classé sous :access, rattachement table, fichier ini Niveau :Débutant Date de création :05/06/2004 Date de mise à jour :12/02/2010 17:59:00 Vu :8 651

Auteur : defrance

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

ce petit truc me permet de mettre à jour facilement le rattachement des tables d'une application access à partir d'un fichier ini (défini dans la fonction rattache table). C'est idéal quand on doit livrer une appli access et que l'environnement de dev n'est pas le même que l'environnement (ou les environnements) de production.
F_Rattache table est une fonction car cela me permet de l'appeller directement d'une macro ;-)

Source

  • Public Function F_RattacheTable(szFichier As String) As Boolean
  • F_RattacheTable = True
  • Dim TableEnCours As TableDef
  • Dim TableNouvel As TableDef
  • Dim szLgnINI As String
  • Set db = CurrentDb
  • 'ouverture du fichier ini
  • Set obj = CreateObject("Scripting.FileSystemObject")
  • szFichierIni = Application.CurrentProject.Path & "\" & szFichier
  • ' si le fichier n'existe pas on le crée (premier passage)
  • If Not obj.FileExists(szFichierIni) Then
  • P_genTableIni (szFichierIni)
  • Else
  • Set objFichierINI = obj.OpenTextFile(szFichierIni, 1, 0)
  • 'boucle infinie jusqu'à la fin du fichier
  • Do
  • On Error Resume Next
  • szLgnINI = objFichierINI.ReadLine
  • ' pour gerer simplemement la fin du fichier
  • If Err.Number > 0 Then
  • Exit Do
  • End If
  • ' boucle sur la liste des tables présente
  • bTopTrouve = False
  • For Each TableEnCours In db.TableDefs
  • 'on vérifie que c'est la bonne table
  • If TableEnCours.SourceTableName = Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1)) Then
  • 'mise à jours du lien ssi il a changé
  • If TableEnCours.Connect <> Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1) Then
  • ' on met à jour la liaison seulement si la base à connecté est accessible
  • If obj.FileExists(Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)) The
  • TableEnCours.Connect = Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)
  • TableEnCours.RefreshLink
  • end if
  • End If
  • ' si a traité la bonne table on sort du next et on passe à la ligne suivante du fichier
  • bTopTrouve = True
  • Exit For
  • End If
  • Next
  • ' si la table n'est pas présente dans la liste des tables on crée le lien
  • If Not bTopTrouve Then
  • ' on crée le lien seulement si la base est accessible
  • If obj.FileExists(Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)) The
  • Set TableNouvel = db.CreateTableDef(Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1)))
  • TableNouvel.Connect = Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)
  • TableNouvel.RefreshLink
  • TableNouvel.SourceTableName = Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1))
  • TableNouvel.RefreshLink
  • db.TableDefs.Append TableNouvel
  • end if
  • End If
  • Loop
  • objFichierINI.Close
  • Set objFichierINI = Nothing
  • End If
  • ' fermeture des objets
  • Set obj = Nothing
  • Set db = Nothing
  • End Function
  • Public Sub P_genTableIni(szNewFichierIni As String)
  • Dim TableEnCours As TableDef
  • Dim szLgnINI As String
  • Set db = CurrentDb
  • 'ouverture du fichier ini
  • Set obj = CreateObject("Scripting.FileSystemObject")
  • obj.CreateTextFile szNewFichierIni, True
  • Set objfINI = obj.GetFile(szNewFichierIni)
  • Set objWritINI = objfINI.openAsTextStream(8)
  • ' récupération du paramétrage
  • For Each TableEnCours In db.TableDefs
  • If Len(TableEnCours.Connect) > 0 Then
  • szLgnINI = TableEnCours.SourceTableName & "=" & TableEnCours.Connect
  • objWritINI.WriteLine (szLgnINI)
  • End If
  • Next
  • ' fermeture des objets
  • objWritINI.Close
  • Set objFichierINI = Nothing
  • Set objfINI = Nothing
  • Set obj = Nothing
  • Set db = Nothing
  • End Sub
Public Function F_RattacheTable(szFichier As String) As Boolean
    F_RattacheTable = True
    Dim TableEnCours As TableDef
    Dim TableNouvel As TableDef
    Dim szLgnINI As String
    Set db = CurrentDb
    'ouverture du fichier ini
    Set obj = CreateObject("Scripting.FileSystemObject")
    szFichierIni = Application.CurrentProject.Path & "\" & szFichier
    ' si le fichier n'existe pas on le crée (premier passage)
    If Not obj.FileExists(szFichierIni) Then
        P_genTableIni (szFichierIni)
    Else
        Set objFichierINI = obj.OpenTextFile(szFichierIni, 1, 0)
        'boucle infinie jusqu'à la fin du fichier
        Do
            On Error Resume Next
            szLgnINI = objFichierINI.ReadLine
            ' pour gerer simplemement la fin du fichier
            If Err.Number > 0 Then
                Exit Do
            End If
            ' boucle sur la liste des tables présente
            bTopTrouve = False
            For Each TableEnCours In db.TableDefs
                'on vérifie que c'est la bonne table
                If TableEnCours.SourceTableName = Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1)) Then
                    'mise à jours du lien ssi il a changé
                    If TableEnCours.Connect <> Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1) Then
                    		' on met à jour la liaison seulement si la base à connecté est accessible
                    		If obj.FileExists(Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)) The
                        	TableEnCours.Connect = Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)
                        	TableEnCours.RefreshLink
                        end if
                    End If
                    ' si a traité la bonne table on sort du next et on passe à la ligne suivante du fichier
                    bTopTrouve = True
                    Exit For
                End If
            Next
            ' si la table n'est pas présente dans la liste des tables on crée le lien
            If Not bTopTrouve Then
            	' on crée le lien seulement si la base est accessible
            	If obj.FileExists(Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)) The
                Set TableNouvel = db.CreateTableDef(Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1)))
                TableNouvel.Connect = Mid(szLgnINI, InStr(1, szLgnINI, "=") + 1)
                TableNouvel.RefreshLink
                TableNouvel.SourceTableName = Trim(Left(szLgnINI, InStr(1, szLgnINI, "=") - 1))
                TableNouvel.RefreshLink
                db.TableDefs.Append TableNouvel
              end if
            End If
        Loop
        objFichierINI.Close
        Set objFichierINI = Nothing
    End If

    ' fermeture des objets
    Set obj = Nothing
    Set db = Nothing
End Function

Public Sub P_genTableIni(szNewFichierIni As String)
    Dim TableEnCours As TableDef
    Dim szLgnINI As String
    Set db = CurrentDb
    'ouverture du fichier ini
    Set obj = CreateObject("Scripting.FileSystemObject")
    obj.CreateTextFile szNewFichierIni, True
    Set objfINI = obj.GetFile(szNewFichierIni)
    Set objWritINI = objfINI.openAsTextStream(8)

    ' récupération du paramétrage
    For Each TableEnCours In db.TableDefs
        If Len(TableEnCours.Connect) > 0 Then
            szLgnINI = TableEnCours.SourceTableName & "=" & TableEnCours.Connect
            objWritINI.WriteLine (szLgnINI)
        End If
    Next

    ' fermeture des objets
    objWritINI.Close
    Set objFichierINI = Nothing
    Set objfINI = Nothing
    Set obj = Nothing
    Set db = Nothing
End Sub


 Conclusion

Au lancement,
- si le fichier ini n'existe pas, il est crée à partir des paramètres de liaison définie dans la base.
-Sinon, il en utilisera les paramètres pour mettre à jour (si besoin) le lien vers les bonnes bases.

La structure du fichier ini est la suivante :
NomDeLaTable=CheminDeLaTable



 Historique

31 juillet 2004 18:56:53 :
31/07/04 : si la table est dans le fichier mais n'existe pas dans la base, le lien est crée
12 février 2010 17:59:00 :
12/02/2010 : petite amélioration pour tester que la base à rattacher existe

 Sources du même auteur

Source avec Zip GENERATION RECURSIVE DE SOUS RÉPERTOIRE
LISTAGE RECURSIVE DE SOUS RÉPERTOIRE
Source avec Zip Source avec une capture ANTI SPAM EN MACRO OUTLOOK VBA

 Sources de la même categorie

Source avec Zip GESTION PERSONNEL par oudlarbi
Source avec Zip Source avec une capture CALENDRIER EN VBA POUR EXCEL 2010 par nounou94
Source avec Zip Source avec une capture MANIPULER LES FENETRES ENFANT D'EXCEL par bigfish_le vrai
Source avec Zip Source avec une capture COLLECTION ID par Le Pivert
Source avec Zip Source avec une capture VBA MASQUE DE SAISIE NUMÉRIQUE par acive

 Sources en rapport avec celle ci

Source avec Zip VISUAL BASIC 2008 - PUBLIPOSTAGE, WORD ET ACCESS. par scn68100
Source avec Zip Source avec une capture Source .NET (Dotnet) OUVRIR BASE ACCESS PAR CLIC DROIT par Le Pivert
Source avec Zip Source avec une capture Source .NET (Dotnet) CRÉER, CONNECTER ET REMPLIR UNE BASE ACCESS par Le Pivert
Source avec Zip Source avec une capture Source .NET (Dotnet) AJOUTER - MODIFIER - SUPPRIMER DANS UNE BDD ACCESS SOUS VB20... par kewan
Source avec Zip [VBS] MODIFICATION D'UN FICHIER INI par VBsearch

Commentaires et avis

Commentaire de Fabio972 le 29/07/2004 18:06:51

Sympa ce code !!!

quand on (re)commence sur ACCESS avec des tables liées partout, il est toujours pratique de pouvoir définir l'envirronement d'utilisatoin de la base.

Cette fonction fait ce qu'elle dit (en tous cas, écrire le fichier si rien de spécifier) et de bien belle manière.
Ce qui m'a permis de voir vers quoi sont rattachées mes tables sans me fouler.

Bravo et merci !!!

Commentaire de Fabio972 le 30/07/2004 14:17:22

Bon, testé plus en profondeur, je confirme que cette fonction fais ce qu'elle dit.

Légèrement modifiée et mise dans une base à part, j'ai pu pour toute une liste de bases ACCESS avoir un rapport sur leurs tables liées.

De même, j'ai pu rattacher les nouvelles tables sans problèmes (modification du chemin dans le fichier généré).

Il ne me reste plus qu'à faire une belle interface et hop !!! je pourrais gérer mes tables liées dans tous les sens !!!


Merci beaucoup DeFrance !!!

Commentaire de defrance le 30/07/2004 20:30:57

pas de quoi, pense à mettre ta prose à disposition de la communauté ;-)

Commentaire de tombal le 31/07/2004 16:29:58

Salut, je voudrais savoir si y'a moyen non pas de modifier un rattachement mais de creer une liaison de table
càd le "lier une table" mais avec du vba ?

Commentaire de defrance le 31/07/2004 18:13:19

je dirai oui, c'est une excellente idée d'évolution. Cela tombe bien j'avais du temps la semaine prochaine ;-)

Commentaire de Fabio972 le 04/08/2004 22:23:32

Dites les gars... c'est quoi la différence entre :

- modifier un rattachement
et
-creer une liaison de table ???

"lier une table" mais avec du vba : c'est ce que fait cette source non ?!?

Sinon DeFrance, je comptais bien m'y mettre aujourd'hui, mais je suis tombé sur cette merveille :
http://www.vbfrance.com/code.aspx?ID=3311

La lisaion des bases depuis cette interface serait fort plaisante. Bien sur, faut prévoir les 100Mo que demandera VB pour le setup par rapport aux qques ko d'une base Access (tant qu'à rattacher des tables Access, c'est sûr qu'il est sur la machine ;-)

Autre source sympa :
http://www.vbfrance.com/codes/GENERATEUR_DE_SCRIPT_SQL_-ACCESS_VERS_SQL-/25127.aspx

Commentaire de defrance le 05/08/2004 00:53:55

modifier un rattachement : la base a des tables liés qui ne sont pas ceux qui sont défini dans le fichiers ini -> on met à jour la liaison sur la bonne base/table.
créer une liaison : la base de possède pas la table défini dans le fichier ini -> on crée une table attaché à partir des infos du fichier ini
La principale utilisation que je fait de cette source et la livraison en production de base access : j'évite de me refaire manuellement le rattachement des tables qui peuvent se trouver dans plusieurs bases ...

Commentaire de hachy le 22/02/2008 16:50:16

bonjour à tous
j'ai crée une base de donnée access sous ADO
je n'arrive pas à mettre à jour 2 table liée.
aidez mois

Commentaire de krov le 27/04/2009 15:43:01

Bonjour à tous,

comment utilise t'on le code de DEFRANCE ?

Merci
Krov

Commentaire de SamiBenelhadj le 12/02/2010 16:40:20

Bonjour,

J'ai une question pour DEFRANCE qui semble bien maîtriser le sujet : la méthode utilisée (classique) fonctionne bien tant que le fichier contenant les tables à attacher est accessible mais ne marche plus dans le cas contraire. Auriez-vous une solution pour "forcer" l'attache de table en stockant dans la propriété .Connect un chemin de fichier inexistant ?
Cela serait très pratique par exemple :
- pour préparer offline un Front End à un client pour lequel on n'a pas accès au Back End,
- ou pour accéler l'attache de tables car lorsqu'un Back End est ouvert par plusierus utilisateurs, la màj de la proriété .Connect de chaque table peut devenir très longue...

Ca fait longtemps que je recherche une solution, sans succès.

Merci pour votre aide.

Commentaire de defrance le 12/02/2010 18:05:15

Bonjour,
Bonne question, j'ai modifié mon source pour vérifier la présence de la base AVANT de tenter la connection/création du lien
par contre j'ai pas compris le second pb, car le module ne met pas à jour la connection si elle est identique à celle paramétré...

Commentaire de SamiBenelhadj le 14/02/2010 18:12:44 10/10

Merci pour cette réponse rapide : je vois que j'ai affaire à un passionné !

Je vais reformuler plus simplement : comment créer une attache ou màj la propriété .Connect vers la table d'un fichier de base de données MS Access inaccessible ?

Je confirme que c'est hyper utile pour de multiples raisons.

Commentaire de defrance le 14/02/2010 18:27:27

D'après ce que j'en sait ce n'est pas possible car access vérifie que la base est accessible (ce qui est assez logique, le contraire serait génant).
Une solution pas très élégante serait de reproduire ton environnement back-end en qualif et préparer ta connection ainsi.
Sinon tu n'attaches aucune table lors de ta configuration et tu laisses la fonction créer les attachements lors de son premier lancement chez ton client...

Commentaire de SamiBenelhadj le 14/02/2010 18:48:06

Bon sang, j'utilise ta solution 1 (inélégante à souhait !)depuis 15 ans sans jamais avoir pensé à la seconde !!! D'autant que, si je me souviens bien, une création d'attache vers un back-end est quasi-instantanné, même si il est ouvert par d'autres utilisateurs.

Encore bravo pour cette suggestion !!!

Si je peux t'être d'une quelconque aide, n'hésite pas : tu peux voir mes applis en tapant cd.concept.online.fr dans ton navigateur.

A+

Commentaire de defrance le 14/02/2010 19:11:43

comme on dit, les choses les plus simples,
Je suis AE et j'ai aussi mon site perso ici : www.benke.fr
si tu as des besoins en dev, ben hésite pas

Commentaire de defrance le 31/03/2011 11:35:28

Nouvelle version avec utilisation d'une table pour stocké le rattachement

' rattache les tables à partir du fichier ini passé en paramètre
' le fichier contient les lignes avec ce format :
' NOMTABLE=Param_de_connection
Sub P_RattacheTable()
    Dim TableEnCours As TableDef
    
    Set db = CurrentDb
    sql = "select * from TableAttache"
    Set rsTblAttache = db.OpenRecordset(sql)
    Do While Not rsTblAttache.EOF
        For Each TableEnCours In db.TableDefs
            'on vérifie que c'est la bonne table
            If TableEnCours.SourceTableName = rsTblAttache.Fields("NomTableAttache") Then
                'mise à jours du lien ssi il a changé
                If TableEnCours.Connect <> rsTblAttache.Fields("LienTableAttache") Then
                    TableEnCours.Connect = rsTblAttache.Fields("LienTableAttache")
                    TableEnCours.RefreshLink
                End If
                Exit For
            End If
        Next
        rsTblAttache.MoveNext
    Loop
    rsTblAttache.Close
    Set rsTblAttache = Nothing
End Sub

Sub P_GenRattacheTable()
    Dim TableEnCours As TableDef
    Set db = CurrentDb
    sql = "delete from TableAttache"
    db.Execute (sql)
    For Each TableEnCours In db.TableDefs
        ' uniquement si la table est attachée
        If Len(TableEnCours.Connect) > 0 Then
            sql = "insert into TableAttache (NomTableAttache, LienTableAttache) values ("
            sql = sql & "'" & TableEnCours.SourceTableName & "',"
            sql = sql & "'" & TableEnCours.Connect & "')"
            db.Execute (sql)
        End If
    Next
    
End Sub

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

les etats access [ par henri ] comment faire pour imprimer un etat access par un code VisualBasic ? VB & Access 2000 [ par Uther ] J'aimerais savoir comment faire pour connecter un DAO datacontrol à une BD Access 2000 sans que le message de "Base de donnee invalide" n'intervienne. Copier un etat access vers Excel [ par Ol ] Je voudrais copier un etat access (un tableau) vers Excel sans perdre la mise en page (ou le moins possible).Comment faire?? Exécutable avec Access [ par janus ] Nous avons problème à créer un exécutable en utilisant Vb avec Access, en considérant que le logiciel Access ne doit pas être obligatoire.C'est à dire enregistrer un document word [ par Christian ] Bonjour à tous, et bravo pour la qualité de ce site sur VB "En Français".Depuis quelques jours je me prend la tête pour enregistrer un document Word à Imprimer état Access sous VB [ par janus ] Le problème est de pouvoir imprimer un état Access sous VB, et ce sans que le logiciel Access ne s'ouvre.Merci d'avance Accès à une base de donnée Access sous VB [ par lolo ] J'aimerais réaliser une sorte de moteur de recherche en VB :il y a différents champs à remplir par l'utilisateur; une fois ces derniers remplis l'appl VB et formulaires access [ par jabri ] Est ce posssible d'appeler à partir d'un programme VB un formulaire appartenet a access (en gardant le look access) et comment merci... Outlook et Access 2000 [ par taz ] Comment exporter ou importer les informations du calendrier d'Outlook 2000 ans Access 2000


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales