Você está na página 1de 10

Lazarus - Acessando banco de dados MySQL com ZeosLib

Vamos criar uma aplicao simples usando o conjunto de componentes ZeosLib e o banco de
dados MySQL. ZeosLib precisa ser baixado e instalado. Usaremos a verso 7.0 do ZeosLib
disponvel no grupo Lazarus-BR.
Depois de extrair os arquivos, inicie o Lazarus. Selecione no menu Package -> Open package
file (.lpk). Localize o diretrio onde voc extraiu o componente e selecione o pacote
zcomponent.lpk em \packages\lazarus. Na janela que abrir clique em Compile. Aguarde
finalizar e ento clique em Install. Esse procedimento ir recompilar o Lazarus e depois ele ser
reinicializado. Confira que uma nova aba foi adicionada na paleta de componentes - Zeos
Access.
Com relao ao banco de dados, voc pode baix-lo no site oficial. A instalao muito simples,
inclusive no Ubuntu.
No Windows localize libmusql.dll no diretrio de instalao do MySQL e copie-a para o diretrio
System32 - procedimento necessrio para o funcionamento do Zeos com MySQL.
Agora que est tudo instalado, no MySQL, crie um novo banco de dados - chame-o de clientes - e
as tabelas necessrias para o nosso exemplo:
create table cidade (id_cidade integer primary key, nome varchar(30));
create table cliente (id_cliente integer primary key, nome varchar(40),
endereco varchar(40), id_cidade integer references cidade(id_cidade), telefone
varchar(14), tipo char(1), status boolean);

A aplicao exemplo
Vamos ento iniciar o Lazarus e criar uma nova aplicao. No primeiro form crie um menu com a
seguinte estrutura.
Arquivo
Sair
Cadastros
Cidade
Cliente
Consultas
Cidade
Cliente
Mude a propriedade Name desse form para frmPrincipal. Mande salvar tudo. Escolha
u_principal para nome da unit e Clientes para nome do projeto.
fortemente aconselhado que os componentes de conexo e acesso ao banco de dados estejam
agrupados em um repositrio denominado DataModule. Para criar um DataModule no Lazarus
selecione o menu Arquivo -> Novo. Selecione Data Module abaixo do grupo Mdulo e
pressione o boto OK. Mude a propriedade Name para dmDados, mande salvar e d o nome
u_dmdados para esta unit.

Zeos
Agora selecione a aba de componentes ZeosLib e coloque:
TZConnection
Esse componente reponsvel por criar uma conexo com o banco de dados e controlar as
transaes. Veremos que ele possui propriedades que permitem que seja configurado para se
conectar a vrios bancos de dados: PostgreSQL, Firebird, Oracle, SQLite e outros. Coloque um
desses no Data Module. As seguintes propriedades merecem um melhor entendimento:
AutoCommit - determina de que forma as alteraes so confirmadas no banco de dados. Se
deixar em True as alteraes so confirmadas implicitamente. Caso se deseje confirmar
explicitamente devemos mudar para False. No nosso caso deixemos em True.
Database - define o nome do banco de dados. Digite clientes. Se estiver usando o Firebird ou
SQLite voc deve informar o caminho completo do arquivo do banco de dados.
HostName - informa o nome ou IP do servidor de banco de dados. Se for a mquina local atribua
o nome localhost.
Name - informe dbCliente.
Password - informar a senha do servidor de banco de dados. Informe a senha do usurio
definida durante a instalao do MySQL. O padra sem senha.
Protocol - define qual o banco de dados que ser conectado. informe mysql-5. Observe a verso
do MySQL que voc est usando.
TransactionIsolation - define o nvel de isolamento da transao. No nosso caso vamos usar
tiReadCommitted.
User - define o nome do usurio do banco de dados. Geralmente root.
Para fazer um teste da conexo, mude a propriedade Connected para True. Se estiver tudo certo
no deve acontecer erro.
TZUpdateSQL
Especifica os comandos SQL de atualizao - INSERT, UPDATE e DELETE. Atua em conjunto
com um TZQuery. Inclua um componente desse no Data Module e defina suas propriedades
assim:
DeleteSQL - DELETE FROM CIDADE WHERE ID_CIDADE = :OLD_ID_CIDADE;
InsertSQL - INSERT INTO CIDADE VALUES (:ID_CIDADE, :NOME);
ModifySQL - UPDATE CIDADE SET NOME = :NOME WHERE ID_CIDADE =
:OLD_ID_CIDADE;
Para informar os comandos clique na propriedade correspondente do Inspetor de Objetos. Digite
o comando no editor e tecle OK.

Name - defina como upCidade.


Qualquer identificador precedido por dois pontos (:) um parmetro que ser definido quando o
comando for executado. O prefixo OLD possibilita o acesso ao valor do campo antes dele ser
modificado.
TZQuery
Query que deve ser usada para atualizar dados em tabelas. usada em conjunto TZUpdateSQL
para que execute as operaes de INSERT, UPDATE ou DELETE. Para cada tabela do banco
deveremos ter um desses componentes no Data Module. Inclua uma TZQuery no Data Module e
vamos alterar suas propriedades:
Connection - especifica o objeto TZConnection. Selecione dbCliente.
Name - queCidade.
SQL - especifica um comando SELECT para mostrar os dados da tabela. Informe: SELECT *
FROM CIDADE.
UpdateObject - define o objeto TZUpdateSQL que ser usado em conjunto com TZQuery.
Selecione upCidade.
TDataSource
Para finalizar o desenho do acesso tabela Cidade, coloque um TDataSource da aba Data
Access e vamos alterar suas propriedades:
Name - dsCidade
DataSet - queCidade.
Com exceo de TZConnection - que deve ser apenas um - repita o processo para definir o
acesso tabela Cliente. O Data Module dever ter esse aspecto:

Repita os mesmos passos para a tabela Cliente, inserindo mais um TSQLQuery e um


TDataSource.

Formulrios
Form principal
No editor de cdigo, digite abaixo de Implementation:
uses u_dmdados;
Localize o evento OnShow na aba Eventos do Inspetor de objetos. D um duplo clique direita
e digite:
dmDados.dbCliente.Connect;
Localize o evento OnClose na aba Eventos do Inspetor de objetos. D um duplo clique direita
e digite:
dmDados.dbCliente.Disconnect;
Assim, sempre que o programa for iniciado a conexo com o banco de dados ser iniciada.
Form de Cidade
Insira um novo form na aplicao. Ele ser desenhado para fazer as atualizaes na tabela
Cidade. Defina o Name do form como frmCidade e o Caption como Cidades. Salve a unit e
defina seu nome como u_cidade. O desenho deste form deve ter a seguinte aparncia.

Antes de comear a desenhar a janela, acesse o cdigo da unit e insira o seguinte cdigo abaixo
de Implementation:
uses u_dmdados;
Isso permite que esta unit acesse os objetos do DataModule.
Pegue um componente TPanel na aba Standard e coloque no form.
Defina a propriedade Align como alTop. Exclua o contedo de Caption.
As propriedades BevelInner e BevelOuter so usadas para definir contornos para o painel.
Deixe, por exemplo, como bvLowered e bvRaised respectivamente.
Agora selecione um TDBNavigator na aba Data Controls e o coloque no form sobre o painel. Na
propriedade DataSource do navegador selecione dsCidade.
Dessa mesma aba selecione TDBEdit e coloque dois deles no form.
No primeiro defina Name como edIdCidade, em DataSource selecione dsCidade e em
DataField digite ID_CIDADE. Essa ltima atribuio ir provocar um erro, mas isso no vai
interferir no resultado.
No segundo TDBEdit defina Name como edNome, DataSource como dsCidade e em DataField
digite NOME.

Selecione TLabel na aba Standard e coloque um esquerda de cada TDBEdit para identificlos. Defina suas propriedades Caption como ID e Nome, respectivamente. Para finalizar o
desenho coloque um TSpeedButton da aba Additional sobre o painel. Defina Name como
btnSair e escolha um cone apropriado para ele usando a propriedade Glyph. No evento
OnClick deste boto digite:
Close;
necessrio programar a abertura e o fechamento da Query no form. A abertura ser
programada no evento OnShow e o fechamento ser programado no evento OnClose, ambos de
form. Com o form selecionado selecione da aba Eventos no Inspetor de Objetos. Localize o
evento OnShow, d um duplo clique na caixa direita e digite o seguinte:
dmDados.queCidade.Open;
Faa o mesmo para o evento OnClose e digite:
dmDados.queCidade.Close;
Agora precisamos programar a chamada do form frmCidade a partir no form principal. Selecione
o form principal, mude para o editor de cdigo e digite abaixo de Implementation:
uses u_cidade;
Volte para o form e clique no menu Cadastros -> Cidades. No editor de cdigo digite:
frmCidade.Show;
Compile e execute o programa.

