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
Chaque task a donc un ID unique.
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
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)
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
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;
Une deuxieme me permettant de recuperer le "freeze":
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.
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();
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 :
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 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
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
Partager