J'ai le code suivant qui, une fois exécuté, renverra le nombre de clients arrivés au cours du mois donné dans le paramètre. Cependant, pendant l'exécution du code, je reçois une erreur d'exécution 3021 (aucun enregistrement actuel). Où est-ce que je me trompe exactement?

Public Function CountOfcustomer(RequiredDate As Date)
    Dim strSQL As String
    Dim rst As DAO.Recordset

       strSQL = "SELECT Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & ") AS reportDate, Count(CalibrationLog.customer) AS CountOfcustomer " & _
            "From CalibrationLog " & _
            "GROUP BY Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & ") " & _
            "HAVING (((Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & "))= Format(" & RequiredDate & "," & Chr(34) & "mm\yyyy" & Chr(34) & ") ));"


    Set rst = CurrentDb.OpenRecordset(strSQL)

    CountOfcustomer = rst!CountOfcustomer

    rst.Close
    Set rst = Nothing
End Function

Montré dans la fenêtre Immédiat;

SELECT Format([dateArrived],"mm\yyyy") AS reportDate, Count(CalibrationLog.customer) AS CountOfcustomer 
From CalibrationLog 
GROUP BY Format([dateArrived],"mm\yyyy") 
HAVING (((Format([dateArrived],"mm\yyyy"))= Format(12/02/2020,"mm\yyyy") ));
1
Shadyjunior 28 avril 2020 à 18:20

2 réponses

Meilleure réponse

Vous souhaitez récupérer un décompte pour le mois de votre argument de date, RequiredDate.

Il me semble qu'il pourrait être plus simple d'éviter tout ça Format(). Vous n'avez même pas besoin de le faire en tant que requête GROUP BY. Demandez simplement un Count avec une clause WHERE qui sélectionne uniquement les lignes qui appartiennent à votre plage de dates cible ... et comparez les dates comme des dates au lieu des dates transformées en chaînes.

Dim strSQL As String
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

strSQL = "PARAMETERS RequiredDate Date; " & _
    "SELECT Count(*) AS CountOfcustomer FROM CalibrationLog " & _
    "WHERE [dateArrived] >= DateSerial(Year(RequiredDate), Month(RequiredDate), 1) " & _
    "AND [dateArrived] < DateSerial(Year(RequiredDate), Month(RequiredDate) + 1, 1);"

Set qdf = CurrentDb.CreateQueryDef(vbNullString, strSQL)
qdf.Parameters("RequiredDate").Value = RequiredDate
Set rst = qdf.OpenRecordset(strSQL)
If Not (rst.BOF And rst.EOF) Then
    CountOfcustomer = rst!CountOfcustomer
End If

Avec cette approche, Access peut utiliser un index sur ce champ dateArrived pour identifier rapidement les enregistrements qui satisfont à la contrainte WHERE de la requête.

2
HansUp 28 avril 2020 à 16:20

Vous devez valider dans la fonction que vous ne recevez probablement aucun enregistrement dans le Recordset.

CountOfcustomer = rst!CountOfcustomer

Si aucun client n'est arrivé dans le RequiredDate spécifié, vous ne pouvez pas faire rst!CountOfcustomer

2
fgiuliani 28 avril 2020 à 15:24