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 :

Requete gestion historique [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut Requete gestion historique
    Bonjour,

    Voila je suis face un probleme de creation d'une requete ou du moins d'optimisation pour la gestion d'une sorte d'hsitorique.

    J'ai une table tasks
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID | parentID | tnID | Delete
     1 |      1      |   2   |  False
     2 |      1      |        |  False
     3 |      1      |   4   |  False
     4 |      4      |   5   |  False
     5 |      5      |   1   | True
     6 |      5      |   5   | True
    Chaque task a donc un ID unique.
    Si une tache est une mise a jour d'une autre, parentID contient l'ID de son createur (1,2,3) ; sinon elle contient son propre ID (4).
    tnID permet de faire un "freeze dans le temps. Il me permet de recuperer toutes les taches a un moment donne. S'il y a un saut dans les tnID, c'est qu'il faut prendre le directement superieur.
    Delete me permet de savoir si la tache a ete supprime. Que je viens de rajouter c'est entre qutre lui qui pose probleme.

    J'ai cree deux requetes :
    Lire les derniers tasks a jour (sans le vert)
    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
    SELECT tasks.ID, tasks.parentID
    FROM tasks
    WHERE tasks.ID IN (
    	SELECT Max(tasks.ID) AS ID
    	FROM (
    		SELECT tasks.parentID
    		FROM tasks WHERE tasks.ID <> tasks.parentID AND delete=false GROUP BY tasks.parentID
    	) A INNER JOIN tasks ON A.parentID = tasks.parentID
    	GROUP BY tasks.parentID
    )
    
    UNION SELECT tasks.ID, tasks.parentID
    FROM tasks
    WHERE tasks.parentID NOT IN (
    	SELECT tasks.parentID
    	FROM tasks WHERE tasks.ID <> tasks.parentID GROUP BY tasks.parentID
    ) AND delete=false;
    Elle se decompose grossierement en deux parties, les dernieres tasks qui ont au moins ete mise a jour une fois; UNION celle qui ne l'ont jamais ete


    Une deuxieme me permettant de recuperer le "freeze":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT MIN(id) AS idn 
    FROM   tasks 
    WHERE  parentid NOT IN (SELECT parentid 
                            FROM   tasks 
                            WHERE  tasks.tnid = Numissue()) 
           AND tasks.tnid > Numissue() 
    GROUP  BY parentid 
    UNION 
    SELECT tasks.id 
    FROM   tasks 
    WHERE  tasks.tnid = Numissue();
    Toujours en deux parties, le premier recuperer les task ayant un tnID directement superieur a l'ID demande, la deuxieme les task ayant pile le bon tnID.
    Comme vous l'avez vus, elle fait appel a une fonction, numIssue qui me renvoi l'ID de l'issu a afficher. J'ai ete contraint de passer par cette methode car j'utilise cette requete en recordsource d'une requete et donc impossible d'y mettre une requete parametre, avec la valeur de son parametre (ou bien je me trompe ?!)...

    Le probleme c'est qu'avec ce systeme il m'est impossible de supprimer une task c'est pourquoi j'ai cree le champs delete, que je rempli a true lorsqu'une tache a ete supprime. Cela n'affecte donc que la requete derniere tasks a jour qui devient tout simplement la precedente avec le vert..

    Je passe en recordsource, c'est deux requetes de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM tasks AS A INNER JOIN tasksLastUpdated AS T ON T.ID = A.ID;
    et
    SELECT * FROM tasks AS A INNER JOIN tasksByTnID AS T ON T.idn = A.ID
    En ayant pris soin, de changer mon numIssue lorsque j'appel ma deuxieme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Dans un module
    Global numberIssue As Integer
    Public Function numIssue() As Integer
        numIssue = numberIssue
    End Function

    Donc mon probleme vient du fait maintenant que je souhaite inserer en plus dans ces requetes, un delta. Qui m'affiche N si la task est nouvelle, M si elle est modifie, et S si elle est supprime.
    Mes fonctions le permettrai il suffirait ´de voir si un ID appartient a tasksByTnID[x] et pas a tasksByTnID[x-1].
    Le probleme c'est que ce tasksByTnID fais appel a une fonction VBA, dont je ne peux changer sa fonction que par le code VBA, et pas dans une requete.

    Je ne vois pas comment faire....


    Et je viens egalement de voir en redigant ce topic un autre probleme, si je souhaite ajouter une nouvelle task seulement a partir de la tnID 3
    ID | parentID | tnID | Delete
    7 | 7 | 3 | False
    Ma requete tasksByTnID[2] me la retournera .... alors qu'elle ne devrai pas... ERF

    Si quelqu'un a l'amabilite de m'aider dans ma reflexion je serais ravi

    Merci.

    Gabvoir

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Hello,

    Bon voila 2 jours que je bosse sur l'optimisation de mes requetes, et effectivement c'etait vraiment nul ce que j'avais fais lol

    Ma requete de selection des dernieres taches a jours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT parentID, Max(tasks.ID) AS ID
    FROM tasks
    WHERE delete=false
    GROUP BY tasks.parentID;
    et ma requete de selection d'un freeze :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MIN(id) AS idn 
    FROM   tasks 
    WHERE  tasks.tnid >= numIssue()
    GROUP  BY parentid ;
    Cependant je suis toujours bloqué afin que je puisse dans la requete d'un freeze je puisse recupere, l'etat d'avant afin de pouvoir faire un "delta".
    J'avais pensé faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT bouh(1,[idn]) AS ID
    FROM tasksByTnID;
    avec dans un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Global numberIssue As Integer
     
    Public Function numIssue() As Integer
        numIssue = numberIssue
    End Function
    Public Function bouh(id As Integer, field As String) As String
    numberIssue = id
    bouh = field
    End Function
    Le seul probleme c'est que Access selectionne d'abord la table puis les champs a lire, et donc la requete taskByTnID recupere le numIssue d'avant ...
    Donc javais pensé a faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT idn
    FROM bouh(3,tasksByTnID);
    Mais ca ne fonctionne pas....
    Une petite idee de comment je pourrais faire ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    J'ai fini par dupliquer ma requete de freeze,

    la solution complete est la :

    http://www.developpez.net/forums/d11...on-2-requetes/

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

Discussions similaires

  1. Gestion historique infocentre RH
    Par Seperpiou dans le forum Conception/Modélisation
    Réponses: 9
    Dernier message: 29/02/2012, 13h54
  2. Requete gestion livres
    Par rehan974 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/04/2007, 10h21
  3. Gestion Historique des données dans une table
    Par popof60 dans le forum Access
    Réponses: 3
    Dernier message: 16/02/2007, 15h56
  4. Réponses: 7
    Dernier message: 05/09/2006, 08h56
  5. Requête de sélection --> Gestion Historique ...
    Par snoopy69 dans le forum Access
    Réponses: 21
    Dernier message: 29/11/2005, 16h10

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