1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2016
    Messages : 34
    Points : 33
    Points
    33

    Par défaut DoCmd.Openform - clause Where versus OpenArgs

    Bonjour,

    J'ai un formulaire dont la source de donnée est une requête assez complexe sur plusieurs tables, et dont un champ appelait une fonction écrite en VBA (une fonction de comptage trop farfelue pour être réalisée via les "Totaux" habituels, en tout cas pas à mon niveau de compétence).

    Lors de mes premiers essais, j'ai utilisé la clause Where pour afficher les données relatives à un enregistrement précis.

    Vu les performances - désastreuses - j'ai tracé les appels à la fonction et - surprise - j'ai découvert que ma fonction VBA était appelée pour TOUS les enregistrements de ma requête et pas seulement sur celui que visait la clause Where ... exactement comme si le recordset du formulaire comprenait en fait TOUS les enregistrements et que la clause Where ne servait in fine qu'à "positionner" le formulaire sur le seul enregistrement ciblé.

    Du coup, je me suis rabattu sur l'OpenArgs pour positionner une valeur de filtrage que j'ai intégrée explicitement dans la requête du formulaire. Dans ce cas, ma fonction VBA n'est appelée qu'une fois et j'imagine que le recordset du formulaire ne contient en tout et pour tout QUE l'enregistrement ciblé.

    Bref, utiliser la clause Where de l'OpenForm et insérer une clause WHERE dans la source de donnée du formulaire via un paramètre reçu par OpenArgs ne sont pas du tout comparables ! Si le formulaire ne vise qu'a afficher les données d'un objet précis, et non à naviguer entre tous les candidats possibles, la deuxième approche est de loin préférable (surtout quand le formulaire est kaffi de sous-formulaires).

    Ça parle à quelqu'un ce genre de détail ? J'ai relu tout ce que j'ai trouvé comme doc et je n'ai trouvé aucune mention de ce genre de subtilité ... mais j'ai peut-être mal cherché ...

    Cordialement,
    Olivier

  2. #2
    Membre expert Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 337
    Points : 3 814
    Points
    3 814

    Par défaut

    Bonjour,

    Effectivement les fonctions perso sont très pratiques dans les requêtes mais à banir des recordset s'il y a bcp de lignes

    Dans ton cas il me semble que le plus simple aurait été d'appeler la fonction au niveau du champ affiché dans le form
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2016
    Messages : 34
    Points : 33
    Points
    33

    Par défaut

    Hum ? Quand il s'agit de formulaires en mode continu, je ne vois pas trop comment appeler la fonction dans le code VBA du formulaire. Faut-il rebalayer (et compléter) le recordset dans le Form_Open, le Form_Load ou le Form_Activate ??

    En plus, je suis dans une application à onglets où j'ai plusieurs formulaires ouverts en même temps et, bien sur, un formulaire peut afficher des données partiellement dépendantes de données modifiables dans un des autres (d'où l'usage intensif que je fais déjà du Form_Activate).

    Quoi qu'il en soit, mon interrogation de fond reste en suspens : quand j'utilise un set de données filtrées par une clause Where lors de l'ouverture d'un formulaire, quelle est la taille réelle du recordset sous-jaccent ? Rien que les résultats filtrés ou le résultat intégral de la requête (ie. sans la clause Where) ?

    Cordialement,

    PS : En fait, j'aimerai bien disposer d'un outil de monitoring qui m'indique quelles sont les requêtes (et sous-requêtes) qui ont été lancées, combien de temps elles ont pris et combien d'enregistrements elles ont retournés. Est-ce que ça existe ?

  4. #4
    Membre expert Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 337
    Points : 3 814
    Points
    3 814

    Par défaut

    Citation Envoyé par olra72 Voir le message
    Hum ? Quand il s'agit de formulaires en mode continu, je ne vois pas trop comment appeler la fonction dans le code VBA du formulaire.
    Dans la source d'un champ on peut écrire =mafonction(monchamp)
    Les performances ne sont pas très bonnes non plus mais au moins c'est géré au niveau de l'affichage

    Citation Envoyé par olra72 Voir le message
    PS : En fait, j'aimerai bien disposer d'un outil de monitoring qui m'indique quelles sont les requêtes (et sous-requêtes) qui ont été lancées, combien de temps elles ont pris et combien d'enregistrements elles ont retournés. Est-ce que ça existe ?
    Je connais avec une base SQL server mais pas access, désolé. Ceci dit cela existe peut-être
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2005
    Messages
    1 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 1 924
    Points : 2 917
    Points
    2 917

    Par défaut

    Bonjour
    J'ai un formulaire dont la source de donnée est une requête assez complexe sur plusieurs tables, et dont un champ appelait une fonction écrite en VBA ...
    Ton formulaire est il seulement utilisé en consultation ?
    si oui, je conseille avant d'ouvrir le form de mettre les données filtrées dans une table temporaire et de mettre cette table temporaire en données source du form.

    CDLT
    "Allways, look at the bright side of life." Monty Python.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 139
    Points : 26 842
    Points
    26 842

    Par défaut

    Salut,

    plus pratique pour garder trace des informations : les tables de parametres

    Avec du code dans les Form_Load().
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. DoCmd.OpenForm et condition where
    Par lolobot dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/08/2008, 10h01
  2. Réponses: 5
    Dernier message: 23/03/2007, 09h58
  3. Syntaxe dans Where (docmd.openform)
    Par fredpeca dans le forum Access
    Réponses: 24
    Dernier message: 09/01/2007, 13h44
  4. probleme avec le caractere 'Z' dans ma clause WHERE
    Par dibox dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 01/04/2004, 12h21
  5. [ character en simple cote ] clause Where
    Par hocinema dans le forum DB2
    Réponses: 3
    Dernier message: 20/02/2004, 10h17

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