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 05/08/2011, 15h12   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
Par défaut Dirty CancelBeforeUpdate No current record

Bonjour tout le monde,

Bon ca fait 3h aue je planche sur ce probleme j'espere que vous reussirez a m'aider.
J'ai un formulaire, une listbox, et un bouton qui supprime le filtre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo GestionErr
If Me.systemID.value = 0 Then
    MsgBox "Please select a system, or cancel the modification by push the key Esc", vbCritical
    Cancel = vbCancel
End If
Exit Sub
' Gestion erreur
End sub
 
 
Private Sub btnRemoveFilter_Click()
On Error GoTo GestionErr
    Me.filter = ""
    Me.FilterOn = False
    Me.Dirty = False
    Me.Requery
Exit Sub
'gestion erreur
end sub
En cliquant sur remove filter, je voudrais que cela me sauvegarde l'enregistrement en cours et m'affiche tous les enregistrements. Sachant aue le champ systemID est obligatoire.

J'ai l'erreur "3021 No current record", sur la ligne Dirty = false, apres avoir vu le msgbox, en revenant dans le btnRemoveFilter.

Si quelau'un a la moindre idee je suis preneur !
Merci!
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 15h34   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
Je viens de m'apercevoir que lorsque j'ouvre le formulaire a la main par la fenetre access (car jusqu'a maintenant je passais par un Docmd.openform),
le formulaire est automatiquement sur un nouveau record, et pas moyen de voir les record, meme encliqutn sur mon bouton filter :S

Voila mon current :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
Private Sub Form_Current()
On Error GoTo GestionErr
sActivation
Me.itemsTasks.Visible = (Me.itemsTasks.Form.RecordsetClone.RecordCount > 0)
Me.lblNoItems.Visible = Not Me.itemsTasks.Visible
' Display photo
If Me.NewRecord = False Then
    If Nz(Me.photo.value, "") = "" Then Me.photo = "~~"
    Me.img.Tag = 1
    Me.btnImgPrevious.Enabled = False
    Me.photo.value = changePhoto(Me.img, Me.photo.value, Me.btnImgPrevious, Me.btnImgNext, Me.invisible, 0)
    Me.btnImgDel.Enabled = CBool(Me.img.Tag)
Else
    Call changePhoto(Me.img, Nz(Me.photo.value, "~~"), Me.btnImgPrevious, Me.btnImgNext, Me.invisible, 0)
End If
 
Exit Sub
'Gestion err
End sub
 
 
Private Sub sActivation()
On Error GoTo GestionErr
Dim strInfosNavig As String
If Me.NewRecord = False Then
  Me!txtGo = Me.CurrentRecord
  Select Case Me.CurrentRecord
    Case 1
      Me!btnPrevious.Enabled = False
      sMajInfosNavig
    Case Else
      Me!btnPrevious.Enabled = True
  End Select
 
  Me!btnNext.Enabled = (Me.CurrentRecord < mlngCpteEnr)
 
  Me.txtGo.Enabled = True
  strInfosNavig = "sur " & mlngCpteEnr & mstrFilter
  lblCount.Caption = strInfosNavig
Else
  Me!btnPrevious.Enabled = False
  Me!btnNext.Enabled = False
  Me.txtGo.Enabled = False
  lblCount.Caption = "New item"
  Me.btnRemoveFilter.Enabled = True
End If
Me!btnFirst.Enabled = Me!btnPrevious.Enabled
Me!btnLast.Enabled = Me!btnNext.Enabled
  Exit Sub
'Gestion err
End Sub
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 15h38   #3
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 651
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 651
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Bonjour,

Ah le fameux inconvénient des formulaires "bindés" sur une table ou une requête... J'en suis revenu depuis, euh... je ne sais plus.
Bref, une première remarque ici :
Code :
If Me.systemID.value = 0 Then
j'écrirais plutôt
Code :
If Nz(Me!systemID, 0)= 0 Then
Ensuite tu peux essayer ceci (je ne suis pas en mesure de tester et de plus, je n'utilise jamais la propriété filter de par ce que j'ai stipulé ci-avant) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub btnRemoveFilter_Click()
    On Error GoTo GestionErr
    If Me.Dirty Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
    Me.Filter= ""
    Me.FilterOn = False
    Me.Dirty = False
    DoCmd.ShowAllRecords
Sortie:
    Exit Sub
GestionErr:
    MsgBox Err.Description, , Err.Number
    Resume Sortie
End Sub
Argy

P.S. Parfois, le Me.Dirty renvoie True alors que rien en apparence a changé. C'est pourquoi il est préférable d'avoir une variable Boolean de module qui prend la valeur True sur l'événement Change() ou AfterUpdate()des contrôles susceptibles d'être mis à jour sur l'enregistrement en cours et de la remettre à False sur l'événement Current().
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 15h46   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
J'obtiens
Erreur 2046 : The command or action saverecord isn't available now
sur
DoCmd.RunCommand acCmdSaveRecord

Je vais mettre en place le remplacant le dirty
...
Voila je viens de creer une variable module boolean booChange, qui passe a true sur les afterupdate des champs

cela devient donc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub btnRemoveFilter_Click()
On Error GoTo GestionErr
    If booChange = True Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
    Me.filter = ""
    Me.FilterOn = False
    Me.Dirty = False
    DoCmd.ShowAllRecords
Exit Sub
'gestion err
end sub
Mais toujours pareil.

Et donc, toujours le meme probleme si j'ouvre le formulaire il se place directement sur un newrecord et cette fois l'erreur est sur ShowAllRecords
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h11   #5
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
Bon je viens de resoudre en partie mon probleme,
je ne sais pour quelle raison la propriete DataEntry etait passe a Yes :S
En la passant a No, cela s'arrange en partie.

Si je ne renseigne pas le champ obligatoire, il maffiche bien le message d'alerte, mais apres c'est une erreur 2501 The runcommand was cancelled ?
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h27   #6
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 651
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 651
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Ceci dit, la méthode ShowAllRecords supprime les filtres existants sur le formulaire dont, tu peux te contenter ce cette instruction :
Mais ça ne marchera pas si tu es sur un nouvel enregistrement (erreur 2046) de même qu'un GoToRecord...
Perso, ce que je fais, je mets en place une fonction qui se nomme quelque chose comme RecordIsSaveable() ; cette dernière vérifie tous les champs (selon le NULL property possible) et si elle renvoie True alors l'enregistrement (nouveau ou existant) subi un INSERT INTO ou un UPDATE par la méthode Execute du fait que je bannis systématiquement l'objet DoCmd lorsqu'il s'agit de manipuler des données.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h47   #7
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
Etant donne que j'ai pas trop envie de reprendre toute la structure de mon form, je vais me contenter de conserver mon "bindage" avec ma table, et avant d'effectuer une action verifier si on a pu sauvegarder par cette fonction save()

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Private Function save() As Boolean
On Error GoTo GestionErr
save = True
If Dirty = True Then
    If Nz(Me!systemID, 0) = 0 Then
        MsgBox "Please select a system, or cancel the modification by push the key Esc", vbCritical
        save = False
    ElseIf Me![name] = "" Then
        MsgBox "Please type a name, or cancel the modification by push the key Esc", vbCritical
        save = False
    Else
        Dirty = False
    End If
End If
Exit Function
'Gest Err
End function
Cependant j'ai du conserver le dirty, en effet si l'utilisateur decide de creer, puis finalement annule, mon booChange reste a true, alors que rien a change. De meme si on modifie et puis finalement on revient en arriere booChange reste a true ... et je n'ai pas trouve la solution pour contrecarre cela ...
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h56   #8
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 651
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 651
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Code :
et je n'ai pas trouve la solution pour contrecarre cela
Si, le mode déconnecté tel que je le fais...
Pas de Dirty donc pas de souci.
Un bouton Save et un bouton Cancel.
Mais comme tu dis si bien, les rustines font foi dans le monde ingrat des développeurs ; tout dépend comment on aime se prendre la tête au présent et dans le futur. Moi j'ai choisi et je ne le regrette pas

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 17h41   #9
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
J'y penserai pour mes prochains developpement

Merci !
gabvoir 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 12h39.


 
 
 
 
Partenaires

Hébergement Web