Vous êtes sur la page 1sur 28

Comment lier une base une autre sans spcifier son chemin d'accs mais seulement son

nom

Bonjour tout le monde,


En supposant que mes 2 bases sont enregistres dans le mme dossier, je recherche le
moyen (si bien sr c'est possible) de lier une base A une base B, sans avoir
spcifier le chemin d'accs complet, mais seulement en donnat le nom de la base A.
Mon but est de pouvoir copier les 2 bases sur un autre PC, et de ne pas avoir chaque
fois relier les 2 bases (vu que le chemin d'accs diffre) pour pouvoir les utiliser.
Je vous remercie par avance pour votre aide
00

15/01/2012, 17h05

Domi2

Rdacteur/Modrateur

#2

Bonjour,
Tu peux prendre connaissance de ce tutoriel, cela devrait
rpondre ton besoin : Liaisons dynamiques pour bases
fractionnes.
Domi2
__________________
Vous avez des montres, nous avons le temps ! (citation attribue L.-S. Senghor)
Ici, on ne perd pas de temps ! On en passe...
Access : crer des codes-barres 128 en VBA
Access : les commandes intgres des menus

Inscription : juin 2006


Messages : 6 644

Ce message (ou un autre) vous a aid ? Votez pour lui avec

Points : 10 904

00

23/01/2012, 21h21

sophie)

Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

#3

merci beaucoup pour ta rponse Domi2


vu le but de mon projet (utiliser SQL et QBE sur 2 tables
lies), je n'ai pas rellement besoin d'une gestion aussi
performante des bases lies. De plus, je ne connais pas VBA,
et le temps me manque pour apprendre ce langage...
En fait, j'ai pu lire qu'on pouvait utiliser les chemins relatifs au
lieu de ceux absolus pour lier 2 bases :
- en ouvrant la feuille Proprit de la Requte
- avant d'effectuer le choix de la table on modifie le
champ Base source
et il tait dit qu'il fallait faire attention la valeur du Dossier
de la base de donnes par dfaut qui est implicitement pris en
compte.
J'ai donc enregistr mes 2 bases (Base1 et Base2) dans le

mme dossier. Puis pour crer une requte dans Base1 (en
utilisant des tables de Base2) j'ai tap "Base2" dans l'attribut
Base source de la feuille de proprits, mais cela ne marche
pas...
j'ai aussi essay "Base2.accdb"... (je suis sous Access 2007)
Je vous remercie par avance pour votre aide
00

24/01/2012, 08h22

#4

Jeannot45
Rdacteur/Modrateur

Un manire simple d'viter d'entrer dans un dveloppement


VBA, c'est de faire sur le second PC une arborescence
identique que celle du PC sur lequel tu dveloppes.
Imaginons que sur ton poste, tu dveloppes la base BASE1
avec des tables lies issues de la BASE2. Tes bases sont
stockes dans le mme rpertoire :
C:\Mes Documents\Developpez
Jean BALLAT
Inscription : octobre 2004
Messages : 2 859
Points : 5 198

Ainsi la premire fois que tu recopies tes bases sur le second


PC tu cres la mme arborescence.
Tu ne devrais pas avoir de problme par la suite.
__________________
Jeannot
Liens Office indispensables visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps


d'y rpondre
00

24/01/2012, 09h22

RobiPMS

Membre chevronn

Robert LINCE
Conseiller psychopdagogique
Inscription : octobre 2007
Messages : 351
Points : 621

#5

Bonjour.
Sans apprendre tout VBA , voici quelque chose qui me
semble rpondre ta demande.
D'abord, la fonction qui rcupre le chemin du rpertoire
courant:
Code :
Slectionner tout - Visualiser dans une fentre part

1Public Function ParentDir(ByVal str As String)


2As String
3' Fonction qui permet de rcuprer le rpertoire
4courant de la base de donne
5
Dim i As Integer
6
7
' repre le dernier "\"
8
If Right(str, 1) = "\" Then str = Left(str,

9Len(str) - 1)
10
11
' maintenant regarde le prcdent
12
For i = Len(str) To 1 Step -1
13
If Mid(str, i, 1) = "\" Then
14
Debug.Print "Fichier " & Right(str,
15Len(str) - i)
16
str = Left(str, i)
17
GoTo fin01
18
End If
19
Next i
20
21fin01:
Debug.Print "Rpertoire " & str
ParentDir = str
End Function
Ensuite une fonction qui tablit la liaison vers deux tables
(dans cet exemple) d'une autre base situe dans le mme
rpertoire (que j'ai appele Nom_de_la_base.accdb). Dans
cet exemple, j'ai utilis le mme nom pour la table-source et
pour sa liaison (table lie). Toujours dans cet exemple, j'ai
dclench la procdure sur l'ouverture d'un formulaire. Bien
entendu tu peux aussi la dclencher avec un bouton dans un
formulaire.
Code :
Slectionner tout - Visualiser dans une fentre part

1Private Sub Form_Open(Cancel As Integer)


2On Error GoTo Err_Form_Open
3
4' * Effacement des tables lies prsentes
5
DoCmd.SetWarnings False
6
DoCmd.DeleteObject acTable, "Table1"
7
DoCmd.DeleteObject acTable, "Table2"
8
DoCmd.SetWarnings True
9
10' * Liaison avec les tables
11
Dim strMotPasse As String
12
Dim strCheminBd As String
13
Dim strNomTable As String
14
Dim strConnect As String
15
Dim oDb As DAO.Database
16
Dim oTbl As DAO.TableDef
17
18 ' Dfinit mot passe, nom table, chemin base de
19donnes
20
strMotPasse = ""
21
strCheminBd =
22ParentDir(Application.CurrentDb.Name) &
23"Nom_de_la_base.accdb"
24
25
Set oDb = CurrentDb
' Instancie l'objet
26Database
27
28
strConnect = "MS Access;pwd=" & strMotPasse
29& ";DATABASE=" & strCheminBd
' Dfinit la
30chaine de connexion permettant la liaison
31
32 ' Cre un lien vers la table 'Table1' de

33Donnees
34
strNomTable = "Table1"
35
Set oTbl = oDb.CreateTableDef(strNomTable)
36
With oTbl
37
.Connect = strConnect
38
.SourceTableName = "Table1"
39
End With
40 ' Ajoute la table la base de donnes
41
oDb.TableDefs.Append oTbl:
42oDb.TableDefs.Refresh
43
44 ' Cre un lien vers la table 'Table2'
45
strNomTable = "Table2"
46
Set oTbl = oDb.CreateTableDef(strNomTable)
47
With oTbl
48
.Connect = strConnect
49
.SourceTableName = "Table2"
50
End With
51 ' Ajoute la table la base de donnes
52
oDb.TableDefs.Append oTbl:
53oDb.TableDefs.Refresh
MsgBox "Tous les liens ont t actualiss.",
vbInformation
Exit_Form_Open:
Exit Sub
Err_Form_Open:
MsgBox Err.Description
Resume Exit_Form_Open
End Sub
J'espre que a correspond ce que tu cherches...
Cordialement
00

28/01/2012, 17h33

sophie)
Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