Form de Cliente
No DataModule j deve ter uma TSQLQuery e um TDataSource devidamente configurados para
acesso tabela Cliente. Vamos ento inserir um novo form no programa definindo Name como
frmCliente, Caption como Clientes. Mande salvar e informe u_cliente no nome da unit. Acesse
o editor de cdigo referente a esse form e abaixo de Implementation, para permitir que a unit
u_cliente tenha acesso aos objetos do DataModule, digite:
uses u_dmdados;
Volte ao form e inclua um TPanel da mesma forma
que foi feito para o form de Cidade.
Selecione um TDBNavigator da aba Data
Controls e coloque sobre o painel. Defina a
propriedade DataSource como dsCliente.
Insira um TSpeedButton da aba Additional no
painel e o configure semelhante ao que fizemos no
form de Cidade, inclusive definindo o cdigo do
evento OnClick para fechar o form.
O form de Cliente dever ter essa aparncia:

Coloque dois TDBedit no form, o primeiro deve ter Name definido como edIdCliente,
DataSource como dsCliente e DataField como ID_CLIENTE.
No segundo defina Name como edNome, DataSource como dsCliente e DataField como
NOME. Coloque dois TLabel para identificar esse campos e defina os Caption de acordo com a
figura anterior.
O componente TDBLookupComboBox usado para que, no caso de uma chave estrangeira
(ID_CIDADE na tabela Cliente), o usurio possa escolher o registro na tabela referenciada
(Cidade). Neste componente os dados da tabela referenciada so mostrados em uma lista. Pegue
ento um componente desses na aba Data Controls e coloque no form abaixo do segundo
TDBEdit. Defina Name como dblIdCidade, DataSource como dsCliente e DataField como
ID_CIDADE. Para definir a lista primeiramente defina a propriedade ListSource como dsCidade,
na propriedade ListField (campo que ser visualizado na lista) defina NOME e KeyField (campo
chave) defina como ID_CIDADE. Existe ainda a propriedade Sorted que define se a lista estar
ordenada e Style que define o comportamento do controle. Deixe Sorted como True e Style
como dsDropDownList (o usurio no poder digitar no controle, apenas selecionar da lista).
Coloque um TLabel para identificar este campo.
Coloque mais um TDBEdit abaixo do LookupComboBox. Defina Name como edTelefone,
DataSource como dsCliente e DataField como TELEFONE. Coloque um TLabel para fazer a
identificao do campo.
O campo TIPO da tabela Cliente usado para informar se o cliente pessoa fsica representado pela letra F - ou pessoa jurdica - representado pela letra J. Para este controle
vamos usar um TDBRadioGroup, que permite que sejam definidas opes para serem
selecionadas. Pegue um componente desses e o coloque no form. Defina a propriedade Caption
como Tipo e Name como rgTipo. DataSource ser dsCliente e DataField ser TIPO. Clique no
boto da propriedade Items. Ser aberta uma janela com o editor de strings. Digite Pessoa fsica
na primeira linha e Pessoa jurdica na segunda e pressione OK. Na propriedade Columns digite
2 para que as opes apaream em linha. Clique no boto da propriedade Values - onde esto os
valores correspondentes s opes definidas em Items. Digite F na primeria linha e J na segunda.
Desta forma quando for selecionada a opo Pessoa fsica ser gravado F no banco de dados, e
J caso contrrio. Redimensione o componente adequadamente.
Finalmente coloque um TDBCheckBox no form. Defina Caption como Ativo e Name como
chxStatus. DataSource definido como dsCliente e em DataField digite STATUS. As
propriedades ValueChecked e ValueUnchecked so usadas para definir o que ser gravado no
campo quando o componente estiver marcado ou no marcado. Como nosso campo no banco de
dados boolean, no necessrio alterar nada.
Para programar a abertura e o fechamento da Query faa de forma anloga ao que foi feito no
form de Cidade. Escreva os cdigos correspondentes nos eventos OnShow e OnClose de
frmCliente.
Agora vamos ao form principal. Na linha uses
abaixo de Implementation acrescente u_cliente
para que ela fique assim:
Uses u_cidade, u_cliente;
Clique no menu Cadastros -> Clientes e no
cdigo do evento OnClick digite:
frmCliente.Show;
Execute o programa e chame o form de Cliente
para fazer os testes.

Consultas
O prximo passo do desenvolvimento ser criar as telas de consulta s tabelas Cidade e Cliente.
Neste artigo mostraremos a criao da consulta de cidades. Supomos que a consulta de clientes
anloga e no haver dificuldade em cri-la.
Para iniciar vamos ao DataModule inserir dois componentes necessrios: um TSQLQuery e um
TDataSource. Na Query mude Name para queConsCidade. Na propriedade Database
selecione dbCliente. Certifique-se que a propriedade Transaction est corretamente definida
como trGeral. No TDataSource mude Name para dsConsCidade e DataSet para queConsCidade.
Uma interface de consulta necessria, portanto deve-se inserir um novo form. Defina Name
como frmConsCidade e Caption como Consulta de cidades. Salve e digite u_conscidade no
nome da unit.
A consulta ir oferecer duas opes de consulta - pela chave primria ou por parte do nome.
Ento insira um TRadioGroup da aba Standard. Defina Caption como Campo. Na propriedade
Items inclua as linhas Cdigo e Nome. Na propriedade Name digite rgCampo. Redimensione o
componente adequadamente.

