Erreur requête select avec condition dans un memo

Résolu
anil16 Messages postés 47 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 15 février 2010 - 7 nov. 2009 à 23:03
anil16 Messages postés 47 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 15 février 2010 - 8 nov. 2009 à 12:09
Bonsoir,
Je n'arrive pas à faire fonctionner cette requête,qui deverait selectionner d'une table les enregistrements dont le num_bl figure dans un memo et afficher le résultat dans une dbgrid voici mon code:
var i,z: integer;
begin
    z:=Memo1.Lines.Count;
    ADOQuery2.SQL.Clear;
    for i:=0 to  z-1  do
    begin
        ADOQuery2.SQL.Add('select * from detail_bl where num_bl=' +
       (Memo1.Lines[i]));
        ADOQuery2.Open;
    end;
end.


le message d'erreur est:
'erreur de syntaxe. dans l'expression 'num_bl=13 select* from detail_bl where num_bl=100''....


Merci beaucoup

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 nov. 2009 à 10:28
Mets un point de débogage sur la ligne :
ADOQuery2.Open;

Et, à chaque arrêt du débogueur sur cette ligne, examine la propriété AdoQuery2.Sql.Text.
Au premier tour, tu verras :
select * from detail_bl where num_bl=xxx
puis, au deuxième passage :
select * from detail_bl where num_bl=xxxselect * from detail_bl where num_bl=yyy
etc, etc.
Mais, je pense que ce n'était pas ton intention et que ce ue tu souhaitais faire est un requête du type : sélectionner tous les enregistrements dont le champ num_bl vaut xxx, yyy, ....
Dans ce cas ta requête devient :
select * from detail_bl where num_bl IN (xxx, yyy, ...);

Alors, puisque tes valeurs sont stockées dans un composant TMemo, il suffit de récupérer les valeurs concaténées en les séparant par des virgules. La propriété Lines (de type TStrings) de ton composant TMemo possède une propriété CommaText (Enumère les chaînes de l'objet TStrings en utilisant le format de données système (SDF)).
Ainsi, le code source se simplifie :
begin
    if Memo1.Lines.Count > 0 then
      with ADOQuery2 do
      begin
        SQL.Clear;
        SQL.Add(
          'SELECT * FROM detail_bl WHERE num_bl IN (' + Memo1.Lines.CommaText + ')');
        Open;
      end;
end;



8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
anil16 Messages postés 47 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 15 février 2010
8 nov. 2009 à 12:09
Bonjour
Merci beaucoup Delphiprog pour tout ces explications et pour le code qui fonctionne comme je l'ai souhaité
Merci encore et bonne journée.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 nov. 2009 à 23:20
A chaque passage dans la boucle tu concatènes les différentes requêtes en utilisant la méthode Add !
Soit tu réinitialises la propriété Sql.Text avant l'appel à la méthode ADD, soit tu affectes directement la propriété Text de AdoQuery2.Sql.


8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
anil16 Messages postés 47 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 15 février 2010
7 nov. 2009 à 23:37
Merci delphiprog, j'avoue que j'ai pas bien compris comment faire cette concaténation et quand je réinitialise sql.text ça m'affiche que les enregistrements dont num_bl = dernière ligne de memo, je suis certaine que j'ai mal appliqué ce que tu m'as demandé de faire
0

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

Posez votre question
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
8 nov. 2009 à 00:51
num_bl est bien de type "entier" en base ? Si non, il te faut numbl='100' et non pas num_bl=100
0
Rejoignez-nous