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 07/08/2011, 14h03   #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 Intersection 2 requetes

Hello,

Bon je bloque sur un (autre) probleme.
Je simplifie le problème :
J'ai une table tasks
ID | parentID | tnID | name
Parent ID me permet de faire un historique des tasks, mais cela importe peu ici

J'ai une requete taksByTN
Code :
1
2
3
4
SELECT MIN(id) AS idn 
FROM   tasks 
WHERE  tasks.tnid >= numIssue()
GROUP  BY parentID
Avec cette fonction numIssue qui renvoi simplement le tnID que lon souhaite visualise.
Jusque la pas de probleme

Le probleme arrive lorsque je souhaite faire un DELTA sur les requetes.
En gros je souhaite que lorsque je recupere la tnID 3 savoir si la tasks etait dans la 2.
J'ai tenté quelque chose du genre :

Code :
1
2
3
4
5
SELECT tasks.ID, 
IIf(Exists (SELECT idn FROM taksByTN WHERE tasks.ID = taksByTN.idn),"M","N") AS Mod, *
FROM tasks
WHERE [ID] In (SELECT idn FROM taksByTN);
Mais cela ne fonctionne pas, il me compte tasks.ID comme un parametre et me demander de le rentrer a la main.

Ici je ne souhaite pas m'occuper de comment on change le numIssue(), c'est le sujet d'un autre topic, et donc le premier renvoi de taksByTN n'est pas le meme que le deuxieme.

Merci de votre aide
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 13h06   #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
J'avais pensé a un DLookUp mais je prefere au maximum ne pas m'en servir.

Donc si vous avez des idees comment faire cette intersection ?!

Je vous remerci
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 17h59   #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
Bon et bien j'ai fini par copier ma requete tasksByTN

Code :
1
2
3
4
5
6
7
8
9
10
11
'tasksByTN
SELECT MIN(id) AS idn, parentID
FROM   tasks 
WHERE  tasks.tnid >= numIssue()
GROUP  BY parentID
 
'tasksByTNPrev
SELECT MIN(id) AS idn, parentID
FROM   tasks 
WHERE  tasks.tnid >= numIssue()-1
GROUP  BY parentID
Et j'utilise un DCount ...
Code :
1
2
3
SELECT [tasks.ID] AS ID, IIf(DCount('idn','tasksByTNPrev','parentID=' & [parentID])=0,"N",IIf(DCount('idn','tasksByTNPrev','idn=' & [ID])=0,"M","S")) AS Mod, *
FROM tasks
WHERE [ID] In (SELECT idn FROM tasksByTN);
C'est pas trop optimisé mais ca marche ...

Merci pour mon aide
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 18h11   #4
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Je suis content de voir que tu as trouvé une solution.

Je t'aurais volontier aidé, mais je n'ai malheureusement pas la capacité de le faire.

ps: pourquoi souhaites-tu éviter le DLookup?
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 18h21   #5
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
Hey hey
Merci de tes encouragements !

Le DLookup est une fonctione domaine de Access, elle fait donc appel a des caracteristique intraseque de Access. Et j'avais lu qu'au niveau performance il vallait mieux eviter de s'en servir quand cela etait possible.

Et puis etant donné qu'un jour je souhaite connecter ma base actuel access a une base SQL je ne sais pas trop ce que cela donnera ...
gabvoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 18h43   #6
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
C'est bon à savoir. Car j'utilise cette fonction à pas mal d'endroits pour mon projet. Je vais garder ça à l'esprit.

Un collègue m'avait proposé une alternative en utilisant des fonctions ADO/DAO mais ça me semblait bien compliqué. C'était finalement peut être mieux. Bref, je vais pas polluer ton sujet
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 18h51   #7
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
Effectivement DAO/ADO sont bien plus performante:

Voir :
http://access.developpez.com/faq/?pa...#PerfRstDomain

Il ne reste plus qu'a voir si la creation de ces propres fonctions de domaine ne serait une bonne idee.
Du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function DDLookUp(field as string, table as string, criteria as string) as string
dim db as DAO.database
dim rst as DAO.recordset
dim strRqt as string
 
strRqt = "SELECT TOP 1 " & field & " FROM " & table & " WHERE " & criteria
set db = currentDB
set rst = db.OpenRecordset(strRqt, DbOpenSnapShot)
 
DDLookUp = rst.fields(field).value
 
set db = nothing
set rst = nothing
End Function
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 12h53.


 
 
 
 
Partenaires

Hébergement Web