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 :

Fonction MAX paramétrée [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Fonction MAX paramétrée
    Bonjour,
    Je voudrais créer une fonction publique permettant de trouver la valeur la plus haute d'un champ d'une table. Ce cahmp est de type numérique entier.
    Cette fonction retournerait la valeur maxi sur la base de 2 paramètres (nom de la table et nom du champ de cette table)
    Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function DernierAT(Nom_Table As String, Nom_Champ As String) As Integer
    Dim rst As DAO.Recordset
    Dim str_maxiAT As String
    Dim int_dernierAT As Integer
     
    str_maxiAT = "Select Max(" & Nom_Champ & ") as IDMax from " & Nom_Table & " "
    MsgBox str_maxiAT
    Set rst = CurrentDb.OpenRecordset(str_maxiAT, dbOpenForwardOnly, dbReadOnly)
     
    DernierAT = rst("IDMax")
    rst.Close
    Set rst = Nothing
    End Function
    J'ai essayé plusieurs combinaisons, toutes avec des erreurs (différentes !). Celle qui correspond au code ci dessus est l'"erreur 3601 : trop peu de paramètres 1 attendu"

    pouvez vous me dire ce qui ne vas pas ?
    Je suis nouveau sur le forum.

  2. #2
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    Essayes peut-être ceci, des apostrophes avant et après un champ string (Nom_Table):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    str_maxiAT = "Select Max(" & Nom_Champ & ") as IDMax from '" & Nom_Table & "'"
    Set rst = CurrentDb.OpenRecordset(str_maxiAT, dbOpenForwardOnly, dbReadOnly)
    DernierAT = rst("IDMax")
    rst.Close
    Set rst = Nothing
    Cordialement
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pourquoi ne pas utiliser DMax() à la place de ta fonction ? Cela fait exactement cela et c'est déjà codé dans Access.

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(DMax("TonChamp","TaTable"),0)
    Attention avec NZ(), elle fait parfois sauter les décimales.

    Sinon à propos de ton problème, vérifie que ni le nom du champ ni le nom de la table ne contienne de blancs.

    Une méthode si tu as des blancs dans tes noms et de toujours encadrer les noms de champ, table et requête par des crochets.

    Ici cela donnerai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Select Max([" & Nom_Champ & "]) as IDMax from [" & Nom_Table & "]"
    Une méthode simple quand on débug du SQL généré par code est
    1. De mettre un point d'arrêt juste après la création de la chaîne SQL.
    2. De taper [Ctrl][g] pour faire apparaître la fenêtre d'exécution immédiate.
    3. De taper ? NomTaVariableSQL [Enter] pour faire afficher le SQL.
    4. Sélectionner le SQL affiché et le copier dans le SQL d'une requête vierge,
    5. Demander à afficher la requête.


    Ça aide généralement à trouver le problème.

    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour BernardMichel et Marot r.

    Merci de vos réponses.
    J'ai essayé avec les apostrophes et j'obtient le message "erreur d'execution 3450 : erreur de syntaxe dans la requète. La clause de la requète est incomplète"
    La visualisation du code montre un surligné en jaune de la ligne set (la même ligne qui posait problème auparavant).

    je vais essayer avec la fonction DMAX. Je ne voulais pas l'utiliser car il m'a été dit qu'elle était consommatrice en ressource machine (mais je suis très loin d'être un expert dans le domaine)Est ce vrai ?
    Sinon mais nomss ne contiennet pas de blancs, mais l'information est très utile car j'ai "ramé" avant de trouver les & et autre " à mettre autour des noms pour indiquer que c'est le contenu qui est à prendre en compte et non le nom lui même.

    Merci de votre aide

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    je vais essayer avec la fonction DMAX. Je ne voulais pas l'utiliser car il m'a été dit qu'elle était consommatrice en ressource machine (mais je suis très loin d'être un expert dans le domaine)Est ce vrai ?
    Oui c'est ce que j'ai entendu aussi mais personnellement je n'ai jamais expérimenté de sérieux problèmes de performance en l'utilisant.
    Il faudrait la comparer avec ton code pour vérifier si elle est plus rapide ou moins rapide mais elle a l'avantage d'exister déjà.
    De plus avec la montée en puissance des machines sauf sur des gros ou très gros volumes je ne suis pas certain qu'on verrait une différence significative.

    Si tu veux gagner en vitesse, que tu veux juste lire des données "fixes" durant ta lecture (ex : une table de référence), tu peux ouvrir tes recordsets en mode dbOpenSnapShot.
    Ça je l'ai testé et cela diminue par deux le temps d'accès aux données par rapport à un dbOpenDynaSet. Toute fois dans la majeur partie des cas, le dbOpenDynaset est bien suffisant.

    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Voilà j'ai essayé le code
    DernierAT = Nz(DMax(" & Nom_champ & ", " & nom_table & "), 0)
    Et j'ai eu une erreur

    J'ai essayé également
    ? rst et j'ai eu une erreur d'exécution 91 variable objet non définie.

    Je ne sais que faire

  7. #7
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    Alors, essayes cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DernierAT = Nz(DMax(Nom_champ, nom_table), 0)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci BernardMichel. ça marche
    Merci aussi à Maro_r pour son aide.

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

Discussions similaires

  1. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  2. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  3. Fonction MAX dans une condition WHERE
    Par borgfabr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 16h06
  4. Fonction max d'un tableau de variables...
    Par Romalafrite dans le forum ASP
    Réponses: 7
    Dernier message: 20/07/2004, 10h38
  5. Réponses: 3
    Dernier message: 17/06/2004, 16h32

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