You are on page 1of 10

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, atra"s da propriedade TableName. O Query faz suas ligaes atra"s da linguagem #Q$, o %ue l&e possibilita o acesso a "rias tabelas. O Query tambm possui mtodos mais eficientes de acesso aos recursos do ser"idor do %ue o Table. Alm de fazer uso de uma linguagem mais eficiente, permite o ser"idor processar re%uisies mais rapidamente e com menos trfego de rede. Os exemplos conduzidos por este material ser'o baseados em um banco de dados Access contendo duas tabelas( )roduto e *ategoria. As mesmas usadas no material +Uso do Componente ADOConnection,. -ostraremos no"amente o modelo e as especificaes de tabelas a seguir(

10

.ig. / 0 modelo de dados do cadastro de produtos

1) Criando o Banco de Dados


)ara definir o banco de dados, usaremos o #123 Access da -icrosoft. 4ntre no programa, crie um banco de dados "azio e sal"e em uma pasta *onsprod. a) Criao da Tabela Categoria #elecione a op'o *riar Tabela no -odo 4strutura e informe os seguintes dados na 5anela(

Cha e

Nome do campo codi!o descricao

Tipo de dados Autonumera"#o $e%to

Tamanho &'

(al e a ta)ela com o nome *Cate!oria+, A)ra a ta)ela Cate!oria no modo dados e informe os se!uintes alores para a coluna descricao- Limpe.a/ Alimenta"#o/ 0estu1rio e Be)idas, Para sal ar um re!istro/ )asta pressionar seta para )ai%o ou para cima, O)ser e 2ue o codi!o da Cate!oria inserido automaticamente assim 2ue o re!istro sal o, b) Criao da Tabela Prod !o (elecione a op"#o Criar $a)ela no 3odo Estrutura e informe os se!uintes dados na 4anelaNome do campo codi!o nome esto2ue em)ala!em fr1!il Ori!em 0alor codCat Tipo de dados Autonumera"#o $e%to Inteiro $e%to $e%to $e%to 3oeda Inteiro Lon!o 5' 5 6 75 Tamanho 10

Cha e

(al e a ta)ela com o nome *Produto+ 2) Criando o Projeto CadProdutos Entre no Delphi/ selecione 8ile (a e All e sal e a unit como uProduto na pasta ConsProduto e em se!uida o pro4eto/ como PConsProduto, Altere as se!uintes propriedades do formul1rio9 Name: 8consProduto 9 Caption : Cadastro de Produtos 9 Position:po(creenCenter,

3) Definindo o Mdulo de Dados Para criar o m;dulo de dados/ acesse a op"#o 8ile Ne< Data 3odule, (al e a unit como *UD3+, Em se!uida/ altere o nome do Datamodule =propriedade name> para D3, a) ADOConec!ion Insira um componente ADOConnec!ion =paleta ADO> no data module e altere as se!uintes propriedades

ConnectionString: (elecione a propriedade ConnectionString e cli2ue nas retic?ncias, Na 4anela 2ue se a)rir1/ erifi2ue se a op"#o *Use Connection (trin!+ est1 marcada e cli2ue no )ot#o Build para a)rir a 4anela *Propriedade de 0incula"#o de dados+, Na orelha Pro edor/ selecione o driver *3icrosoft @et &,' OLE DB Provider+ e cli2ue em a an"ar, Na a)a Cone%#o cli2ue nas retic?ncias do item 6 e selecione o )anco de dados =consprod,md)> 2ue ser1 acessado e cli2ue em OA,
Loginprompt( .alse 6inibe a 5anela de sen&a do banco de dados7 Name( A3O*ons)rod 6padr'o A3O 8 nome9do9programa7 Connected( True

10

b) AD !uer"
:nsira um componente AD !uer" 6paleta A3O7 e altere as seguintes propriedades
; Connection( ; Name(

selecione o nome do componente A3O*onnection 6A3O*ons)rod7<

Qr)rod

c) Datasource
:nsira um componente Datasource 6paleta 3ata Access7 e altere as seguintes propriedades
; Dataset( ; Name(

selecione o nome do componente A3O%uery 6Qr)rod7<

3s*ons)rod

d) AD Table
:nsira um componente AdoTable 6paleta A3O7 e altere as seguintes propriedades
; Connection( ; Name(

selecione o nome do componente A3O%uery 6Qr)rod7<

T2*at *ategoria

; Tablename( ; Active(

True

e) Datasource
:nsira um componente Datasource 6paleta 3ata Access7 e altere as seguintes propriedades
; Dataset( ; Name(

T2*at<

3s*at

(eu data module de e estar semelhante ao da fi!ura a)ai%o-

10

Exemplo 1
a> $orne o formul1rio 8consProd ati o, Em se!uida/ fa"a-o usar a unit do data module entrando na op"#o 8ile Use Unit e selecionando UdmB )> insira componente DB"rid =Data Controls> e altere a propriedade Datasource para D3,DsConsProd =nome do datasource li!ado ao 2uerC> c> insira um )ot#o no formul1rio/ altere seu Caption para *0er todos+ e acrescente o se!uinte c;di!o no seu e ento OnClicADM.QrProd.Close; // fecha o query DM.QrProd.SQL.Clear; // apaga contedo da propriedade Sql // adiciona o comando SQL DM.QrProd.SQL. dd!"S#L#C$ % &'(M produto"); DM.QrProd.(pen; // e*ecuta o query

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

Como oc? pDde perce)er/ o ADO2uerC semelhante ao componente ADOta)le no 2ue di. respeito E cone%#o com os componentes de acesso/ pois am)os s#o datasets, Entretanto/ todo ADO2uerC por padr#o retorna um resultset n#o edit1 el,

Exemplo 2 Consultas parametrizadas


Na maioria das situa"Fes/ ao in s de consultarmos todos os re!istros de uma ta)ela/ selecionamos apenas uma parte deles/ acrescentando uma cl1usula GHEIE em nosso comando (JL, Entretanto/ essa cl1usula pode n#o re2uerer um alor fi%o/ mas al!o ari1 el pro indo da interface com o usu1rio, Nesse caso/ chamamos esse alor de parKmetro, O parKmetro identificado dentro do comando (JL colocando-se um sinal de dois pontos = - > antes do nome de uma ari1 el, Por e%emplo+,#'# nome - .cliente /0 cliente 1 um par2metro +,#'# salario 0 .3alor /0 3alor 1 um par2metro

10

Para e%emplificar/ iremos construir uma consulta 2ue selecione todos os produtos 2ue possuem uma determinada ori!em, Ao erificarmos os re!istros da ta)ela Produto/ emos 2ue a coluna *OIILE3+ pode assumir os se!uintes alores- (#o Paulo e Belo Hori.onte, Baseado nisso/ iremos inserir um componente de sele"#o na interface 2ue permita a escolha da ori!em, a) Insira um label no form e altere seu Caption para Origem; b) insira um Combobox (paleta Standard) e altere as seguintes propriedades:
Name: Items:

CbOrigem ada !alor em uma lin"a: S#o $aulo e %elo &ori'onte

(s re!a o seguinte )digo no e!ento OnCli *:


DM.QrProd.Close; DM.QrProd.SQL.Clear; DM.QrProd.SQL. dd!" S#L#C$ % &'(M produto "); DM.QrProd.SQL. dd!" +,#'# origem - .origem"); DM.QrProd.Parameters.Param4y5ame!"origem").6alue .- C7(rigem.$e*t; DM.QrProd.(pen;

Nos comandos acima/ emos linhas semelhantes Es do e%emplo anterior, As mudan"as ficam por conta das duas linhas 2ue fa.em a inclus#o e da passa!em de um parKmetro, A inclus#o determinada pela linha .. dd!8 +,#'# funcao - .origem9);: onde ori#em o parKmetro, ParKmetros de em ser imediatamente precedidos pelo caractere dois pontos, E a passa!em do

parKmetro feita na linha Parameters.Param4y5ame!"origem").6alue .- C7(rigem.$e*t: onde o parKmetro rece)er1 o te%to da op"#o selecionada no com)o)o%, A anta!em da utili.a"#o de parKmetros 2ue a cada consulta reali.ada/ pode-se trocar o alor do parKmetro informado e o)ter resultados diferentes,

10

=ota se %ue o c>digo do e"ento contm uma parte repetiti"a representada pelo nome da %uery 63-.Qr)rod7. ? poss@"el utilizar o comando #it$ do 3elp&i para e"itar ter %ue escre"er seu nome em todas as lin&as. Obser"e o mesmo c>digo escrito com aux@lio do comando Ait&(
;ith DM.QrProd do 4egin Close; SQL.Clear; SQL. dd!" S#L#C$ % &'(M produto "); SQL. dd!" +,#'# origem - .origem"); Parameters.Param4y5ame!"origem").6alue .- C7(rigem.$e*t; (pen; end;

Exemplo 3 Parmetros baseados em combos dinmicas


No e%emplo anterior/ o campo fun"#o era representado por um com)o)o% com os alores fi%os, 0eremos a!ora como construir uma consulta parametri.ada )aseada em um campo de outra ta)ela 2ue possui um correspondente na ta)ela principal =cha e estran!eira>, Criaremos uma consulta 2ue trar1 todos os produtos de uma cate!oria informada, (; 2ue ao in s de di!itar o c;di!o da mesma/ ser1 disponi)ili.ado um com)o para 2ue se4a selecionada a descri"#o,

a) Insira um label no form e altere seu Caption para Categoria; b) insira um +b,oo*upCombobox (paleta +ata Controls) e altere as seguintes propriedades:

