Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rétablir Relation sur base dorsale

10 réponses
Avatar
Jacques
Bonsoir,

Je voudrais =E0 partir de la base Frontale r=E9tablir les relations de la
base Dorsale,
Mais le code ne me r=E9tablie que les relations de la base Frontale, et
rien sur la
Dorsale.

Ou se trouve mon erreur ?

Pour cerner plus facilement le probl=E8me le joins une base all=E9g=E9e.
http://cjoint.com/?0bgmWQXLXZa

Sub RetablirRelations(ByVal strChemin As String)
'Cette fonction r=E9tablie les relations entre les tables
Set WS =3D DBEngine.CreateWorkspace("Nouveau", "Admin", "",
dbUseJet)
Set dbDorsale =3D WS.OpenDatabase(strChemin)

cpt =3D 0
strsql =3D "Select * from [tbl Relations]"
Set rs =3D dbDorsale.OpenRecordset(strsql)

If Not rs.EOF Then
cpt =3D cpt + 1
rs.MoveFirst
'Do Until rs.EOF
While Not rs.EOF
Set rel =3D
dbDorsale.CreateRelation(rs.Fields("NomRelation"),
rs.Fields("TablePrincipale"), rs.Fields("TableSecondaire"),
rs.Fields("relAttributes"))
Set myField =3D
rel.CreateField(rs.Fields("ChampPrincipal"))
myField.ForeignName =3D rs.Fields("ChampSecondaire")
rel.Fields.Append myField
dbDorsale.Relations.Append rel
rs.MoveNext
Wend
'Loop
End If

dbDorsale.Close: Set dbDorsale =3D Nothing
WS.Close: Set WS =3D Nothing
End Sub

Merci pour votre aide.

Salutations

10 réponses

Avatar
3stone
Salut,

Je n'ai pas regarder ta base, mais pour relier les tables après
un déplacement de la base dorsale, tu peux utiliser ceci:
http://www.3stone.be/access/articles.php?lng=fr&pg(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)


Jacques wrote:
Bonsoir,

Je voudrais à partir de la base Frontale rétablir les relations de la
base Dorsale,
Mais le code ne me rétablie que les relations de la base Frontale, et
rien sur la
Dorsale.

Ou se trouve mon erreur ?

Pour cerner plus facilement le problème le joins une base allégée.
http://cjoint.com/?0bgmWQXLXZa

Sub RetablirRelations(ByVal strChemin As String)
'Cette fonction rétablie les relations entre les tables
Set WS = DBEngine.CreateWorkspace("Nouveau", "Admin", "",
dbUseJet)
Set dbDorsale = WS.OpenDatabase(strChemin)

cpt = 0
strsql = "Select * from [tbl Relations]"
Set rs = dbDorsale.OpenRecordset(strsql)

If Not rs.EOF Then
cpt = cpt + 1
rs.MoveFirst
'Do Until rs.EOF
While Not rs.EOF
Set rel > dbDorsale.CreateRelation(rs.Fields("NomRelation"),
rs.Fields("TablePrincipale"), rs.Fields("TableSecondaire"),
rs.Fields("relAttributes"))
Set myField > rel.CreateField(rs.Fields("ChampPrincipal"))
myField.ForeignName = rs.Fields("ChampSecondaire")
rel.Fields.Append myField
dbDorsale.Relations.Append rel
rs.MoveNext
Wend
'Loop
End If

dbDorsale.Close: Set dbDorsale = Nothing
WS.Close: Set WS = Nothing
End Sub

Merci pour votre aide.

Salutations
Avatar
3stone
re,

Jacques wrote:
Je voudrais à partir de la base Frontale rétablir les relations de la
base Dorsale,
Mais le code ne me rétablie que les relations de la base Frontale, et
rien sur la
Dorsale.

Ou se trouve mon erreur ?




Oups !!!!

J'ai tout de même jeté un oeil, après avoir relu....

- On _lie_ (link) les tables dorsale à la frontale, ok

- mais on ne supprime PAS les _relations_ entre les tables de la dorsale !
Les relations entre tables font parties de la structure, il n'y a aucune raison de les supprimer.