#6

merci pour ta rponse Jeannot45 , en fait le "deuxime pc"


je ne le connais pas et je n'y ai pas accs d'o le fait que je
ne puisse pas crer le mme chemin.
RobiPMS je te remercie pour ton aide
je rencontre quelques difficultes pour mettre en place le
code :
j'ai ouvert mon formulaire : Feuille de Proprits->
Evnement->sur activation->gnrateur de code
puis j'ai copi tes 2 fonctions dans :
Code :
Slectionner tout - Visualiser dans une fentre part

1Private Sub Form_Current()


2...
3End Sub
mais rien ne se passe quand j'ouvre le formulaire.
je ne sais pas si j'ai fait n'importe quoi...
merci par avance pour votre aide

00

28/01/2012, 17h48

Domi2

Rdacteur/Modrateur

#7

Bonjour,
La premire fonction, tu dois la copier dans un module de
code standard et non dans le module du formulaire.
Et la deuxime procdure, tu dois la copier non pas dans
l'vnement Sur activation, Form_Current, mais dans
l'vnement Sur ouverture, Form_Open.
Ca devrait aller mieux.
Domi2
__________________

Vous avez des montres, nous avons le temps ! (citation attribue L.-S. Senghor)

Inscription : juin 2006


Messages : 6 644

Ici, on ne perd pas de temps ! On en passe...


Access : crer des codes-barres 128 en VBA

Points : 10 904

Access : les commandes intgres des menus


Ce message (ou un autre) vous a aid ? Votez pour lui avec

00

28/01/2012, 18h10

sophie)

Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

#8

merci Domi2
j'ai fais les changements adquats, mais il ne se passe
toujours rien.
j'ai juste enregistr les 2 fonctions aux bons endroits (je ne
pense pas avoir fait d'erreur sur les noms des tables et des
bases, car j'ai repris les mmes que dans le code de RobiPMS
pour viter des erreurs et tester le code),
mais y a-t-il une manip gnrale essentielle ou des
changements importants faire dans le code VBA pour que a
fonctionne ?
merci pour votre aide
00

28/01/2012, 18h35

BlueMonkey
Membre Expert

#9

Bonjour,
Citation:

Inscription : dcembre
2011
Messages : 660

y a-t-il une manip gnrale essentielle ou des changements


importants faire
L'excution des macros peut tre bloqu par le niveau de

scurit configur.
Points : 1 267

Sinon pour la demande initiale d'avoir le mme chemin pour


chaque base, quelque soit le PC,
il est galement possible d'utiliser les liens symbolique vers
un dossier.
lien symbolique.
Avec des liens symboliques ou des jonctions de partitions, il
est mme possible
de faire pointer un lien vers une autre partition, sans qu'un
programme ne soit perturb.
00

28/01/2012, 19h13

sophie)

Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

#10

merci pour ta rponse BlueMonkey


au niveau des liens symboliques ( moins d'avoir mal
compris), si je change de rpertoire mes 2 bases, alors je dois
recrer le lien symbolique non?
et en enregistrant mes 2 bases sur un autre pc, je dois crer
le lien symbolique aussi sur le 2me pc ?
00

28/01/2012, 19h20

BlueMonkey

#11
Citation:

Membre Expert

si je change de rpertoire mes 2 bases, alors je dois recrer


le lien symbolique non?
Inscription : dcembre
2011
Messages : 660
Points : 1 267

C'est exact.
Citation:

En enregistrant mes 2 bases sur un autre pc, je dois crer le


lien symbolique aussi sur le 2me pc
Si la base n'est pas dans le rpertoire attendu par le lien, oui.
Il faut bien voir que les liens permette juste de rendre
transparent le fait qu'on travaille,
sur dans un rpertoire ou un autre.
Rien de plus.
exemple : on travaille sur plusieurs version d'une base ou
d'un logiciel.
Pour passer d'une version l'autre, il suffit de changer le lien
symbolique pour pointer sur la version souhaite.
00

28/01/2012, 19h34

#12

sophie)

d'accord merci BlueMonkey

Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

je vais peut-tre me rpter, mais mon but est de


remettre mes 2 bases lies une personne, et qu'une
fois qu'elle les aura enregistres sur son pc qu'elle
n'ait pas relier les 2 tables de mes 2 bases pour
executer les requtes.
donc le mieux c'est peut-tre le code VBA, mais je
n'arrive pas le faire fonctionner... et si j'ai bien
compris je n'ai rien faire de plus que d'enregistrer
les 2 fonctions de RobiPMS ?
en enlevant la scurit : Access m'affiche le
formulaire que j'ai mis par dfaut l'ouverture de ma
base. Je l'ai donc ferm, ainsi que celui sur ma
table1. Puis en voulant rouvrir le formulaire de table1
j'ai le message suivant :
"Le moteur de bases de donnes n'a pas pu
verrouiller la table "Table1" car elle est dj utilise
par une autre personne ou un autre processus."
serait-ce la source du problme?
merci par avance pour votre aide
00

28/01/2012, 19h43

BlueMonkey

#13
Citation:

Membre Expert

Inscription : dcembre
2011
Messages : 660
Points : 1 267

"Le moteur de bases de donnes n'a pas pu verrouiller la


table "Table1" car elle est dj utilise par une autre
personne ou un autre processus."
Pour ce type de problme, essaye de sortir d'Access, puis de
relancer.
Si a ne fonctionne pas. Essaye en fermant la session
Windows.
Enfin si rien de cela fonctionne, essaye
un compactage (rparation induite
)
00

28/01/2012, 22h12

sophie)

Invit de passage

Inscription : dcembre
2011
Messages : 39
Points : 2

#14

merci BlueMonkey!
je crois que je m'embourbe dans ce code VBA, que je n'ai
peut-tre pas assez adapt.
De plus, j'ai retrouv de la doc sur ma 1re mthode dont le
but est que les tables de Base2 n'apparaissent pas dans
Base1 (ce qui n'tait pas le cas car j'utilisais l'importation
sous Access) :
mettre dans "Base source" de la feuille de proprits d'une
requte le nom de ma 2me base, et il faut (ce que je n'avais
pas fait) pour utiliser les champs faire prcder leur nom par

le nom de la 2me base (dans le code SQL) :


exemple : Base2.Table1.Prenom
nanmoins le fichier doit se trouver dans
C:\Users\sophie\documents
donc je le mets cet endroit, mais quand j'execute Access me
dit :
"Fichier C:\Users\sophie\documents\Base2.mdb introuvable"
je pense que tout cela est due l'extension... mais pourquoi
veut-il un ".mdb" (extension anglaise?) au lieu d'un ".accdb"?
que puis-je faire (j'arrive pas changer cette extension)?
merci par avance pour votre aide
00

29/01/2
012,
11h13

sophie
)

Invit de
passage

Inscriptio
n:
dcembr
e 2011
Messages
: 39
Points : 2

#15

Bonjour,
je viens de trouver que l'extension ".mdb" correspond Access 2002-2003,
j'ai donc enregistr ma 2me base en Access 2002-2003.
Quand j'excute ma requte dans Base1 utilisant une table de Base2 a
fonctionne. Nanmoins Base2 doit contenir un mot de passe l'ouverture, et
quand j'en mets un, la requte dans Base1 ne fonctionne plus : j'ai le
message "Mot de passe non valide", alors qu'on ne m'a demand aucun
moment d'entrer le mot de passe de la 2me base pour excuter ma
requte.
Auriez vous une ide ? merci par avance
je demande aussi si passer d'Access 2007 2002-2003 implique
d'importantes pertes de fonctionnalit de ma base ?
00

Message

2 visiteurs sur ce sujet (2 anonymes)

Page 1 2 Suivante

ro # Post le 11/04/2011 09:50:53


ms_89

Music
Addict
!

Bonjour !
J'aimerais savoir comment on peut lire les champs d'une table Access avec du code VBA. La

29/01/2
012,
11h13

#15

BDD que j'ai, reprsente des parcours de formations (type CFA).


En effet, j'ai une table qui s'appelle programme(avec un id programme et les id des
modules (pouvant aller jusqu' 200 modules par programme!

tudes
: IUT
Dijon

Ce qui fait qu'on a 200

colonnes partiellement remplies pour chaque programme


)). J'aimerai rcuprer tous les
numros de modules pour chaque programme pour les afficher dans un formulaire.
J'ai mon code VBA pour l'instant, mais ma variable "m1" est toujours vide :
Code : Autre - Slectionner

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4

Option Compare Database


