Balayage d'enregistrements sur formulaire filtré... Est ce possible ? - VB/VBA/VBS - Programmation
Marsh Posté le 12-05-2006 à 14:48:07
Personne n'a une idée pour m'aider ?
Peut être que ma question est mal posée...
Marsh Posté le 12-05-2006 à 15:38:29
Je sais ce qu'est un formulaire intégrant une condition de filtre (propriétés .Filter et .FilterOn) mais je ne suis pas sûr de ce que tu veux dire par « balayer des enregistrements »
Marsh Posté le 12-05-2006 à 16:05:10
En fait ce que je veux faire c'est dans sélection d'enregistrements, me positionner directement sur celui qui a été choisi et ensuite pourvoir faire défiler tous les autres (premier, précédent, suivant, dernier avec les boutons sur le formulaire).
En fait mon problème vient du fait comme j'ouvre mon formulaire sur un filtre il me renvoie un message d'erreur lorsque je clique sur précédent, suivant... Le message est ainsi libellé : "Impossible d'atteindre l'enregistrement spécifié"
Je sais pas si c'est plus clair comme ça ?
Marsh Posté le 13-05-2006 à 20:42:58
Utilises-tu la propriété .RecordsetClone de ton formulaire ?
Les formulaires Access ont des propriétés d'accès aux données qui leur sont liées. De mémoire tu dois avoir .RecordsetClone qui devrait te permettre de te positionner correctement sur un enregistrement particulier et .Bookmark pour synchroniser le recordset et l'affichage du formulaire (frm.Bookmark = rs.Bookmark).
Sans Access sous la main c'est difficile de t'aider plus.
Marsh Posté le 13-05-2006 à 21:23:18
Merci Tegu,
Merci de ton aide. C'est déjà un début de piste.
Est ce que tu aurais d'autres infos sur ces instructions ?
Un exremple de code par exemple ?
Par aavance je te remercie.
Bon week end.
Marco.
Marsh Posté le 15-05-2006 à 09:31:36
Bonjour à tous,
J'espère que vous avez passé un très bon week end.
En fait je ne sais pas utiliser ces pripriétés (RecordsetClone et Bookmark).
Est ce que tu pourrais m'aider s'il te plait ?
Merci et à plus tard.
Marco.
Marsh Posté le 15-05-2006 à 17:54:53
En fait je ne sais pas comment m'en sortir.
J'ai fais différents essais avec le "movefirst, movelast,movenext,moveprevious"...
Il se positionne systématiquement sur un enregistrement qui n'est pas spécialement le premier, mais qui semble être au millieu de ma liste.
Pour préciser un petit peut les choses à ce point :
-J'ai deux écrans qui s'enchainent,
-Dans le premier j'ai une liste d'incidents,
-Lorsque je clique sur un des incidents (n'importe lequel), j'ai son détail qui s'affiche dans un autre écran (qui me permet de faire de la mise à jour),
-Ensuite je veux pouvoir passer d'un enregistrement à l'autre sur l'écran "fiche des incidents" (écran nommé précédemment "détail" ).
Et en fait c'est ça que j'arrive pas à faire.
En fait mon écran "détail" reçoit pour recordset une requète (car l'utilisateur n'a pas le droit de voir tous les enregistrements).
Pour ouvrir l'écran "détail" je donne un argument dans la clause where (le numéro d'incident).
D'où ma question : est ce que mon problème pour utiliser "movefirst, movenext, movelast, moveprevious" ne viendrait pas de ma façon d'ouvrir le formulaire ?
Par avance merci.
Marco qui désespère de trouver réponse à sa question.
Marsh Posté le 15-05-2006 à 18:13:59
Voici la manière dont j'ouvre le fameux formulaire "détail" :
If StrDroits = CstAdmin Then
DoCmd.OpenForm "FrmFormulaireIncident", acNormal, StrRequete, "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormEdit, , StrOpenArgs
ElseIf StrDroits = CstVisualisation Then '=> Attention au cas de l'accès en modif
DoCmd.OpenForm "FrmFormulaireIncident", acNormal, StrRequete, "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormReadOnly, , StrOpenArgs
ElseIf StrDroits = CstCreation Then
DoCmd.OpenForm "FrmFormulaireIncident", acNormal, StrRequete, "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormAdd, , StrOpenArgs
End If
Marsh Posté le 16-05-2006 à 13:42:52
Donc Tegu,
Donc voici à présent ce que j'esaye de faire sur tes conseils :
Private Sub Form_Load()
On Error GoTo ErrHandler
Dim StrArgs As String
Dim rs As DAO.Recordset
Dim StrRowSource As String
If Not IsNull(Me.OpenArgs) Then
StrArgs = Me.OpenArgs
StrDroits = Split(StrArgs, "¤" )(0)
StrRegion = Split(StrArgs, "¤" )(1)
StrStatut = Split(StrArgs, "¤" )(2)
StrUser = Split(StrArgs, "¤" )(3)
Else
Exit Sub
End If
TxtRegionParam.SetFocus
TxtRegionParam.Text = StrRegion
NomRedacteur.SetFocus
NomRedacteur.Text = StrUser
If StrRegion = "NAT" Then
DatAnalyseNational.Value = Date
End If
If Not IsNull(Me.NumSite.Column(0)) Then
'Alimente les champs "Région" et "Ville" en fonction de la valeur de la combo "NumSite"
Me.TxtRegion.SetFocus
Me.TxtRegion.Text = Me.NumSite.Column(2)
Me.TxtVille.SetFocus
Me.TxtVille.Text = Me.NumSite.Column(1)
End If
If Not IsNull(Me.ClosLe.Value) Then
CmdCloturer.Enabled = False
End If
Statut = IIf(Me.Statut.Value = "Privé", "Public", "Privé" )
Me.Statut.Value = Statut
Me.CmdPartager.Caption = IIf(Statut = "Public", "Isoler", "Partager" )
Me.CmdPartager.Enabled = False
If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, Statut.Value, StrUser) Then
Exit Sub
End If
If Not ModSQL.FctChargeRegion(StrRegion) Then
Exit Sub
End If
Me.FilterOn = False
'=> Voici la partie qui m'intéresse
Dim StrSearchName As String
Set rs = Me.RecordsetClone
StrSearchName = Str(Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)))
rs.FindFirst "NumIncident = " & StrSearchName
If rs.NoMatch Then
Err.Description = "Enregistrement inexistant"
Err.Raise 1
Else
Me.Bookmark = rs.Bookmark
End If
rs.Close
Me.Refresh
Me.Recalc
Me.Requery
ExitHandler:
Set rs = Nothing
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation, CstAppName
Resume ExitHandler
End Sub
D'après vous, pourquoi est ce que ça ne fonctionne pas ?
Existe t il une autre méthode pour aboutir au résultat souhaité ?
Par avance merci.
Marco.
Marsh Posté le 12-05-2006 à 10:51:47
Bonjour,
Le nouveau problème du jour vient du fait que j'essaye de balayer des enregistrements avec un formulaire que je lance sur un champs filtré dans Access 2003.
Est ce que c'est possible ?
A bientôt et merci d'avance.
Marco.
A titre d'exemple, voici le code associé aux bouttons qui me permettent de me déplacer d'un enregistrement à l'autre (FctDroitsEnregistrement est une fonction qui doit me permettre en fonction des droits associés à la fiche incident qui est visualisée de dire si l'utilisateur a droit ou non de voir/modifier...) :
Private Sub CmdPremier_Click()
On Error GoTo ErrHandler
DoCmd.GoToRecord , , acFirst
If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, _
Statut.Value, StrUser) Then
Exit Sub
End If
ExitHandler:
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
Private Sub CmdPrecedent_Click()
On Error GoTo ErrHandler
DoCmd.GoToRecord , , acPrevious
If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, _
Statut.Value, StrUser) Then
Exit Sub
End If
ExitHandler:
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation, CstAppName
Resume ExitHandler
End Sub
Private Sub CmdSuivant_Click()
On Error GoTo ErrHandler
DoCmd.GoToRecord , , acNext
If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, _
Statut.Value, StrUser) Then
Exit Sub
End If
ExitHandler:
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation, CstAppName
Resume ExitHandler
End Sub
Private Sub CmdDernier_Click()
On Error GoTo ErrHandler
DoCmd.GoToRecord , , acLast
If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, _
Statut.Value, StrUser) Then
Exit Sub
End If
ExitHandler:
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation, CstAppName
Resume ExitHandler
End Sub
Cotmar
---------------
Marco