Je remarque donc que ta dorsale n'a aucune relation, ce qui est une hérésie au niveau de la
conception...

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
Jacques
On 6 jan, 23:24, "3stone" wrote:
Salut,

Je n'ai pas regarder ta base, mais pour relier les tables apr s
un d placement de la base dorsale, tu peux utiliser ceci:http://www.3ston e.be/access/articles.php?lng=fr&pg(

--
A+
Pierre (3stone) Access MVP
Perso:http://www.3stone.be/
MPFA:http://www.mpfa.info/ (infos g n rales)



Jacques wrote:
> Bonsoir,

> Je voudrais partir de la base Frontale r tablir les relations de la
> base Dorsale,
> Mais le code ne me r tablie que les relations de la base Frontale, et
> rien sur la
> Dorsale.

> Ou se trouve mon erreur ?

> Pour cerner plus facilement le probl me le joins une base all g e.
>http://cjoint.com/?0bgmWQXLXZa

> Sub RetablirRelations(ByVal strChemin As String)
> 'Cette fonction r tablie les relations entre les tables
>     Set WS = DBEngine.CreateWorkspace("Nouveau", "Admin", "",
> dbUseJet)
>        Set dbDorsale = WS.OpenDatabase(strChemin)

>       cpt = 0
>       strsql = "Select * from [tbl Relations]"
>       Set rs = dbDorsale.OpenRecordset(strsql)

>       If Not rs.EOF Then
>          cpt = cpt + 1
>          rs.MoveFirst
>          'Do Until rs.EOF
>          While Not rs.EOF
>                  Set rel =
> dbDorsale.CreateRelation(rs.Fields("NomRelation"),
> rs.Fields("TablePrincipale"), rs.Fields("TableSecondaire"),
> rs.Fields("relAttributes"))
>                  Set myField =
> rel.CreateField(rs.Fields("ChampPrincipal"))
>                  myField.ForeignName = rs.Fields("C hampSecondaire")
>                  rel.Fields.Append myField
>                  dbDorsale.Relations.Append rel
>                  rs.MoveNext
>         Wend
>         'Loop
>      End If

>      dbDorsale.Close: Set dbDorsale = Nothing
>      WS.Close: Set WS = Nothing
> End Sub

> Merci pour votre aide.

> Salutations- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Bonsoir 3stone et bonne année 2011,

Merci pour ta réponse, mais je penses qu'il y à une petite erreur.

Dans mon cas je voudrais rétablir les relations Un à plusieurs ou
autres
de la base Dorsale et mon exemple montre que je n'y arrive pas.

Salutations
Avatar
Jacques
On 6 jan, 23:52, Jacques wrote:
On 6 jan, 23:24, "3stone" wrote:





> Salut,

> Je n'ai pas regarder ta base, mais pour relier les tables apr s
> un d placement de la base dorsale, tu peux utiliser ceci:http://www.3st one.be/access/articles.php?lng=fr&pg(

> --
> A+
> Pierre (3stone) Access MVP
> Perso:http://www.3stone.be/
> MPFA:http://www.mpfa.info/ (infos g n rales)

> Jacques wrote:
> > Bonsoir,

> > Je voudrais partir de la base Frontale r tablir les relations de la
> > base Dorsale,
> > Mais le code ne me r tablie que les relations de la base Frontale, et
> > rien sur la
> > Dorsale.

> > Ou se trouve mon erreur ?

> > Pour cerner plus facilement le probl me le joins une base all g e.
> >http://cjoint.com/?0bgmWQXLXZa

> > Sub RetablirRelations(ByVal strChemin As String)
> > 'Cette fonction r tablie les relations entre les tables
> >     Set WS = DBEngine.CreateWorkspace("Nouveau", "Admin", "",
> > dbUseJet)
> >        Set dbDorsale = WS.OpenDatabase(strChemin)

> >       cpt = 0
> >       strsql = "Select * from [tbl Relations]"
> >       Set rs = dbDorsale.OpenRecordset(strsql)

> >       If Not rs.EOF Then
> >          cpt = cpt + 1
> >          rs.MoveFirst
> >          'Do Until rs.EOF
> >          While Not rs.EOF
> >                  Set rel =
> > dbDorsale.CreateRelation(rs.Fields("NomRelation"),
> > rs.Fields("TablePrincipale"), rs.Fields("TableSecondaire"),
> > rs.Fields("relAttributes"))
> >                  Set myField =
> > rel.CreateField(rs.Fields("ChampPrincipal"))
> >                  myField.ForeignName = rs.Fields( "ChampSecondaire")
> >                  rel.Fields.Append myField
> >                  dbDorsale.Relations.Append rel
> >                  rs.MoveNext
> >         Wend
> >         'Loop
> >      End If

> >      dbDorsale.Close: Set dbDorsale = Nothing
> >      WS.Close: Set WS = Nothing
> > End Sub

> > Merci pour votre aide.

> > Salutations- Masquer le texte des messages précédents -

> - Afficher le texte des messages précédents -

Bonsoir 3stone et bonne année 2011,

Merci pour ta réponse, mais je penses qu'il y à une petite erreur.

Dans mon cas je voudrais rétablir les relations Un à plusieurs ou
autres
de la base Dorsale et mon exemple montre que je n'y arrive pas.

Salutations- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Re

"ce qui est une hérésie au niveau de la conception... "

Pourquoi, n'a ton pas besion parfois de supprimer des relations pour
intervenir sur une
table, ou bien rétablir une relation qui pour une raison quelconque
n'est pas faite.

J'ai mis le bouton supprimé pour faciliter l'exemple et dans le seul
but de montrer que
le code ne permet pas de rétablir les relations sur la dorsale.

Donc si j'ai bien compris lorsqu'on pert une relation le seul moyen de
la rétablir est de le
faire manuellement.

Salutations
Avatar
3stone
Salut,

Jacques wrote:
[...]
Pourquoi, n'a ton pas besion parfois de supprimer des relations pour
intervenir sur une
table, ou bien rétablir une relation qui pour une raison quelconque
n'est pas faite.




Si, cela peut se justifier lorsque l'on à pas accès à la base,
que l'on envoie une modification de la partie frontale.
On adapte ainsi la dorsale au nouveaux besoins, mais...


Exemple tiré de l'aide en ligne:

Cet exemple utilise la méthode CreateRelation pour créer un objet Relation entre l'objet TableDef
Employés et un nouvel objet TableDef nommé Départements. Il illustre également la manière dont la
création d'un nouvel objet Relation crée les objets Indexes nécessaires dans la table externe (Index
Départements Employés dans la table Employés).

Sub CreateRelationX()

Dim dbsNorthwind As Database
Dim tdfEmployees As TableDef
Dim tdfNew As TableDef
Dim idxNew As Index
Dim relNew As Relation
Dim idxLoop As Index

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

With dbsNorthwind
' Add new field to Employees table.
Set tdfEmployees = .TableDefs!Employees
tdfEmployees.Fields.Append _
tdfEmployees.CreateField("DeptID", dbInteger, 2)

' Create new Departments table.
Set tdfNew = .CreateTableDef("Departments")

With tdfNew
' Create and append Field objects to Fields
' collection of the new TableDef object.
.Fields.Append .CreateField("DeptID", dbInteger, 2)
.Fields.Append .CreateField("DeptName", dbText, 20)

' Create Index object for Departments table.
Set idxNew = .CreateIndex("DeptIDIndex")
' Create and append Field object to Fields
' collection of the new Index object.
idxNew.Fields.Append idxNew.CreateField("DeptID")
' The index in the primary table must be Unique in
' order to be part of a Relation.
idxNew.Unique = True
.Indexes.Append idxNew
End With

.TableDefs.Append tdfNew

' Create EmployeesDepartments Relation object, using
' the names of the two tables in the relation.
Set relNew = .CreateRelation("EmployeesDepartments", _
tdfNew.Name, tdfEmployees.Name, _
dbRelationUpdateCascade)

' Create Field object for the Fields collection of the
' new Relation object. Set the Name and ForeignName
' properties based on the fields to be used for the
' relation.
relNew.Fields.Append relNew.CreateField("DeptID")
relNew.Fields!DeptID.ForeignName = "DeptID"
.Relations.Append relNew

' Print report.
Debug.Print "Properties of " & relNew.Name & _
" Relation"
Debug.Print " Table = " & relNew.Table
Debug.Print " ForeignTable = " & _
relNew.ForeignTable
Debug.Print "Fields of " & relNew.Name & " Relation"

With relNew.Fields!DeptID
Debug.Print " " & .Name
Debug.Print " Name = " & .Name
Debug.Print " ForeignName = " & .ForeignName
End With

Debug.Print "Indexes in " & tdfEmployees.Name & _
" TableDef"
For Each idxLoop In tdfEmployees.Indexes
Debug.Print " " & idxLoop.Name & _
", Foreign = " & idxLoop.Foreign
Next idxLoop

' Delete new objects because this is a demonstration.
.Relations.Delete relNew.Name
.TableDefs.Delete tdfNew.Name
tdfEmployees.Fields.Delete "DeptID"
.Close
End With

End Sub-- A+Pierre (3stone) Access MVPPerso: http://www.3stone.be/MPFA: http://www.mpfa.info/
(infos générales)
Avatar
Jacques
On 7 jan, 22:57, "3stone" wrote:
Salut,

Jacques wrote:

[...]

> Pourquoi, n'a ton pas besion parfois de supprimer des relations pour
> intervenir sur une
> table, ou bien r tablir une relation qui pour une raison quelconque
> n'est pas faite.

Si, cela peut se justifier lorsque l'on pas acc s la base,
que l'on envoie une modification de la partie frontale.
On adapte ainsi la dorsale au nouveaux besoins, mais...

Exemple tir de l'aide en ligne:

Cet exemple utilise la m thode CreateRelation pour cr er un objet Relatio n entre l'objet TableDef
Employ s et un nouvel objet TableDef nomm D partements. Il illustre galem ent la mani re dont la
cr ation d'un nouvel objet Relation cr e les objets Indexes n cessaires d ans la table externe (Index
D partements Employ s dans la table Employ s).

Sub CreateRelationX()

   Dim dbsNorthwind As Database
   Dim tdfEmployees As TableDef
   Dim tdfNew As TableDef
   Dim idxNew As Index
   Dim relNew As Relation
   Dim idxLoop As Index

   Set dbsNorthwind = OpenDatabase("Northwind.mdb")

   With dbsNorthwind
      ' Add new field to Employees table.
      Set tdfEmployees = .TableDefs!Employees
      tdfEmployees.Fields.Append _
         tdfEmployees.CreateField("DeptID", dbInteger, 2)

      ' Create new Departments table.
      Set tdfNew = .CreateTableDef("Departments")

      With tdfNew
         ' Create and append Field objects to Fields
         ' collection of the new TableDef object.
         .Fields.Append .CreateField("DeptID", dbInteger, 2)
         .Fields.Append .CreateField("DeptName", dbText, 20)

         ' Create Index object for Departments table.
         Set idxNew = .CreateIndex("DeptIDIndex")
         ' Create and append Field object to Fields
         ' collection of the new Index object.
         idxNew.Fields.Append idxNew.CreateField("DeptID")
         ' The index in the primary table must be Unique in
         ' order to be part of a Relation.
         idxNew.Unique = True
         .Indexes.Append idxNew
      End With

      .TableDefs.Append tdfNew

      ' Create EmployeesDepartments Relation object, using
      ' the names of the two tables in the relation.
      Set relNew = .CreateRelation("EmployeesDepartments", _
         tdfNew.Name, tdfEmployees.Name, _
         dbRelationUpdateCascade)

      ' Create Field object for the Fields collection of the
      ' new Relation object. Set the Name and ForeignName
      ' properties based on the fields to be used for the
      ' relation.
      relNew.Fields.Append relNew.CreateField("DeptID")
      relNew.Fields!DeptID.ForeignName = "DeptID"
      .Relations.Append relNew

      ' Print report.
      Debug.Print "Properties of " & relNew.Name & _
         " Relation"
      Debug.Print "  Table = " & relNew.Table
      Debug.Print "  ForeignTable = " & _
         relNew.ForeignTable
      Debug.Print "Fields of " & relNew.Name & " Relation"

      With relNew.Fields!DeptID
         Debug.Print "  " & .Name
         Debug.Print "    Name = " & .Name
         Debug.Print "    ForeignName = " & .ForeignName
      End With

      Debug.Print "Indexes in " & tdfEmployees.Name & _
         " TableDef"
      For Each idxLoop In tdfEmployees.Indexes
         Debug.Print "  " & idxLoop.Name & _
            ", Foreign = " & idxLoop.Foreign
      Next idxLoop

      ' Delete new objects because this is a demonstration.
      .Relations.Delete relNew.Name
      .TableDefs.Delete tdfNew.Name
      tdfEmployees.Fields.Delete "DeptID"
      .Close
   End With