Public Sub Transfert_lien()
'ouverture du RecordSet
Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Temp\Module_
V3.accdb")
Set pgm2 = db.OpenRecordset("Pgm2")
Set lien = db.OpenRecordset("lien")
pgm2.MoveFirst
Do While pgm2.[N Programme] <> ""
'rcupration des modules de 1 200 et ajout dans la table lien
If Not IsNull(m1) Then
With lien
.AddNew
![N Module] = Left(m1, 10)
![N Programme] = pgm2.[N Programme]
.Update
.Bookmark = .LastModified
pgm2.MoveNext
End With
End If
Loop

End Sub

29/01/2
012,
11h13

#15

2
5
2
6
2
7
2
8
2
9
3
0
3
1
J'ai cherch sur Internet mais je n'ai rien trouv qui pouvait correspondre ce que je
cherchais...
S'il quelqu'un pouvait m'aider, a serait sympa.
Merci d'avance !
Romain.

On "nat" pas motard, on le devient.

Public # Post le 11/04/2011 09:50:53


it

gu # Post le 11/04/2011 10:42:20


k92

Bonjour, je ne connais pas trop le Visual Basic, mais pour pouvoir te connecter une base
de donnes il te faut les API (des fichiers qui te permettent de lier ton projet VB la base
de donnes).
Access tant une base de donnes de Microsoft, ainsi que le langage VB .NET, je pense que
tu n'as pas grand chose installer, par contre il te faudrait peut tre dfinir en haut de ton
code les lignes qui prcisent que tu vas te servir d'une base de donnes Access.
tudes
: BTS
NEWTO
N
ENREA

Il y a des tutoriels assez sympa que tu peux trouver sur Internet, il suffit juste de bien
rechercher :
http://access.developpez.com/cours/?page=langagevba
Par contre j'aurais deux choses te dire :
- Quand tu postes un morceau de code, choisis le symbole "</>" et le langage qui va avec
pour crire ton code dedans, comme a les Zr0s (nous) pourrons mieux lire ton code.

29/01/2
012,
11h13

#15

- Je ne sais pas si tu le sais mais tu as besoin d'un minimum de connaissance en SQL pour
interagir avec une base de donnes.
ro # Post le 11/04/2011 11:34:20
ms_89
Music
Addict
!

Merci de ta rponse guk92!


Autant pour moi pour le code, je n'avais pas vu que VB .NET tait dans la liste...

tudes
: IUT
Dijon

C'est

mon premier post, alors merci du conseil!


Je suis all sur dveloppez.com et d'autres sites, mais je n'ai rien trouv qui me permette
de rcuprer les valeurs de mes champs.
Pour ce qui est du SQL, je le sais que j'en ai besoin, mais j'ai dj essay de mettre ma
requte en dur, sauf qu'access ne veut pas traiter les champs que je lui demande (les 200
champs dans le Select, Access n'aime pas trop).
Donc je me suis tourn vers le VBA, en pensant utilis une boucle pour pouvoir faire mon
traitement, mais sans succs jusqu' maintenant...
Merci encore guk92, je vais encore cherch pour voir ce que je peux trouver l-dessus !

On "nat" pas motard, on le devient.

gu # Post le 11/04/2011 11:43:04


k92

Access n'est pas une base de donnes pour les professionnelles (mon prof dit que c'est pour
les bons pres de famille qui font la compta de leurs revenus
la pointe de la perfection non plus.

), donc n'est pas l'outil

Si tu le peux, je te conseil d'utiliser une base de donnes MySQL.


Il y a un trs trs trs bon tuto sur a sur le site du zro.
tudes
: BTS
NEWTO
N
ENREA

Ensuite il existe un moyen pour relier VB .NET MySQL (sur le site developpez).
Mais un dernier conseil avec Access, essaye de commencer petit, genre une table de 3
champs avant de t'attaquer 300 ( moins que tu sois un spartiate
).
Et une fois que c'est OK, avec tes 200 champs slectionner, fait un SELECT * FROM taTable
et c'est OK.

ro # Post le 11/04/2011 12:00:53


ms_89
Music
Addict
!

tudes
: IUT
Dijon

Oui je suis bien d'accord avec l'avis de ton prof


Le seul problme, c'est que je ne peux pas faire ce que je veux, car je suis en stage de DUT
en entreprise...
Et ils sont en train de changer leur systme de fonctionnement
informatique. Donc au dbut, ils avaient une base documentaire (pas une base de
donnes!) et ensuite ils ont migr vers une base de donnes, sauf qu'ils ont eu des beugs au
niveau de la migration, donc la base de donnes n'est pas saine... Rsultat : je dois mettre
en place des formulaires permettant de consulter/modifier les donnes. J'espre que t'as
tout compris

29/01/2
012,
11h13

#15

Et puis j'ai aussi essay pour 3 champs avant de tester sur les 200 (informaticien mais pas
suicidaire

), mais le problme est le mme, c'est que je ne sais pas comment rcuprer

la valeur de mon champ avec du code VBA.

On "nat" pas motard, on le devient.

An # Post le 11/04/2011 12:02:01


gelo

Citation : roms_89

tudes
: CFA
AFTI

En effet, j'ai une table qui s'appelle programme


Code : Autre - Slectionner

1
2
3
4
5

Option Compare Database


Public Sub Transfert_lien()

Set pgm2 = db.OpenRecordset("Pgm2")

Ta table s'appelle programme ou Pgm2?

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 11/04/2011 13:39:25
ms_89
Music
Addict
!

oups... j'avais pas vu, bien jou angelo ! elle s'appelle bien pgm2

On "nat" pas motard, on le devient.

