Données sur bases Access - bases liées

Le
Driss HANIB
Bonjour à tous
dans une de mes programmes j'utilise une base Access principale qui contient
également des tables liées.
J'ai ainsi groupé toutes mes requêtes dans cette table principale.
Le problème est que je cherche à compacter de manière automatique les bases
de données (principales et liées).
Pour l'instant je note en dur, le nom des bases liées et je les mets dans le
même répertoire que la base principale.

Je voudrai "automatiser" ce compactage sans donner au préalable les chemins
des bases liées.
peut-on donc à partir d'une table de cette base principale, déterminer si
elle est liée et si oui , le chemin de la base liée ?

merci pour vos pistes

Driss
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Driss HANIB
Le #15395721
j'ai oublié de préciser que j'utilise DAO....

Driss


"Driss HANIB" news:%
Bonjour à tous
dans une de mes programmes j'utilise une base Access principale qui


contient
également des tables liées.
J'ai ainsi groupé toutes mes requêtes dans cette table principale.
Le problème est que je cherche à compacter de manière automatique les


bases
de données (principales et liées).
Pour l'instant je note en dur, le nom des bases liées et je les mets dans


le
même répertoire que la base principale.

Je voudrai "automatiser" ce compactage sans donner au préalable les


chemins
des bases liées.
peut-on donc à partir d'une table de cette base principale, déterminer si
elle est liée et si oui , le chemin de la base liée ?

merci pour vos pistes

Driss




jean-marc
Le #15395711
"Driss HANIB" news:%
Bonjour à tous
dans une de mes programmes j'utilise une base Access principale qui
contient
également des tables liées.
J'ai ainsi groupé toutes mes requêtes dans cette table principale.
Le problème est que je cherche à compacter de manière automatique les
bases
de données (principales et liées).
Pour l'instant je note en dur, le nom des bases liées et je les mets dans
le
même répertoire que la base principale.

Je voudrai "automatiser" ce compactage sans donner au préalable les
chemins
des bases liées.
peut-on donc à partir d'une table de cette base principale, déterminer si
elle est liée et si oui , le chemin de la base liée ?



Salut Driss,

Intéressante question ... pour le moment sans réponse ...

Je vais investiguer!


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
jean-marc
Le #15394671
"Driss HANIB" news:%
Bonjour à tous
dans une de mes programmes j'utilise une base Access principale qui
contient
également des tables liées.
J'ai ainsi groupé toutes mes requêtes dans cette table principale.
Le problème est que je cherche à compacter de manière automatique les
bases
de données (principales et liées).
Pour l'instant je note en dur, le nom des bases liées et je les mets dans
le
même répertoire que la base principale.

Je voudrai "automatiser" ce compactage sans donner au préalable les
chemins
des bases liées.
peut-on donc à partir d'une table de cette base principale, déterminer si
elle est liée et si oui , le chemin de la base liée ?




Re!

Voila la soulution:
Une Db contient une collection TableDefs, qui contient les tables.
Chaque table a une propriété "Connect".
Cette propriété est vide ("") pour une table "normale", alors que pour une
table liée elle contient le nom et le chemin de la base à laquelle
appartient cette table.

Voici un petit bout de code:

Dim db As Database
Dim tb As TableDef

Set db = OpenDatabase("c:/principale.mdb")
For Each tb In db.TableDefs

If tb.Connect <> "" Then
Debug.Print "la table " & tb.Name & " est une table liée. Source
= " & tb.Connect
End If

Next

Donc tu ouvres ta base principale (ici "c:principale.mdb")
puis tu parcours les tables (avec Tabledefs par exemple)
et tu examine la propriété Connect.

Dans mon cas, j'avais créé une base "db_liee" et attaché une table:
("Tbl_liee").

Voici la sortie de mon programme:

la table Tbl_dbliee est une table liée. Source = ;DATABASE=C:db_liee.mdb


Et voila :-)



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Driss HANIB
Le #15394661
merci Jean-Marc pour ta célérité..
je regarde cela

Driss

"jean-marc" news:46dd445b$0$14245$
"Driss HANIB" news:%
> Bonjour à tous
> dans une de mes programmes j'utilise une base Access principale qui
> contient
> également des tables liées.
> J'ai ainsi groupé toutes mes requêtes dans cette table principale.
> Le problème est que je cherche à compacter de manière automatique les
> bases
> de données (principales et liées).
> Pour l'instant je note en dur, le nom des bases liées et je les mets


