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 22/11/2010, 12h20   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Par défaut Trouver un enregistrement dans un formulaire

Bonjour,

Je développe actuellement une DB en Access 2007 pour le suivre la maintenance des machines que j'ai vendu à mes clients.

Je rencontre le problème suivant : dans un champs indépendant (liste déroulante), je liste toutes les machines en service. Ensuite, je voudrais qu'en cliquant sur un bouton (que j'ai appelé "Find"), la fiche détaillée de cet enregistrement s'ouvre.

Actuellement, j'utilise
Code :
"DoCmd.GoToRecord acActiveDataObject, , acGoTo, Serial"
où Serial reprend le n° donné dans ma liste déroulante, pour atteindre mon enregistrement.

Cela fonctionne dans ma table de machine. Par contre, je voudrais faire la même chose pour ma table client (créer un formulaire de recherche, à l'aide d'une zone de liste déroulante indépendante), mais là, je rencontre un problème : ca ne marche pas...

La seule différence que je vois, c'est que, dans ma table Clients, ma clé primaire est assurée par un n° automatique et que j'ai dû supprimer plusieurs enregistrements (ce qui je crois explique mon problème).

D'après les recherches que j'ai pu faire, je crois que la solution serait d'utiliser les recordset, mais c'est ici que les choses se gâtent: je ne suis pas informaticien et ce concept me dépasse...

J'aurais souhaité savoir si quelqu'un pouvait m'aider, soit en m'aidant à créer le code nécessaire, ou en me renvoyant vers des tutoriels genre "Les recordsets pour les Nuls" (parce que je n'en touche vraiment pas une sur le sujet...), ou encore en m'expliquant les bases...

J'espère que je poste au bon endroit, que ma question est claire et que je donne toutes les infos nécessaires, sinon il ne faut pas hésiter à me demander plus d'informations.

D'avance je vous remercie pour votre précieuse aide et d'avoir pris la peine de lire ce message jusqu'au bout!
mykegyver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 12h46   #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

Rien n'est désespéré.

Pour contourner votre problème, je ne suis pas sûr qu'utiliser les recordsets soit plus approprié (pour info, aller voir le tutoriel Création et manipulation des données avec DAO , surtout la partie 5).

Je serais plutôt partisan d'utiliser les filtres, et plus précisément le langage SQL (tutoriel : Le Langage SQL appliqué à Access ).

L'idée est la suivante : plutôt que d'ouvrir la totalité de la table comme source du formulaire d'affichage, puis d'aller au bon enregistrement (ce que vous avez tenté de faire), il me semble plus judicieux de choisir l'enregistrement qu'on veut (par une liste), puis ouvrir le formulaire de consultation avec une source n'incluant que cet enregistrement.


Dans votre cas, cela pourrait donner ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Une liste déroulante  (cboMaListe ) qui stocke le numéro ClientIND
 
Un bouton commande "Choisir" dont le click ouvre le formulaire "fClient", en faisant passer le n) client comme argument.
 
 
Private Sub cmdChoisir_Click()
DoCmd.OpenForm "fClient",,,,,,me.cboMaListe
End Sub
 
sur l'ouverture du formulaire "fClient"
Private Sub Form_Open(Cancel As Integer)
dim sql as string
sql = "SELECT * from tClient WHERE ((ClientIND.tClient)= " & openArg & ");"
me.recordsource = sql
 
 
end sub

Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 08h55   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Bonjour Pierre,

Un tout grand merci pour ces infos!

Actuellement, je potasse les documents proposés sur les recordsets (histoire de finir moins bête ).

Je trouve votre suggestion tout à fait logique! Le seul hic que j'ai rencontré, c'est que la valeur stocké dans la variable est le n° de l'enregistrement. Tant qu'il est le même que la clé primaire, pas de soucis. C'est lorsque j'ai un décalage entre les 2 que ça commence à se gâter. C'est pourquoi j'envisageais de me tourner vers les recordsets.

De toutes manières, j'implémenterais les 2 pour comparer!

Encore merci et bonne journée,

Mykegyver
mykegyver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 10h07   #4
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

A vous lire, à moins que quelque chose m'ait échappée, passer par les recordset ne résoudra pas votre problème.