tudes
: IUT
Dijon

An # Post le 11/04/2011 14:10:39


gelo

Du coup, le problme est rgl ?

29/01/2
012,
11h13

tudes
: CFA
AFTI

#15

Merci de ne donner que le code minimal correspondant


votre problme

ro # Post le 11/04/2011 14:35:38


ms_89
Music
Addict
!

tudes
: IUT
Dijon

non, a ne change rien mon problme...


je fais que de chercher sur internet, mais je ne trouve rien. j'espre trouver quelque chose
pour que je puisse avoir au moins une piste.

On "nat" pas motard, on le devient.

An # Post le 11/04/2011 14:47:21


gelo

tudes
: CFA
AFTI

Je t'avoue que pour l'ajout dans la table lien, j'aurai tendance passer par une requte
insert into
Maintenant je ne sais pas si c'est la meilleur faon de faon de faire : ton addNew l'air
sympa aussi
Un petit exemple avec ma mthode (j'ai 2 tables : users et messages et jinsre les id de
users dans messages avec un message en dur )
Code : VB.NET - Slectionner

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4

Private Sub Commande2_Click()


Dim oRs As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim query As String
Set oRs = CurrentDb.OpenRecordset("users")
While Not oRs.EOF
query = "insert into messages (users, messages) values (" &
Set qdf = CurrentDb.CreateQueryDef("", query)
qdf.Execute
oRs.MoveNext
Wend
oRs.Close
End Sub

dit le 11/04/2011 14:47:53 par Angelo

29/01/2
012,
11h13

#15

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 11/04/2011 15:23:59
ms_89
Music
Addict
!

Merci Angelo pour ta mthode. L'objet QueryDef te sert stocker une requte SQL si j'ai
bien compris?! Mais moi le seul problme, c'est qu'avant d'crire dans ma table lien, il faut
dj que je puisse rcuprer les donnes depuis ma table pgm2! C'est a mon problme
principal.
Merci pour ton coup de main en tout cas !

tudes
: IUT
Dijon

k92

On "nat" pas motard, on le devient.

gu # Post le 11/04/2011 15:50:54

Si tu arrives te connecter dans un premier temps, le reste c'est simple, tu remplaces


l'insertion INSERT INTO de l'exemple par une slection SELECT (SELECT * FROM taTable).
Puis tu fais un affichage de la slection.
Je ne me rappelle plus exactement de la commande pour l'affichage pour VB,
Console.WriteLine("ce que tu souhaites afficher") je crois si tu es sous la console, si t'es
dans un fichier Excel (VB A) c'est encore une autre commande.
tudes
: BTS
NEWTO
N
ENREA

Tu dois parvenir quelque chose avec un peu de bidouillage

An # Post le 11/04/2011 16:14:14


gelo

Cette rponse a aid l'auteur du sujet

tudes
: CFA
AFTI

Citation : roms_89
Merci Angelo pour ta mthode. L'objet QueryDef te sert stocker une requte SQL si j'ai
bien compris?! Mais moi le seul problme, c'est qu'avant d'crire dans ma table lien, il faut
dj que je puisse rcuprer les donnes depuis ma table pgm2! C'est a mon problme
principal.
Merci pour ton coup de main en tout cas !
La rcupration des donnes de pgm2 est assur par le OpenRecordset logiquement
Dans mon exemple users correspond pgm2 et messages lien
Fais juste ce code :

29/01/2
012,
11h13

#15

Code : VB.NET - Slectionner

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5

Option Compare Database


Public Sub Transfert_lien()
dim pgm2 as DAO.Recordset
Dim qdf As DAO.QueryDef
'ouverture du RecordSet
Set db =
DBEngine.Workspaces(0).OpenDatabase("C:\Temp\Module_V3.accdb"
)
Set pgm2 = db.OpenRecordset("Pgm2")
While Not pgm2.EOF
Debug.Print pgm2("[N Programme]")
pgm2.MoveNext
Wend
pgm2.Close
End Sub

et dis moi si a fait une erreur et sinon si tu as quelque chose dans la fentre d'excution
En fait, je n'y avais pas pens mais tu pourra pas pass par un insert + select directement ?
Par contre j'ai pas compris les valeurs du n de module
Code : SQL - Slectionner

INSERT INTO lien ([N Programme]) SELECT [N Programme]


from pgm2

dit le 11/04/2011 16:15:32 par Angelo

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 11/04/2011 16:37:13
ms_89
Music
Addict
!

Merci guk92 pour ta rponse, j'ai test en remplaant le INSERT INTO par le SELECT mais
a me mettait l'erreur comme quoi je n'avais pas le droit de faire une requte de slection.
je n'ai pas compris pourquoi.
Angelo, j'ai test et je n'ai pas d'erreur et je rcupre tous les numros de programme
(enfin ils s'affichent dans la console d'excution). C'est dj un trs bon point
Citation : angelo

29/01/2
012,
11h13

#15

Par contre j'ai pas compris les valeurs du n de module


tudes
: IUT
Dijon

En fait, maintenant que je rcupre le n de programme, il faut que je rcupre tous les
numros de modules (les id si tu prfres) pour chaque programme
. C'est une
arborescence en quelque sorte. Pour un programme donn, j'ai plusieurs modules
correspondants. J'espre que je suis assez clair

La solution serait peut-tre de faire une