dans
> le
> même répertoire que la base principale.
>
> Je voudrai "automatiser" ce compactage sans donner au préalable les
> chemins
> des bases liées.
> peut-on donc à partir d'une table de cette base principale, déterminer


si
> elle est liée et si oui , le chemin de la base liée ?
>

Re!

Voila la soulution:
Une Db contient une collection TableDefs, qui contient les tables.
Chaque table a une propriété "Connect".
Cette propriété est vide ("") pour une table "normale", alors que pour une
table liée elle contient le nom et le chemin de la base à laquelle
appartient cette table.

Voici un petit bout de code:

Dim db As Database
Dim tb As TableDef

Set db = OpenDatabase("c:/principale.mdb")
For Each tb In db.TableDefs

If tb.Connect <> "" Then
Debug.Print "la table " & tb.Name & " est une table liée.


Source
= " & tb.Connect
End If

Next

Donc tu ouvres ta base principale (ici "c:principale.mdb")
puis tu parcours les tables (avec Tabledefs par exemple)
et tu examine la propriété Connect.

Dans mon cas, j'avais créé une base "db_liee" et attaché une table:
("Tbl_liee").

Voici la sortie de mon programme:

la table Tbl_dbliee est une table liée. Source = ;DATABASE=C:db_liee.mdb


Et voila :-)



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;









Driss HANIB
Le #15394651
Salut Jean Marc

voici ma petite fonction qui va chercher la liste des bases liées à une base
principale

Private Function BASE_GEN_Tablesliées(BaseGen As Database) As String()
Dim ITable As Long
Dim Liste() As String
Dim Max As Long
Dim Existe As Boolean
Dim Chaine As String
Dim Pos As Long
ReDim Liste(0)
With BaseGen
If .TableDefs().Count <> 0 Then
For ITable = 0 To .TableDefs.Count - 1
If .TableDefs(ITable).Connect <> vbNullString Then
Chaine = .TableDefs(ITable).Connect
Pos = InStr(Chaine, "DATABASE=")
Chaine = Right$(Chaine, Len(Chaine) - Pos - Len("DATABASE=")
+ 1)
Existe = False
For I = 1 To Max
If Liste(I) = Chaine Then
Existe = True
Exit For
End If
Next I
If Not Existe Then
Max = Max + 1
ReDim Preserve Liste(Max)
Liste(Max) = Chaine
End If
End If
Next ITable
End If
End With
BASE_GEN_Tablesliées = Liste()
End Function

Elle permet de gérer le cas où les bases liées sont avec mot de passe.
Le problème, et c'est la cas pour moi est qu'elle "charge" également des
tables de type PARADOX qui sont liées.
par contre la fin de la chaine de conbtient pas le suffixe .mdb

il faut donc tester cela avant de faire le compactage

On pourrait peut être rajouter un morceau qui permettrait de savoir la
nature de la table, par exemple mettre au début un ";" et avant le type de
BDD


Driss


"jean-marc" news:46dd445b$0$14245$
"Driss HANIB" news:%
> Bonjour à tous
> dans une de mes programmes j'utilise une base Access principale qui
> contient
> également des tables liées.
> J'ai ainsi groupé toutes mes requêtes dans cette table principale.
> Le problème est que je cherche à compacter de manière automatique les
> bases
> de données (principales et liées).
> Pour l'instant je note en dur, le nom des bases liées et je les mets


dans
> le
> même répertoire que la base principale.
>
> Je voudrai "automatiser" ce compactage sans donner au préalable les
> chemins
> des bases liées.
> peut-on donc à partir d'une table de cette base principale, déterminer


si
> elle est liée et si oui , le chemin de la base liée ?
>

Re!

Voila la soulution:
Une Db contient une collection TableDefs, qui contient les tables.
Chaque table a une propriété "Connect".
Cette propriété est vide ("") pour une table "normale", alors que pour une
table liée elle contient le nom et le chemin de la base à laquelle
appartient cette table.

Voici un petit bout de code:

Dim db As Database
Dim tb As TableDef

