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

Zone de liste, comment s'y prendre !

10 réponses
Avatar
Rouge_XIII
Bonjour,

Voici mon problème :
J'ai créé un formulaire tout simple contenant une "zone de liste" seule. Je
voudrais lorsque l'on double-clique sur l'un des enregistrements contenuent
dans la zone de liste on accède à un autre formulaire qui s'ouvre sur
l'enregistrement sélectionné préallablement.

La méthode que j'ai employé est la suivante :
En 1 : j'ai d'abord développé dans un module, une fonction RECHERCHEID qui
est celle-ci :
Public openEnr
Function RechercheID(ReqSQL As String, NomChamp As String, Valeur As String)
'--
Dim rs As New ADODB.Recordset
'--
'--
rs.Open ReqSQL, CN, adOpenKeyset, adLockBatchOptimistic
rs.MoveFirst
For i = 1 To rs.RecordCount
If Val(rs(NomChamp).Value) <> Val(Valeur) Then
rs.MoveNext
Else
Exit For
End If
Next i
rs.Close
'--
'--
'Renvoi du N° d'enregistrement dans la Fonction "RechercheID"
RechercheID = i
End Function

Puis en 2 : sur l'évènement "Sur double-clique" de la zone de liste j'ai mis
:

Private Sub lstUser_DblClick(Cancel As Integer)
'--Recherche un utilisateur pour modification
'--
If Me.lstUser.ListCount = 0 Then
MsgBox "La liste des utilisateurs est vide." & vbCr & vbLf & "Aucune
modification n'est donc à apporter !", vbCritical + vbOKOnly, "Liste vide..."
End If
If Me.lstUser.ListCount <> 0 Then
DoCmd.OpenForm "Frm-Modif-lstUser"
'Utilisation d'une fonction personnellement programmée servant à
retrouver le N°
'd'un enregistrement (N° Ligne dans une Table) à partir de la clé
primaire
openEnr = RechercheID("SELECT * FROM UTILISATEUR", "PK_User",
lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr
End If
End Sub

Mon soucis est qu'Access n'accède pas à l'enregistrement voulu. Lorsque le
formulaire s'ouvre, après le double-clique, il se positionne toujours sur le
premier enregistrement ! Comment faire ?

Merci pour vos réponses

Cordialement

Rouge_XIII

NB : le PK_User est un champ "texte". Le soucis ne viendrait-il pas d'ici ?

10 réponses

Avatar
Ghislain
SAlut,

Pas tant de complications !!! enfin si je comprends bien ton preobleme...
Dans ta zone de liste tu cree un bouton qui apparaitra pour chaque
enregistremente et dans l evenement "on Click" tu mets le code suivant

Private Sub TonBouton_Click()

On Error GoTo Err_TonBouton_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "TonFormulaireAOuvrir"

stLinkCriteria = "[TonChampRelation]=" & Me![TonChampRelation]
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_TonBouton_Click:
Exit Sub

Err_TonBouton_Click:
MsgBox Err.Description
Resume Exit_TonBouton_Click

End Sub

Voila c tout... ou tout simplement en creant ton bouton tu suis l'assistant
qui te fera la meme chose.
--
Ghislain


"Rouge_XIII" wrote:

Bonjour,

Voici mon problème :
J'ai créé un formulaire tout simple contenant une "zone de liste" seule. Je
voudrais lorsque l'on double-clique sur l'un des enregistrements contenuent
dans la zone de liste on accède à un autre formulaire qui s'ouvre sur
l'enregistrement sélectionné préallablement.

La méthode que j'ai employé est la suivante :
En 1 : j'ai d'abord développé dans un module, une fonction RECHERCHEID qui
est celle-ci :
Public openEnr
Function RechercheID(ReqSQL As String, NomChamp As String, Valeur As String)
'--
Dim rs As New ADODB.Recordset
'--
'--
rs.Open ReqSQL, CN, adOpenKeyset, adLockBatchOptimistic
rs.MoveFirst
For i = 1 To rs.RecordCount
If Val(rs(NomChamp).Value) <> Val(Valeur) Then
rs.MoveNext
Else
Exit For
End If
Next i
rs.Close
'--
'--
'Renvoi du N° d'enregistrement dans la Fonction "RechercheID"
RechercheID = i
End Function

Puis en 2 : sur l'évènement "Sur double-clique" de la zone de liste j'ai mis
:

Private Sub lstUser_DblClick(Cancel As Integer)
'--Recherche un utilisateur pour modification
'--
If Me.lstUser.ListCount = 0 Then
MsgBox "La liste des utilisateurs est vide." & vbCr & vbLf & "Aucune
modification n'est donc à apporter !", vbCritical + vbOKOnly, "Liste vide..."
End If
If Me.lstUser.ListCount <> 0 Then
DoCmd.OpenForm "Frm-Modif-lstUser"
'Utilisation d'une fonction personnellement programmée servant à
retrouver le N°
'd'un enregistrement (N° Ligne dans une Table) à partir de la clé
primaire
openEnr = RechercheID("SELECT * FROM UTILISATEUR", "PK_User",
lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr
End If
End Sub

Mon soucis est qu'Access n'accède pas à l'enregistrement voulu. Lorsque le
formulaire s'ouvre, après le double-clique, il se positionne toujours sur le
premier enregistrement ! Comment faire ?

Merci pour vos réponses

Cordialement

Rouge_XIII

NB : le PK_User est un champ "texte". Le soucis ne viendrait-il pas d'ici ?


Avatar
Rouge_XIII
Bonsoir Ghislain, merci pour ta réponse d'une part.

D'autre part, le code que tu m'as donné a été généré avec l'assistant. Hors
je ne l'utilise jamais.
J'ai la sensation que tu n'as pas compris ce que je demandais !
Ici, je n'ai parlé d'aucun bouton. Mon formulaire est juste composé d'une
"zone de liste" et c'est tout !
Je veux lorsque l'on double-clique sur cette dernière un formulaire s'ouvre
en se placant directement sur l'enregistrement sélectionné précédemment !

Cordialement.

Rouge_XIII


SAlut,

Pas tant de complications !!! enfin si je comprends bien ton preobleme...
Dans ta zone de liste tu cree un bouton qui apparaitra pour chaque
enregistremente et dans l evenement "on Click" tu mets le code suivant

Private Sub TonBouton_Click()

On Error GoTo Err_TonBouton_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "TonFormulaireAOuvrir"

stLinkCriteria = "[TonChampRelation]=" & Me![TonChampRelation]
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_TonBouton_Click:
Exit Sub

Err_TonBouton_Click:
MsgBox Err.Description
Resume Exit_TonBouton_Click

End Sub

Voila c tout... ou tout simplement en creant ton bouton tu suis l'assistant
qui te fera la meme chose.
--
Ghislain


"Rouge_XIII" wrote:

Bonjour,

Voici mon problème :
J'ai créé un formulaire tout simple contenant une "zone de liste" seule. Je
voudrais lorsque l'on double-clique sur l'un des enregistrements contenuent
dans la zone de liste on accède à un autre formulaire qui s'ouvre sur
l'enregistrement sélectionné préallablement.

La méthode que j'ai employé est la suivante :
En 1 : j'ai d'abord développé dans un module, une fonction RECHERCHEID qui
est celle-ci :
Public openEnr
Function RechercheID(ReqSQL As String, NomChamp As String, Valeur As String)
'--
Dim rs As New ADODB.Recordset
'--
'--
rs.Open ReqSQL, CN, adOpenKeyset, adLockBatchOptimistic
rs.MoveFirst
For i = 1 To rs.RecordCount
If Val(rs(NomChamp).Value) <> Val(Valeur) Then
rs.MoveNext
Else
Exit For
End If
Next i
rs.Close
'--
'--
'Renvoi du N° d'enregistrement dans la Fonction "RechercheID"
RechercheID = i
End Function

Puis en 2 : sur l'évènement "Sur double-clique" de la zone de liste j'ai mis
:

Private Sub lstUser_DblClick(Cancel As Integer)
'--Recherche un utilisateur pour modification
'--
If Me.lstUser.ListCount = 0 Then
MsgBox "La liste des utilisateurs est vide." & vbCr & vbLf & "Aucune
modification n'est donc à apporter !", vbCritical + vbOKOnly, "Liste vide..."
End If
If Me.lstUser.ListCount <> 0 Then
DoCmd.OpenForm "Frm-Modif-lstUser"
'Utilisation d'une fonction personnellement programmée servant à
retrouver le N°
'd'un enregistrement (N° Ligne dans une Table) à partir de la clé
primaire
openEnr = RechercheID("SELECT * FROM UTILISATEUR", "PK_User",
lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr
End If
End Sub

Mon soucis est qu'Access n'accède pas à l'enregistrement voulu. Lorsque le
formulaire s'ouvre, après le double-clique, il se positionne toujours sur le
premier enregistrement ! Comment faire ?

Merci pour vos réponses

Cordialement

Rouge_XIII

NB : le PK_User est un champ "texte". Le soucis ne viendrait-il pas d'ici ?




Avatar
Eric
Bonsoir,

Je viens de tester ton code et je me positionne correctement sur
l'élément sélectionné dans la liste après ouverture du formulaire
(Access2K). Le problème ne doit pas venir de là.
(Sous réserve que le PK_User soit numérique ou numérique stocké en texte)

N'étant pas spécialiste d'ADO, je me demande toutefois, puisque tu
récupères l'identifiant (PK_User), si tu n'aurais pas intérêt à utiliser
plutôt une méthode Seek (ou une méthode Find) sur ton recordset géré à
partir du sql au lieu de ta boucle.

Bonsoir Ghislain, merci pour ta réponse d'une part.

D'autre part, le code que tu m'as donné a été généré avec l'assistant. Hors
je ne l'utilise jamais.
J'ai la sensation que tu n'as pas compris ce que je demandais !
Ici, je n'ai parlé d'aucun bouton. Mon formulaire est juste composé d'une
"zone de liste" et c'est tout !
Je veux lorsque l'on double-clique sur cette dernière un formulaire s'ouvre
en se placant directement sur l'enregistrement sélectionné précédemment !

Cordialement.

Rouge_XIII



SAlut,

Pas tant de complications !!! enfin si je comprends bien ton preobleme...
Dans ta zone de liste tu cree un bouton qui apparaitra pour chaque
enregistremente et dans l evenement "on Click" tu mets le code suivant

Private Sub TonBouton_Click()

On Error GoTo Err_TonBouton_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "TonFormulaireAOuvrir"

stLinkCriteria = "[TonChampRelation]=" & Me![TonChampRelation]
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_TonBouton_Click:
Exit Sub

Err_TonBouton_Click:
MsgBox Err.Description
Resume Exit_TonBouton_Click

End Sub

Voila c tout... ou tout simplement en creant ton bouton tu suis l'assistant
qui te fera la meme chose.
--
Ghislain


"Rouge_XIII" wrote:


Bonjour,

Voici mon problème :
J'ai créé un formulaire tout simple contenant une "zone de liste" seule. Je
voudrais lorsque l'on double-clique sur l'un des enregistrements contenuent
dans la zone de liste on accède à un autre formulaire qui s'ouvre sur
l'enregistrement sélectionné préallablement.

La méthode que j'ai employé est la suivante :
En 1 : j'ai d'abord développé dans un module, une fonction RECHERCHEID qui
est celle-ci :
Public openEnr
Function RechercheID(ReqSQL As String, NomChamp As String, Valeur As String)
'--
Dim rs As New ADODB.Recordset
'--
'--
rs.Open ReqSQL, CN, adOpenKeyset, adLockBatchOptimistic
rs.MoveFirst
For i = 1 To rs.RecordCount
If Val(rs(NomChamp).Value) <> Val(Valeur) Then
rs.MoveNext
Else
Exit For
End If
Next i
rs.Close
'--
'--
'Renvoi du N° d'enregistrement dans la Fonction "RechercheID"
RechercheID = i
End Function

Puis en 2 : sur l'évènement "Sur double-clique" de la zone de liste j'ai mis
:

Private Sub lstUser_DblClick(Cancel As Integer)
'--Recherche un utilisateur pour modification
'--
If Me.lstUser.ListCount = 0 Then
MsgBox "La liste des utilisateurs est vide." & vbCr & vbLf & "Aucune
modification n'est donc à apporter !", vbCritical + vbOKOnly, "Liste vide..."
End If
If Me.lstUser.ListCount <> 0 Then
DoCmd.OpenForm "Frm-Modif-lstUser"
'Utilisation d'une fonction personnellement programmée servant à
retrouver le N°
'd'un enregistrement (N° Ligne dans une Table) à partir de la clé
primaire
openEnr = RechercheID("SELECT * FROM UTILISATEUR", "PK_User",
lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr
End If
End Sub

Mon soucis est qu'Access n'accède pas à l'enregistrement voulu. Lorsque le
formulaire s'ouvre, après le double-clique, il se positionne toujours sur le
premier enregistrement ! Comment faire ?

Merci pour vos réponses

Cordialement

Rouge_XIII

NB : le PK_User est un champ "texte". Le soucis ne viendrait-il pas d'ici ?




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Rouge_XIII
Bonsoir Eric,

En suivant tes conseils, j'ai modifier mon code pour que ma fonction
RECHERCHEID(...) mette bien en valeur la recherche souhaité ! Celle ci
fonctionne maintenant correctement !
Mon nouveau soucis se situe, à présent, sur l'évènement double-clique qui
contient le code VBA suivant :

DoCmd.OpenForm "Frm-Modif-lstUser"
openEnr = RechercheID("SELECT * FROM UTILISATEUR", Me.lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr

la variables openEnr me renvoi bien la valeur de l'élément sélectionné dans
ma zone de liste (confimé grace à l'ajout de MsgBox (openEnr)...) Mais lors
de l'ouverture du formulaire de modification... celui ci n'arrive pas a
atteindre l'enregistrement spécifié !

Y'aurait-il un autre moyen pour que lors de l'ouverture de mon formulaire de
modification il se positionne sur l'enregistrement voulu ?

Merci
Cordialement.
Rouge_XIII
Avatar
Eric
Bonsoir,

je n'arrive pas à reproduire ton probleme car quand je dbl-click sur la
liste, je récupère l'id et j'ouvre donc le formulaire par ta commande
OpenForm ..., acGoto openEnr sur l'enregistrement choisi.
Par contre, je me demande le but car ton formulaire est bien basé sur
une table(ou requête) qui doit être de même structure que celle distante
utilisée dans la fonction RechercheID(), non ?

Une solution consisterait à mettre une clause Where sur l'ouverture de
ton formulaire au lieu de se positionner par acGoto du style :
DoCmd.OpenForm "Frm-Modif-lstUser", , , "PK_User=" & lstUser

Bonsoir Eric,

En suivant tes conseils, j'ai modifier mon code pour que ma fonction
RECHERCHEID(...) mette bien en valeur la recherche souhaité ! Celle ci
fonctionne maintenant correctement !
Mon nouveau soucis se situe, à présent, sur l'évènement double-clique qui
contient le code VBA suivant :

DoCmd.OpenForm "Frm-Modif-lstUser"
openEnr = RechercheID("SELECT * FROM UTILISATEUR", Me.lstUser.Value)
DoCmd.GoToRecord acDataForm, "Frm-Modif-lstUser", acGoTo, openEnr

la variables openEnr me renvoi bien la valeur de l'élément sélectionné dans
ma zone de liste (confimé grace à l'ajout de MsgBox (openEnr)...) Mais lors
de l'ouverture du formulaire de modification... celui ci n'arrive pas a
atteindre l'enregistrement spécifié !

Y'aurait-il un autre moyen pour que lors de l'ouverture de mon formulaire de
modification il se positionne sur l'enregistrement voulu ?

Merci
Cordialement.
Rouge_XIII


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Rouge_XIII
Bonjour,

Tout es basé sur la même requête effectivement. Que ce soit le formulaire à
ouvrir, la zone de liste et ma fonction RECHERCHEID(...).
J'ai essayé ta solution qui pourrait fonctionner si je n'avais pas une
invitation dans une boîte de dialogue qui me demande l'enregistrement
rechercher.
En effet, si je cherche le PK_User qui contient par ex : test. Une boite de
dialogue s'ouvre et je dois "entrer une valeur de paramètre" (donc saisir
test pour que dès l'ouverture de mon forumulaire on se positionne sur test.

Je travaille sur des champs de type "text" et nom numérique car on m'a
demandé que chaque utilisateur est un nom différent (d'où l'utilité d'avoir
mis le PK_User : qui est le nom d'utilisateur pour éviter tout doublon)

L'utilité de ce formulaire (form avec la zone de liste pour le dbl click)
consiste pour l'administrateur de la base a avoir une vue d'ensemble de tout
les utilisateurs de la base et pouvoir ainssi effectuer des modification si
il y a lieu surtout en ce qui concerne le changement de statut de
l'utilisateur (statut pour moi est soit Administrateur, Super utilisateur,
utilisateur). Chaque droit d'accès de l'utilisateur a été pensé et n'a donc
accès qu'à tout ou partie de la base.

J'espère que mes explications t'auront éclaircie un minimum.
Je te remercie pour ton aide.
Cordialement.

Rouge_XIII
Avatar
Eric
Bonjour,

Que contient exactement ta zone de liste sur laquelle lors d'un double
clic tu veux ouvrir le formulaire ? (Nb de colonnes, champs associés aux
colonnes de la liste)
Car si la liste a en 1ere colonne, même cachée, le PK_User, je ne vois
pas pourquoi la commande
DoCmd.OpenForm "Frm-Modif-lstUser", , , "PK_User='" & lstUser & "'"
ne marcherait pas sauf si dans la source du formulaire à ouvrir le champ
PK_User n'existe pas.

J'ai essayé ta solution qui pourrait fonctionner si je n'avais pas une
invitation dans une boîte de dialogue qui me demande l'enregistrement
rechercher.


Quand cette boite de dialogue apparait-elle ?

En effet, si je cherche le PK_User qui contient par ex : test. Une boite de
dialogue s'ouvre et je dois "entrer une valeur de paramètre" (donc saisir
test pour que dès l'ouverture de mon forumulaire on se positionne sur test.



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Rouge_XIII
Voici ce que j'ai en détail :
Formulaire "Frm-Gest-User" contient :
-> une zone de liste seule avec en src : SELECT * FROM UTILISATEUR WHERE
FK_Type_User<>"Administrateur"; (le * correspondant à PK_NomUser, Password,
FK_Type_User); Nbre colonnes : 3; Largeurs des colonnes : 7cm;0cm;2cm (je
masque donc le password qui ne me regarde pas)
sur cette zone de liste un "Evènement" sur "double clic" ayant le code
suivant :
DoCmd.OpenForm "Frm-Modif-lstUser", , , "PK_User='" & Me.lstUser.Value & "'"
qui me renvois sur le formulaire Frm-Modif-lstUser et qui doit "normalement"
ce positionner sur l'enregistrement sélectionné dans la zone de liste.

Le forlumaire : "Frm-Modif-lstUser" est basé sur la requête suivante :
SELECT * FROM UTILISATEUR WHERE FK_Type_User<>"Administrateur";
j'y ai inséré dans le corp, le "PK_NomUser" et le "FK_Type_User" et "une
zone de liste modifiable" crée avec la boite à outils pour avec en src :
SELECT * FROM TYPE_UTILISATEUR ORDER BY PK_Type_User pour changer le statut
de l'utilisateur.

Mon soucis : le code que tu m'as fournis plus haut me renvoi une boite de
dialogue avec "Entrer une valeur de ce paramètre" avec PK_NomUser et une zone
de text qui attend une valeur saisie. Si je saisie le nom recherché ca
fonctionne ! Hors je ne voudrai pas le saisir puisqu'il est selectionné
précédemment dans la "zone de liste" !
Que faire ?

Merci encore.
Cdt

Rouge_XIII
Avatar
Eric
et avec :
DoCmd.OpenForm "Frm-Modif-lstUser", , , "PK_NomUser='" &
Me.lstUser.Value & "'"

Il y a un problème avec tes noms de champs. S'agit-il de PK_User ou de
PK_NomUser ? Dans ta fonction tu parlais de PK_User et maintenant de
PK_NomUser.

Voici ce que j'ai en détail :
Formulaire "Frm-Gest-User" contient :
-> une zone de liste seule avec en src : SELECT * FROM UTILISATEUR WHERE
FK_Type_User<>"Administrateur"; (le * correspondant à PK_NomUser, Password,
FK_Type_User); Nbre colonnes : 3; Largeurs des colonnes : 7cm;0cm;2cm (je
masque donc le password qui ne me regarde pas)
sur cette zone de liste un "Evènement" sur "double clic" ayant le code
suivant :
DoCmd.OpenForm "Frm-Modif-lstUser", , , "PK_User='" & Me.lstUser.Value & "'"
qui me renvois sur le formulaire Frm-Modif-lstUser et qui doit "normalement"
ce positionner sur l'enregistrement sélectionné dans la zone de liste.

Le forlumaire : "Frm-Modif-lstUser" est basé sur la requête suivante :
SELECT * FROM UTILISATEUR WHERE FK_Type_User<>"Administrateur";
j'y ai inséré dans le corp, le "PK_NomUser" et le "FK_Type_User" et "une
zone de liste modifiable" crée avec la boite à outils pour avec en src :
SELECT * FROM TYPE_UTILISATEUR ORDER BY PK_Type_User pour changer le statut
de l'utilisateur.

Mon soucis : le code que tu m'as fournis plus haut me renvoi une boite de
dialogue avec "Entrer une valeur de ce paramètre" avec PK_NomUser et une zone
de text qui attend une valeur saisie. Si je saisie le nom recherché ca
fonctionne ! Hors je ne voudrai pas le saisir puisqu'il est selectionné
précédemment dans la "zone de liste" !
Que faire ?

Merci encore.
Cdt

Rouge_XIII


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Rouge_XIII
Merci pour ta patience Eric et pour ton aide ! mon problème est maintenant
résolu.
Mon champs a toujours été : PK_NomUser et non PK_User c'est une erreur
regretable de ma part que j'ai utilisé dans ce topic. Lors des modifications
que j'ai pu apporté grâce à ton aide je toujours utilisé le nom :
PK_NomUser...
Encore merci
Cdt
Rouge_XIII