Sei sulla pagina 1di 4

21/08/2018

[Delphi] Conhecendo o componente Query - André Celestino

[Delphi] Conhecendo o componente Query

·

Query 27/11/2012 BY ANDRÉ CELESTINO · 52 COMENTÁRIOS Olá, leitores! Como participo de fóruns sobre

Olá, leitores! Como participo de fóruns sobre programação, tenho notado que muitos desenvolvedores tem algumas dúvidas relacionadas ao componente Query do Delphi. Este componente, de extrema utilidade, dispõe de recursos para inserir, atualizar, excluir registros e selecionar dados de uma tabela. O foco deste artigo é apresentar os conceitos básicos e as principais funcionalidades do componente Query, bem como algumas dicas para tirar proveito deste componente.

“Query”, em inglês, significa pergunta, questão ou dúvida. Nos conceitos de programação, quando executamos algum comando no banco de dados, esperamos que ele retorne os resultados desejados. Portanto, um comando SQL pode ser comparado a uma “questão” direcionada ao banco de dados, que por sua vez, fica responsável de retornar com a resposta. O componente Query tem exatamente essa função: submeter comandos SQL ao banco de dados e obter o retorno. Não vou entrar em detalhes sobre a linguagem SQL, pressupondo que você, desenvolvedor, já tenha uma noção dos comandos para manipulação de dados.

Aonde eu encontro o componente Query?

O componente Query herda as propriedades da classe TDataSet. O que eu quero dizer é que não existe apenas um tipo de componente Query, ou seja, depende de qual conjunto de componentes que você está utilizando para conectar com o banco de dados.

• Se você estiver utilizando dbExpress, o nome do componente é TSQLQuery;

• No conjunto ADO (dbGo), o componente é o TADOQuery;

• Caso esteja utilizando o ZeosLib, o componente em questão é o TZQuery;

• Nos componentes IBX, o nome é IBQuery.

Como disse anteriormente, estes componentes herdam da mesma classe, portanto, os comandos são praticamente semelhantes, salvo algumas exceções.

Configurando um componente Query Em primeiro lugar, para configurar uma Query é preciso definir a sua conexão. Isso pode ser feito através da propriedade Connection ou SQLConnection do componente, disponível no Object Inspector do Delphi.

Propriedade Connection do componente Query no Delphi

Propriedade Connection do componente Query no Delphi

Após essa configuração, já podemos escrever a instrução SQL que será executada no banco de dados. Vale lembrar que o foco deste artigo trata a atribuição de comandos via código, e não de modo gráfico. Portanto, em breve também vou postar um pequeno tutorial de como utilizar a Query como fonte de dados e exibir os registros em uma DBGrid.

–> Executando um comando SELECT dentro de uma Query Vamos começar a estudar o componente Query trazendo dados de uma tabela. Como exemplo, vou utilizar uma tabela chamada CLIENTES de um banco de dados qualquer, mas nada impede que você faça os mesmos exemplos com outra tabela ou outro banco de dados. As instruções que vamos executar no banco de dados devem ser escritas na propriedade SQL da Query. Nada mais óbvio, rsrs. Pois bem, vamos ao nosso primeiro exemplo, lembrando que estou utilizando o nome Query1 para generalizar os componentes Query em comum. O primeiro passo é atribuir o comando SQL à Query:

21/08/2018

[Delphi] Conhecendo o componente Query - André Celestino

E em seguida, abrí-la com o comando Open:

Query1.Open;

Simples, não? Ok, já que agora eu selecionei o cliente nº 10 no banco de dados, como podemos obter os dados dele utilizando as funções da Query? Não existe segredo, basta utilizar o método FieldByName:

ShowMessage('Nome

:'

+ Query1.FieldByName('Nome').AsString);

ShowMessage('Idade

:'

+ Query1.FieldByName('Idade').AsString);

ShowMessage('Endereço:' + Query1.FieldByName('Nome').AsString);

Mas temos um problema. Vamos supor que eu queira utilizar uma função SQL para agregação de dados, como MAX, MIN, SUM, AVG ou COUNT. Por exemplo, se executarmos a SQL:

Select COUNT(*) from CLIENTES where UF = 'SP'

Os dados serão retornados, mas a coluna não terá nenhum nome. Sendo assim, não será possível acessar essa informação pelo FieldByName da Query. Bom, para este problema temos duas soluções. A primeira é renomear a coluna com o resultado da agregação na própria SQL:

Query1.SQL.Text := 'Select COUNT(*) as Contador from CLIENTES where UF = 'SP'';

Query1.Open;

ShowMessage(Query1.FieldByName('Contador').AsString);

A segunda opção é utilizar outra propriedade da Query, chamada Fields. Essa propriedade enumera os campos