Set db = OpenDatabase("c:/principale.mdb")
For Each tb In db.TableDefs

If tb.Connect <> "" Then
Debug.Print "la table " & tb.Name & " est une table liée.


Source
= " & tb.Connect
End If

Next

Donc tu ouvres ta base principale (ici "c:principale.mdb")
puis tu parcours les tables (avec Tabledefs par exemple)
et tu examine la propriété Connect.

Dans mon cas, j'avais créé une base "db_liee" et attaché une table:
("Tbl_liee").

Voici la sortie de mon programme:

la table Tbl_dbliee est une table liée. Source = ;DATABASE=C:db_liee.mdb


Et voila :-)



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;









Driss HANIB
Le #15394621
POur ceux que cela intéresse un lien vers vbfrance
pour détacher et attacher des tables

http://www.vbfrance.com/codes/ACCESS-ATTACHER-DETACHER-TABLES-LIEES_41570.aspx
jean-marc
Le #15394611
"Driss HANIB" news:
Salut Jean Marc



Re!

voici ma petite fonction qui va chercher la liste des bases liées à une
base
principale




<jolie fonction>


Elle permet de gérer le cas où les bases liées sont avec mot de passe.
Le problème, et c'est la cas pour moi est qu'elle "charge" également des
tables de type PARADOX qui sont liées.
par contre la fin de la chaine de conbtient pas le suffixe .mdb

il faut donc tester cela avant de faire le compactage

On pourrait peut être rajouter un morceau qui permettrait de savoir la
nature de la table, par exemple mettre au début un ";" et avant le type de
BDD




Voila, j'ai modifié un tout petit peu ta fonction:

- j'ai ajouté la déclaration de la variable "i", qui manquait
(note: n'oublie pas de mettre "Option Explicit" en tête
de tous tes modules et formes, ça détecte ce genre d'oublis)

- J'ai enlevé le redim t(0) en tête de fonction

- J'ai déplacé le Max=max+1 après l'affectation, ainsi
ta table commencera à l'index 0

- j'ai ajouté un peu de code pour détecter le format
et retourner l'info.


Voici la fonction, et ensuite un exemple d'utilisation:

Private Function BASE_GEN_Tablesliées(BaseGen As Database) As String()
Dim ITable As Long
Dim Liste() As String
Dim Max As Long
Dim Table_exist As Boolean
Dim Chaine As String
Dim Pos As Long
Dim i As Long ' ajout JMN

With BaseGen
If .TableDefs().Count <> 0 Then
For ITable = 0 To .TableDefs.Count - 1
If .TableDefs(ITable).Connect <> vbNullString Then
Chaine = .TableDefs(ITable).Connect
Pos = InStr(Chaine, "DATABASE=")
Chaine = Right$(Chaine, Len(Chaine) - Pos -
Len("DATABASE=") + 1)
Table_exist = False
For i = 1 To Max
If Liste(i) = Chaine Then
Table_exist = True
Exit For
End If
Next i
If Not Table_exist Then
ReDim Preserve Liste(Max)
If InStr(LCase(Chaine), ".mdb") <> 0 Then
Liste(Max) = "ACCESS;" & Chaine
Else
' ici on pourrait traiter d'autres extensions
' par defaut on met "other"
Liste(Max) = "OTHER;" & Chaine
End If
Max = Max + 1 ' modif JMN
End If
End If
Next ITable
End If
End With
BASE_GEN_Tablesliées = Liste()
End Function

Voici l'exemple d'utilisation:

Dim db As Database
Dim t() As String
Dim i As Long
Dim nom_base As String
Dim typ_base As String

Set db = OpenDatabase("c:/principale.mdb")
t = BASE_GEN_Tablesliées(db)
For i = LBound(t()) To UBound(t())
If InStr(t(i), ";") <> 0 Then
nom_base = Mid$(t(i), InStr(t(i), ";") + 1)
typ_base = Mid$(t(i), 1, InStr(t(i), ";") - 1)
Debug.Print "TYPE: " & typ_base & ", DB:" & nom_base;
If typ_base = "ACCESS" Then
Debug.Print ", COMPACT = YES"
Else
Debug.Print ", COMPACT = NO"
End If
Else
MsgBox "erreur format, ne doit pas arriver"
End If
Next i
db.Close
Set db = Nothing

Voila, avec ceci tu devrais être paré :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Driss HANIB
Le #15394591
"jean-marc" news:46dd66eb$0$14232$
<jolie fonction>



merci ..;o)

