Requête SQL. - Programmation
Marsh Posté le 16-05-2002 à 09:30:25
HappyHarry a écrit a écrit : tu fais koi exactement ? |
ben en fait g une grosse requête sql bien immense, avec plein de iif, des jointures, des requêtes imbriquées, etc... mais on dirait qu'elle est trop grosse...
sans entrer dans le détail, voilà... y'a t'il moyen de remédier à cela ??
Marsh Posté le 16-05-2002 à 10:22:53
j'imagine que tu fais ta requete dans l'assistant requete d'access en mode création
et si tu la faisais directement en mode SQL ? je me souviens avoir tapé des requetes immenses sans aucun prob
Marsh Posté le 16-05-2002 à 10:32:33
Harkonnen a écrit a écrit : j'imagine que tu fais ta requete dans l'assistant requete d'access en mode création et si tu la faisais directement en mode SQL ? je me souviens avoir tapé des requetes immenses sans aucun prob |
Harkonnen fidèle au poste !!
ben en fait je crée la requête sous vba en faisant un createquerydef, ms ça revient au mem paske après je suis allé la modifier en mode dsl et ca change rien
au fait g vérifié dans les restrictions d'access, et une requete sql peut faire 64000 caractères, donc c pas ça. il semblerait que ce soit au niveau du nombre de caractères dans une cellule de grille d'interrogation qui est limité à 1024, et c ça qui plante ! as tu une idée de ce que c'est ?
Marsh Posté le 16-05-2002 à 10:55:33
la grille d'interrogation doit etre la grille qui te permet de faire une requete en mode création, en faisant glisser les champs de la table
c'est pour ça que tu devrais faire ta requete directement en mode SQL dans access je pense, à la mimine
Marsh Posté le 16-05-2002 à 10:58:26
Harkonnen a écrit a écrit : la grille d'interrogation doit etre la grille qui te permet de faire une requete en mode création, en faisant glisser les champs de la table c'est pour ça que tu devrais faire ta requete directement en mode SQL dans access je pense, à la mimine |
ouais mais la actuellement je suis en mode sql, et ça ne marche pas mieux.
il faudrait que cette requete se fasse automatiquement en cliquant sur un bouton, c'est pour ça que je la fais par vba.
si je te montre la requête , tu peux trouver l'erreur potentielle ??
Marsh Posté le 16-05-2002 à 10:59:43
envoie toujours
Marsh Posté le 16-05-2002 à 11:06:11
ok, surtout ne t'effraie pas ...!!
SELECT INCIDENT.date, nomSource, RUE.nomRue, QUARTIER_ELU.nomQuartierElu, QUARTIER.nomQuartier, catIncident, INCIDENT.description
FROM INCIDENT, QUARTIER_ELU, RUE, QUARTIER, SOURCE, CAT_INCIDENT
WHERE INCIDENT.numQuartierElu=QUARTIER_ELU.numQuartierElu AND SOURCE.numSource = 2^(chercheSelection(INCIDENT.numSource , 20)) AND INCIDENT.numRue= RUE.numRue AND INCIDENT.numQuartier=QUARTIER.numQuartier AND CAT_INCIDENT.catIncident = iif(INCIDENT.agression =0,iif(INCIDENT.vol =0,iif(INCIDENT.incendie =0 , iif(INCIDENT.dégradation =0,iif(INCIDENT.comportement =0,iif(INCIDENT.problèmes =0,iif(INCIDENT.regroupements =0,iif(INCIDENT.éclairage =0,SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 9 AND numCatIncident = 2^chercheSelection(INCIDENT.divers, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=9) ,'Eclairage public',SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 7 AND numCatIncident = 2^chercheSelection(INCIDENT.regroupements, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=7)),SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 6 AND numCatIncident = 2^chercheSelection(INCIDENT.problèmes, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=6)),SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 5 AND numCatIncident = 2^chercheSelection(INCIDENT.problèmes, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=5)), SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 4 AND numCatIncident = 2^chercheSelection(INCIDENT.dégradation, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=4)),SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 3 AND numCatIncident = 2^chercheSelection(INCIDENT.incendie, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=3)),SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 2 AND numCatIncident = 2^chercheSelection(INCIDENT.vol, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=2)),SELECT catIncident FROM CAT_INCIDENT WHERE typeIncident = 1 AND numCatIncident = 2^chercheSelection(INCIDENT.agression, SELECT COUNT(*) FROM CAT_INCIDENT WHERE typeIncident=1));
tu comprends mieux le pb ????
Marsh Posté le 16-05-2002 à 11:08:14
ouh putain........
Marsh Posté le 16-05-2002 à 11:10:09
cette requete se "compile" normalement sous access, sans erreur ?
Marsh Posté le 16-05-2002 à 11:14:17
Harkonnen a écrit a écrit : cette requete se "compile" normalement sous access, sans erreur ? |
qu'entends tu par se compile ?
le module dans lequel je la crée passe ; lorsque je clique sur le bouton qui appelle la création de la requête ça marche, mais quand j'essaie d'obtenir les résultats ou de passer en mode création, ça plante...
Marsh Posté le 16-05-2002 à 11:19:37
J'ai déjà eu le même problème, c limité Access
Faut décomposer la requêtes en plusieurs sous-requêtes.
Maintenant, vu la mauvaise tournure de ta requête, c'est pas gagné
Marsh Posté le 16-05-2002 à 11:35:12
je viens de tester, en remplaçant tes fonctions VB par des fonctions à moi, et ça pète aussi
donc, comme dit thegti, à mon avis le seul moyen est de diviser ta requete en sous requetes.
bon courage... si j'ai 5mn dans la journée j'essaierai de m'y coller, mais c'est pas gagné
Marsh Posté le 16-05-2002 à 11:43:48
Harkonnen a écrit a écrit : je viens de tester, en remplaçant tes fonctions VB par des fonctions à moi, et ça pète aussi donc, comme dit thegti, à mon avis le seul moyen est de diviser ta requete en sous requetes. bon courage... si j'ai 5mn dans la journée j'essaierai de m'y coller, mais c'est pas gagné |
ok je veux bien la séparer en plusieurs requetes mais comment faire ? je coupe à quel niveau ? et comment je fais après pour n'avoir plus qu'une requete globale ?
merci qd meme de te prendre la tete pr ça
Marsh Posté le 16-05-2002 à 14:09:14
Je te l'ai déjà dis, le design de ta base est ... pas top !
Au lieu de multiplier les champs :
INCIDENT.agression
INCIDENT.vol
INCIDENT.incendie
...
Tu ferais mieux d'avoir une autre table, qui te donne la liste des types d'incident pour un INCIDENT, chaque type étant affecté d'un niveau de gravité, ce qui te permetrait de sélectionner directemment celui ayant le niveau le plus haut et qui te débarasserait de tous ces iif() qui font quand même pas très propre.
Comment tu va faire pour maintenir ton application le jour ou un utilisateur te pondra de nouveaux types d'incidents ?
C'est pas une question en l'air !
Tu peux être QUAZIEMENT certain que çà va arriver, même si on t'a jurré que çe n'est pas le cas...
Si t'as besoin d'aide pour la modélisation, ben, tu sais ou demander
Marsh Posté le 16-05-2002 à 14:12:46
Mara's dad a écrit a écrit : Je te l'ai déjà dis, le design de ta base est ... pas top ! Au lieu de multiplier les champs : INCIDENT.agression INCIDENT.vol INCIDENT.incendie ... Tu ferais mieux d'avoir une autre table, qui te donne la liste des types d'incident pour un INCIDENT, chaque type étant affecté d'un niveau de gravité, ce qui te permetrait de sélectionner directemment celui ayant le niveau le plus haut et qui te débarasserait de tous ces iif() qui font quand même pas très propre. Comment tu va faire pour maintenir ton application le jour ou un utilisateur te pondra de nouveaux types d'incidents ? C'est pas une question en l'air ! Tu peux être QUAZIEMENT certain que çà va arriver, même si on t'a jurré que çe n'est pas le cas... Si t'as besoin d'aide pour la modélisation, ben, tu sais ou demander |
je sais bien que c pas trop évolutif, mais c'était la seule solution que j'avais envisagé
je leur avait dit, qu'il ne pourrait pas ajouter de type d'incident, mais que les sous catégories pouvaient être rajoutées autant que possible (j'avais fait pour en tout cas)
je vais réflechir à cette nouvelle organisation
n'hésites pas à développer ton idée
et encore merci
Marsh Posté le 16-05-2002 à 14:15:38
ok alors essayons de comprendre
au lieu d'avoir incident.agression, incident.vol etc
je mets un champ typeIncident. et là dedans je stocke quoi ? quelle relation fais je avec cette nouvelle table ?
pour cette nouvelle table, quels sont donc les champs que je dois créer ?
je précise que j'ai déja une table typeIncident qui me donne la liste des 9 types d'incident possible
...
Marsh Posté le 16-05-2002 à 14:41:02
Loom the Gloom a écrit a écrit : ok alors essayons de comprendre au lieu d'avoir incident.agression, incident.vol etc je mets un champ typeIncident. et là dedans je stocke quoi ? quelle relation fais je avec cette nouvelle table ? pour cette nouvelle table, quels sont donc les champs que je dois créer ? je précise que j'ai déja une table typeIncident qui me donne la liste des 9 types d'incident possible ... |
Et tu as donc 9 relations entre INCIDENT et typeIncident ! ! !
Bon, dans ta table typeIncident tu ajoutes un champs NiveauDeGravité s'il n'y en as pas déjà un.
Ensuite il te faut une nouvelle table qui fasse la relation entre INCIDENT et typeIncident, disons ListeIncidents.
Dans ListeIncidents il faut au moins 2 champs:
1- Identifiant de l'indident
2- Identifiant du type d'incident
Exemple de requête:
SELECT INCIDENT.id, Max(typeIncident.NIVEAU) AS MaxDeNIVEAU
FROM INCIDENT, ListeIncidents, typeIncident
WHERE (((ListeIncidents.id_incident)=[INCIDENT].[ID]) AND ((ListeIncidents.id_typeIncident)=[typeIncident].[ID]))
GROUP BY INCIDENT.id;
Qui te donne pour chaque incident le type d'incidant ayant le niveau le plus élevé.
Marsh Posté le 16-05-2002 à 09:15:37
comment faire lorsqu'on veut créer une requête sous vba, mais que cette requête dépasse les 1024 caractères autorisées ???
merci
---------------
Music|Market|Feed|Loom|DVD