Sie sind auf Seite 1von 11

UNEB - LP II Delphi Professora Luclia Delphi com Acesso a Banco de Dados Trabalhando com ADOQUERY

O componente Query um componente dataset, assim como o Table, especializado em conexes com tabelas. A diferena entre eles est na forma como acessam as informaes. O Table liga-se diretamente a uma nica tabela, atravs da propriedade TableName. O Query faz suas ligaes atravs da linguagem SQL, o que lhe possibilita o acesso a vrias tabelas. O Query tambm possui mtodos mais eficientes de acesso aos recursos do servidor do que o Table. Alm de fazer uso de uma linguagem mais eficiente, permite o servidor processar requisies mais rapidamente e com menos trfego de rede. Os exemplos conduzidos por este material sero baseados em um banco de dados Access contendo duas tabelas: Produto e Categoria. As mesmas usadas no material Uso do Componente ADOConnection. Mostraremos novamente o modelo e as especificaes de tabelas a seguir:

Fig. 1 modelo de dados do cadastro de produtos

1) Criando o Banco de Dados


Para definir o banco de dados, usaremos o SGBD Access da Microsoft. Entre no programa, crie um banco de dados vazio e salve em uma pasta Consprod. a) Criao da Tabela Categoria Selecione a opo Criar Tabela no Modo Estrutura e informe os seguintes dados na janela:

Chave

Nome do campo codigo descricao

Tipo de dados Autonumerao Texto

Tamanh o 40

Salve a tabela com o nome Categoria. Abra a tabela Categoria no modo dados e informe os seguintes valores para a coluna descricao: Limpeza, Alimentao, Vesturio e Bebidas. Para salvar um registro, basta pressionar seta para baixo ou para cima. Observe que o codigo da Categoria inserido automaticamente assim que o registro salvo. b) Criao da Tabela Produto Selecione a opo Criar Tabela no Modo Estrutura e informe os seguintes dados na janela: Nome do campo codigo nome estoque embalagem frgil Origem Valor codCat Tipo de dados Autonumera o Texto Inteiro Texto Texto Texto Moeda Inteiro Longo Tamanho

Chave

50 5 1 25

Salve a tabela com o nome Produto 2) Criando o Projeto CadProdutos Entre no Delphi, selecione File Save All e salve a unit como uProduto na pasta ConsProduto e em seguida o projeto, como PConsProduto. Altere as seguintes propriedades do formulrio:
Name= FconsProduto Caption = Cadastro de Produtos Position=poScreenCenter.

3) Definindo o Mdulo de Dados Para criar o mdulo de dados, acesse a opo File New Data Module. Salve a unit como UDM. Em seguida, altere o nome do Datamodule (propriedade name) para DM.

a) ADOConection Insira um componente ADOConnection (paleta ADO) no data module e altere as seguintes propriedades

ConnectionString: Selecione a propriedade ConnectionString e clique nas reticncias. Na janela que se abrir, verifique se a opo Use Connection String est marcada e clique no boto Build para abrir a janela Propriedade de Vinculao de dados. Na orelha Provedor, selecione o driver Microsoft Jet 4.0 OLE DB Provider e clique em avanar. Na aba Conexo clique nas reticncias do item 1 e selecione o banco de dados (consprod.mdb) que ser acessado e clique em Ok.
Loginprompt: False (inibe a janela de senha do banco de dados) Name: ADOConsProd (padro ADO + nome_do_programa) Connected: True

b) ADOQuery
Insira um componente ADOQuery (paleta ADO) e altere as seguintes propriedades
Connection: Name:

selecione o nome do componente ADOConnection (ADOConsProd);

QrProd

c) Datasource
Insira um componente Datasource (paleta Data Access) e altere as seguintes propriedades
Dataset: Name:

selecione o nome do componente ADOquery (QrProd);

DsConsProd

d) ADOTable
Insira um componente AdoTable (paleta ADO) e altere as seguintes propriedades
Connection: Name:

selecione o nome do componente ADOquery (QrProd);

TBCat Categoria

Tablename: Active:

True

e) Datasource

Insira um componente Datasource (paleta Data Access) e altere as seguintes propriedades


Dataset: Name:

TBCat;

DsCat

Seu data module deve estar semelhante ao da figura abaixo:

