Probleme de syntaxe

Signaler
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012
-
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
-
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

Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

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.
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
(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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

j'utilise access (2003)
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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