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 :

Requête imbriquée ou autre solution


Sujet :

Requêtes et SQL.

  1. #1
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 404
    Points : 1 683
    Points
    1 683
    Par défaut Requête imbriquée ou autre solution
    Bonjour,

    Je cherche depuis un bon bout de temps à réaliser des calculs à partir de requêtes.

    Une requête initiale me permet de sélectionner des enregistrements
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT UT([evaris]) AS Unite, indice([evaris],[evafre],[evapce],[evadan],[evafag],[evaeff],[evamap1],[evamap2],[evamap3],[evamap4],[evamap5]) AS Ind, urgence([evaid],[evadat],[Ind]) AS Urg
    FROM tEVA
    WHERE (((Exists (SELECT Max(t1.evadat) AS MaxDeevadat, t1.evaris FROM tEVA AS t1 WHERE ((Not (t1.evafin) Is Null)) GROUP BY t1.evaris HAVING (((Max(t1.evadat))=[tEVA].[evadat]) AND ((t1.evaris)=[tEVA].[evaris]))))<>False));
    La requête comporte 3 champs : Unite (entier long), indice (entier long) et Urg (octet). Ces enregistrements sont filtrés pour ne prendre dans la table tEVA que les enregistrements concernés.

    Je désire récupérer par unité le nombre d'enregistrements d'urgence 1 ou 2 ou 3, et le ratio niveau d'urgence sur total des occurrences. J'y parviens par une requête basée sur une autre requête mais les temps de traitement sont longs... par ailleurs, je souhaiterais traiter les requêtes en vba pour ne pas laisser aux utilisateurs la possibilité de les modifier.

    Avez-vous des pistes ?

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Tout d'abord le select est tout simple mais il semble faire appel aux fonctions programmées ut, indice et urgence qui elles-mêmes contiennent des select, non ?
    Pour le temps de réponse il serait probablement meilleur de faire une grosse requête autonome...

    Ensuite j'ai l'impression que le where est compliqué pour rien, non ? en effet il existe toujours me semble-t-il un enregistrement qui contient le Max(t1.evadat) de chaque evaris donc j'aurais tendance à penser que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NOT isnull(t1.evafin);
    donnerait le même résultat mais j'avoue que j'ai un peu mal à la tête

    Enfin je ne comprends pas :
    par ailleurs, je souhaiterais traiter les requêtes en vba pour ne pas laisser aux utilisateurs la possibilité de les modifier.
    car je ne sais pas faire de requêtes ailleurs qu'en vba

  3. #3
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 404
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour nico84,

    Dans l'ordre :
    1. ut et indice sont des fonctions simples (sans select) et effectivement Urg est une fonction utilisant un recordset.
    2. une grosse requête : oui, c'est ce que je cherche à faire...
    3. pour déterminer les valeurs indice et Urg, je ne prends en compte dans la table tEVA que les enregistrements de chaque evaris qui ont la date evadat la plus récente et dont la date de fin evafin n'est pas renseignée.
    4. je ne désire pas laisser trainer des requêtes enregistrées et préfère les intégrer dans les états ou les formulaires non modifiables (.mde).

    Merci de ton aide

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Alors :

    1. A quoi ressemble Urg ?

    3. Ca marche comme ça ??? Amha ça devrait être plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE tEVA.evadat = (SELECT Max(t1.evadat) AS MaxDeevadat FROM tEVA AS t1 WHERE NOT isnull(t1.evafin) and t1.evaris=tEVA.evaris)
    4. Je pensais que les requêtes d'un .mde n'étaient pas modifiables mais je découvre que oui ! Ceci dit mes utilisateurs n'ont pas accès aux requêtes grâce à cette séquence (boul est vrai seulement si l'utilisateur est admin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ChangeProperty "StartupShowDBWindow", DB_Boolean, boul
    ChangeProperty "AllowBuiltinToolbars", DB_Boolean, boul
    ChangeProperty "AllowFullMenus", DB_Boolean, boul
    ChangeProperty "AllowShortcutMenus", DB_Boolean, boul
    ChangeProperty "AllowToolbarChanges", DB_Boolean, boul
    C'est probablement la solution la plus simple mais il est aussi possible d'écrire en dur la requête "source" du formulaire dans le formulaire lui même avec cette séquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_open(Cancel As Integer)
      Me.RecordSource = "select ..."
    End Sub

  5. #5
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 404
    Points : 1 683
    Points
    1 683
    Par défaut
    Urg:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    Public Function Urgence(identifiant As Long, laDate As Date, indice As Integer) As Byte
      'Urgence(identifiant;ladate;indice)
      Dim oDb     As DAO.Database
      Dim oRst    As DAO.Recordset
      Dim vInf    As Integer
      Dim vSup    As Integer
      Dim sSQL    As String
      Set oDb = CurrentDb
      sSQL = "SELECT TOP 1 tLIM.linid, tLIM.limutr, tLIM.limdat, tLIM.liminf, tLIM.limsup " & _
        "FROM tLIM " & _
        "WHERE (tLIM.limutr = " & UT(identifiant) & " And tLIM.limdat <= #" & laDate & "#) " & _
        "ORDER BY tLIM.limdat DESC;"
      Set oRst = oDb.OpenRecordset(sSQL, dbOpenDynaset)
      vInf = oRst!liminf
      vSup = oRst!limsup
      oRst.Close: oDb.Close: Set oRst = Nothing: Set oDb = Nothing
      If indice < vInf Then
        Urgence = 3
      ElseIf indice >= vInf And indice < vSup Then
        Urgence = 2
      Else
        Urgence = 1
      End If
    End Function
    Je teste la condition pour tEVA.evadat

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    J'avoue que sans l'analyse de la base et les données sous la main je patauge...

    Dans la 1ere requête il n'y a pas une ambigüité entre l'alias Ind et le paramètre [Ind] de la fonction urgence ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/05/2011, 22h35
  2. Réponses: 2
    Dernier message: 29/06/2007, 09h37
  3. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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