cerhu > microsoft.* > microsoft.vb

Driss HANIB (04/09/2007, 12h34)
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
Driss HANIB (04/09/2007, 12h37)
j'ai oublié de préciser que j'utilise DAO....

Driss

"Driss HANIB" <dhanib> a écrit dans le message de
news:3916
[..]
jean-marc (04/09/2007, 13h11)
"Driss HANIB" <dhanib> wrote in message
news:3916
[..]
> 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 (04/09/2007, 13h41)
"Driss HANIB" <dhanib> wrote in message
news:3916
[..]
> 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 :-)
Driss HANIB (04/09/2007, 14h08)
merci Jean-Marc pour ta célérité..
je regarde cela

Driss

"jean-marc" <jean_marc_n2> a écrit dans le message de
news:0e4c
[..]
Driss HANIB (04/09/2007, 14h46)
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" <jean_marc_n2> a écrit dans le message de
news:0e4c
[..]
Driss HANIB (04/09/2007, 15h58)
POur ceux que cela intéresse un lien vers vbfrance
pour détacher et attacher des tables

[..]
jean-marc (04/09/2007, 16h08)
"Driss HANIB" <dhanib> wrote in message
news:2476
> 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é :-)
Driss HANIB (04/09/2007, 16h28)
"jean-marc" <jean_marc_n2> a écrit dans le message de
news:0e4c
> <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 (04/09/2007, 16h45)
"Driss HANIB" <dhanib> wrote in message
news:5796
> "jean-marc" <jean_marc_n2> a écrit dans le message de
> news:0e4c
> 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?
Driss HANIB (04/09/2007, 17h01)
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
[..]

Exemple de liens pour une table PARADOX3.0
"Paradox 3.X;HDR=NO;IMEX=2;DATABASE=F:\Program
Files\DevStudio\Projets\Base\Base Max"
exemple de lien pour une base access avec mot de passe
"MS Access;PWD=XXXXX;DATABASE=F:\Program
Files\DevStudio\Projets\Base\Notes.mdb"
exemple de liens avec une base access sans mot de passe
";DATABASE=F:\Program
Files\DevStudio\Projets\Cab_suivi_Elevage\Base\ord o.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" <jean_marc_n2> a écrit dans le message de
news:0e4c
[..]
Jean-marc (04/09/2007, 20h36)
Driss HANIB wrote:
[..]
> exemple de lien pour une base access avec mot de passe
> "MS Access;PWD=XXXXX;DATABASE=F:\Program
> Files\DevStudio\Projets\Base\Notes.mdb"
> exemple de liens avec une base access sans mot de passe
> ";DATABASE=F:\Program
> Files\DevStudio\Projets\Cab_suivi_Elevage\Base\ord o.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


Tout est ok alors. Pour Access (que tu reconnais par le.mdb), c'est tout
simple.
Pour Paradox, les tables ont le nom de leur fichier et la "base" c'est
simplement le
répertoire.
Tu sais donc que si il n'y a pas d'extension, c'est une table paradox.
A priori, tu as toutes les infos nécessaires :-)

Bonne prog!
Driss HANIB (07/09/2007, 09h23)
Oui..
merci Jean Marc

Driss
"Jean-marc" <NO_SPAM_jean_marc_n2> a écrit dans le message
de news:0e4c
[..]
Discussions similaires
ouverture des bases de données access 2000

Livre Introduction aux bases de données ACCESS

Options de Verrouillages et 2 bases de données Access

problème ouverture de bases de données access


Fuseau horaire GMT +2. Il est actuellement 00h03. | Privacy Policy