OVH Cloud OVH Cloud

Copier des tables en DAO

5 réponses
Avatar
Pierre Fauconnier
Bonjour

J'ai une base MDE qui me sert de "programme". Cette base contient une série
de tables liées se trouvant dans une base DONNEES.mdb.

Pour gérer la maintenance de mes tables, le projet développé évoluant avec
le temps, j'ai besoin d'ajouter des champs à certaines tables liées.

Pour cela, j'avais pensé créer une base MODELE.mdb reprenant la structure
des tables et que je peux envoyer aux utilisateurs avec le MDE. J'imaginais
alors pouvoir mettre la structure des tables de DONNEES.mdb en renommant
l'ancienne table de DONNEES, en copiant la nouvelle table de MODELE vers
DONNEES, puis une requête pour ajouter les enregistrements de l'ancienne
vers la nouvelle, et pour finir en supprimant l'ancienne table renommée...
Tout cela avec le code suivant

Dim Base_Source As DAO.Database
Dim Base_Modele As DAO.Database

Dim Table_Source As DAO.TableDef
Dim Table_Modele As DAO.TableDef

Set Base_Source = DAO.OpenDatabase(CurrentProject.Path & "\donnees.mdb")
Set Base_Modele = DAO.OpenDatabase(CurrentProject.Path & "\modele.mdb")

Base_Source.TableDefs("contacts").Name = "Contacts1"
Base_Source.TableDefs.Refresh
Set Table_Modele = Base_Modele.TableDefs("contacts")
Base_Source.TableDefs.Append Table_Modele <<<============= Le code
plante ici
...
...

VBA me dit "Ajout impossible. Il existe déjà un objet de ce nom dans la
collection"

Alors que j'ai beau scanner ma collection TableDefs dans DONNEES, plus
de traces de Contacts, par contre, Contacts1 existe bien...

Où me plante-je?

Merci dès à présent pour vos éclaircissements.



