Requette Acces sur interval

Bonjours,

Voila je cherche a faire une requette sour Access, entre 2 tables contenant des intervals (metrique) differents.

http://www.hebergementimages.com/images/1201532074_requette.jpg

La requette que j ai essayer d ecrire ne marche pas :frowning:

Si quelqu un a une idee, je prend :slight_smile:

Merci d’avance.

EDIT:

Je vais essayer d etre plus precis.

J’ai 2 tables differentes avec 3 champs : HOLE-ID (ca c est la clef), FROM , TO
NOM (toujours la clef), FROM, TO

(HOLE-ID= string, FROM,TO = double )
Ce que je veux c est avoir le HOLE-ID et l’interval commun entre les different FROM TO.

Ex :

dans table 1 : HOLE-ID=BLEU FROM=10 TO=20
Dans table 2: HOLE-ID=BLEU FROM=15 TO=25

Je veux avoir comme resultats 15 et 20.

Dans table 1 : HOLE-ID=VERT FROM=150 TO=560
das table 2 : HOLE-ID=VERT FROM=100 TO=160

Je veux 150 et 160.

Le truc c est que j’ai dans les 500 HOLE-ID differents, et un nombre incalculable de FROM TO differents ( dans les 20 000 lingnes dans chaque table)

Avec des interval Qui se chevauche n importe comment (c’est a dire interval dans table 2 pas toujours compris dans table1, parfois plus grand, parfois inexistant, parfois chevauche dans limite sup, parfois dans limite inf…)

C’est pas un probleme simple, et je ne suis pas dutout specialiste en language.

J’espere que mes explication sont meilleure maintenant.

Je prend toujours tout les conseil :stuck_out_tongue:

merci
Edité le 28/01/2008 à 18:07

En fait, il te faut le Max des deux FROM et le Min des deux TO ?

