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 :

Regroupement et édition de données [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut Regroupement et édition de données
    Bonjour à tous.

    Voilà des jours que je cherche à faire une requête joignant une table et une requête avec regroupement :
    - La table principale (table) est banale (une cinquantaine de champs classiques) avec comme clef le champ ID_table, sans doublon bien sûr.
    - La requête (requete) n'a que deux champs : un champ table_ID identique celui de la table et un champ champ_x qui est du texte généré par une fonction rangée dans un module.
    Précision importante : le champ "table_ID" de la requête peut avoir des doublons. Lorsque c'est le cas, champ_x est identique dans les deux enregistrements.

    Le but est simplement d'obtenir une requête (tableetrequete) présentant tous les champs de table avec l'ajout de champ_x, et que cette requête soit sans doublons.

    J'ai essayé un bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT table.*, requete.champ_x
    FROM table INNER JOINT requete
    ON table.ID_table = requete.table_ID
    mais dans ce cas, les doublons en provenance de requete sont conservés, ce qui fait que j'ai plein d'enregistrements en doubles et absolument identiques.
    Le résultat est le même avec un LEFT JOINT ou RIGHT JOINT.

    J'ai ensuite essayé en modifiant préalablement requete avec un regroupement GROUP BY, de manière à éviter ses doublons en amont.
    Le résultat marche bien : j'ai maintenant tous les champs de table avec l'ajout de champ_x, sans doublon.
    Mais on ne peut plus toucher aux données ! la requête en regroupement, bien que source d'un seul champ de la requête finale, empêche toute modification des données de table. Inutile, donc, pour le formulaire que je veux faire par la suite.

    Quelqu'un aurait-il une solution ? Merci beaucoup

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonsoir,

    Je pensais utiliser une fonction de domaine à la place de la jointure :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT table.*, DLookup("champ_x","requete","table_ID=" & [table_ID])
    FROM table;

    A tester, normalement ça autorise les modifications mais c'est plus lent

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  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.

    Essaye en partant de ta requête en utilisant distinct plutôt que group by.
    C'est accessible via le SQL ou les propriétés de ta requête.

    Il est possible que cela ne marche pas et dans ce cas là tu peux utiliser DFirst() à la place de la jointure. Ce n'est pas la solution la plus performante mais si tu as peu de données ça peut être acceptable.

    Une autre option est de créer une table temporaire contenant avec le résultat de ta requête (par group by ou distinct).
    1. Tu vides la table temporaire.
    2. Tu lance une requête d'ajout.
    3. Tu te sers de la table temporaire dans ta jointure.

    C'est nettement plus performant que DFirst() mais c'est BEAUCOUP moins dynamique.

    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
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour à tous et merci de votre aide.

    - Le DISTINCT produit le même résultat que le GROUP BY : rapide, efficace, mais les données sont figées et non modifiables.
    - Le DLookUp est tellement lent qu'il a fait planter ma machine, pourtant assez costaude : j'ai dû passer par le gestionnaire de tâches pour arrêter sauvagement Access.
    - Le DFirst(), j'ai essayé de me renseigner mais je ne vois pas comment le mettre en place. Ça a pas l'air d'être du VBA, pas du SQL. Comment l'intégrer dans une requête source de formulaire ?
    - Je vais creuser la création temporaire d'une table. Certes j'ai beaucoup de données par enregistrement, mais peu de nouveaux enregistrements (en moyenne deux à trois par mois). Je vais voir si le manque de dynamisme me handicape ou non.

    À suivre...

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    Citation Envoyé par Vijinn Voir le message
    - Le DFirst(), j'ai essayé de me renseigner mais je ne vois pas comment le mettre en place. Ça a pas l'air d'être du VBA, pas du SQL. Comment l'intégrer dans une requête source de formulaire ?

    À suivre...
    Tu remplaces simplement Dlookup par Dfirst c'est le même principe, par contre c'est aussi lent

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Merci, c'est très simple en effet.
    Bon, effectivement, la lenteur est intenable... même si c'est moins rédhibitoire que le DLookup.

    Je creuse l'idée de la création de table. C'est peut-être la bonne solution même si cela implique des procédures de mises à jour assez lourdes. Comme ces mises à jour ne seraient occasionnées qu'assez rarement (2 ou 3 fois par mois), ça serait supportable pour l'utilisateur.
    Y a-t-il un moyen de ne pas afficher les messages "Vous allez exécuter une requête Création de table...", "La table "tableprovisoire" existante sera supprimée avant l'exécution de la requête" et "Vous allez coller X lignes dans une nouvelle table" (ou de faire "oui" automatiquement) ?

    Merci beaucoup

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Concernant les messages d'alertes lors de l'exécution d'une requête action, il y a possibilité de les déactiver momentanément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.Setwarnings false ' désactive les messages d'alertes
    docmd.RundSQL LeSQL
    DoCmd.Setwarnings True ' rétablit les messages d'alertes
    ou plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.execute, leSQL, dbFailOnError
    Concernant les fonctions DFirst et Dlookup, peut-être essayer d'ajouter un index sur le champ "table_ID" dans l'autre table présent dans la requête.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour.
    La requête création fonctionne bien, je choisis cette cette solution là.
    J'ai dû bidouiller un peu : comme la requête création est lancée depuis le formulaire ayant comme source la table qui doit être supprimée puis recréée par la requête, il bloquait la suppression (Erreur d'exécution '3211'). J'ai contourné le problème en changeant la source du formulaire par un clone avec un autre nom.

    Merci beaucoup de votre aide

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

Discussions similaires

  1. Regrouper des bases de données
    Par Jim_Crayon dans le forum Administration
    Réponses: 1
    Dernier message: 23/08/2011, 14h59
  2. [A-07] Regrouper 3 bases de données en une seule
    Par Alain7751 dans le forum Modélisation
    Réponses: 5
    Dernier message: 06/03/2009, 12h28
  3. Regroupement de bases de données
    Par smilingdreamer dans le forum Modélisation
    Réponses: 5
    Dernier message: 03/11/2008, 15h33
  4. Réponses: 4
    Dernier message: 01/11/2008, 17h53
  5. Regroupement par plage de données consécutives.
    Par ntexcier dans le forum Administration
    Réponses: 5
    Dernier message: 06/11/2006, 08h29

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