Name:

+blCategoria +-.+sCat des ri ao codigo

Listsource: Listfield: Keyfield:

Depois de ter a4ustado essas propriedades/ erifi2ue se a seta para )ai%o do componente D)LooAupCom)o)o% ficou ha)ilitada, (e n#o esti er/ confira se a propriedade Acti e do ta)le D3,$)Cat est1 true, N#o altere as propriedades Datasource e Datafield do componente, Estas s; podem conter alor se a interface for de entrada de dados, Escre a o se!uinte c;di!o no e ento OnClicA do D)LooAupCom)o)o%
with DM.QrProd do begin Close; SQL.Clear; SQL.Add(' SELECT * F !M "rod#to '$; SQL.Add(' %&E E 'od'at ( )'at'$; Para*eters.Para*+,-a*e(''at'$..al#e )( DM.T+'at.Field+,-a*e('Codigo'$..al#e; !"en; end;

10

Podemos er no c;di!o acima 2ue o critrio de sele"#o a!ora determinado pelo campo codCat 2ue contm o c;di!o da cate!oria do produto, Como o D)looAup aponta diretamente para a ta)ela Cate!oria =determinado pela sua propriedade Listsource>/ passamos o pr;prio alor do o)4eto field =codi!o> para o parKmetro *cat+ na linha Parameters.Param4y5ame!"cat").6alue .DM.$4cat.&ield4y5ame!"Codigo").6alue;

(xemplo / 0 1rabal"ando om par2metros op ionais


A!ora eremos como criar uma consulta onde o operador poder1 efetuar a consulta informando a 2uantidade 2ue 2uiser de parKmetros, (e n#o informar nenhum/ traremos todos os re!istros, (e informar al!um/ aplicamos a2uele filtro indi idualmente, A l;!ica consiste em testar se o operador informou al!um alor no campo do parKmetro e adicionar o respecti o filtro ao comando (JL, Prepararemos uma interface *especial+ para separar este e%ercMcio dos demais, Baseie-se na fi!ura a)ai%o-

10

a) Insira um groupbox (paleta Standard) no form e altere seu Caption para $ar2metros op ionais; b) insira um label e altere seu aption para 3ome. 4di ione tamb5m um (dit e altere: Name: (d3ome Text: deixe em bran o ) insira um label e altere seu aption para fragil. Insira um 6adiobutton altere seu nome para 6bnao e seu Caption para 3#o. Insira um segundo 6adiobutton ao lado do primeiro e altere seu nome para 6bSim e seu Caption para Sim d) insira um +b,oo*upCombobox (paleta +ata Controls) e altere as seguintes propriedades: Name: +blCat (para distinguir do outro +blCategoria 7ue est8 na tela) Listsource: +-.+sCat Listfield: des ri ao Keyfield: odigo e) insira um label e altere o Caption para $re9o (:7ue). 4di ione tamb5m um (dit e altere: Name : (d;alor Text: deixe em bran o. f) insira um %utton e altere o Caption para $es7uisar

g) digite o seguinte tre "o no e!ento OnCli * do bot#o $es7uisar:


with DM.QrProd do begin Close; SQL.Clear; SQL.Add(' SELECT * F !M "rod#to '$; SQL.Add(' %&E E /(/ '$; 00se ti1er "reen'hido o no*e2 adi'iona o 3iltro i3 (Ed-o*e.Te4t 56 ''$ then begin SQL.Add(' A-D no*e li7e )no*e '$; Para*eters.Para*+,-a*e('no*e'$..al#e )( '8'9Ed-o*e.Te4t9'8'; end; 00se ti1er *ar'ado 3r:gil si* i3 ( bS.Che'7ed$ then begin SQL.Add(' A-D 3ragil ( ;s; '$; end; 00 se ti1er *ar'ado 3r:gil n<o i3 ( b-.Che'7ed$ then begin SQL.Add(' A-D 3ragil ( ;n; '$; end; 00 se ti1er sele'ionado a 'ategoria i3 (DblCat.Te4t 56 ''$ then begin SQL.Add(' A-D 'od'at ( )'at'$; Para*eters.Para*+,-a*e(''at'$..al#e )( DM.T+Cat.Field+,-a*e('Codigo'$..al#e; end; 00 se ti1er "reen'hido o "re=o2 adi'iona o 3iltro i3 (Ed.alor.Te4t 56 ''$ then begin SQL.Add(' A-D 1alor 6 )1al '$; Para*eters.Para*+,-a*e('1al'$..al#e )( StrToFloat(Ed.alor.Te4t$; end; !"en; end; end;

10

,ogo no in< io= foi a res entado o )digo >&(6( 1?1 no S@,. (ssa ondi9#o foi olo ada om uma Ani a finalidade: riar uma l8usula B"ere fixa para o sele t. Isso e!ita repetidos testes para !erifi ar se o mesmo possui l8usula B"ere antes de adi ionar ada um dos filtros. O)ser e 2ue para cada teste reali.ado/ inserido um trecho referente ao filtro dese4ado atra s do comando (JL,add=> se!uido da respecti a passa!em de parKmetro, Isso permite 2ue o operador tenha uma total fle%i)ilidade na escolha dos parKmetros da tela, N possM el passar alores fi%os tam)m/ como est1 sendo feito no caso do campo fr1!il, No caso especMfico do filtro do campo nome/ o recurso de passa!em de parKmetros do Delphi n#o suporta a delimita"#o dos corin!as da cl1usula LIOE =caractere *P+> no pr;prio comando/ tendo 2ue ser passados na monta!em do parKmetro/ como pode ser erificado na linha Parameters.Param4y5ame!"nome").6alue ."<"=#d5ome.$e*t="<";

10

") insira um %utton e altere o Caption para 3o!a Consulta. +igite o seguinte tre "o para e!ento OnCli *
#d5ome.Clear; #d6alor.Clear; D7lCat.>ey3alue .- /?; '7S.Chec@ed .- false; '75.Chec@ed .- false;

O se $orm l%rio de&er% es!ar assim'

You might also like