Tres cosas:
1. Las líneas de un memo empiezan con el índice 0. Supongo ue en el FOR empiezas con x := 1 porque la primera es un título. Si no es así, estás perdiendo un elemento.
2. Si no tienes contenido en el Memo, no deberías filtrar...
3. Una forma más elegante (y con menos líneas) es fabricar el SQL en vez de hacerlo en variables para después concatenarlas.
(siempre teniendo en cuenta que la primera línea del memo hay que ignorarla como haces en tú ejemplo)
Código Delphi
[-]
var
x:integer;
begin
IBQueryInvent.SQL.Clear;
IBQueryInvent.SQL.Add('select * from INVENTARIO ');
if (Memo1.Lines.Count > 1) then
begin
IBQueryInvent.SQL.Add('where Genero IN ( ');
for x:=1 to Memo1.Lines.count - 1 do;
IBQueryInvent.SQL.Add('''' + Memo1.Lines[x] + ''' , ');
IBQueryInvent.SQL.Add('''0'' ) ');
end;
IBQueryInvent.Open;
end;
Yo prefiero utilizar
WITH..DO para evitar repetir el componente en cada línea.
Código Delphi
[-]
var
x:integer;
begin
with IBQueryInvent do
begin
SQL.Clear;
SQL.Add('select * from INVENTARIO ');
if (Memo1.Lines.Count > 1) then
begin
SQL.Add('where Genero IN ( ');
for x:=1 to Memo1.Lines.count - 1 do;
SQL.Add('''' + Memo1.Lines[x] + ''' , ');
SQL.Add('''0'' ) ');
end;
Open;
end;
end;
Y mi preferida, evitando poner un elemento que no existe:
1. Agrego la primera condición, si existe
2. Agrego el resto con una coma delante.
Código Delphi
[-]
var
x:integer;
begin
with IBQueryInvent do
begin
SQL.Clear;
SQL.Add('select * from INVENTARIO ');
if (Memo1.Lines.Count > 1) then
begin
SQL.Add('where Genero IN ( ');
SQL.Add('''' + Memo1.Lines[1] + '''');
for x:=2 to Memo1.Lines.count - 1 do;
SQL.Add(', ''' + Memo1.Lines[x] + '''');
SQL.Add(')');
end;
Open;
end;
end;