End Sub-- A+Pierre (3stone) Access MVPPerso:http://www.3stone.be/MPFA:htt p://www.mpfa.info/
(infos g n rales)



Bonsoir 3stone,

Merci pour ce code, maintenant il me reste plus qu'à le comprendre
et le mettre en place.

Salutations
Avatar
Jacques
On 8 jan, 00:50, Jacques wrote:
On 7 jan, 22:57, "3stone" wrote:





> Salut,

> Jacques wrote:

> [...]

> > Pourquoi, n'a ton pas besion parfois de supprimer des relations pour
> > intervenir sur une
> > table, ou bien r tablir une relation qui pour une raison quelconque
> > n'est pas faite.

> Si, cela peut se justifier lorsque l'on pas acc s la base,
> que l'on envoie une modification de la partie frontale.
> On adapte ainsi la dorsale au nouveaux besoins, mais...

> Exemple tir de l'aide en ligne:

> Cet exemple utilise la m thode CreateRelation pour cr er un objet Relat ion entre l'objet TableDef
> Employ s et un nouvel objet TableDef nomm D partements. Il illustre gal ement la mani re dont la
> cr ation d'un nouvel objet Relation cr e les objets Indexes n cessaires dans la table externe (Index
> D partements Employ s dans la table Employ s).

> Sub CreateRelationX()

>    Dim dbsNorthwind As Database
>    Dim tdfEmployees As TableDef
>    Dim tdfNew As TableDef
>    Dim idxNew As Index
>    Dim relNew As Relation
>    Dim idxLoop As Index

>    Set dbsNorthwind = OpenDatabase("Northwind.mdb")

>    With dbsNorthwind
>       ' Add new field to Employees table.
>       Set tdfEmployees = .TableDefs!Employees
>       tdfEmployees.Fields.Append _
>          tdfEmployees.CreateField("DeptID", dbInteger, 2)

>       ' Create new Departments table.
>       Set tdfNew = .CreateTableDef("Departments")

>       With tdfNew
>          ' Create and append Field objects to Fields
>          ' collection of the new TableDef object.
>          .Fields.Append .CreateField("DeptID", dbInteger, 2)
>          .Fields.Append .CreateField("DeptName", dbText, 20)

>          ' Create Index object for Departments table.
>          Set idxNew = .CreateIndex("DeptIDIndex")
>          ' Create and append Field object to Fields
>          ' collection of the new Index object.
>          idxNew.Fields.Append idxNew.CreateField("DeptID")
>          ' The index in the primary table must be Unique in
>          ' order to be part of a Relation.
>          idxNew.Unique = True
>          .Indexes.Append idxNew
>       End With

>       .TableDefs.Append tdfNew

>       ' Create EmployeesDepartments Relation object, using
>       ' the names of the two tables in the relation.
>       Set relNew = .CreateRelation("EmployeesDepartments", _
>          tdfNew.Name, tdfEmployees.Name, _
>          dbRelationUpdateCascade)

>       ' Create Field object for the Fields collection of the
>       ' new Relation object. Set the Name and ForeignName
>       ' properties based on the fields to be used for the
>       ' relation.
>       relNew.Fields.Append relNew.CreateField("DeptID")
>       relNew.Fields!DeptID.ForeignName = "DeptID"
>       .Relations.Append relNew

