Erreur requête select avec condition dans un memo [Résolu]

Signaler
Messages postés
47
Date d'inscription
vendredi 15 février 2008
Statut
Membre
Dernière intervention
15 février 2010
-
Messages postés
47
Date d'inscription
vendredi 15 février 2008
Statut
Membre
Dernière intervention
15 février 2010
-
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

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
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.
Messages postés
47
Date d'inscription
vendredi 15 février 2008
Statut
Membre
Dernière intervention
15 février 2010

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.
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
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.
Messages postés
47
Date d'inscription
vendredi 15 février 2008
Statut
Membre
Dernière intervention
15 février 2010

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
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
num_bl est bien de type "entier" en base ? Si non, il te faut numbl='100' et non pas num_bl=100