Exemplo 1
a) Torne o formulrio FconsProd ativo. Em seguida, faa-o usar a unit do data module entrando na opo File Use Unit e selecionando Udm; b) insira componente DBGrid (Data Controls) e altere a propriedade Datasource para DM.DsConsProd (nome do datasource ligado ao query) c) insira um boto no formulrio, altere seu Caption para Ver todos e acrescente o seguinte cdigo no seu evento OnClick:
DM.QrProd.Close; // fecha o query DM.QrProd.SQL.Clear; // apaga contedo da propriedade Sql // adiciona o comando SQL DM.QrProd.SQL.Add('SELECT * FROM produto'); DM.QrProd.Open; // executa o query

Execute o programa e clique no boto para ver o resultado abaixo:

Como voc pde perceber, o ADOquery semelhante ao componente ADOtable no que diz respeito conexo com os componentes de acesso, pois ambos so datasets. Entretanto, todo ADOquery por padro retorna um resultset no editvel.

Exemplo 2 Consultas parametrizadas


Na maioria das situaes, ao invs de consultarmos todos os registros de uma tabela, selecionamos apenas uma parte deles, acrescentando uma clusula WHERE em nosso comando SQL. Entretanto, essa clusula pode no requerer um valor fixo, mas algo varivel provindo da interface com o usurio. Nesse caso, chamamos esse valor de parmetro. O parmetro identificado dentro do comando SQL colocando-se um sinal de dois pontos ( : ) antes do nome de uma varivel. Por exemplo:
WHERE nome = :cliente -> cliente um parmetro WHERE salario > :valor -> valor um parmetro

Para exemplificar, iremos construir uma consulta que selecione todos os produtos que possuem uma determinada origem. Ao verificarmos os registros da tabela Produto, vemos que a coluna ORIGEM pode assumir os seguintes valores: So Paulo e Belo Horizonte. Baseado nisso, iremos inserir um componente de seleo na interface que permita a escolha da origem. a) Insira um label no form e altere seu Caption para Origem; b) insira um Combobox (paleta Standard) e altere as seguintes propriedades:

Name: CbOrigem Items: cada valor em uma linha: So Paulo e Belo Horizonte

Escreva o seguinte cdigo no evento OnClick:


DM.QrProd.Close; DM.QrProd.SQL.Clear; DM.QrProd.SQL.Add(' SELECT * FROM produto '); DM.QrProd.SQL.Add(' WHERE origem = :origem'); DM.QrProd.Parameters.ParamByName('origem').Value := CbOrigem.Text; DM.QrProd.Open;

Nos comandos acima, vemos linhas semelhantes s do exemplo anterior. As mudanas ficam por conta das duas linhas que fazem a incluso e da passagem de um parmetro. A incluso determinada pela linha ..Add( WHERE funcao = :origem);, onde origem o parmetro. Parmetros devem ser imediatamente precedidos pelo caractere dois pontos. E a passagem do parmetro feita na linha Parameters.ParamByName('origem').Value := CbOrigem.Text, onde o parmetro receber o texto da opo selecionada no combobox. A vantagem da utilizao de parmetros que a cada consulta realizada, pode-se trocar o valor do parmetro informado e obter resultados diferentes.

Nota-se que o cdigo do evento contm uma parte repetitiva representada pelo nome da query (DM.QrProd). possvel utilizar o comando with do Delphi para evitar ter que escrever seu nome em todas as linhas. Observe o mesmo cdigo escrito com auxlio do comando with:
with DM.QrProd do Begin Close; SQL.Clear; SQL.Add(' SELECT * FROM produto '); SQL.Add(' WHERE origem = :origem');

Parameters.ParamByName('origem').Value := CbOrigem.Text; Open; end;

Exemplo 3 Parmetros baseados em combos dinmicas


No exemplo anterior, o campo funo era representado por um combobox com os valores fixos. Veremos agora como construir uma consulta parametrizada baseada em um campo de outra tabela que possui um correspondente na tabela principal (chave estrangeira). Criaremos uma consulta que trar todos os produtos de uma categoria informada. S que ao invs de digitar o cdigo da mesma, ser disponibilizado um combo para que seja selecionada a descrio.
a) Insira um label no form e altere seu Caption para Categoria; b) insira um DbLookupCombobox (paleta Data Controls) e altere as seguintes propriedades: Name: DblCategoria Listsource: DM.DsCat Listfield: descricao Keyfield: codigo

Depois de ter ajustado essas propriedades, verifique se a seta para baixo do componente DbLookupCombobox ficou habilitada. Se no estiver, confira se a propriedade Active do table DM.TbCat est true. No altere as propriedades Datasource e Datafield do componente. Estas s podem conter valor se a interface for de entrada de dados. Escreva o seguinte cdigo no evento OnClick do DbLookupCombobox
with DM.QrProd do begin Close; SQL.Clear; SQL.Add(' SELECT * FROM produto ');

