Problème sur une requête SQL complexe...

cs_juan Messages postés 10 Date d'inscription mardi 17 octobre 2000 Statut Membre Dernière intervention 22 mai 2002 - 30 avril 2002 à 15:59
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 - 30 avril 2002 à 19:37
bjour tous
je fais tout un chemin de sélection sur une base de données, en utilisant des requêtes paramétrées afin de pouvoir emprunter plusieurs chemins de sélection differents, adaptés aux choix de l'utilisateur....
arrivé à la définition des résultats, je crée un vecteur dans lequel je rentre toutes les valeurs initiales de mes paramètres (qui au besoin resteront inchangées), et je voudrais pour afficher chaque étape de ma sélection, remplacer progressivement ces valeurs initiales par les valeurs que mon programme affecte aux paramêtres: j'aboutis à ce genre de déclaration:

sqltxt := 'SELECT * FROM gene2 WHERE ((Type NOT LIKE ''' + DataModule1.Query1.Params[0].AsString+ ''') AND (Type NOT LIKE '''+ DataModule1.Query1.Params[1].AsString+ ''') AND (Type NOT LIKE ''' +DataModule1.Query1.Params[2].AsString+ ''')) AND (Type LIKE ''' +vectinit[3]+ ''') AND ((Materiau LIKE ''' + vectinit[4] + ''') ...

DataModule1.Query1.Active := False;
DataModule1.Query1.SQL.Clear;
DataModule1.Query1.SQL.Add(sqltxt + ' ORDER BY Fabricant');
DataModule1.Query1.Active := True;

c'est à dire que j'assigne les valeurs de paramètres à mes trois premiers paramètres, et que je laisse les valeurs initiales des autres, contenues dans le vecteur "vectinit"... cette syntaxe marche lorsque je ne reprends que les valeurs initiales ou que les valeurs assignées, mais je n'arrive pas à n'assigner que certains paramètres par cette syntaxe, sans avoir l'erreur "indice de ligne hors limite"...
une solution ?

1 réponse

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
30 avril 2002 à 19:37
Parce que tu te trompe dans l'utilisation des paramètres dans une requète SQL. La requète doit être :
sqltxt := 'SELECT * FROM gene2 WHERE ((Type NOT LIKE :Param1 ) AND (Type NOT LIKE :Param2 ) AND (Type NOT :Param3 )) AND (Type LIKE ''' +vectinit[3]+ ''') AND ((Materiau LIKE ''' + vectinit[4] + ''')

Car tu ne peut utiliser Params[] tant que les paramètres ne sont pas défini d'ou ton erreur d'index.

L'utilisation de la requète serait alors :
DataModule1.Query1.Active := False;
DataModule1.Query1.SQL.Clear;
DataModule1.Query1.SQL.Add(sqltxt + ' ORDER BY Fabricant');
DataModule1.Query1.ParamByNamle('Param1').Value:='...';
DataModule1.Query1.ParamByNamle('Param2').Value:='...';
DataModule1.Query1.ParamByNamle('Param3').Value:='...';
DataModule1.Query1.Active := True;

Utilise de préférence ParamByName que Params[] car ParamByName ne dépend pas de l'ordre d'apparation dans la requète.

--- :sleepy) Nono du Moulin :sleepy) ---
0
Rejoignez-nous