Je pense qu'il y a un mauvais paramètrage dans votre formulaire :
Citation:
c'est que la valeur stocké dans la variable est le n° de l'enregistrement
Il ne faut pas stocker ce n° d'enregistrement, mais la clé primaire. Comme cela le tour est joué.

Si vous avez des difficultés, donner nous la source de la liste déroulante, et la source du formulaire "client".

Bonne journée

Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 15h08   #5
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Hmm...

Je me suis peut-être emballé un peu vite... Ca coince toujours

Voici mon code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Private Sub Commande4_Click()
 
Dim Serial As String
 
Serial = Me.Serial
If IsNull(Serial) Then
    MsgBox ("Error! Please select serial in list or add equipent.")
 
    Else
    DoCmd.Close
 
    DoCmd.OpenForm "Equipment"
    DoCmd.GoToRecord acActiveDataObject, , acGoTo, Serial
    End If
 
End Sub
Ma variable "Serial" stocke bien ma clé primaire (vérifié à l'aide d'un msgbox). Où ca coince, c'est qu'à l'ouverture du formulaire, il me place sur l'enregistrement correspondant au n° de la clé primaire.

Je m'explique: si ma clé primaire a comme valeur 12 (j'utilise les n° automatiques) mais qu'il s'agit du 10ème enregistrement, à l'ouverture du formulaire, il me positionne sur le 12ème enregistrement...

Je vois bien l'erreur mais je ne vois pas comment la corriger Une idée?

D'avance !

Mykegyver
mykegyver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 18h27   #6
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 536
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 536
Points : 601
Points : 601
Envoyer un message via Yahoo à alassanediakite
Salut
Il faut faire la différence entre ouvrir un formulaire à un enregistrement (un filtre)...
Code :
DoCmd.OpenForm "fClient",,,,,,me.cboMaListe
... qui doit être complété par
Code :
DoCmd.OpenForm "fClient",,,,,,"matable.id=" & Me.Serial
... et avancer dans un formulaire ouvert ...
Code :
DoCmd.GoToRecord acActiveDataObject, , acGoTo, Serial
Donc ton code sera...
Code :
1
2
3
4
5
6
7
8
9
10
11
Private Sub Commande4_Click()
 
If IsNull(Me.Serial ) Then
    MsgBox ("Error! Please select serial in list or add equipent.")
 
    Else
     DoCmd.OpenForm "Equipment",,,,,,"matable.id=" & Me.Serial 'je doute un peu du nombre de virgules
    DoCmd.Close acform, Me.name
    End If
 
End Sub
Par ailleurs il faut éviter le mot "serial" pour le nom de tes objets, il s'apparente un peu aux mots réservés.
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 08h57   #7
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Et voilà!

Ca y est, ca marche...

Voici mon code:

1. Le click sur le bouton

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Private Sub Commande4_Click()
 
Dim Id As String
 
If IsNull(Me.Serial) Then
    MsgBox ("Error! Please select serial in list or add equipment.")
 
    Else
    Id = Me.Serial
    DoCmd.Close
    DoCmd.OpenForm "Equipment", , , , , , Id
 
    End If
 
End
2. L'ouverture du formulaire

Code :
1
2
3
4
5
6
7
8
 
SubPrivate Sub Form_Open(Cancel As Integer)
 
Dim sql As String
sql = "SELECT * from Equipement WHERE N°= " & OpenArgs & ";"
Me.RecordSource = sql
 
End Sub
Un tout grand merci à tous pour votre aide! Il ne me reste plus qu'à comparer avec les recordsets.

Mykegyver
mykegyver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h59   #8
Invité de passage
 
Inscription : mai 2005
Messages : 1
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 1
Points : 1
Points : 1
Par défaut Listebox

Bonjour,
J'ai un formulaire créer par l'assistant Access et j'ai rajouter une zone de liste afin d'afficher d'autres informations en liaison avec la le formulaire creer par l'assistant et qui est lié à une table.

Mon problème c'est que la zone de liste ne réagi pas au boutons précèdent et suivant quand je navigue dans le formulaire.
Merci pour votre réponse.
dev38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 19h03   #9
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
Nous ne sommes pas devins.
Il nous faudrait plus de renseignements.
Les codes correspondant aux clics sur les boutons, par exemple.

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 03h59.


 
 
 
 
Partenaires

Hébergement Web