--
Pierre Fauconnier (pierre.fauconnier@nospam.nospam)
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin ( proverbe
zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci

5 réponses

Avatar
Pierre Fauconnier
Bonjour

Pour ceux que cela intéresse, j'ai trouvé une solution en DAO...

Dim maBase As DAO.Database

Set maBase = DAO.OpenDatabase(CurrentProject.Path & "modèle.mdb")
maBase.Execute "select contacts.* into contacts1 in '" &
CurrentProject.Path & "base cible.mdb' from contacts"


Set maBase = DAO.OpenDatabase(CurrentProject.Path & "base cible.mdb")
With maBase
.Execute "insert into contacts1 select *from contacts"
.TableDefs.Delete "contacts"
.TableDefs("contacts1").Name = "Contacts"
End With


--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin ( proverbe
zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"Pierre Fauconnier" a écrit dans le
message de news:
Bonjour

J'ai une base MDE qui me sert de "programme". Cette base contient une
série de tables liées se trouvant dans une base DONNEES.mdb.

Pour gérer la maintenance de mes tables, le projet développé évoluant avec
le temps, j'ai besoin d'ajouter des champs à certaines tables liées.

Pour cela, j'avais pensé créer une base MODELE.mdb reprenant la structure
des tables et que je peux envoyer aux utilisateurs avec le MDE.
J'imaginais alors pouvoir mettre la structure des tables de DONNEES.mdb en
renommant l'ancienne table de DONNEES, en copiant la nouvelle table de
MODELE vers DONNEES, puis une requête pour ajouter les enregistrements de
l'ancienne vers la nouvelle, et pour finir en supprimant l'ancienne table
renommée... Tout cela avec le code suivant

Dim Base_Source As DAO.Database
Dim Base_Modele As DAO.Database

Dim Table_Source As DAO.TableDef
Dim Table_Modele As DAO.TableDef

Set Base_Source = DAO.OpenDatabase(CurrentProject.Path &
"donnees.mdb")
Set Base_Modele = DAO.OpenDatabase(CurrentProject.Path & "modele.mdb")

Base_Source.TableDefs("contacts").Name = "Contacts1"
Base_Source.TableDefs.Refresh
Set Table_Modele = Base_Modele.TableDefs("contacts")
Base_Source.TableDefs.Append Table_Modele <<<============= Le code
plante ici
...
...

VBA me dit "Ajout impossible. Il existe déjà un objet de ce nom dans la
collection"

Alors que j'ai beau scanner ma collection TableDefs dans DONNEES, plus
de traces de Contacts, par contre, Contacts1 existe bien...

Où me plante-je?

Merci dès à présent pour vos éclaircissements.



--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin (
proverbe zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci




Avatar
Eric
Bonjour Pierre,

Effectivement je regardai ton problème et butai sur la même erreur. Je
n'ai pas encore de solution.

La suite, c'est juste pour info perso

Parfait si tu as trouvé une solution, mais je me pose quand même
quelques interrogations.

Tu disais, question Maintenance, devoir ajouter des champs à la table
Contact.

Pour gérer la maintenance de mes tables, le projet développé évoluant
avec le temps, j'ai besoin d'ajouter des champs à certaines tables liées.


Ce n'est pas le cas là, tu ajoutes seulement des enregistrements, non ?


D'autre part,
la table Contact1 créée dans la 1ere partie de la procédure n'a ni
index, ni clé primaire, ca ne risque pas d'être génant ?

Enfin,
la suppression de la table (ancienne) Contact ne risque-t-elle pas de
poser des problèmes si elle est en relation avec d'autres tables ?

A+
Eric


Bonjour

Pour ceux que cela intéresse, j'ai trouvé une solution en DAO...

Dim maBase As DAO.Database

Set maBase = DAO.OpenDatabase(CurrentProject.Path & "modèle.mdb")
maBase.Execute "select contacts.* into contacts1 in '" &
CurrentProject.Path & "base cible.mdb' from contacts"


Set maBase = DAO.OpenDatabase(CurrentProject.Path & "base cible.mdb")
With maBase
.Execute "insert into contacts1 select *from contacts"
.TableDefs.Delete "contacts"
.TableDefs("contacts1").Name = "Contacts"
End With




Avatar
Pierre Fauconnier
Bonjour Eric

Merci pour tes réponses et tes interrogations

Ce n'est pas le cas là, tu ajoutes seulement des enregistrements, non ?
Non, justement. La table CONTACTS de BASE CIBLE contient les

enregistrements.
La table CONTACTS de la base MODELE ne contient aucun enregistrement, mais
elle contient des nouveaux champs qui ne sont pas présents dans la table
CONTACTS de BASE CIBLE.
Dès lors, mon code
- crée une nouvelle table CONTACTS1 dans BASE CIBLE en copiant la
structure et les enregistrements ( inexistants ) de CONTACTS de la base
MODELE
- Ajoute les enregistrements de CONTACTS dans CONTACTS1 de la base BASE
CIBLE. Les nouveaux champs sont vides.
- Supprime la table CONTACTS de la base BASE CIBLE
- Renomme la table CONTACTS1 en CONTACTS dans la base BASE CIBLE

Je ne gère pas les liaisons de mes tables dans BASE CIBLE.
La base PROGRAMME.MDE qui contient une liaison vers CONTACTS de
BASE CIBLE fonctionne parfaitement avec la nouvelle table, puisqu'elle porte
le même nom

la table Contact1 créée dans la 1ere partie de la procédure n'a ni index,
ni clé primaire, ca ne risque pas d'être génant ?
Ca, c'est beaucoup plus gênant. Surtout que Access 2000 ne conserve pas

toutes les propriétés des champs. Ainsi, les clés primaires sont perdues,
les index aussi, et la propriété "Chaîne vide autorisée=OUI" passe à "NON",
alors que je veux l'éviter à tout prix...

la suppression de la table (ancienne) Contact ne risque-t-elle pas de
poser des problèmes si elle est en relation avec d'autres tables ?


Je ne gère pas les liaisons de mes tables dans BASE CIBLE.
La base PROGRAMME.MDE qui contient une liaison vers CONTACTS de
BASE CIBLE fonctionne parfaitement avec la nouvelle table, puisqu'elle porte
le même nom

Merci dès lors pour tes précisions. Je n'ai donc pas LA solution à mon
problème... Merd.....

Si tu as d'autres pistes pour la maintenance des tables, je suis preneur. Je
pense donc que je vais devoir scanner chaque champ de ma table d'origine et
ajouter les nouveaux champs par itération, en "itérant" également sur les
propriétés des champs...

Merci pour tes remarques pertinentes


--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin ( proverbe
zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci


"Eric" a écrit dans le message de news:
%
Bonjour Pierre,

Effectivement je regardai ton problème et butai sur la même erreur. Je
n'ai pas encore de solution.

La suite, c'est juste pour info perso

Parfait si tu as trouvé une solution, mais je me pose quand même quelques
interrogations.

Tu disais, question Maintenance, devoir ajouter des champs à la table
Contact.

Pour gérer la maintenance de mes tables, le projet développé évoluant
avec le temps, j'ai besoin d'ajouter des champs à certaines tables liées.


Ce n'est pas le cas là, tu ajoutes seulement des enregistrements, non ?


D'autre part,
la table Contact1 créée dans la 1ere partie de la procédure n'a ni index,
ni clé primaire, ca ne risque pas d'être génant ?

Enfin,
la suppression de la table (ancienne) Contact ne risque-t-elle pas de
poser des problèmes si elle est en relation avec d'autres tables ?

A+
Eric


Bonjour

Pour ceux que cela intéresse, j'ai trouvé une solution en DAO...

Dim maBase As DAO.Database

Set maBase = DAO.OpenDatabase(CurrentProject.Path & "modèle.mdb")
maBase.Execute "select contacts.* into contacts1 in '" &
CurrentProject.Path & "base cible.mdb' from contacts"


Set maBase = DAO.OpenDatabase(CurrentProject.Path & "base
cible.mdb")
With maBase
.Execute "insert into contacts1 select *from contacts"
.TableDefs.Delete "contacts"
.TableDefs("contacts1").Name = "Contacts"
End With





Avatar
G Roydor
le pb que vous évoquiez :

Set Table_Modele = Base_Modele.TableDefs("contacts")
Base_Source.TableDefs.Append Table_Modele <<<============= Le code
plante ici
...

...

VBA me dit "Ajout impossible. Il existe déjà un objet de ce nom
dans la
collection"

Alors que j'ai beau scanner ma collection TableDefs dans DONNEES, plus
de traces de Contacts, par contre, Contacts1 existe bien...

est cetainement du à la conservation des données par ACCESS pour
permettre un retour à la situation initiale si une impossibilité
survenait dans les opérations successives.
il faut étudier la notion de transaction et les possibilités de donner
l'indication de bonne fin de procédure (ce qui arrive lorsque vous avez
quitté l'exécution du code d'ou la disparition de Contact).

Cordialement
GR






Pierre Fauconnier a écrit:
Bonjour

Pour ceux que cela intéresse, j'ai trouvé une solution en DAO...

Dim maBase As DAO.Database

Set maBase = DAO.OpenDatabase(CurrentProject.Path & "modèle.mdb")
maBase.Execute "select contacts.* into contacts1 in '" &
CurrentProject.Path & "base cible.mdb' from contacts"


Set maBase = DAO.OpenDatabase(CurrentProject.Path & "base cible.mdb")
With maBase
.Execute "insert into contacts1 select *from contacts"
.TableDefs.Delete "contacts"
.TableDefs("contacts1").Name = "Contacts"
End With




Avatar
Pierre Fauconnier
Bonsoir

Je n'avais pas pensé à cette possibilité de transaction, mais je pense que
le problème se situe ailleurs car même après avoir fermé la base cible et
l'avoir ouverte à nouveau, le problème demeure...

De toute façon, comme expliqué dans ma réponse, le problème du transfert des
propriétés de champs qui ne se fait pas rend inutile la manipulation de
cette façon. J'ai donc dµu créé une fonction pour copier ma structure
autrement.

Merci pour l'aide apportée et bon week-end.



--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin ( proverbe
zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"G Roydor" a écrit dans le message de news:

le pb que vous évoquiez :

Set Table_Modele = Base_Modele.TableDefs("contacts")
Base_Source.TableDefs.Append Table_Modele <<<============= Le code
plante ici
...

...

VBA me dit "Ajout impossible. Il existe déjà un objet de ce nom dans
la
collection"

Alors que j'ai beau scanner ma collection TableDefs dans DONNEES, plus
de traces de Contacts, par contre, Contacts1 existe bien...

est cetainement du à la conservation des données par ACCESS pour permettre
un retour à la situation initiale si une impossibilité survenait dans les
opérations successives.
il faut étudier la notion de transaction et les possibilités de donner
l'indication de bonne fin de procédure (ce qui arrive lorsque vous avez
quitté l'exécution du code d'ou la disparition de Contact).

Cordialement
GR






Pierre Fauconnier a écrit:
Bonjour

Pour ceux que cela intéresse, j'ai trouvé une solution en DAO...

Dim maBase As DAO.Database

Set maBase = DAO.OpenDatabase(CurrentProject.Path & "modèle.mdb")
maBase.Execute "select contacts.* into contacts1 in '" &
CurrentProject.Path & "base cible.mdb' from contacts"


Set maBase = DAO.OpenDatabase(CurrentProject.Path & "base
cible.mdb")
With maBase
.Execute "insert into contacts1 select *from contacts"
.TableDefs.Delete "contacts"
.TableDefs("contacts1").Name = "Contacts"
End With