Probleme de syntaxe

bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012 - 26 avril 2008 à 20:15
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 - 28 avril 2008 à 21:56
Bonjour,
je réalise une application de gestion des membres d'une coopérative, mon probleme est le suivant : j'ai une table1 dans laquelle se trouve une colonne date_remb, une autre table2 dans laquelle se touve un colonne stat_remb et une table3 dans laquelle se trouve la colonne nom_mem les trois tables ont en commun la colonne mat_mem. Le truc c'est que je voudrais faire une requete qui portent sur les trois tables, laquelle me renvoie les noms des membres (nom_mem) dont les dates de remboursement (date_remb) ont deja depassé la date du jour (actuel ),et dont le statut du remboursement (stat_remb) est differrent de 'Total'
Si quelqu'un peut m'aider je le remercie d'avance.

<!-- / message -->

6 réponses

gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
27 avril 2008 à 17:16
Bonjour,

Cette requête n'est pas compliquée à écrire. Si tu ne connais pas SQL, tu peux lire le tutorial mysql à l'adresse http://dev.mysql.com/doc/refman/5.0/fr/tutorial.html

Interesse toi à la commande 'SELECT', aux jointures et à la commande 'WHERE'

Essaye de faire une requête et si elle ne fonctionne pas, poste la ici pour avoir de l'aide pour la corriger.

Grrrrrrrrrrr
0
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
27 avril 2008 à 21:54
en fait voici ma requete à probleme :rst.Open " SELECT emprunt.*, membre.*, remboursement.* FROM emprunt Inner join (remboursement inner join membre on remboursement.mat_mem membre.mat_mem ) on emprunt.mat_mem remboursement.mat_mem where date_remb < date ", cnx, adOpenStatic, adLockOptimistic, adCmdText
en fait je me dis que date ici me renvoie la date du jour comme en VB que j'utilise (je ne connais pas la fonction en sql)
et j'ai l'erreur suivante :
Erreur d'exécution '-2147217904(800e10)':
Aucune valeur donnée pour un ou plusieurs des paramètres requis.
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
27 avril 2008 à 23:36
(re)Bonjour,


Pour le select il vaut mieux ne pas utiliser * mais sélectionner les champs à recupèrer
SELECT t3.nom_mem,t1.date_remb, t2.stat_remb, t1.mat_mem
Ca accelère l'execution des requetes


Liste des tables à lier
Les alias (AS t1, ...) ne sont pas obligatoires mais c'est plus facile pour préfixer les champs
FROM table1 as t1, table2 as t2, table3 as t3


Filtrage des résultats
->date de remboursement qui est expirée, elle doit être inférieure à la date actuelle
->now() renvoit la date courrante (fonction sql)
-> différent de 'Total' NOT LIKE "Total". Le NOT LIKE permet à sgbd de savoir que c'est une chaine qu'il va comparer et donc de gagner du temps d'execution
WHERE t1.date_remb < now()
AND t2.stat_remb NOT LIKE "Total"


jointure des tables
J'utilise des comparaisons de champs plutot que des 'join' parce que ça permet de lier les tables entre elles après filtrage
Si mat_men est une chaine il vaut mieux utiliser 'LIKE' plutot que '=' (même raisons que plus haut)
Avec les 'join' les tables sont liées entre elles puis ensuite filtrées. Pour obtenir 40 résultats sur des tables de 40000 enregistrements chacune, le join est pas très optimisé (ou alors je sais pas les faire, je veux bien qu'on m'explique)
AND t1.mat_mem = t2.mat_mem
AND t1.mat_mem = t3.mat_men


 


Bref ça donne :


SELECT t3.nom_mem,t1.date_remb, t2.stat_remb, t1.mat_mem
FROM table1 as t1, table2 as t2, table3 as t3
WHERE t1.date_remb < now()
AND t2.stat_remb NOT LIKE "Total"
AND t1.mat_mem = t2.mat_mem
AND t1.mat_mem = t3.mat_men




Teste ça et dis moi si ça fonctionne

Grrrrrrrrrrr
0
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
28 avril 2008 à 14:58
J'ai testé la requete elle n'a pas fonctionné, ça m'affiche l'erreur precedente. Mais sinon dans ma requete j'ai changé date par now() et tout va bien
Cependant j'ai un autre probleme : je dois maintenant selectionner et afficher les membres ayant depassé de 37 jours leurs dates limites de remboursement, je ne connais pas la fonction en sql, mais sais que pour avoir cette date en VB on utilise DateAdd("d",37, Madate)
je pense à un requete similaire à ça :
"SELECT date_remb FROM emprunt where DateAdd("d", 37, date_remb) < now() "
j'espere que la syntaxe est bonne, donc maintenant je cherche la fonction similaire à DateAdd() en sql ou une autre syntaxe qui ferait ce que je recherche
Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
28 avril 2008 à 15:05
j'utilise access (2003)
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
28 avril 2008 à 21:56
Je ne connais pas access, désolé.

date_add existe en sql et visiblement ça existe en access:
http://www.techonthenet.com/access/functions/date/dateadd.php

Grrrrrrrrrrr
0