Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/04/2011, 10h43   #1
Invité de passage
 
Inscription : mars 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 5
Points : 1
Points : 1
Par défaut Lien entre un formulaire et un recordset DAO

Bonjour à tous,
je développe actuellement une application professionnelle sensée gérer des entreprises clientes. J'ai conçu l'application de sorte qu'il y ait la base dans un fichier (Entreprises_Base.mdb) et l'application avec les formulaires dans un autre (Entreprises_App.mdb). J'utilise donc largement les objets DAO pour faire le lien entre l'appli et la base. Et c'est là que ca me bloque aussi. Voici le topo:
J'ai un formulaire avec une liste des entreprises. Lorsqu'on sélectionne une entreprise, des données "basiques" s'affichent dans un cadre à coté de la liste, dans le même formulaire. Lorsqu'on clique sur un bouton que j'ai créé, je récupère la clé primaire de l'entreprise selectionnée et la fait passer à un nouveau formulaire qui affichera toutes les infos.
Code :
DoCmd.OpenForm "entreprise", acNormal, , , acFormReadOnly, acDialog, Me.LstEntreprises.Column(0, Me.LstEntreprises.ListIndex)
Ensuite, dans la procédure Open du formulaire Entreprise, je récupère cette valeur (si elle existe), j'ouvre un recordset avec une requête conditionnée sur la clé et j'attribue le recordset à la propriété Recordset de mon formulaire.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If Len(Me.OpenArgs) > 0 Then
 
        Set odb = OpenDatabase(AppPath & "Entreprises_Base.mdb", False, False)
 
        rsQuery = "SELECT * FROM ENTREPRISE WHERE ENTREPRISE_CLE=" & Me.OpenArgs
        Set rstEts = odb.OpenRecordset(rsQuery, dbOpenDynaset)
 
        Set Me.Form.Recordset = rstEts
        Me.Form.Requery
 
        Me.ENTREPRISE_CLE.Value = rstEts.Fields("ENTREPRISE_CLE").Value
        Me.ENTREPRISE_CP.Value = rstEts.Fields("ENTREPRISE_CP").Value
 
        rstEts.Close: Set rstEts = Nothing
        odb.Close: Set odb = Nothing
    Else
        MsgBox "Nombre de paramètres insuffisants, l'ouverture des détails est impossible."
        DoCmd.Close
    End If
Ce que je n'ai pas et que je souhaiterai avoir, c'est un remplissage "automatique" des champs de mon formulaire. Je m'explique: dans les propriétés d'un champ texte on trouve la Source qui peut être un champ et qui est très utile si la source du formulaire est une table. Mais ca ne fonctionne pas si la source du formulaire est définie sur un recordset.

Alors ma question est la suivante: comment remplir mes champs texte sans avoir à taper pour chacun (j'en ai un bonne centaine) la ligne
Code :
Me.NOM_DU_CHAMP.Value = rstEts.Fields("NOM_DU_CHAMP").Value
Merci beaucoup de votre aide et n'hésitez pas si vous avez des questions!
MrPiMs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 12h57   #2
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
Bonjour

Question bête :
Pourquoi passez-vous un recordset comme source du formulaire et pas la requête SQL (qui sert à ouvrir le recordset)?

Code :
1
2
3
4
rsQuery = "SELECT * FROM ENTREPRISE WHERE ENTREPRISE_CLE=" & Me.OpenArgs
        Set rstEts = odb.OpenRecordset(rsQuery, dbOpenDynaset)
 
        Set Me.Form.Recordset = rstEts
Il est tout à fait possible d'ouvrir le formulaire ainsi :

Code :
1
2
3
4
rsQuery = "SELECT * FROM ENTREPRISE WHERE ENTREPRISE_CLE=" & Me.OpenArgs
 
 
        Set Me.RecordSource = rsQuery
Ensuite, il suffit que votre formulaire contienne des contrôles ayant comme source les différents champs de la requête source.

Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h08   #3
Invité de passage
 
Inscription : mars 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 5
Points : 1
Points : 1
Merci pier.antoine pour votre réponse. C'aurait été si simple de faire comme vous le dites! Mais comme j'ai pu l'expliquer, mes données sont dans un autre fichier que celui de l'application. Donc impossible de faire une requête directement sur une table sachant qu'il n'y a pas de tables physiquement dans ma partie applicative.
MrPiMs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 15h18   #4
Invité de passage
 
Inscription : mars 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 5
Points : 1
Points : 1
En fait j'ai trouvé la solution à force de bidouiller. Il faut que le recordset à utiliser dans le formulaire soit déclaré en public et non directement dans la procédure d'ouverture du formulaire.

Voilà, merci encore à pier.antoine d'avoir proposé son aide.
MrPiMs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 17h48   #5
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
On pouvait sans doute contourner le problème en important les données de la table externe dans une table locale (à détruire ensuite).

Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h21.


 
 
 
 
Partenaires

Hébergement Web