Non, je veux conaitre les zones d intersections. A savoir un From d’une table et le TO d’une autre (dependament des cas ca peut etre 'inverse, ou aucun cas des deux.)

A titre d’exemple voila les premiere ligne des deux tables :

Les donnees de la table1 sont :

Bleu 57.00 79.23
Rouge 45.87 51.19
Vert 34.62 41.05
Jaune 66.09 69.19
Jaune 22.95 41.76
Gris 11.89 20.28
Gris 51.38 51.82

Les donnes de la table 2 sont :

Rouge 45.87 46.94
Vert 34.63 35.97
Jaune 66.45 75.19
(donc pas de Bleu et pas de Gris)

Le resultat attendu serrait:

Rouge 45.87 46.94
Vert 34.63 35.97
Jaune 66.45 69.19

Voila si quelqu’un a une idee :smiley: je prend :wink:
Edité le 28/01/2008 à 19:43

Oui, mais comme tu as une relation entre tes deux tables, pour chaque enregistrement de ta requête tu disposes d’un [table1].[FROM] et d’un [table2].[FROM], d’un [table1].[TO] et d’un [table2].[TO]
Donc il faut que ton ENTRE s’applique à l’intervalle qui va du plus grand des deux FROM au plus petit des deux TO.

L’intervalle peut être vide, mais qu’entends-tu par ‘inverse’ ?

oui c est ca, du plus grand des From au plus petit des TO, mais dans certain cas il n’y a pas d entree correspondante dans la table2 a la table1 (Ex: couleur Bleu).

Avec le type de relation que tu as représentée dans ta copie d’écran, les valeurs ne figurant que d’un côté seront éliminées par la requête.
Ce qu’il ter faut faire, c’est travailler par étapes
1- A partir de table1, tu crées une requête de regroupement, et tu conserves les valeurs PremierDe pour chacun des champs, sauf pour FROM où tu gardes MAX, et TO où tu gardes MIN
2- Idem sur table2
3- Tu crées une requête de sélection ,avec comme sources les deux précédentes et tu établis la relation entre les champs PremierDeHole-ID

(merci de ton "obstination a m’aider :P)

Je suis pas sure d’avoir tout compris, mais je pense qu’il va y avoir un probleme. a savoir que je peux tres bien avoir plusieurs intervals Jaunes dans la table1 avec plusieurs intercections dans la table2, il me faudrait donc dans ma table resultat avoir plusieur “interval d’intersection” pour la couleur jaune.

Si j’arrive a faire ce que tu as ecris dessus, je vais uniquement conserver len “FROM max” et les “TO min” pour chaque couleur ?

Je me demande si je pourrais pas faire des boucle avec des IF ? j’ai souvenir de quelques trucs que j ai vaguement ecouter quand j etais a la fac sur les boucles :S Je sais pas si Acces accepte ce genre de chose ?

Je pourrais peut etre ecrire un truc du genre :

Select [table1.]NOM , [table1].from, [table1].to
IF [table1].from,to contains [table2].from then keep [table2].from
esleif
[table1].from,to contains [table2].to then keep [table2].to
esleif
[table2].from,to contains [table1].from then keep [table1].from
elseif
[table2].from,to contains [table1].to then keep [table1].to
End;

C’est de la science fiction ce que j’ecris ?

J’etais en geol pas en info :stuck_out_tongue:

Encore merci :stuck_out_tongue:
Edité le 28/01/2008 à 22:49

“Si j’arrive a faire ce que tu as ecris dessus, je vais uniquement conserver len “FROM max” et les “TO min” pour chaque couleur ?”
Oui, bien sûr, puisqu’il s’agit d’une requête de regroupement.
Si cette notion ne t’est pas familière, regarde dans l’aide, et n’hésite pas à demander des précisions si besoin.

Par contre, je ne dois pas avoir compris exactement le problème, par rapport à ta remarque
“il me faudrait donc dans ma table resultat avoir plusieur “interval d’intersection” pour la couleur jaune.”

Je me suis basé sur ton exemple : au résultat, il n’y avait qu’une seule ligne avec ‘jaune’

Bonjour,

Me revoila :wink:

Pour t eclairer et reprendre l’exemple de facon plus total :

Bleu 57.00 79.23
Rouge 45.87 51.19
Vert 34.62 41.05
Jaune 66.09 69.19
Jaune 22.95 41.76
Gris 11.89 20.28
Gris 51.38 51.82

Les donnes de la table 2 sont :

Rouge 45.87 46.94
Vert 34.63 35.97
Jaune 35.00 70.00
(donc pas de Bleu et pas de Gris)

Le resultat attendu serrait:

Rouge 45.87 46.94
Vert 34.63 35.97
Jaune 35.00 41.76
Jaune 66.09 69.19

Pour essayer d’expliquer verbalement, il peut y avoir plusieurs interval pour une meme couleur dans la table1 et plusieurs intervals pour une meme couleur dans la table2.

Il est possible que l’interval dans la table 2 couvre totalement, partiellement (en debordant des limites ou pas) ou pas dutout l’interval dans la table 1.

C’est un inventaire. La table 1 correspond a ce que tu sais (vieux fichier de donnee), la table 2 a ce que tu as retrouve(physiquement). Ce que tu sais n’est pas forcement forcement retrouve, et ce que tu as retrouve tu ne le savais pas forcement. Moi ce que je veux, c est ce que je sais ET que j’ai retrouve.

Je sais pas si je suis tres clair ?

En tout cas merci encore :stuck_out_tongue:
Edité le 29/01/2008 à 14:50

Pour qu’Access fonctionne correctement, il faut que tu saches lui donner des relation non ambigües entre les deux tables.
Dans ton cas, la difficulté sera de lui indiquer qu’il faut qu’il associe l’élément ‘jaune’ de la table2 au deuxième de la table1 et uniquement à celui-ci.
Peux-tu indiquer quelle règle tu te fixes pour arriver à ce résultat ?

Ensuite, il faut voir si les règles que tu te fixes sont directement transcriptibles en relations et en critères;
sinon, il te faudra passer par du VBA

lol

Moi qui pensais que se serait simple…

Apparement c’est complique, et surtout c’est trop complique pour moi.

Je pense que je vais faire tout ca a la main, ca serra long, mais se serra fait :stuck_out_tongue:

En tout cas merci beaucoup pour ton Aide gcc :slight_smile:

Non ce n’est pas compliqué ;
Il faut simplement bien poser les règles au départ.
Si tu arrives à mettre noir sur blanc toutes les conditions qui font que tu choisis “spontanément” telle solution plutôt que telle autre, c’est gagné.
A ta place je n’abandonnerais pas tout de suite, ça commence juste à être intéressant

lol, interessabt…

Bon donc je vais continuer :stuck_out_tongue:

le truc c’est simple.

Dans la table1 j’ai des intervals qui correspondent a diferentes couleurs. Il peut y avoir plusieurs intervals par couleur.

Dans la table 2 (c’est la meme choses), j’ai des intervals qui correspondent a diferentes couleurs. Il peut y avoir plusieurs intervals par couleur.

Mais les intervals dans la table 2 sont differents des intervals dans la table 1.

Cependant certains intervals entre la table 1 et la table 2 peuvent se “chevaucher”.

Ben moi je veux connaite ces intervals “chevauchant” pour chaque couleur.

La c’est plus clair ? :stuck_out_tongue:

Oui, c’est très clair
C’est ce que j’avais compris la première fois, mais ton second exemple m’a un peu perturbé car il ne respecte pas ces hypothèses :

et dans ton exemple,
table 1

Jaune 66.09 69.19
Jaune 22.95 41.76

table2

Jaune 35.00 70.00

résultat

Jaune 35.00 41.76
Jaune 66.09 69.19

il n’y a pas chevauchement pour la valeur en gras

Sisi ca se chevauche :stuck_out_tongue:

J ai fais un super dessein Paint (dsl pour la qualite pourrie de l image :P) pour illustrer un certains nombres de cas. Mais j imagine qu il y a d autres cas. (l’exemple jaune est reprit, les autres couleurs sont fictives dans les chiffres)

http://www.hebergementimages.com/images/1201634215_explication.JPG

J’espere que tu comprends un peu mieu, sinon je reverrais ma copie :stuck_out_tongue:

En tout cas je te remercie vraiment de ton aide. C’est vraiment sympa…
Edité le 29/01/2008 à 20:20

Effectivement, rien ne vaut un bon dessin pour s’expliquer.
Je n’avais pas envisagé qu’une valeur de table2 puisse servir de référence à 2 valeurs de table1.
Il y a plusieurs façons de faire, il faut que je prenne le temps de voir laquelle est la plus simple à mettre en oeuvre (tout en évitant le VBA, si possible)

Il faut que tu crées une requête de sélection de la manière suivante :
Tables : table1 et table2
Relation : champs HOLE-ID
Eléments :
HOLE-ID
Table1.FROM
Table1.TO
Table2.FROM
Table2.TO
IntervalleMIN
IntervalleMAX

tu effaceras éventuellement ce qui est en trop plus tard
IntervalleMIN ET INTERVALLEMAX sont des champs calculés ; donc dans champ, tu tapes
IntervalleMIN: VraiFaux([Table1].[FROM]<[Table2].[FROM];[Table2].[from];[Table1].[FROM])
IntervalleMax: VraiFaux([Table1].[TO]>[Table2].[TO];[Table2].[TO];[Table1].[TO])

si tu as une version internationale, tu remplaces VraiXFaux par iif

J’arrive pas a rentrer correctement les choses,

A savoir que mes tables s’appelle en vrai : INT0pt5 et Dispo (ya pas vraiment d importence dans laquelle j appelle 1 et laquelle j appelle 2 … ? )

J’ai fait comme tu as dis (enfin comme j ai compris :p) j’ai rajouter le champ IntervalleMIN (INTMin dans la table INT0pt5)

SELECT Dispo.[HOLE-ID], Dispo.FROM, Dispo.TO, INT0pt5.FROM, INT0pt5.TO, INT0pt5.INTMax, INT0pt5.INTMin
FROM INT0pt5 INNER JOIN Dispo ON INT0pt5.[HOLE-ID] = Dispo.[HOLE-ID]
WHERE (((INT0pt5.INTMin) iif([INT0pt5].[FROM]<[Dispo].[FROM];[Dispo].[from];[INT0pt5].[FROM])))
WHERE (((INT0pt5.INTMax) iif ([INT0pt5].[TO]>[Dispo].[TO];[Dispo].[TO];[INT0pt5].[TO])));

Il me dit qu il y a un probleme de synthaxe dans ma requette. J’imagine que ca viens de " ; " en trop dans les parties " WHERE" ?

Tu as fait ta requête en mode création ou en mode select ?
Si on fait confiance à Access, (mode création) la traduction en select devrait donner
SELECT Dispo.[HOLE-ID], Dispo.FROM, INT0pt5.FROM, Dispo.TO, INT0pt5.TO,
IIf([Dispo].[FROM]<[INT0pt5].[FROM],[INT0pt5].[from],[Dispo].[FROM]) AS IntervalleMin,
IIf([Dispo].[TO]>[INT0pt5].[TO],[INT0pt5].[TO],[Dispo].[TO]) AS IntervalleMax
FROM Dispo INNER JOIN INT0pt5 ON Dispo.[HOLE-ID] = INT0pt5.[HOLE-ID];
Edité le 30/01/2008 à 16:11

ahah :stuck_out_tongue:

Ca avance dans le bon sens !!!

Je pense que j’ai un resultat sufisant pour moi. Il y a encore des erreurs mais je peux facilement les corriger sous Exell.

Maintenant comme j’ai l’impression que tu prends casiment ca comme un defis que tu te lances :wink:
Je te mets quelques ligne des resultats faux:

HOLE-ID Dispo.FROM INT0pt5.FROM Dispo.TO INT0pt5.TO IntervalleMin IntervalleMax
1…235.04…213.0432027…236.45…219.1335181…235.04…219.1335181
2…520.67…537.0996595…521.16…540.0295482…537.0996595…521.16
3…332.99…350.124671…334.09…352.3500651…350.12467…334.09
4…61.81…42.80788069…62.42…45.73544027…61.81…45.73544027
5…42.98…64.61984644…48.46…69.18986816…64.61984644…48.46
6…36.24…55.57886019…39.32…61.17765664…55.57886019…39.32

Je te mets aussi quelques resultats juste :wink: :

HOLE-ID…Dispo.FROM…INT0pt5.FROM …Dispo.TO…INT0pt5.TO…IntervalleMin…IntervalleMax

9…234.7…231.5564847…245.39…245.3900082…234.7…245.39
10…8.29…0…18.17…18.16904664…8.29…18.169
11…66.75…66.74692031…75.9…78.93293025…66.75…75.9

Je sais pas si tu vas continuer a regarder, ou si tu vas aller aider d’autre,

Mais en tout cas je te remerci mille fois !!! tu m’evites d avoir a passer de longues heures a faire ca ligne par ligne !!!

merci beaucoup et a plus pour un autre probleme :wink: