IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Equivalent SQL de la fonction Dcount


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Femme Profil pro
    Stagiaire
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Equivalent SQL de la fonction Dcount
    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:
    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] & "")
    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.

    À 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:
    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
    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
    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
    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!).

    Quelqu'un saurait-il m'indiquer pourquoi et me proposer un code qui marche?
    Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,
    La requête qui va te retourner la même chose que ton Dcount est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Count(*) AS RangE FROM Einteilungen WHERE [ID] <=" & intID  & " AND  EinkBeleg ='" & strEinkBeleg & "' AND Einteilungen.Pos=" & intPos & ";"

  3. #3
    Candidat au Club
    Femme Profil pro
    Stagiaire
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Merci
    Ca fonctionne parfaitement, merci beaucoup!

  4. #4
    Candidat au Club
    Femme Profil pro
    Stagiaire
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Une dernière question : dans son tutoriel sur le sujet, Philippe JOCHMANS utilise cette requête pour avoir le nombre de notes inférieures à 10 d'un élève:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    "SELECT Count(bytNote) AS InferMoy " & _
    "FROM tbl_Classe " & _
    "WHERE bytNote < 10 " & _
    "GROUP BY strNom, strPrenom " & _
    "HAVING strNom='" & strNomEleve & "' And strPrenom='" & strPrenomEleve & "';"
    Pourquoi dans mon cas n'est-il pas nécessaire d'utiliser "GROUP BY" et "HAVING" ?

  5. #5
    Candidat au Club
    Femme Profil pro
    Stagiaire
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bmazoyer Voir le message
    Ca fonctionne parfaitement, merci beaucoup!
    En fait non, ca ne fonctionne pas parfaitement : la requête donne les bons résultats jusqu'à la ligne 32667, et ensuite affiche "#Zahl!". Pourtant je ne vois pas de différence de type entre les données avant et après cette ligne. Voyez-vous une explication ?

    En pièce jointe un extrait d'une table formée à partir de cette requête et exportée au format Excel.
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 358
    Points
    34 358
    Par défaut
    Salut,

    tu as atteint la limite de capacité d'une variable de type Integer (-32 768 à 32 767)

    Si tu veux aller au delà de ces valeurs, passe ta variable en Long

  7. #7
    Candidat au Club
    Femme Profil pro
    Stagiaire
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Je me sens un peu débile mais je suppose que c'est le genre d'erreurs que font les débutants
    Merci en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sql*Loader et fonctions
    Par Veve44 dans le forum SQL
    Réponses: 12
    Dernier message: 05/10/2005, 15h33
  2. [SQL SERVER 2000] Fonction utilisateur : boucle sans fin
    Par galinijay dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/09/2005, 16h03
  3. Syntaxe SQL de la fonction inputmask ???
    Par Aurèl90 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/09/2005, 15h59
  4. Equivalent Sql server de Net8 easy config d'Oracle?
    Par sorel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2005, 13h33
  5. Critère non reconnu dans la fonction DCount
    Par Ps4 dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo