Erro de Sql.add

Delphi

29/12/2004

Boa noite a todos, estou com um problema numa consulta para selecionar alguns itens obtidos num grid(multiselect) e importados para uma lista.
Toda vez que executo recebo um erro de Token ) Line 8.
Segue a consulta abaixo.

Var
i : integer;
Begin
qry.active := false;
qry.sql.Clear;
qry.SQL.Add( ´SELECT Listas.CODLISTA, Listas.TURMA, Listas.RESPONS, Listas.ALUNO, Listas.BAIRRO, ´);
qry.SQL.Add( ´ Listas.CEP, Listas.TELEFONE, Listas.ESTADO_L, Escolas.NOMESCOLA, Material.CODLISTA, ´);
qry.SQL.Add( ´ Material.TIPO_ITEM, Material.CODIGO, Material.QUANTIDADE, Material.PRECO, Material.CODEDIT, ´);
qry.SQL.Add( ´ Turmas.TURNO, Turmas.SERIE, Turmas.GRAU, Titulos.NOMITEM, Editores.NOMEDIT ´);
qry.SQL.Add( ´ FROM ´´LISTAS.DBF´´ Listas, ´´MATERIAL.DBF´´ Material, ´´TURMAS.DBF´´ Turmas, ´´:Livro1:TITULOS.DBF´´ Titulos, ´);
qry.SQL.Add( ´ ´´ESCOLAS.DBF´´ Escolas, ´´:Livro1:EDITORES.DBF´´ Editores ´);
qry.SQL.Add( ´ WHERE LISTAS.CODLISTA IN (´ );
for i:=0 to lista.count - 1 do
qry.SQL.Add(Lista.Strings[i]);
qry.SQL.Add(´ ) ´);
qry.SQL.Add(´ AND (Listas.CODESCOLA = Escolas.CODESCOLA) ´);
qry.SQL.Add(´ AND (Material.CODLISTA = Listas.CODLISTA) ´);
qry.SQL.Add(´ AND (Listas.TURMA = Turmas.TURMA) ´);
qry.SQL.Add(´ AND (Material.CODIGO = Titulos.CODITEM) ´);
qry.SQL.Add(´ AND (Material.CODEDIT = Editores.CODEDIT) ´);
qry.SQL.Add(´ GROUP BY (Listas.CODLISTA, Listas.TURMA, Listas.RESPONS, Listas.ALUNO, Listas.BAIRRO, Listas.CEP, ´);
qry.SQL.Add(´ Listas.TELEFONE, Listas.ESTADO_L, Escolas.NOMESCOLA, Material.CODLISTA, Material.TIPO_ITEM, ´);
qry.SQL.Add(´ Material.CODIGO, Material.QUANTIDADE, Material.PRECO, Material.CODEDIT, Turmas.TURNO, Turmas.SERIE, ´);
qry.SQL.Add(´ Turmas.GRAU, Titulos.NOMITEM, Editores.NOMEDIT)´);
qry.Active := True;
lista.Clear;

Um Abraço a todos e agradeço a ajuda.


Rogerioluz

Rogerioluz

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

29/12/2004

tente assim:


Var
    i : integer;
    sVirgula: string[1];
