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

Access Discussion :

Lenteur dans un formulaire avec fonctions de domaines [AC-2019]


Sujet :

Access

  1. #1
    Membre émérite
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 2 878
    Points
    2 878
    Par défaut Lenteur dans un formulaire avec fonctions de domaines
    Bonjour

    Je vous expose la situation simplifiée.

    J'ai une table d'objectifs (TObjectifs) avec par date et par site (une dizaine), trois indicateurs.

    J'ai par ailleurs une table de planning (TPlanning) me donnant à chaque ligne une date, un site et (entre autres) des valeurs pour les trois mêmes indicateurs.

    J'ai fait une requête (RPlanning) sur la TPlanning qui me permet d'afficher pour telle fourchette de dates (et plein d'autres critères facultatifs), toutes les lignes qui correspondent.
    J'ai fait un formulaire (FPlanning) sur cette requête dont les différents contrôles (menus déroulants et zones de textes) situés en Entête de formulaire alimentent la RPlanning.

    Dans cet entête, il y a aussi des zones de textes qui donnent les sommes sur les trois indicateurs pour chacun des sites.
    Jusque là tout va bien et tout est relativement rapide.

    Par contre, je dois comparer mes sommes Planifiées sur les trois indicateurs par rapport aux objectifs pour chacun des sites.

    Pour cela j'ai créé un simple requête (RObjectifs) sur la TObjectifs et la RPlanning, qui regroupe par Site et fait la somme de chacun des indicateurs. Cette requête affiche donc une ligne par site et 3 colonnes. Pas de soucis non plus.

    Ce que je veux c'est de mettre les valeurs de RObjectifs dans des zones de texte dans l'entête de mon formulaire.

    La seule solution que j'ai trouvé à présent est d'utiliser la formule suivante dans des zones de texte : SomDom("[SommeDeIndicateur1]";"RObjectifs";"Site='AAA'")
    Mais même avec une toute petite requête RObjectifs, le temps est trop long d'afficher les 30 résultats dans le formulaire. Et cela ralentit d'autant les affichages des autres calculs.

    Est-ce que l'on peut avoir une autre manière d'afficher les résultats de ma requête RObjectifs dans 30 zones de texte dans l'entête de mon formulaire FPlanning ? Pour information, les indicateurs doivent y être, même sans résultat, et toujours à la même place, d'où la contrainte des zones de texte.

    J'espère avoir été complet sans être trop long, et merci d'avance à ceux qui m'apporteront leur lumière.

    Bon après-midi

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  2. #2
    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.

    De ce que j'ai compris, ma solution serait de faire une requête qui fait la somme par site et je me servirai de cette requête comme source de l'affichage.
    J'utiliserai une requête croisée dynamique ou une simple requête "group by", selon ce qui est le plus pratique, pour calculer les totaux pour tous les sites.
    L'avantage de la requête croisée dynamique c'est qu'elle peut te permettre d'afficher tes résultats en tableau directement plutôt que d'aller chercher chacune des valeurs une par une.

    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.

  3. #3
    Membre émérite
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 2 878
    Points
    2 878
    Par défaut
    Bonsoir

    Merci marot_r, mais je ne peux pas faire une requête d'analyse croisée (malheureusement), car j'ai des contraintes d'affichage (de couleurs, de dispositions, de positions) qui m'obligent aux zones de texte.

    Je rappelle que les informations que je cherche à afficher sont à mettre dans l'entête du formulaire.

    Je suis même prêt à faire 30 requêtes s'il le faut, mais je crois que l'on ne peut pas afficher directement le résultat d'une requête dans une zone de texte. Même si cette requête n'a qu'une ligne et qu'une colonne en résultat.

    Cela pourrait être une solution : est-ce que l'on peut afficher dans une zone de texte le résultat d'une requête qui n'a qu'une ligne et qu'une colonne ? Sans passer par une fonction de domaine bien entendu.

    Dans l'attente d'une autre suggestion, je vous souhaite une bonne soirée

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    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.

    Pour la requête croisée dynamique tu peux peut-être quand même t'en servir comme source dans un sous-formulaire que tu mets dans l'entête de ton formulaire en utilisant la mise en forme conditionnelle pour tes couleurs et autre.
    Mais ce n'est pas forcément la plus adaptée à ton besoin.

    Pour l'affichage tu peux mettre dans la source de ton contrôle quelque chose comme : =DFirst("TonChamp", "TaRequetePourTotaux", "Site=""AAA""").
    Généralement Access est plus rapide si il lit les données depuis une requête que si on utilise les fonctions de domaine.

    Et, si tes totaux ne sont pas mis à jour dynamiquement quand tu les regardes, tu peux aussi envisager de mettre les totaux dans une table temporaire et afficher depuis cette table temporaire.
    Là l'affichage sera instantané (ou presque) une fois les totaux faits.
    Attention de bien s'assurer que la table soit à jour avant l'affichage.

    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.

  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
    Et j'avoue que pour les stats sur des données "figées", je préfères utiliser Excel et ses tableaux croisés dynamiques.
    Tu exportes tes données Access et ensuite tu les mets en forme et affiche dans Excel.
    Personnellement, je trouve que généralement c'est plus souple et facile à faire que de le faire dans Access.
    Notamment si tu intègre des graphiques ou que tu as des resultats qui ne tiennent pas dans un écran standard ... Il n'y a pas de zoom sur un formulaire d'Access semblable à ce que Excel propose pour ses feuilles.

    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
    Membre émérite
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 2 878
    Points
    2 878
    Par défaut
    Bonjour marot_r et le forum
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Pour la requête croisée dynamique tu peux peut-être quand même t'en servir comme source dans un sous-formulaire que tu mets dans l'entête de ton formulaire en utilisant la mise en forme conditionnelle pour tes couleurs et autre.
    Mais ce n'est pas forcément la plus adaptée à ton besoin.
    Je confirme que ce n'est pas adapté à mon cas à cause des contraintes de mise en forme

    Pour l'affichage tu peux mettre dans la source de ton contrôle quelque chose comme : =DFirst("TonChamp", "TaRequetePourTotaux", "Site=""AAA""").
    Généralement Access est plus rapide si il lit les données depuis une requête que si on utilise les fonctions de domaine.
    Si je ne m'abuse, il s'agit bien d'une fonction de domaine qui va lire les informations dans une requête.
    Je viens d'essayer et cela revient au même qu'avec un SomDom (mais c'est plus juste puisque je n'ai qu'une seule ligne par site).

    Et, si tes totaux ne sont pas mis à jour dynamiquement quand tu les regardes, tu peux aussi envisager de mettre les totaux dans une table temporaire et afficher depuis cette table temporaire.
    Là l'affichage sera instantané (ou presque) une fois les totaux faits.
    Attention de bien s'assurer que la table soit à jour avant l'affichage.

    A+
    Malheureusement si. Les totaux doivent être mis à jour dynamiquement.
    En fait on change les données plusieurs fois par jour et on vérifie en permanence par rapport à l'objectif qui est mis à jour plusieurs fois par jour (car il s'affine au fur et à mesure que l'on s'en approche).

    Je réitère la question que j'avais posé dans mon dernier post.
    Est-ce que l'on peut afficher dans une zone de texte le résultat d'une requête (qui n'aurait qu'une ligne et qu'une colonne) ?
    J'ai essayé de plein de façons, car cela semble possible d'après l'aide de MS, mais je n'ai pas trouvé comment changer la source d'une zone de texte pour lui indiquer de prendre le résultat d'une requête.

    Dans l'attente de l'idée qui débloquera la situation, je souhaite une bonne après-midi à chacun (sous la pluie).

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut,
    Citation Envoyé par Pierre Dumas Voir le message
    ...
    Est-ce que l'on peut afficher dans une zone de texte le résultat d'une requête (qui n'aurait qu'une ligne et qu'une colonne) ?
    J'ai essayé de plein de façons, car cela semble possible d'après l'aide de MS, mais je n'ai pas trouvé comment changer la source d'une zone de texte pour lui indiquer de prendre le résultat d'une requête...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Form_Current()
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSql As String
     
    strSql = "SELECT id_fact" _
    & " FROM tblFacture" _
    & " WHERE id_fact = 10248"
     
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
     
    Me.Texte0 = rst.Fields("id_fact").Value
    End Sub
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,
    je ne sais pas si c'est la solution mais as-tu essayé d'inclure la requête RObjectifs dans RPlanning avec une jointure gauche vers RObjectifs par le champ Site (pour afficher tout de RPlanning ) ?
    Les fonctions de domaine ne semblent pas bénéficier de l'optimisation du moteur JET (selon denis hulo)
    vérifie aussi si tu as des index sur les champs impactés par tes regroupements
    Je réitère la question que j'avais posé dans mon dernier post.
    Est-ce que l'on peut afficher dans une zone de texte le résultat d'une requête (qui n'aurait qu'une ligne et qu'une colonne) ?
    oui, mais seulement avec les fonctions de domaine (comme tu l'as fait)
    ou par un Recordset (donc VBA)
    je souhaite une bonne après-midi à chacun (sous la pluie).
    euh! merci, mais non, il y a un superbe soleil en Normandie
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir hyperion13 et Pierre Dumas,
    du coup, la solution d'hyperion13 peut être plus efficace si on parcourt tous les enregistrements:
    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
    Private Sub Form_Current()
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
     
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("RObjectifs", dbOpenSnapshot)
    Do Until rst.EOF 
        select case rst.Fields("Site")
            Case "AAA" : Me.Texte0 = rst.Fields("[SommeDeIndicateur1]")
            Case "BBB" : Me.Texte1 = rst.Fields("[SommeDeIndicateur2]")
           'Case etc.
        End Select
    loop
    dbs.close : set dbs = nothing
    rst.close: set rst = nothing
    End Sub
    PS: la lenteur est due à la fonction de domaine qui s'exécute 30 fois
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Membre émérite
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 2 878
    Points
    2 878
    Par défaut
    Bonsoir

    Merci tee_grandbois et hyperion13 pour les suggestions.

    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,
    je ne sais pas si c'est la solution mais as-tu essayé d'inclure la requête RObjectifs dans RPlanning avec une jointure gauche vers RObjectifs par le champ Site (pour afficher tout de RPlanning ) ?
    J'y ai bien pensé, mais le total par indicateur de la RObjectifs se retrouvera sur plusieurs lignes de la RPlanning. Je ne pourrai donc plus le récupérer pour les mettre dans mes zones de texte de l'entête. Surtout que le nombre de lignes par site (côté RPlanning) peut être différent, mais aussi qu'il peut ne pas y avoir de sites dans RPlanning, alors qu'il y a des objectifs à afficher quand même.

    [...]
    vérifie aussi si tu as des index sur les champs impactés par tes regroupements
    C'est à dire ? Il vaut mieux qu'il y ait des champs indexés ou pas dans les regroupements ?

    J'ai vu tous ces messages sur un ancien fil et, pour l'instant, j'ai retenu la technique avec des listes déroulantes (basées sur la RObjectifs), puis des zones de texte récupérant la valeur de ces listes déroulantes.
    Cette méthode a comme inconvénient de doubler les champs, mais est beaucoup plus rapide pour afficher les indicateurs.

    Je laisse encore ouvert le fil.

    Bonne soirée et merci encore aux participants.

    Pierre Dumas

    Merci encore et bonne soirée.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    C'est à dire ? Il vaut mieux qu'il y ait des champs indexés ou pas dans les regroupements ?
    un index accélère le traitement c'est un gain de temps de traitement quand il y a un volume important d'enregistrements. On privilégiera les champs les plus sollicités dans les tris, les regroupements, les critères ... Il faut juste ne pas trop en abuser, cela prend de la place dans la base.
    j'ai retenu la technique avec des listes déroulantes (basées sur la RObjectifs), puis des zones de texte récupérant la valeur de ces listes déroulantes.
    Cette méthode a comme inconvénient de doubler les champs, mais est beaucoup plus rapide pour afficher les indicateurs.
    c'est vrai, je ne me souvenais plus de cette astuce. certes cela double les contrôles (les champs) dans les formulaires ou états mais puisqu'ils seront non visibles, pourquoi s'en priver ?
    J'y ai bien pensé, mais le total par indicateur de la RObjectifs se retrouvera sur plusieurs lignes de la RPlanning.
    cela n'a aucune importance c'est juste une colonne dupliquée, elle n'apparaitra qu'une seule fois dans l’entête
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #12
    Membre émérite
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 2 878
    Points
    2 878
    Par défaut
    Oups, j'ai oublié de remercier tee_grandbois, hyperion13 et marot_r pour ces échanges

    Tellement repris à faire le travail que j'ai oublié ici.

    Comme indiqué, je suis parti sur la base de couples de contrôles. Le premier en liste déroulante, le second en zone de texte basé sur le premier.

    Je pense que cela résistera bien à la montée en charge.

    Bonne fin de semaine à chacun

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2007, 12h15
  2. Réponses: 10
    Dernier message: 03/10/2006, 15h32
  3. [WinForms]Lenteur d'affichage formulaire avec image de fond
    Par olixelle dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/09/2006, 14h06
  4. Réponses: 4
    Dernier message: 12/06/2006, 11h46
  5. Mise à jour dans un formulaire avec condition
    Par Bourni dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2006, 22h13

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