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

Modélisation Discussion :

MCD et gestion de données en fonction de dates [AC-2003]


Sujet :

Modélisation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut MCD et gestion de données en fonction de dates
    Bonjour,
    Je ne sais pas trop où poser ma question car j'aurais besoin de conseils pour me guider.

    J'ai des mesures d'indice de chloration et de consommation d'eau pour plusieurs stations. Ces mesures sont réalisées une fois par semaine pour chaque station. Cependant, il peut qu'il se passe plusieurs semaines sans qu'il y ait de mesures pour certaines stations.

    L'objectif est de suivre l'évolution de la consommation d'eau au fil du temps pour déceler d'éventuels problèmes de fuites. Je souhaiterais donc réaliser un formulaire qui permettrait de saisir la date précise du relevé, l'indice de chloration et la consommation en eau. J'aurais aussi des champs calculés: c'est à dire la quantité d'eau consommée entre la date saisie et la date correspondant au dernier relevé, ainsi que la moyenne de consommation (quantité d'eau consommée/nombre de jours entre les deux relevés).
    Tout d'abord, est-ce que mon MCD vous semble bon.

    Ensuite comment puis-je faire avec mes deux champs calculés? Dois-je les créer en dur dans ma base, est-il possible de les calculer automatiquement? (en sachant que l'on peut avoir une date pour le relevé de chloration pas de relevé de consommation pour cette même date, donc suivant mon MCD actuel, des cases vides pour certaines dates.)

    Je ne sais pas si je suis très claire, mais n'hésitez pas à me demander des précisions. (ci joint mon MCD, et un exemple excel de mes données)
    En vous remerciant d'avance.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Bonjour

    Si j'ai bien compris, tu souhaite pouvoir saisir les différents relevés effectués dans chaque station et faire ensuite des calculs de consommation, pour une station donnée, entre deux date données.

    Une première question. Pourquoi souhaites utiliser Access ? A tu rencontré une limite dans Excel pour ton problème ?

    Ensuite, ton modèle ne me semble pas conforme. La table date ne me semble pas nécessaire. Tout au plus devrais tu avoir besoin d'une table Stations et d'une table de relevé des mesures.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    @jncoffy

    Citation Envoyé par jncoffy
    La table date ne me semble pas nécessaire. Tout au plus devrais tu avoir besoin d'une table Stations et d'une table de relevé des mesures
    En effet, car au niveau du schéma relationnel l’objectif est d’obtenir quelque chose comme :

    Une table ne comportant que des dates a peu d’intérêt ici sauf à vouloir générer un calendrier.

    A noter le champ DateReleve inclue dans la clé primaire {idStation, DateReleve} si on doit considérer qu’une station a au plus un relevé à effectuer à une même date (la clé primaire ne pouvant présenter de doublons).

    Seulement, quel est le MCD dont est dérivé ce schéma ?

    Si tu dois passer par un logiciel comme l’a fait Rainette, tu es obligé de passer par une entité DateRelevé (au niveau conceptuel on ne parle pas encore de table mais d’entité).
    Par exemple avec Win’Design avec un MCD très proche de celui de Rainette :

    Bien sûr il ne faudra pas oublier, avant de générer le MLD, de cocher la bonne option pour que le logiciel ne génère pas de table DateReleve à partir de l'entité Datereleve (Arf, comment on fait ça déjà sous win’design ?)

    @rainette
    Citation Envoyé par rainette
    Ensuite comment puis-je faire avec mes deux champs calculés? Dois-je les créer en dur dans ma base, est-il possible de les calculer automatiquement?
    Puisqu’ils peuvent être calculés, il est à priori inutile de les stocker dans des champs supplémentaires de la table.

    Tu peux commencer par construire les requêtes nécessaires avec les assistants puis créer des fonctions VBA qui vont exploiter ces requêtes. Il faudra éventuellement se méfier du cas NULL avec la fonction Nz, à voir.

    Pour afficher une valeur calculée dans un formulaire dépendant, il suffit de créer une zone de texte avec un contenu du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NomDeLaFonction([idStation], [DateReleve])
    J'essaierai de repasser si besoin…

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci de vos réponses.
    Citation Envoyé par jncoffy Voir le message
    Une première question. Pourquoi souhaites utiliser Access ? A tu rencontré une limite dans Excel pour ton problème ?
    J'utilise un logiciel qui sera relié à une base de donnée ACCESS.
    Mais si c'est plus simple à réaliser sous excel, pourquoi pas, mais j'aurais de toutes façons besoin de les importer dans Access.

    Ensuite, c'est vrai que comme l'avait compris jncoffy, j'aurais fait une table date à part. Etant donné que j'ai la même date qui se répète pour toutes mes stations, j'avais résonné comme ça. Et effectivement, je souhaiterais intégrer une fonction calendrier dans mon formulaire.

    f-leb : Pour mes calculs, je ne vois pas du tout comment obtenir la soustraction (requête ou code) entre mes deux dates...

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    par exemple une fonction VBA qui recherche l'index précédent une date pour une station donnée:

    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
    Public Function IndexPrecedent(NumStation As Long, DateActuelle As Date) As Double
     
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
     
    Set db = CurrentDb
     
    strSQL = "SELECT TOP 1 Relever.[Index] AS IndexPrecedent FROM Relever " & _
    "WHERE (Relever.[Index] Is Not Null And Relever.DateReleve < #" & Format(DateActuelle, "mm/dd/yyyy") & _
    "# AND Relever.idStation =" & NumStation & ")" & _
    " ORDER BY Relever.DateReleve DESC;"
     
    Set rst = db.OpenRecordset(strSQL)
     
    If Not rst.EOF Then IndexPrecedent = rst!IndexPrecedent
    End Function
    puis une requête SELECT qui reprend la fonction pour faire la soustraction Index-IndexPrecedent comme dans ton tableau Excel:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Relever.idStation, Relever.DateReleve, Relever.Index,
     IIf(IndexPrecedent([idStation],([DateReleve]))=0,Null,[Index]-IndexPrecedent([idStation],([DateReleve]))) AS conso
    FROM Relever WHERE idStation=1 ORDER BY Relever.DateReleve;

    faudra sans doute peaufiner tout ça, j'ai fait un peu vite...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Pour ma part je me pose une question.

    Existe t'il un moyen dans une requête RQBE d'avoir un champ calculé qui utilise une donnée de l'enregistrement précédent.
    Su Excel il est tout bête de faire calcul en utilisant un élément de la ligne précédent, mais sous Access, comment par exemple calculer le nombre de jours écoulés entre la date du dernier enregistrement et celle de l'enregistrement précédent ?
    Et comment disposer d'une colonne Total qui fasse la somme, après chaque enregistrement, des enregistrements précédents ?

    C'est possible sans passer par le langage SQL ?

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par jncoffy
    Sur Excel il est tout bête de faire calcul en utilisant un élément de la ligne précédent…
    La difficulté dans Access (dans tout SGBDR en général) c’est que les lignes d’une table ne sont pas ordonnées. La seule possibilité de tri dont dispose rainette est celle avec la date du relevé.

    De plus, comme les relevés ne sont pas forcément à intervalles réguliers, la ligne "précédente" ne peut être calculée à partir de la ligne "en cours". Dommage !
    Bref, en pur SQL il faut passer par un jeu de requête/sous-requête jointes ou corrélées qui fait un peu mal à la tête.

    Citation Envoyé par jncoffy
    comment par exemple calculer le nombre de jours écoulés entre la date du dernier enregistrement et celle de l'enregistrement précédent ?
    par exemple avec une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LaTable(idEnregistrement, DateEnregistrement, valeur)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T.DateEnregistrement, 
    (SELECT TOP 1 DateEnregistrement FROM LaTable 
     WHERE DateEnregistrement<T.DateEnregistrement ORDER BY DateEnregistrement DESC) 
             AS DateEnregistrementPrecedent
     FROM LaTable T ORDER BY T.DateEnregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DateEnregistrement	DateEnregistrementPrecedent
          01/01/2010	
          05/01/2010	         01/01/2010
          10/01/2010	         05/01/2010
          30/01/2010	         10/01/2010
    Citation Envoyé par jncoffy
    Et comment disposer d'une colonne Total qui fasse la somme, après chaque enregistrement, des enregistrements précédents ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T.DateEnregistrement, T.Valeur,
     (SELECT Sum(Valeur) FROM LaTable WHERE
     DateEnregistrement<=T.DateEnregistrement) AS TotalCumul FROM LaTable T
     ORDER BY T.DateEnregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DateEnregistrement    Valeur    TotalCumul
    01/01/2010 	      10 	    10
    05/01/2010 	      20 	    30
    10/01/2010 	      40 	    70
    30/01/2010 	      50 	    120
    Heureusement, dans les requêtes Access on peut employer des fonctions VBA. Dans le problème de rainette, j’ai pu ainsi m’en tirer sans trop de mal en décomposant le problème avec deux requêtes SELECT assez simples.

    Citation Envoyé par jncoffy
    C'est possible sans passer par le langage SQL ?
    Ben je vois pas, difficile de s’en passer dans un SGBD…Il y a bien les fonctions de domaines VBA dlookup, dsum,… (des SELECT avec une syntaxe allégée)
    Par contre comme je l’ai dit précédemment, on peut toujours décomposer le problème en problèmes plus simples…

    Je me rends compte que c’est pas si simple finalement mais je vois pas comment faire autrement

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour,
    Je m'excuse de n'avoir pas donné de nouvelles depuis mon dernier post, mais je n'ai pas eu le temps de me repencher sur le problème.

    Ne maitrisant pas la programmation, je ne sais pas par quel bout commencer...
    Voici ma démarche:
    J'ai créé dans Access un module dans lequel j'ai mis la fonction VBA recherchant l'index précédent pour une date pour une station donnée.
    Puis, j'ai créé la requête SELECT qui appelle la fonction.
    Mais lorsque j'execute la requête, j'ai seulement une ligne vide qui apparaît.
    Est-ce qu'il y a quelque chose que je fais mal, une étape que j'ai ratée ou autre?
    Merci d'avance.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Me rappelle plus trop moi depuis le temps...

    Tu parles de la fonction et de la requête du message #5, c’est ça ?

    Dans la fenêtre d’exécution de l’éditeur VBA (CTRL+G), fait un test d’affichage du résultat de la fonction en tapant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? IndexPrecedent(1, #08/11/2010#)
    en adaptant avec un numéro de station et une date (date au format US, mm/jj/aaaa) compatibles avec tes données.
    Sur la ligne juste en-dessous devrait s’afficher l’index de la station n°1 précédent la date du 11/08/2010.

    Si ce n’est pas le cas, poste le code de la fonction. Il y a sans doute une 'tite boulette qui doit traîner …

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par f-leb
    Me rappelle plus trop moi depuis le temps...
    Oui, c'est clair.

    Citation Envoyé par f-leb
    Tu parles de la fonction et de la requête du message #5, c’est ça ?
    Je parles bien du message #5.
    Je viens de tester ce que tu disais. Il devait y avoir une petite erreur qui s'était glissée dans le code. En le recopiant à nouveau, cela fonctionne!

    Un grand merci!

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

Discussions similaires

  1. [AC-2007] Récupérer des données en fonction de date la plus récente
    Par m6riil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/04/2013, 20h42
  2. Gestion de couleurs en fonctions de données en base de données
    Par exopartners dans le forum Silverlight
    Réponses: 8
    Dernier message: 08/04/2010, 13h06
  3. Gestion des données modifiables en fonction du rôle
    Par matsin dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 10/02/2010, 11h14
  4. Réponses: 9
    Dernier message: 17/04/2004, 16h32
  5. Réponses: 3
    Dernier message: 24/11/2003, 17h41

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