Bonjour,
J'essaye de remplacer la fonction Dcount (que j'utilisais jusqu'ici dans le générateur de fonctions) par du code SQL.
Voici ma fonction:
Elle compte pour chaque commande de ma table "Einteilungen" le nombre de commandes ayant les mêmes numéros d'EinkBeleg et de Pos, et ayant un numéro d'identification (ID) inférieur ou égal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part RangE: DCount("*";"[Einteilungen]";"[ID] <= " & [ID] & " AND [Einteilungen]![EinkBeleg] = '" & [Einteilungen]![EinkBeleg] & "' AND [Einteilungen]![Pos] = " & [Einteilungen]![Pos] & "")
À l'aide du tutoriel "Les fonctions de domaine dans Access" (je n'ai jamais utilisé SQL auparavant), j'ai créé pour la remplacer un module avec la fonction suivante:
J'ai ensuite fait un bouton qui ouvre une requête affichant les résultats :
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 Public Function CountRangE(intID As Integer, strEinkBeleg As String, intPos As Integer) As Variant ' ===== déclaration des variables ===== Dim strSql As String Dim rst As DAO.Recordset ' ===== affectation ===== strSql = "SELECT Einteilungen.ID, Einteilungen.EinkBeleg, Einteilungen.Pos, Count(Einteilungen.ID) AS RangE " & _ "FROM Einteilungen " & _ "GROUP BY Einteilungen.ID, Einteilungen.EinkBeleg, Einteilungen.Pos " & _ "HAVING Einteilungen.ID<=" & intID & " AND Einteilungen.EinkBeleg='" & strEinkBeleg & "' AND Einteilungen.Pos=" & intPos & ";" Set rst = CurrentDb.OpenRecordset(strSql) CountRangE = rst("RangE") rst.Close Set rst = Nothing Exit Function End Function
Mon problème est que la fonction CountRangE ne fonctionne pas: dans mon champ "RangE" je n'obtiens que les valeurs 1 et #Zahl! (j'utilise Access en Allemand, j'imagine que l'équivalent francais est #Nombre!).
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 Private Function CreateSQL() Dim strSql As String strSql = "SELECT Einteilungen.ID, Einteilungen.EinkBeleg, Einteilungen.Pos, CountRangE(Einteilungen.ID, Einteilungen.EinkBeleg, Einteilungen.Pos) AS RangE " & _ "FROM Einteilungen;" CreateSQL = strSql End Function Private Sub RunSQL_Click() Dim db As DAO.Database, qd As DAO.QueryDef Dim strRequete As String, strSql As String ' Nom requête à modifier ou créer strRequete = "Q_RangE" Set db = CurrentDb ' Crée le code SQL et le met dans la variable strSQL strSql = CreateSQL() ' On s'assure que la requête n'est pas ouverte. DoCmd.Close acQuery, strRequete ' Tente d'obtenir l'objet QueryDef correspondant à ' la requête. Si elle n'existe pas une erreur se produit On Error Resume Next Set qd = db.QueryDefs(strRequete) On Error GoTo 0 If qd Is Nothing Then ' Si la requête n'existe pas, on la crée avec ' son code SQL Set qd = db.CreateQueryDef(strRequete, strSql) Else ' Affecte le nouveau code SQL de la requête qd.SQL = strSql End If qd.Close Set db = Nothing ' Ouvre la requête en mode feuille de données DoCmd.OpenQuery strRequete Me.SetFocus End Sub
Quelqu'un saurait-il m'indiquer pourquoi et me proposer un code qui marche?
Merci d'avance
Partager