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 :

améliorer une requête


Sujet :

Access

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut améliorer une requête
    Bonjour à tous, et merci de votre aide
    voila mon problème
    J'ai, dans un premier temps fait la requête suivante :
    que je nomme (R1ligne_electrique)

    SELECT Ligne, PK_deb, PK_fin, ELECT
    FROM Dec_ligne
    WHERE (((Dec_ligne.Ligne)="930000"));

    qui ma donné ceci c'est un exemple)
    La table d'origine :
    Ligne PK_deb PK_fin ELECT
    930000 0 0,114 1500V
    930000 0,114 2,3 1500V
    930000 2,3 3,258 1500V
    930000 3.258 5,448 1500V
    930000 5,448 12,12 25000V
    930000 12,12 15,12 25000V
    930000 15,12 140,52 25000V
    930000 140,52 142,82 5000V
    930000 142,82 183,3 5000V
    930000 183,3 252,4 25000V
    930000 252,4 257,475 25000V
    930000 257,475 259,155 1500V


    En faisant la requête suivante

    SELECT Ligne, Min(PK_deb) AS MinDePK_deb, Max(PK_fin) AS MaxDePK_fin, ELECT
    FROM Dec_ligne
    GROUP BY Ligne, ELECT
    HAVING Ligne="930000";

    Me donne ce résultat
    Ligne MinDePK_deb MaxDePK_fin ELECT
    930000 0 259,155 1500V
    930000 5,448 257,475 25000V
    930000 140,52 183,3 5000V

    Moi je cherche à obtenir ceci :

    Ligne MinDePK_deb MaxDePK_fin ELECT
    930000 0 5,448 1500V
    930000 5,448 257,475 25000V
    930000 140,52 183,3 5000V
    930000 183,3 257,475 25000V
    930000 257,475 259,155 1500V

    C'est à dire les pK_deb et PK_fin de chaque section (ou segment)
    Le SQL me permet-il de faire cela?

    Alors comment faire? puis-je avoir de l'aide?
    merci

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Je ne vois pas comment c'est possible.
    Il faudrait une troisième colonne dans le GROUP BY.
    Un truc dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     Ligne    PK_deb     PK_fin    ELECT  Segment 
     930000     0         0,114    1500V    1
     930000     0,114     2,3      1500V    1
     930000     2,3       3,258    1500V    1
     930000     3.258     5,448    1500V    1
     930000     5,448    12,12    25000V    2
     930000    12,12     15,12    25000V    2
     930000    15,12    140,52     5000V    3
     930000   140,52    142,82     5000V    3
     930000   142,82    183,3      5000V    3
     930000   183,3     252,4     25000V    4
     930000   252,4     257,475   25000V    4
     930000   257,475   259,155    1500V    5
    ...pour faire GROUP BY Ligne, ELECT, Segment
    La colonne segment il faur l'alimenter par du code VBA qui incrémente la valeur pour chaque changement de ELECT.

    Bon courage

  3. #3
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour,

    C'est à dire les pK_deb et PK_fin de chaque section (ou segment)
    Tu peux préciser ce que tu entends exactement par section (ou segment) ?

    J'ai l'impression que LedZepp a assimilé les sections/segments avec ELECT (une tension ?) Mais ta requête fait un très bon Group by sur ELECT.

    Peut être si on avait une vague notion de ce que c'est que PK_deb et PK_fin ?

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut
    LedZeppII a parfaitement compris. c'est cela que je cherche à faire.
    Je suis donc obligé de partir de ma table initiale, et de créer un seconde table avec une colonne supplémentaire que l'on appelera segment par exemple.
    Je dois faire cela en VBA.
    J'ai déjà démaré mais j'ai un petit problème pour créer ma table vide en VBA. je fais ceci

    DoCmd.SetWarnings False
    Dim Qry As DAO.QueryDef
    Set Qry = CurrentDb.QueryDefs("CREATE TABLE tempo (champ1 CHAR(10),champ' Double,champ3 double,champ4 Long,champ5 long);")
    Qry.Execute
    Set Qry = Nothing
    DoCmd.SetWarnings True

    et ca me répond cela
    "Elément non trouvé dans cette collection"

    pourquoi?
    merci

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    QueryDefs est une collection des requêtes sauvées dans l'onglet Requêtes.
    Ex: QueryDefs("NomDeLaRequete")
    Pour exécuter une commande SQL on utilise DoCmd.RunSQL "CREATE ...".

    On peut créer une table avec DAO mais c'est un peu plus long à écrire.
    -> Création d'un object TableDef
    -> Création et Ajout des champs un par un
    -> Ajout de la nouvelle table à la collection TableDefs
    Tout est là : http://warin.developpez.com/access/dao

    Bon courage

  6. #6
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Pourquoi ne pas utiliser une méthode simple, puisque tu vas régulièrement avoir besoin de cette table temporaire ?
    Je te propose de
    1- créer 'manuellement' la table temporaire, qui doit contenir les mêmes champs clés que la table Dec_ligne, plus 1 nouveau champ 'Segment'. Donc, tu peux faire une copie locale, dans l'application, de la table Dec_ligne, que je suppose attachée...
    Pour l'exemple, je propose de l'appeler 'Dec_ligne_temp', comme ça, elle sera à côté de l'original dans l'onglet Tables de la fenêtre base de données.
    Puis, quand tu en as besoin, tu lances 2 requêtes :
    2- 1 qui vide toute cette table, (DELETE * FROM Dec_ligne_temp)
    3- 1 qui copie toutes les clés primaires de la table Dec_ligne dans la table Dec_ligne_temp, ce qui permettra de les joindre plus tard. Là, une simple requête Ajout fait le boulot en 3 clicks.
    4- Puis lancer la routine VBA qui va numéroter les segments :
    Il ne reste plus à cette routine que
    - ouvrir un recordset basé sur une requête qui contient les 2 tables jointes, avec toutes les valeurs de Dec_ligne + le nouveau champ 'Segment', et trié par Pk_Deb,
    - enregistrer par DAO dans ce recordset les n°s de segment, qui s'incrémentent lorsque ELECT change de valeur.

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

Discussions similaires

  1. Améliorer une requête SQL d'autocompletion
    Par krunch dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/01/2013, 19h00
  2. Améliorer la performance d'une requête
    Par BorisShem dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/04/2009, 22h47
  3. Améliorer une requête complexe
    Par cyberyan dans le forum PL/SQL
    Réponses: 9
    Dernier message: 04/09/2008, 17h34
  4. cherche aide pour améliorer le traitement d'une requête
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/04/2008, 14h15
  5. Amélioration d'une requête
    Par phtpht dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/07/2006, 12h20

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