Bonjour à tous,

Je bloque depuis plusieurs jours sur une requête VBA de mise à jour.

J'ai 2 tables : une table "Matrices_carrées" avec comme clé primaire "N°" et j'ai une autre table "T_base_de_données" dans laquelle j'enregistre mes opérations effectuées sur mes outils.

Dans la table "T_base_de_données" je peux retrouver plusieurs fois un outil avec différents nbre de coups donnés. J'ai créé une requête qui permet de faire le total de cps donnés sur un N° d'outils. Lorsque je teste la requête seule elle m'indique bien le nbre de coups total de mon outils.

J'ai créé un code VBA car j'ai plusieurs tables en fonction des types d'outils :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Private Sub Commande44_Click()
 
Dim db As Database
Dim sql As String
Dim Rs20 As DAO.Recordset
Dim qfd20 As DAO.QueryDef
Dim n20 As String
Dim t20 As String
Dim ncd20 As String
 
 
'soluce2
'Dim sql As String
'DoCmd.SetWarnings False ' pour ne pas avoir de message a chaque ajout
'    sql = "INSERT INTO Table2(champ1, champ2) VALUES (" & nomducontrolequialavaleurduchamp1.Value & "," & nomducontrolechamp2.Value & ");"
'    DoCmd.RunSQL sql
'    sql = "INSERT INTO Table3(champ1, champ2) VALUES (" & nomducontrolequialavaleurduchamp1.Value & "," & nomducontrolechamp2.Value & ");"
'    DoCmd.RunSQL sql
'...
'DoCmd.SetWarnings True
 
DoCmd.SetWarnings False ' pour ne pas avoir de message a chaque ajout
sql = "INSERT INTO [T_base_de_données](N°_identification_outil,Abrégé_outillage,Opération, Date_suivi, Nbre_de_coups_donnés,Longueur_après_affûtage,Observations) VALUES ([Forms]![F_suivi outils]![N° outil],[Forms]![F_suivi outils]![type_outillage],[Forms]![F_suivi outils]![Opération],[Forms]![F_suivi outils]![date_suivi],[Forms]![F_suivi outils]![cps_donnés],[Forms]![F_suivi outils]![longhaut_affûtage],[Forms]![F_suivi outils]![observations])"
DoCmd.RunSQL sql
DoCmd.SetWarnings True
 
'Référence la base de données
Set db = CurrentDb
If [Forms]![F_suivi outils]![type_outillage] = "MCAR" Then GoSub mcar
If [Forms]![F_suivi outils]![type_outillage] = "PCAR" Then GoSub pcar
If [Forms]![F_suivi outils]![type_outillage] = "MRON" Then GoSub mron
If [Forms]![F_suivi outils]![type_outillage] = "PRON" Then GoSub pron
If [Forms]![F_suivi outils]![type_outillage] = "MREF" Then GoSub mref
If [Forms]![F_suivi outils]![type_outillage] = "PREF" Then GoSub pref
If [Forms]![F_suivi outils]![type_outillage] = "MOBL" Then GoSub mobl
If [Forms]![F_suivi outils]![type_outillage] = "POBL" Then GoSub pobl
GoSub line31
 
mcar:
'code pour activer requête "R_cumul_cps_donnés"
Set qfd20 = CurrentDb.QueryDefs("R_cumul_cps_donnés")
 
'1er paramètre : permet de prendre en compte le type d'outillage dans la requête "R_cumul_cps_donnés"
        qfd20.Parameters("[Formulaires]![F_Suivi outils]![type_outillage]") = [Forms]![F_suivi outils]![type_outillage]
'2nd paramètre : permet de prendre en compte le N° d'outil dans la requête "R_cumul_cps_donnés"
        qfd20.Parameters("[Formulaires]![F_Suivi outils]![N° outil]") = [Forms]![F_suivi outils]![N° outil]
 
'ouvre le recordset basé sur la requête
Set Rs20 = qfd20.OpenRecordset
 
'Vérifie s'il y a des enregistrements dans le Recordset pour éviter message d'erreur
If Rs20.BOF = True And Rs20.EOF = True Then GoTo line31
 
'stocke dans les variables les données de la table sélectionnée en fonction de la requête
Rs20.MoveFirst
While Not Rs20.EOF
    With Rs20
        n20 = .Fields("N°_identification_outil").Value
        t20 = .Fields("Abrégé_outillage").Value
        ncd20 = .Fields("SommeDeNbre_de_coups_donnés").Value
    End With
 
        Rs20.MoveNext
Wend
 
sql = "UPDATE [Matrices_carrées] SET [Matrices_carrées].Nbre_de_coups_total = " & ncd20 & " WHERE [Matrices_carrées].N°= '" & n20 & "'"
' sql = "UPDATE [Matrices_carrées] SET [Matrices_carrées].Nbre_de_coups_total = " & ncd20 & " WHERE [Matrices_carrées].Abrégé_outillage= '" & t20 & "'"
DoCmd.RunSQL sql
Return
 
pcar:
Return
 
mron:
Return
 
pron:
Return
 
mref:
Return
 
pref:
Return
 
mobl:
Return
 
pobl:
Return
 
line31:
End Sub
Lorsque j'exécute le code avec la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sql = "UPDATE [Matrices_carrées] SET [Matrices_carrées].Nbre_de_coups_total = " & ncd20 & " WHERE [Matrices_carrées].N°= '" & n20 & "'"
le débogueur s'arrête sur
.

Lorsque j'exécute le code avec la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sql = "UPDATE [Matrices_carrées] SET [Matrices_carrées].Nbre_de_coups_total = " & ncd20 & " WHERE [Matrices_carrées].Abrégé_outillage= '" & t20 & "'"
Tous mes outils ont le même nbre total de coups.

Je ne vois pas pourquoi cela ne fonctionne pas avec le critère de la clé primaire.

Un conseil serait le bien venu