>       ' Print report.
>       Debug.Print "Properties of " & relNew.Name & _
>          " Relation"
>       Debug.Print "  Table = " & relNew.Table
>       Debug.Print "  ForeignTable = " & _
>          relNew.ForeignTable
>       Debug.Print "Fields of " & relNew.Name & " Relation"

>       With relNew.Fields!DeptID
>          Debug.Print "  " & .Name
>          Debug.Print "    Name = " & .Name
>          Debug.Print "    ForeignName = " & .ForeignNam e
>       End With

>       Debug.Print "Indexes in " & tdfEmployees.Name & _
>          " TableDef"
>       For Each idxLoop In tdfEmployees.Indexes
>          Debug.Print "  " & idxLoop.Name & _
>             ", Foreign = " & idxLoop.Foreign
>       Next idxLoop

>       ' Delete new objects because this is a demonstration.
>       .Relations.Delete relNew.Name
>       .TableDefs.Delete tdfNew.Name
>       tdfEmployees.Fields.Delete "DeptID"
>       .Close
>    End With

> End Sub-- A+Pierre (3stone) Access MVPPerso:http://www.3stone.be/MPFA:h ttp://www.mpfa.info/
> (infos g n rales)

Bonsoir 3stone,

Merci pour ce code, maintenant il me reste plus qu'à le comprendre
et le mettre en place.

Salutations- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Bonjour,

Est-ce que quelqu'un pourrait essayer mon exemple dont le lien se
trouve plus haut
et me dire si les relations se font bien sur les deux bases.

On me dit que le code fonctionne (ce que je crois) mais pas chez-moi.

Merci pour votre aide.

Salutations
Avatar
3stone
Salut,

Jacques wrote:
[...]
Est-ce que quelqu'un pourrait essayer mon exemple dont le lien se
trouve plus haut
et me dire si les relations se font bien sur les deux bases.

On me dit que le code fonctionne (ce que je crois) mais pas chez-moi.




Oui, il fonctionne...

Etant donné que les fichiers ne sont pas au même endroit que lorsque
les tables de la dorsale ont été liés à la fontale, j'ai dû refaire la
première liaison avec l'assistant...

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
Jacques
On 27 jan, 06:20, "3stone" wrote:
Salut,

Jacques wrote:

[...]

> Est-ce que quelqu'un pourrait  essayer mon exemple dont le lien se
> trouve plus haut
> et me dire si les relations se font bien sur les deux bases.

> On me dit que le code fonctionne (ce que je crois) mais pas chez-moi.

Oui, il fonctionne...

Etant donné que les fichiers ne sont pas au même endroit que lorsque
les tables de la dorsale ont été liés à la fontale, j'ai dû ref aire la
première liaison avec l'assistant...

--
A+
Pierre (3stone) Access MVP
Perso:http://www.3stone.be/
MPFA:http://www.mpfa.info/ (infos générales)



Bonsoir 3stone,

Pour moi c'est l'incompréhension totale, j'ai essayé sur un portable,
puis sur une
autre machine fixe, est imposible de faire fonctionner ce code.

Suite à ton experience A-tu une idée du problème, ou une piste de
recherche à me donner.

Salutations.
Avatar
3stone
Salut,

Jacques wrote:
[...]
Pour moi c'est l'incompréhension totale, j'ai essayé sur un portable,
puis sur une
autre machine fixe, est imposible de faire fonctionner ce code.

Suite à ton experience A-tu une idée du problème, ou une piste de
recherche à me donner.




Oui, après avoir déplacé les bases, réattaches-tu d'abord les tables
de la dorsale avec l'assistant "gestionnaire des tables liées" ??

Le chemin vers la dorsale étant écrite "en dur" dans le style:
E:mes basesmadorsale.mdb

En déplacant les bases, impossible d'atteindre la dorsale, et
à fortiori, impossible de toucher au relations...

Il faut donc lier les tables de la dorsale avec l'assistant
( ou avec ce que j'avais proposé au départ...
http://www.3stone.be/access/articles.php?lng=fr&pg( )
ensuite tu peux utiliser les codes via les deux boutons...

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)