Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 07/02/2011, 20h23   #1
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Par défaut Message d'erreur suite à l'exécution d'un formulaire

Bonsoir,

J'utilise une base de donnée Access pour gérer un stock. J'ai un tableau de grilles de crible et un tableau de d'intervention appeler "tbMouvementGrille" avec un numéro de grille, une date de début et une date de fin (je lui affecte par défaut 31/12/9999 comme valeur pour un état en cour) comme champs. J'ai un formulaire qui me permet d'enregistrer les interventions sur mes grilles. Pour ce faire, j'ai un premier formulaire dans lequel j'ai une liste de toutes mes grilles en service et un deuxième formulaire qui s'affiche une fois la grille sélectionnée pour créer un nouvelle état (en service, stock, HS, etc.). Lorsque je choisi une grille, je souhaite affecter une nouvelle date de fin à l'enregistrement précédent de la grille, c'est à dire passer de 31/12/9999 à la date de l'intervention et créer un nouvel enregistrement. J'ai le code suivant sur mon premier formulaire :

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 Commande5_Click()
    Dim idInter As Long
    Dim lng As Long
    Dim DateInter As Date
 
    'Message d'erreur s'il n'y a pas de date
    If IsNull(Me!Texte2) = True Then
        MsgBox "Vous n'avez pas entré de date d'intervention", vbOKOnly, "Attention, date manquante !"
    End If
 
    ' on verifie que l'on a bien selectionné une liste
    DateInter = Me!Texte2
    If IsNull(Liste0.Column(0)) Then
        MsgBox "Vous n'avez pas choisi de grille", vbOKOnly, "Attention, date manquante !"
        Exit Sub
    Else
    idInter = Liste0.Column(0)
    End If
    'On enregistre la date de l'intervention et le numéro de l'intervention
    Call MAJ_MouvementPrecedent(idInter, DateInter)
 
    DoCmd.OpenForm "MouvementGrille", acNormal, , , , , idInter
 
 
End Sub
 
Private Sub Commande6_Click()
    DoCmd.Close
End Sub
Private Sub MAJ_MouvementPrecedent(prmNumMouvement As Long, prmDateMouvement As Date)
   Dim numMouvementPrecedent As Variant
   numMouvementPrecedent = prmNumMouvement
 
   If Not (IsNull(numMouvementPrecedent)) Then
      'Il y a un mouvement précédent
     Dim db As dao.Database: Set db = CurrentDb
     Dim r As dao.Recordset: Set r = db.OpenRecordset("tbMouvementGrille", dbOpenDynaset)
 
     If Not r.NoMatch Then
         r.Edit
         r![DateFinEtat] = prmDateMouvement
         r.Update
       Else
         Error (5): 'Cas normalement impossible car on vient de le trouver
     End If
 
     r.Close: Set r = Nothing: 'Ferme le recordset et libère la mémoire utilisée.
     db.Close: Set db = Nothing: 'Ferme la database et libère la mémoire utilisée.
   End If
 
End Sub
Et le code suivant sur mon deuxième formulaire :

Code :
1
2
3
4
5
6
7
8
9
10
11
Private Sub Form_Open(Cancel As Integer)
    If Me.OpenArgs = "GotoNew" Then
    DoCmd.GoToRecord , , acNewRec
    Else
        If Not IsNull(Me.OpenArgs) And Me.OpenArgs <> "GotoNew" Then
            Me.idPrecedenteInterv = Me.OpenArgs
        Else
            'Ne rien faire ou faire autre chose d'utile
        End If
    End If
End Sub
Lorsque je sélectionne un grille, j'ai le message d'erreur suivant qui s'affiche : "Erreur d'exécution '-2147352567 (80020009)': Impossible d'attribuer une valeur à cette objet. "
avec le débogage qui me surligne la ligne suivante dans le code du deuxième formulaire mais j'arrive pas trop à comprendre pourquoi.
Code :
            Me.idPrecedenteInterv = Me.OpenArgs
Auriez-vous une idée d'ou pourrai venir le problème ?
Merci d'avance
Sébastien
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 20h41   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Essaye de déplacer ton code dans l'événement Au Chargement (On load).

Le
Code :
And Me.OpenArgs <> "GotoNew"
ne sert :a rien car si tu es déjà là c'est que Me.OpenArgs est différent de "GotoNew" sinon tu n'y serais pas.

Un dernier point, les Nulls sont un peu pénibles. Une comparaison entre un null et n'importe quoi donne Null et il n'est pas touours évident de savoir ce que le code va faire avec cela.