Observe a figura acima para orientar o seu desenho. Inclua um TEdit da aba Standard. Defina
Name como edDado e delete o contedo da propriedade Text.
Coloque um TLabel para identificar o campo. Defina Caption como Dado a consultar.
Insira um TButton. Defina Name btnConsultar.
Localize o componente TDBGrid na aba Data Controls. Insira um no form. Defina sua
propriedade Name com dbgDados.
Abra o editor de cdigo e digite abaixo de Implementation:
uses u_dmdados;
Volte ao form e na propriedade DataSource da TDBGrid selecione dsConsCidade. D um duplo
clique no boto btnConsultar e digite o cdigo:

Analisando o cdigo:
linha 39 - define que propriedades e mtodos sem referncia a um objeto so considerados como
sendo de queConsCidade.
linha 41 - fecha a Query.
linha 42 - limpa o contedo da propriedade SQL.
linha 43 - verifica que campo foi selecionado no RadioGroup.
linhas 45 e 46 - definem um comando SELECT para buscar linhas na tabela pela chave primria.
pIdCidade um parmetro definido na linha 46.
linhas 50 e 51 - definem um comando SELECT para buscar linhas na tabela por parte do nome
da cidade.
linha 53 - abre a Query.
Mude para o form principal. No editor de cdigo inclua a unit u_conscidade na linha uses abaixo
de Implementation. Clique na opo Consultas -> Cidades. Digite o cdigo:
frmConsCidade.Show;
Execute o programa e faa testes de consulta. Falta validar edDado para que aceite apenas
dgitos numricos quando a consulta for direcionada para o campo chave.
Deixamos essa tarefa e a criao da consulta de clientes como um exerccio.

Referncias aos campos de uma tabela - criao de TFields


Para criar os TFields ainda necessrio que a TSQLQuery esteja
ativa. D um duplo clique na TSQLQuery e voc ver uma janela como
esta:
Esta janela oferece uma barra de ferramentas bastante intuitiva. O
boto adicionar ir abrir uma nova janela onde voc poder selecionar
os campos da tabela que se deseja adicionar. Aps selecionar os
campos pressione o boto Create. O boto novo campo permite criar
um campo de dado, calculado ou lookup. O uso desse boto ir abrir a
seguinte janela:

Aqui voc escolhe o tipo do campo em Field Type. Em Field properties podemos definir os valores
das propriedades do campo. Depois confirme tudo pressionando Ok. Esteja sempre atento que as
tabelas envolvidas na criao dos campos devem estar abertas.
Note tambm que esse procedimento ir criar variveis do tipo TField, que podem ser usadas no
cdigo do nosso programa. Essas variveis so criadas abaixo do Data Module conforme
podemos ver na figura:

A partir disso, podemos acessar os campos da tabela


usando essas variveis, lembrando que elas so objetos.
Veja alguns exemplos de utilizao desses objetos:

queCidadeidcidade.Value; // l o valor do campo, inteiro nesse caso


queCidadeidcidade.AsString;
// l o valor do campo convertido para
string
Criao de TFields no uma novidade. Isso j existia nas verses anteriores. Apenas ficou um
pouco mais intuitivo e fcil manipular a criao desses objetos.

Referncia aos parmetros de um comando SQL


Como sabemos, possvel escrever comandos SQL utilizando parmetros. Um exemplo
mostrado no cdigo abaixo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

procedure TfrmConsCidade.btnPesquisarClick(Sender: TObject);


begin
with dmDados.queConsCidade do
begin
Close;
SQL.Clear;
if (rgCampo.ItemIndex = 0) then
begin
// pidcidade um parmetro
SQL.Add('select * from cidade where idcidade = :pidcidade');
// atribuio do valor do parmetro
ParamByName('pidcidade').Value := StrToInt(edValor.Text);
//Params[0].Value := StrToInt(edValor.Text);
end
else
begin
SQL.Add('select * from cidade where nome like :pnome');
ParamByName('pnome').Value := edValor.Text + '%';
end;
Open;
end;
end;

Em verses anteriores no havia o mtodo ParamByName(). O acesso a um parmetro era feito


usando Params[]. Isso mostrado na linha de cdigo 13, que aparece comentada. O uso de
ParamByName() torna o cdigo mais legvel.
O SQLdb melhorou muito, mas ainda aconselhamos o uso de ZeosLib.

Você também pode gostar