requte, mais vu qu'elle ne s'excute pas, je suis encore bloqu


Merci tous les deux pour vos rponses!!

On "nat" pas motard, on le devient.

An # Post le 11/04/2011 17:54:14


gelo

Citation : roms_89

tudes
: CFA
AFTI

Angelo, j'ai test et je n'ai pas d'erreur et je rcupre tous les numros de programme
(enfin ils s'affichent dans la console d'excution). C'est dj un trs bon point
Oui c'tait le but : vrifier qu'on arrive au moins lire les donnes de la table pgm2
Citation : roms_89
Citation : angelo
Par contre j'ai pas compris les valeurs du n de module
En fait, maintenant que je rcupre le n de programme, il faut que je rcupre tous les
numros de modules (les id si tu prfres) pour chaque programme
. C'est une
arborescence en quelque sorte. Pour un programme donn, j'ai plusieurs modules
correspondants. J'espre que je suis assez clair

La solution serait peut-tre de faire une

requte, mais vu qu'elle ne s'excute pas, je suis encore bloqu


Merci tous les deux pour vos rponses!!
Si je comprend bien [N Module] est galement dans la table pgm2 et tu as une cl
trangre dans la table lien ?
Si oui, tu n'as plus qu'a ajouter le insert into dans le code que je t'ai dj donn :
Code : VB.NET - Slectionner

1 Public Sub Transfert_lien()


2 Dim pgm2 As DAO.Recordset
3 Dim qdf As DAO.QueryDef

29/01/2
012,
11h13

4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6

#15

Dim query As String


'ouverture du RecordSet
Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Temp\Module_V3.accd
Set pgm2 = db.OpenRecordset("Pgm2")
While Not pgm2.EOF
query = "insert into liens([N Module], [N Programme]) values ("
& "')"
Set qdf = CurrentDb.CreateQueryDef("", query)
qdf.Execute
pgm2.MoveNext
Wend
oRs.Close
End Sub

dit le 11/04/2011 17:59:39 par Angelo

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 09:27:41
ms_89
Music
Addict
!

Salut angelo,
merci de tes rponses, a m'a dj bien aider jusqu' maintenant!
Citation : angelo
Si je comprend bien [N Module] est galement dans la table pgm2

tudes
: IUT
Dijon

Non, mon champ [N Module] est dans ma table lien


. En fait, dans ma table pgm2, j'ai
mon champ N Programme et ensuite mes champs m1, m2, m3... jusqu' m200 qui me
permettent d'identifier mes modules

(je m'tais un peu mal exprim avant, je viens de

regarder...
la structure de la table est comme a, je ne peux pas la modifier
) et
dans ces champs m1,m2...m200 (type texte), on trouve les numros de module dans les 10
premiers caractres, et leur descriptif aprs. C'est pour a qu'au dbut de mon premier
code, je prenais les 10 premiers caractres pour avoir juste le code du module, sauf que
mon m1 tait vide :
Code : VB.NET - Slectionner

![N Module] = Left(m1, 10)

29/01/2
012,
11h13

#15

Citation : angelo
et tu as une cl trangre dans la table lien ?
Ma table lien ne comprend que 3 champs, qui forment une cl compose. Il y a donc N
Programme, NModule, et Position (qui est de type entier) pour savoir quel endroit est
situ le module (si c'est le m1, m2...).
J'espre que tu as tout compris ce que je t'ai dit, ce n'est pas trs vident d'expliquer par
crit
. En tout cas, s'il y a des choses que tu n'as pas compris, n'hsites surtout pas me
poser des questions, j'essaierai de te rpondre le plus clairement possible! Merci
beaucoup !!

On "nat" pas motard, on le devient.

k92

gu # Post le 12/04/2011 10:23:02

Content de voir que tu avances roms_89, angelo lui est un ancien donc il n'aura mon avis
pas trop de soucis aider un peu tout les zros en galre grce ses connaissances.
Par contre il faut que tu sois plus prcis dans tes posts, je viens de lire le dernier et je n'ai
pas compris si tu avais un soucis ou non.
De plus on ne connait pas trop ton systme (on ne connait pas tes tables, les liens entre tes
tables, leurs noms etc...), il faut plus synthtiser.
tudes
: BTS
NEWTO
N
ENREA

An # Post le 12/04/2011 10:24:25


gelo

Ca sent la conception foireuse a !


Dsol de toujours reformuler ce que tu dis mais c'est la meilleurs manire de se
tudes
: CFA
AFTI

comprendre (ou alors tu me files un jeu de test

prenons un exemple (je limite le nombre de module 5) :


Dans pgm2 tu as :

29/01/2
012,
11h13

#15

Et dans liens tu veux avoir :

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 11:11:46
ms_89
Music
Addict
!

tudes
: IUT
Dijon

c'est exactement a !

excusez moi pour mes posts, c'est vrai que j'ai pas l'habitude de

poster sur des forums, donc il me faut un petit peu de temps pour que je m'y habitue !
Pour la conception foireuse, j'y peux rien (enfin pas grand chose, je suis en stage en
entreprise, et leur base de donnes a t faite partir d'une base documentaire donc je
prend ce qu'on me donne
). J'arrive afficher les numros de module (je me suis limit
5 aussi) avec le numro de programme correspondant grce au code VBA suivant :
Code : VB.NET - Slectionner

1 Option Compare Database