retornados em ordem crescente, permitindo que o desenvolvedor acesse os dados através da posição do campo na

Query:

Query1.SQL.Text := 'Select COUNT(*) from CLIENTES where UF = 'SP'';

Query1.Open;

ShowMessage(Query1.Fields[0].AsString);

Neste caso, o campo número zero é a quantidade de clientes retornada pela Query. Da mesma forma, posso acessar qualquer campo da Query através da posição que ele se encontra:

ShowMessage('Nome

:'

+ Query1.Fields[0].AsString);

ShowMessage('Idade

:'

+ Query1.Fields[1].AsString);

ShowMessage('Endereço:' + Query1.Fields[2].AsString);

Porém, ao se utilizar o Fields, o desenvolvedor pode se perder em meio a tantos campos retornados. Por exemplo, se

a consulta retornou 15 campos, como o desenvolvedor irá saber que o campo Telefone é o de número 7? Pensando assim, eu recomendo utilizar o FieldByName e referenciar os campos pelo próprio nome. Além de facilitar a manutenção, o código-fonte fica mais legível.

–> Consultando vários registros com a Query No exemplo acima retornamos apenas um resultado, isto é, o cliente número 10. A nossa necessidade agora é trazer

21/08/2018

[Delphi] Conhecendo o componente Query - André Celestino

todos os clientes da tabela e preencher uma ListBox com o nome de cada um. É possível programar isso com a

Query?

Yes! Para isso, vamos mudar um pouco a nossa instrução SQL:

Query1.SQL.Text := 'Select * from Clientes';

Query1.Open;

Pronto, agora selecionei todos os registros da tabela Clientes. Para que eu possa preencher uma ListBox com os nomes, será necessário executar um loop (laço de repetição) nos resultados da Query.

Observe como é bem simples. A instrução abaixo move o cursor da Query para o primeiro registro:

Query1.First;

Em seguida, escrevemos o loop:

While not (Query1.Eof) do

O loop acima assume que enquanto a Query não chegar até o último registro (Eof End of File), ele será executado.

Dessa forma, poderemos obter o nome de cada cliente e adicionar na ListBox com o código abaixo:

ListBox1.Items.Add(Query1.FieldByName('Nome').AsString);

Por fim, porém o mais importante, temos que mover o cursor da Query para o próximo registro:

Query1.Next;

E

depois que o loop for finalizado, fechar a Query:

Query1.Close;

O

nosso código final ficará da seguinte forma:

Query1.SQL.Text := 'Select * from Clientes';

Query1.Open;

Query1.First;

While not (Query1.Eof) do begin

ListBox1.Items.Add(Query1.FieldByName('Nome').AsString);

Query1.Next;

end;

Query1.Close;

Aproveitando o embalo, tome nota das seguinte funções da Query:

First – move o cursor para o primeiro registro Last – move o cursor para o último registro Prior – move o cursor para o registro anterior Next – move o cursor para o próximo registro

21/08/2018

[Delphi] Conhecendo o componente Query - André Celestino

–> Manipulando dados com a Query Até agora vimos como utilizar a Query com um comando SELECT no banco de dados. No entanto, ela pode fazer mais do que isso! Sim, podemos inserir, atualizar e excluir registros utilizando a mesma propriedade, a SQL! A única diferença é que, ao invés do comando Open, utiliza-se o comando ExecSQL. Vamos aplicar isso de uma forma prática:

Query1.SQL.Text := 'Insert into Clientes (Codigo, Nome) Values (15, ''Andre'')';

Query1.ExecSQL;

Pronto, nosso novo registro foi incluído! Embora seja bem simples, náo podemos descartar a possibilidade de ocorrer algum erro na execução da instrução SQL. Caso algum dado esteja inconsistente, a instrução não será realizada com sucesso. Para prevenir essa possibilidade, nada melhor do que envolver as instruções da Query dentro de um tratamento de exceções:

Query1.SQL.Text := 'Insert into Clientes (Codigo, Nome) Values (15, ''Andre'')'; try

Query1.ExecSQL;

except On E:Exception do ShowMessage('Ocorreu um erro ao incluir o cliente: ' + E.Message);

end;

Aliás, o tratamento de exceções nunca deixou de ser uma ótima prática de programação. Antes de ir embora, quero apenas ressaltar uma observação que às vezes confunde alguns desenvolvedores:

• Para comandos SELECT, utilize o comando Open da Query.

• Para comandos INSERT, UPDATE e DELETE, utilize o comando ExecSQL.

Fico por aqui, leitores! Aguarde pelo próximo artigo sobre Query, onde comentarei sobre a passagem de parâmetros! Abraços!