Voila, j'ai modifié un tout petit peu ta fonction:



- j'ai ajouté la déclaration de la variable "i", qui manquait
(note: n'oublie pas de mettre "Option Explicit" en tête


effectivement c'est le seul module (enfin je crois ) où il manque car avec
mztools je rajoute systématique un entête de module..



- J'ai enlevé le redim t(0) en tête de fonction



en fait j'aime bien et j'ai pris l'habitude de commencer à remplir mes
tableaux à l'indice 1..


- j'ai ajouté un peu de code pour détecter le format
et retourner l'info.


Voici la fonction, et ensuite un exemple d'utilisation:
Voila, avec ceci tu devrais être paré :-)



NICKEL !

en fait pour la table PARADOX, le format est ajouté avant le premier ";"
je ne sais pas pour les autres formats

+ aussi le mot de passe éventuel

merci

Driss
jean-marc
Le #15394581
"Driss HANIB" news:Owv$n$

"jean-marc" news:46dd66eb$0$14232$

en fait pour la table PARADOX, le format est ajouté avant le premier ";"
je ne sais pas pour les autres formats

+ aussi le mot de passe éventuel



Voici par exemple ce qu'on récupère pour une table liée DB2, via ODBC:

TYPE: OTHER, DB:=SCANDB06;MODE=SHARE;DBALIAS=SCANDB06;, COMPACT = NO

En fait, ça peut être très variable d'un type à l'autre.

Comme de toute façon tu ne compactes que les bases access, ça n'a pas grande
importance pour ton projet, je pense?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Driss HANIB
Le #15394561
tout à fait
mais en fait (bon je me torture..) ma base sur mon poste de developpement
est dans unité particulière (F:) et dans une répertoire particulier
alors que sur une autre poste (ou je développe occasionellement) la base
est sur une autre unité et les tables liées ne sont pas du tout dans les
mêmes répertoires..

cela nde change donc pas pour le compactage, mais je voulais éventuellement
aussi prévoir un petit outil pour modifier le liens des tables liées si par
hasard on change la position des bases de données.
Autrement cela implique un changement "a la main" de tous ces liens.. car
les liens sont marqués en dur..
Ainsi on pourrait faire, lors de l'installation de la base sur un réseau
modifier les liens automatiquement en focntion du lieu de chaque base..


Voilà

ce n'est pas une urgence, mais bon..
pour l'instant je n'utilise que 2 types de BDD : Access et PARADOX 3.0

un petit lien intéressant
http://forum.hardware.fr/hfr/Programmation/VB-VBA-VBS/access-tables-liees-sujet_70929_1.htm

Exemple de liens pour une table PARADOX3.0
"Paradox 3.X;HDR=NO;IMEX=2;DATABASE=F:Program
FilesDevStudioProjetsBaseBase Max"
exemple de lien pour une base access avec mot de passe
"MS Access;PWD=XXXXX;DATABASE=F:Program
FilesDevStudioProjetsBaseNotes.mdb"
exemple de liens avec une base access sans mot de passe
";DATABASE=F:Program
FilesDevStudioProjetsCab_suivi_ElevageBaseordo.mdb"

je vais travailler cela pour l'instant pour pouvoir bouger les liens sans
détruire la table avec reconstruction de la table .. a voir ce qui est
possible

Driss

"jean-marc" news:46dd6f9e$0$14231$
"Driss HANIB" news:Owv$n$
>
> "jean-marc" > news:46dd66eb$0$14232$
>
> en fait pour la table PARADOX, le format est ajouté avant le premier ";"
> je ne sais pas pour les autres formats
>
> + aussi le mot de passe éventuel

Voici par exemple ce qu'on récupère pour une table liée DB2, via ODBC:

TYPE: OTHER, DB:=SCANDB06;MODE=SHARE;DBALIAS=SCANDB06;, COMPACT = NO

En fait, ça peut être très variable d'un type à l'autre.

Comme de toute façon tu ne compactes que les bases access, ça n'a pas


grande
importance pour ton projet, je pense?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Publicité
Poster une réponse
Anonyme