Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2011, 09h17   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
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 :
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 :
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 :
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 :
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 :
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
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2011, 12h45   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
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 :
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 :
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 :
1
2
SELECT bouh(1,[idn]) AS ID
FROM tasksByTnID;
avec dans un module :
Code :
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 :
1
2
SELECT idn
FROM bouh(3,tasksByTnID);
Mais ca ne fonctionne pas....
Une petite idee de comment je pourrais faire ?
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 18h23   #3
Membre du Club
 
Inscription : juillet 2006
Messages : 85
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 85
Points : 41
Points : 41
Envoyer un message via MSN à gabvoir
J'ai fini par dupliquer ma requete de freeze,

la solution complete est la :

http://www.developpez.net/forums/d11...on-2-requetes/
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h26.


 
 
 
 
Partenaires

Hébergement Web