Si tu t'attends a avoir un Null il est plus prudent de traiter le null séparément.

Par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
if not isNull(Me.OpenArgs) then
 
      if Me.OpenArgs<>"GotoNew" then
            'Traîter ce cas
          else
            Traiter l'autre cas
      end if
 
   else
      'Traiter le cas où la valeur est null
end if
comme cela jamais le Null n'est utilisé directement dans une comparaison.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 22h19   #3
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Merci marot_r pour ta réponse,

j'ai essayé ta proposition mais j'ai toujours le même problème qui s'affiche. J'ai toujours le même message d'erreur avec le débogage sur la même ligne.

Je ne comprends vraiment pas d'ou peut venir le problème.
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 12h33   #4
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Bonjour,

J'ai repris une ancienne version de ma base de donnée qui fonctionnait et j'ai copié le formulaire qui me posait problème et je n'ai plus le message qui apparaît mais j'ai toujours un problème au niveau de la modification de mes enregistrements. Au lieu de modifier la date de fin comme le programme devrait le faire, la date de fin reste inchangée (31/12/9999), j'ai donc deux ou plusieurs enregistrements de la même grille avec comme date de fin 31/12/9999.

Voilà le code du deuxième formulaire qui fonctionne maintenant (c'est le même à priori, je pense que le problème devait venir d'un mauvais format de cellule ...) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Form_Open(Cancel As Integer)
 
    DoCmd.GoToRecord , , acNewRec 'Ouvre la feuille sur un nouvel enregistrement
    If Me.OpenArgs = "GotoNew" Then
    DoCmd.GoToRecord , , acNewRec
    Else
        If Not IsNull(Me.OpenArgs) Then
            Me.idPrecedenteInterv = Me.OpenArgs
        Else
            'Ne rien faire ou faire autre chose d'utile
        End If
    End If
End Sub
Seb
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 14h06   #5
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Quel code utilises-tu pour la mise à jour ?

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 18h07   #6
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Salut,

j'utilise le code suivant pour mettre à jour ma base de donnée "tbintervention"

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
Private Sub Commande5_Click()
    Dim idInter As Long
    Dim lng As Long
    Dim DateInter As Date
 
    'Message d'erreur s'il n'y a pas de date
    If IsNull(Me!Texte2) = True Then
        MsgBox "Vous n'avez pas entré de date d'intervention", vbOKOnly, "Attention, date manquante !"
    End If
 
    ' on verifie que l'on a bien selectionné une liste
    DateInter = Me!Texte2
    If IsNull(Liste0.Column(0)) Then
        MsgBox "Vous n'avez pas choisi de grille", vbOKOnly, "Attention, date manquante !"
        Exit Sub
    Else
    idInter = Liste0.Column(0)
    End If
    'On enregistre la date de l'intervention et le numéro de l'intervention
    Call MAJ_MouvementPrecedent(idInter, DateInter)
 
    DoCmd.OpenForm "MouvementGrille", acNormal, , , , , idInter
 
 
End Sub
 
Private Sub Commande6_Click()
    DoCmd.Close
End Sub
Private Sub MAJ_MouvementPrecedent(prmNumMouvement As Long, prmDateMouvement As Date)
   Dim numMouvementPrecedent As Variant
   numMouvementPrecedent = prmNumMouvement
 
   If Not (IsNull(numMouvementPrecedent)) Then
      'Il y a un mouvement précédent
     Dim db As dao.Database: Set db = CurrentDb
     Dim r As dao.Recordset: Set r = db.OpenRecordset("tbMouvementGrille", dbOpenDynaset)
 
     If Not r.NoMatch Then
         r.Edit
         r![DateFinEtat] = prmDateMouvement
         r.Update
       Else
         Error (5): 'Cas normalement impossible car on vient de le trouver
     End If
 
     r.Close: Set r = Nothing: 'Ferme le recordset et libère la mémoire utilisée.
     db.Close: Set db = Nothing: 'Ferme la database et libère la mémoire utilisée.
   End If
 
End Sub
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h57   #7
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
As-tu vérifié que les données n'étaient pas mise à jour ?

Il se peut que l'affichage ne change pas mais que tes données soient bien modifiées.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 12h26   #8
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Bonjour marot_r,

je viens de faire l'essai et le mise à jour ne se fait pas comme elle devrait se faire, voici un exemple des enregistrements que je viens d'essayer :