Begin
    sVirgula := ´,´;

    qry.close;
    qry.sql.Clear;
    qry.SQL.Add( ´SELECT Listas.CODLISTA, Listas.TURMA, Listas.RESPONS, Listas.ALUNO, Listas.BAIRRO, ´);
    qry.SQL.Add( ´ Listas.CEP, Listas.TELEFONE, Listas.ESTADO_L, Escolas.NOMESCOLA, Material.CODLISTA, ´);
    qry.SQL.Add( ´ Material.TIPO_ITEM, Material.CODIGO, Material.QUANTIDADE, Material.PRECO, Material.CODEDIT, ´);
    qry.SQL.Add( ´ Turmas.TURNO, Turmas.SERIE, Turmas.GRAU, Titulos.NOMITEM, Editores.NOMEDIT ´);
    qry.SQL.Add( ´ FROM ´´LISTAS.DBF´´ Listas, ´´MATERIAL.DBF´´ Material, ´´TURMAS.DBF´´ Turmas, ´´:Livro1:TITULOS.DBF´´ Titulos, ´);
    qry.SQL.Add( ´ ´´ESCOLAS.DBF´´ Escolas, ´´:Livro1:EDITORES.DBF´´ Editores ´);
    qry.SQL.Add( ´ WHERE LISTAS.CODLISTA IN (´ );

    for i:=0 to lista.count - 1 do
    begin
        if i = lista.count - 1
        then sVirgula := ´´;

        // coloquei a função QuotedStr() porque
        // suponho que o campo LISTAS.CODLISTA seja alfanumérico.
        // se não fôr, basta retirar a função.
        // a variável sVirgula é o separador dos itens da lista
        qry.SQL.Add( QuotedStr(Lista.Strings[i])+sVirgula);
    end;

    qry.SQL.Add(´ ) ´);
    qry.SQL.Add(´ AND (Listas.CODESCOLA = Escolas.CODESCOLA) ´);
    qry.SQL.Add(´ AND (Material.CODLISTA = Listas.CODLISTA) ´);
    qry.SQL.Add(´ AND (Listas.TURMA = Turmas.TURMA) ´);
    qry.SQL.Add(´ AND (Material.CODIGO = Titulos.CODITEM) ´);
    qry.SQL.Add(´ AND (Material.CODEDIT = Editores.CODEDIT) ´);
    qry.SQL.Add(´ GROUP BY Listas.CODLISTA, Listas.TURMA, Listas.RESPONS, Listas.ALUNO, Listas.BAIRRO, Listas.CEP, ´);
    qry.SQL.Add(´ Listas.TELEFONE, Listas.ESTADO_L, Escolas.NOMESCOLA, Material.CODLISTA, Material.TIPO_ITEM, ´);
    qry.SQL.Add(´ Material.CODIGO, Material.QUANTIDADE, Material.PRECO, Material.CODEDIT, Turmas.TURNO, Turmas.SERIE, ´);
    qry.SQL.Add(´ Turmas.GRAU, Titulos.NOMITEM, Editores.NOMEDIT ´);
    qry.Open;
    lista.Clear;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/12/2004

melhorando um pouco:

Var
    i : integer;
    sVirgula: string[1];
Begin
    sVirgula := ´,´;

    qry.close;
    qry.sql.Clear;
    qry.SQL.Add( ´SELECT Listas.CODLISTA, Listas.TURMA, Listas.RESPONS, Listas.ALUNO, Listas.BAIRRO, ´);
    qry.SQL.Add( ´ Listas.CEP, Listas.TELEFONE, Listas.ESTADO_L, Escolas.NOMESCOLA, Material.CODLISTA, ´);
    qry.SQL.Add( ´ Material.TIPO_ITEM, Material.CODIGO, Material.QUANTIDADE, Material.PRECO, Material.CODEDIT, ´);
    qry.SQL.Add( ´ Turmas.TURNO, Turmas.SERIE, Turmas.GRAU, Titulos.NOMITEM, Editores.NOMEDIT ´);
    qry.SQL.Add( ´ FROM ´´LISTAS.DBF´´ Listas, ´´MATERIAL.DBF´´ Material, ´´TURMAS.DBF´´ Turmas, ´´:Livro1:TITULOS.DBF´´ Titulos, ´);
    qry.SQL.Add( ´ ´´ESCOLAS.DBF´´ Escolas, ´´:Livro1:EDITORES.DBF´´ Editores ´);
    qry.SQL.Add( ´ WHERE LISTAS.CODLISTA IN (´ );

    for i:=0 to lista.count - 1 do
    begin
        if i = lista.count - 1
        then sVirgula := ´´;

        // coloquei a função QuotedStr() porque
        // suponho que o campo LISTAS.CODLISTA seja alfanumérico.
        // se não fôr, basta retirar a função.
        // a variável sVirgula é o separador dos itens da lista
        qry.SQL.Add( QuotedStr(Lista.Strings[i])+sVirgula);
    end;

    qry.SQL.Add(´ ) ´);
    qry.SQL.Add(´ AND (Listas.CODESCOLA = Escolas.CODESCOLA) ´);
    qry.SQL.Add(´ AND (Material.CODLISTA = Listas.CODLISTA) ´);
    qry.SQL.Add(´ AND (Listas.TURMA = Turmas.TURMA) ´);
    qry.SQL.Add(´ AND (Material.CODIGO = Titulos.CODITEM) ´);
    qry.SQL.Add(´ AND (Material.CODEDIT = Editores.CODEDIT) ´);
    qry.Open;
    lista.Clear;