2
3
4 Public Sub Transfert_lien()

29/01/2
012,
11h13

5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7

#15

Dim
Dim
Dim
Dim

pgm2 As DAO.Recordset
lien As DAO.Recordset
qdf As DAO.QueryDef
str As String

'ouverture du RecordSet
Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Temp\Module_V3.accd
Set pgm2 = db.OpenRecordset("Pgm2")
Set lien = db.OpenRecordset("lien")
While Not pgm2.EOF
'test du module null ou non
If Not Isnull(pgm2("[m1]")
'affiche le n de programme
Debug.Print pgm2("[N Programme]")
'affiche les numros de modules correspondants au programme
Debug.Print pgm2("[m1]"), pgm2("[m2]"), pgm2("[m3]"), pgm2(
pgm2("[m5]")
EndIf
pgm2.MoveNext
Wend
pgm2.Close
End Sub

Pour reprendre ton tableau, ce que je n'arrive pas faire, si par exemple, je n'ai pas de
module 4 dans mon programme 2, lorsque j'excute mon programme il m'affiche null dans
la fentre d'excution, mais il faudrait qu'il ne m'affiche rien. Mon test actuel ne permet
que de traiter le premier module, car la fonction IsNull ne peut prendre qu'un seul

29/01/2
012,
11h13

#15

argument

. Je voudrais que mon test s'effectue sur tous mes modules.

N m1
Prog
ram
me

m2

m3

m4

m5

m0000000001
description
module 1
pgm1

m0000000002
description
module 2
pgm1

m0000000003
description
module 3
pgm1

m0000000004
description
module 4
pgm1

m0000000005
description
module 5
pgm1

m0000000001
description
module 1
pgm2

m0000000002
description
module 2
pgm2

m0000000003 description
module 3
pgm2

Ensuite une fois que ce traitement sera fait, je pourrais mettre les donnes dans ma table
lien. Y'aurait-il moyen d'avoir une variable pour parcourir tous les modules (donc de 1
200) de chaque programme et voir ainsi si le module est null ou non ?! Est-ce que tu peux
m'aider trouver comment faire ce traitement (je rappelle que je suis vraiment pas Zero
en VBA...

)?

Merci d'avance aux "Zanciens"

On "nat" pas motard, on le devient.

gu # Post le 12/04/2011 11:20:19


k92

Citation : roms_89
si par exemple, je n'ai pas de module 4 dans mon programme 2, lorsque j'excute mon
programme il m'affiche null dans la fentre d'excution, mais il faudrait qu'il ne m'affiche
rien.

tudes
: BTS
NEWTO
N
ENREA

Tu fais directement un affichage avec :


Code : VB.NET - Slectionner

Debug.Print pgm2("[m1]"), pgm2("[m2]"), pgm2("[m3]"), pgm2("[m4]"


pgm2("[m5]")

Ne penses tu pas que tu devrais tester chacun de ces paramtres ( les pgm2() ) pour voir
s'ils sont NULL avant de faire un Print directement ?
(avec quelque chose comme if pgm2("[mx]") is null ou quelque chose qui y ressemble,

29/01/2
012,
11h13

#15

encore une fois VB n'est pas mon fort)


An # Post le 12/04/2011 11:27:30
gelo

Cette rponse a aid l'auteur du sujet

tudes
: CFA
AFTI

Il faut faire une boucle sur les colonnes modules non nulle (au moins tu n'aura pas crire
200 fois la condition ! ) :
Code : VB.NET - Slectionner

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2

Public Sub Commande2_Click()


Dim
Dim
Dim
Dim

pgm2 As DAO.Recordset
lien As DAO.Recordset
qdf As DAO.QueryDef
str As String

'ouverture du RecordSet
Set pgm2 = CurrentDb.OpenRecordset("Pgm2")
'Set lien = db.OpenRecordset("liens")
While Not pgm2.EOF 'boucle sur toutes les lignes de la table Pgm2

For Each pgm In pgm2.Fields 'Pour toutes les colonnes d'une ligne donn
'pgm.Name <=> nom de la colonne
'pgm2(pgm.Name) <=> valeur de la colonne
If Not IsNull(pgm2(pgm.Name)) And Left(pgm.Name, 1) =
pas nulle
Debug.Print pgm2(pgm.Name)
End If
Next
pgm2.MoveNext
Wend
pgm2.Close
End Sub

29/01/2
012,
11h13

#15

4
2
5
2
6
dit le 12/04/2011 11:28:19 par Angelo

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 11:30:20
ms_89
Music
Addict
!

petite correction mon post d'avant


Citation : roms_89
je rappelle que je suis vraiment pas Zero en VBA...

tudes
: IUT
Dijon

j'ai mis un "pas" qui n'a aucun lieu d'tre l, donc je suis un Zero en VBA
c'est ce que je
voulais dire.
guk92, par rapport ce que tu dis, c'est ce que je voudrais faire, mais je n'ai pas russi
justement mettre en place ce test. C'est sur ce point que j'ai demand de l'aide
angelo.

On "nat" pas motard, on le devient.

An # Post le 12/04/2011 11:49:46


gelo

Ma rponse est au dessus

tudes
: CFA
AFTI

Merci de ne donner que le code minimal correspondant


votre problme

ro # Post le 12/04/2011 12:04:54


ms_89
Music
Addict
!

Merci angelo pour ta rponse! a m'a aid aussi


. j'ai juste rajout le debug.print juste
aprs le while pour savoir dans quel programme sont contenus les modules affichs.
Il faut que maintenant je puisse remplir ma table lien avec une requte ou autre, je sais
pas comment faire, vu que mon addNew ne fonctionne pas non plus...

29/01/2
012,
11h13

#15

Code : VB.NET - Slectionner

tudes
: IUT
Dijon

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7

Option Compare Database


Public Sub Transfert_lien()
Dim
Dim
Dim
Dim

pgm2 As DAO.Recordset
lien As DAO.Recordset
qdf As DAO.QueryDef
str As String

'ouverture du RecordSet
Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Temp\Module_V3.accd
Set pgm2 = db.OpenRecordset("Pgm2")
Set lien = db.OpenRecordset("lien")

While Not pgm2.EOF 'boucle sur toutes les lignes de la table Pgm2
Debug.Print pgm2("[N Programme]")
For Each pgm In pgm2.Fields 'Pour toutes les colonnes d'une ligne donn
'pgm.Name <=> nom de la colonne
'pgm2(pgm.Name) <=> valeur de la colonne
If Not IsNull(pgm2(pgm.Name)) And Left(pgm.Name, 1) =
pas nulle
Debug.Print pgm2(pgm.Name)
End If
Next
pgm2.MoveNext
Wend
pgm2.Close
End Sub

29/01/2
012,
11h13

#15

2
8
2
9

On "nat" pas motard, on le devient.

An # Post le 12/04/2011 12:17:43


gelo

Cette rponse a aid l'auteur du sujet

tudes
: CFA
AFTI

Il suffit d'ajouter l'insert que j'ai propos plus tot :


Code : VB.NET - Slectionner

1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5

Set pgm2 = CurrentDb.OpenRecordset("Pgm2")


While Not pgm2.EOF 'boucle sur toutes les lignes de la table Pgm2
For Each pgm In pgm2.Fields 'Pour toutes les colonnes d'une ligne donn
'pgm.Name <=> nom de la colonne
'pgm2(pgm.Name) <=> valeur de la colonne
If Not IsNull(pgm2(pgm.Name)) And Left(pgm.Name, 1) =
pas nulle
query = "insert into liens([N Module], [N Programme]) values ('"
Set qdf = CurrentDb.CreateQueryDef("", query)
qdf.Execute
End If
Next
pgm2.MoveNext
Wend
pgm2.Close

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 14:38:54
ms_89
Music
Addict

Oui, mais c'est ce que j'ai fait, mais est-ce que c'est normal que ma table lien se mette pas

29/01/2
012,
11h13
!

#15

jour lorsque je suis en mode pas pas?


Il n'y a aucun champ de remplis quand je la consulte aprs avoir fait tourner plusieurs fois
mon algo!
et j'ai un autre petit problme que je comprend pas :

tudes
: IUT
Dijon

Code : VB.NET - Slectionner

Left(pgm2(pgm.Name), 10)

C'est bien cens prendre que les 10 premiers caractres du champ?! Et pourtant, j'ai tout le
champ qui vient avec...

On "nat" pas motard, on le devient.

An # Post le 12/04/2011 14:46:07


gelo

je ne comprend pas trop, sur ma base de test a fonctionne

tudes
: CFA
AFTI

Attention moi j'ai mis liens avec un s alors que visiblement toi non mais a aurai du te
mettre une erreur ...
Et oui le left permet de n'acoir que les 10 premiers caractres.
Comment sait tu que tu as tout ? tu as fait un debug.print query ? (fais le pour voir la
syntaxe qui est gnr)
Quelles sont les types de tes colonnes ? (texte, numrique ...)

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 14:57:47
ms_89
Music
Addict
!

oui, j'avais corrig la table lien, j'avais vu que tu avais mis un S

tudes
: IUT
Dijon

On "nat" pas motard, on le devient.

pour ce qui est des 10 caractres, c'est rsolu, j'avais laiss trainer un debug.print...
sinon pour mes types de colonnes dans lien, N Programme et N Module sont de type
texte, et Position est de type numrique.

29/01/2
012,
11h13

#15

An # Post le 12/04/2011 15:03:04


gelo

Je ne vois pas trop


remplace mes currentDb par db : on ne sais jamais
tudes
: CFA
AFTI

En parlant de position ; je n'ai pas compris quoi il sert ni comment tu es sens l'obtenir
donc il napparat pas dans la requte
nulle)

(mais en principe les colonnes peuvent tre

Merci de ne donner que le code minimal correspondant


votre problme
ro # Post le 12/04/2011 15:19:46
ms_89
Music
Addict
!

J'ai dj essay avec le db mais a ne change rien...


Pour Position en fait, a serait juste un entier qui s'incrmente qui me permet de savoir o
est positionn le module dans le programme de formation. C'est du point de vue pdagogie,
savoir si on peut suivre le module x avant d'avoir fait le module y.
Pour chaque programme, cet entier doit tre rinitialis.

tudes
: IUT
Dijon

Je devrais arriver a dans ma table lien

N Programme

N Module

Position

P000000001

M000000001

P000000001

M000000002

P000000001

M000000003

P000000002

M000000001

P000000002

M000000002

Donc j'ai toujours ce problme o le INSERT que j'ai, n'insert aucune donne dans ma table
lien...