idMouvement//Grille// MarquageGrille// TypeEtat// DateDebutEtat// DateFinEtat// Personnel// Affectation// Commentaire// idPrecedenteInterv
30// C035M13N-1// Montée// 08/02/2011// 31/12/9999// EMPLOYE1// C111// // 4.
32// C035M13N-1// HS// 09/02/2011// 31/12/9999// EMPLOYE1// HS// 30.

La date soulignée aurai du être remplacée par 09/02/2011. Y a vraiment un truc qui m'échappe là.

A+

Seb
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 13h12   #9
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Mets un point d'arret sur le Private Sub MAJ_MouvementPrecedent (Tu cliques dans la marge à gauche de l'instruction et cela va mettre un gros point marron.)

L'éxécution va s'arréter là et passer en mode débug, et tu vas pouvoir voir le code s'exécuter en appuyant sur la touche [F8].

Probalement que numMouvementPrecedent est null mais je ne vois pas pourquoi.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 19h57   #10
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Bonsoir marot_r,

je viens d'effectuer ta méthode d'exécution du programme pas à pas et je ne vois pas ce qui cloche. numMouvementPrecedent prend bien la bonne valeur par contre y'a un truc qui me turlupine. Il me semble qu'on n'emploi pas le numMouvementPrecedent dans le Sub MAJ_MouvementPrecedent. On affecte juste sa valeur mais après je ne vois pas ou on lui dit "va chercher l'enregistrement du numéro numMouvementPrecedent pour changer la valeur du champs [DateFinEtat]". J'ai été aidé pour cette partie du code car je ne maîtrise pas du tout la partie dao. Aurai-je oublié quelque chose ?

Seb
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 13h24   #11
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Bonjour,

J'ai essayé de modifier mon code avec une autre approche :

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
Private Sub MAJ_MouvementPrecedent(prmNumMouvement As Long, prmDateMouvement As Date)
   Dim numMouvementPrecedent As Variant
   numMouvementPrecedent = prmNumMouvement
 
   If Not (IsNull(numMouvementPrecedent)) Then
      'Il y a un mouvement précédent
     Dim db As dao.Database
     Dim r As dao.Recordset
     Dim strSQL As String
 
     strSQL = "SELECT tbMouvementGrille.idMouvementGrille FROM tbMouvementGrille WHERE (((tbMouvementGrille.idMouvementGrille)=" & prmNumMouvement & "))"
     Set db = CurrentDb
     Set r = db.OpenRecordset(strSQL, dbOpenDynaset)
 
     If Not r.NoMatch Then
         r.Edit
         r![DateFinEtat] = prmDateMouvement
         r.Update
       Else
         Error (5): 'Cas normalement impossible car on vient de le trouver
     End If
 
     r.Close: Set r = Nothing: 'Ferme le recordset et libère la mémoire utilisée.
     db.Close: Set db = Nothing: 'Ferme la database et libère la mémoire utilisée.
   End If
 
End Sub
J'ai un problème au niveau de la ligne :
Code :
1
2
 
         r![DateFinEtat] = prmDateMouvement
Lorsque je passe la souris sur cette ligne en mode debug, il me met le message suivant :
r![DateFinEtat] = < Élément non trouvé dans cette collection.>

Je vois pas d'où ça pourrait venir. Je vais me pencher dessus.

A+

Seb
rafalemirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 14h04   #12
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Citation:
Envoyé par rafalemirage Voir le message
Bonsoir marot_r,

je viens d'effectuer ta méthode d'exécution du programme pas à pas et je ne vois pas ce qui cloche. numMouvementPrecedent prend bien la bonne valeur par contre y'a un truc qui me turlupine. Il me semble qu'on n'emploi pas le numMouvementPrecedent dans le Sub MAJ_MouvementPrecedent. On affecte juste sa valeur mais après je ne vois pas ou on lui dit "va chercher l'enregistrement du numéro numMouvementPrecedent pour changer la valeur du champs [DateFinEtat]". J'ai été aidé pour cette partie du code car je ne maîtrise pas du tout la partie dao. Aurai-je oublié quelque chose ?

Seb
Tu as parfaitement raison il manque carrément la ligne de code :

Code :
r.findfirst("[NomTonChampNumero]=" & numMouvementPrecedent)
à mettre juste avant le if r.nomatch then

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h00   #13
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 81
Points : 15
Points : 15
Merci marot_r

j'ai essayé plusieurs solutions mais j'avais pas mis la bonne syntaxe. En tout cas, maintenant ça marche nickel. Heureusement que tu traînais dans le coin .

Merci

Seb
rafalemirage 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 07h42.


 
 
 
 
Partenaires

Hébergement Web