Note que não existe mais a cláusula GROUP BY. ela era totalmente inútil na sua instrução, visto que você não utilizava nenhum campo agregado.


GOSTEI 0
Massuda

Massuda

29/12/2004

Mais um detalhe... você precisa garantir que a lista contenha pelo menos um item. Uma lista vazia irá dar problema.


GOSTEI 0
Adilsond

Adilsond

29/12/2004

var
  i: Integer;
  S: String;
begin
  S := ´´;
  if Lista.Count > 0 then
     begin
       S := Lista.Strings[0];
       if Lista.Count > 1 then
          for i := 1 to Lista.Count - 1 do
            S := ´,´ + Lista.Strings[i];
     end;
  with Qry do
    begin
      if Active then
         Close;
      with SQL do
        begin
          Clear;
          Add(´SELECT DISTINCT´);
          Add(´       Listas.CODLISTA,´);
          Add(´       Listas.TURMA,´);
          Add(´       Listas.RESPONS,´);
          Add(´       Listas.ALUNO,´);
          Add(´       Listas.BAIRRO,´);
          Add(´       Listas.CEP,´);
          Add(´       Listas.TELEFONE,´);
          Add(´       Listas.ESTADO_L,´);
          Add(´       Escolas.NOMESCOLA,´);
          Add(´       Material.CODLISTA,´);
          Add(´       Material.TIPO_ITEM,´);
          Add(´       Material.CODIGO,´);
          Add(´       Material.QUANTIDADE,´);
          Add(´       Material.PRECO,´);
          Add(´       Material.CODEDIT,´);
          Add(´       Turmas.TURNO,´);
          Add(´       Turmas.SERIE,´);
          Add(´       Turmas.GRAU,´);
          Add(´       Titulos.NOMITEM,´);
          Add(´       Editores.NOMEDIT´);
          Add(´FROM ´ + QuotedStr(´LISTAS.DBF´) + ´ Listas,´);
          Add(´     ´ + QuotedStr(´MATERIAL.DBF´) + ´ Material,´);
          Add(´     ´ + QuotedStr(´TURMAS.DBF´) + ´ Turmas,´);
          Add(´     ´ + QuotedStr(´:Livro1:TITULOS.DBF´) + ´ Titulos,´);
          Add(´     ´ + QuotedStr(´ESCOLAS.DBF´) + ´ Escolas,´);
          Add(´     ´ + QuotedStr(´:Livro1:EDITORES.DBF´) + ´ Editores´);
          if S = ´´ then
             Add(´WHERE (Listas.CODESCOLA = Escolas.CODESCOLA)´)
          else
             begin
               Add(´WHERE (LISTAS.CODLISTA IN (´ + S + ´))´);
               Add(´  AND (Listas.CODESCOLA = Escolas.CODESCOLA)´);
             end;
          Add(´  AND (Listas.CODESCOLA = Escolas.CODESCOLA)´);
          Add(´  AND (Material.CODLISTA = Listas.CODLISTA)´);
          Add(´  AND (Listas.TURMA = Turmas.TURMA)´);
          Add(´  AND (Material.CODIGO = Titulos.CODITEM)´);
          Add(´  AND (Material.CODEDIT = Editores.CODEDIT)´);
        end;
      Open;
    end;
  Lista.Clear;
end;



GOSTEI 0
POSTAR