SQL.Add(' WHERE codcat = :cat'); Parameters.ParamByName('cat').Value := DM.TBcat.FieldByName('Codigo').Value; Open; end;

Podemos ver no cdigo acima que o critrio de seleo agora determinado pelo campo codCat que contm o cdigo da categoria do produto. Como o Dblookup aponta diretamente para a tabela Categoria (determinado pela sua propriedade Listsource), passamos o prprio valor do objeto field (codigo) para o parmetro cat na linha Parameters.ParamByName('cat').Value :=

DM.TBcat.FieldByName('Codigo').Value;

Exemplo 4 Trabalhando com parmetros opcionais


Agora veremos como criar uma consulta onde o operador poder efetuar a consulta informando a quantidade que quiser de parmetros. Se no informar nenhum, traremos todos os registros. Se informar algum, aplicamos aquele filtro individualmente. A lgica consiste em testar se o operador informou algum valor no campo do parmetro e adicionar o respectivo filtro ao comando SQL. Prepararemos

uma interface especial para separar este exerccio dos demais. Baseie-se na figura abaixo: a) Insira um groupbox (paleta Standard) no form e altere seu Caption para Parmetros opcionais; b) insira um label e altere seu caption para Nome. Adicione tambm um Edit e altere: Name: EdNome Text: deixe em branco c) insira um label e altere seu caption para fragil. Insira um Radiobutton altere seu nome para Rbnao e seu Caption para No. Insira um segundo Radiobutton ao lado do primeiro e altere seu nome para RbSim e seu Caption para Sim d) insira um DbLookupCombobox (paleta Data Controls) e altere as seguintes propriedades: Name: DblCat (para distinguir do outro DblCategoria que est na tela) Listsource: DM.DsCat Listfield: descricao Keyfield: codigo e) insira um label e altere o Caption para Preo (>que). Adicione tambm um Edit e altere: Name : EdValor Text: deixe em branco. f) insira um Button e altere o Caption para Pesquisar g) digite o seguinte trecho no evento OnClick do boto Pesquisar:
with DM.QrProd do begin Close; SQL.Clear; SQL.Add(' SELECT * FROM produto '); SQL.Add(' WHERE 1=1 '); //se tiver preenchido o nome, adiciona o filtro if (EdNome.Text <> '') then begin SQL.Add(' AND nome like :nome '); Parameters.ParamByName('nome').Value := '%'+EdNome.Text+'%'; end;

//se tiver marcado frgil sim if (RbS.Checked) then begin SQL.Add(' AND fragil = "s" '); end; // se tiver marcado frgil no if (RbN.Checked) then begin SQL.Add(' AND fragil = "n" '); end; // se tiver selecionado a categoria if (DblCat.Text <> '') then begin SQL.Add(' AND codcat = :cat'); Parameters.ParamByName('cat').Value := DM.TBCat.FieldByName('Codigo').Value; end; // se tiver preenchido o preo, adiciona o filtro if (EdValor.Text <> '') then begin SQL.Add(' AND valor > :val '); Parameters.ParamByName('val').Value := StrToFloat(EdValor.Text); end; Open; end; end;

Logo no incio, foi acrescentado o cdigo WHERE 1=1 no SQL. Essa condio foi colocada com uma nica finalidade: criar uma clusula where fixa para o select. Isso evita repetidos testes para verificar se o mesmo possui clusula where antes de adicionar cada um dos filtros. Observe que para cada teste realizado, inserido um trecho referente ao filtro desejado atravs do comando SQL.add() seguido da respectiva passagem de parmetro. Isso permite que o operador tenha uma total flexibilidade na escolha dos parmetros da tela. possvel passar valores fixos tambm, como est sendo feito no caso do campo frgil. No caso especfico do filtro do campo nome, o recurso de passagem de parmetros do Delphi no suporta a delimitao dos coringas da

clusula LIKE (caractere %) no prprio comando, tendo que ser passados na montagem do parmetro, como pode ser verificado na linha
Parameters.ParamByName('nome').Value := '%'+EdNome.Text+'%';

h) insira um Button e altere o Caption para Nova Consulta. Digite o seguinte trecho para evento OnClick
EdNome.Clear; EdValor.Clear; DblCat.Keyvalue := -1; RbS.Checked := false; RbN.Checked := false;

O seu formulrio dever estar assim: