Laboratório de
Programação I
Carlos Oberdan Rolim
Ciência da Computação
Sistemas de Informação
Aplicação com
Bancos de dados usando dbExpress
Parte II
Componentes Data Control
Componentes Data Control são responsáveis por apresentar
os dados do banco de dados ao usuário
Vamos ver mais alguns componentes relacionados à
manipulação do banco de dados
DBEdit
É de longe o componente mais usado para mostrar campos.
Oferece uma caixa de edição conectada a um campo no
arquivo. Para usá-lo, basta preencher as propriedades
DataSource e DataField (nessa ordem)
DBLabel (ou DBText em versões mais
novas)
Permite exibir um campo de um registro atualmente ativo.
Seleciona-se o DataSource e o DataField (nessa ordem)
DBComboBox e DBListBox
DBComboBox permite exibir ou editar valores de uma coluna
de uma tabela
DBListBox funciona da mesma maneira, só que tem um
“visual” diferente.
Em ambos seleciona-se o DataSource e o DataField (nessa
ordem)
DBMemo
Permite exibir ou editar blobs de um registro ativo.
Seleciona-se o DataSource e o DataField (nessa ordem)
Exercício
Objetivos:
Demonstrar como efetuar alterações em uma tabela usando um
ClientDataSet (se for usado somente um sqlTable isso não é possivel)
Criar um form apresentando os campos da tabela agenda usando
componentes DBEdit
Demonstrar como ações que o DBNavigator executa podem ser
efetuadas através de botões
Form que será construido terá mais ou menos essa aparência
Componentes usados
Criar um Data Module e inserir os seguintes componentes
SQLConnection
DataSource
ClientDataSet
DataSetProvider
2 x SqlTable
Ajuste das propriedades
SQLConnection
Conforme visto anteriormente
SQLTable1
SQLConnection: SQLConnection1
TableName: usuarios
SQLTable2
SQLConnection: SQLConnection1
TableName: cidade
DataSetProvider
Dataset: SQLTable1
Datasource
Dataset: ClientDataSet 1
ClientDataSet
ProviderName: DataSetProvider1
Active: True
Field Editor
Clicando duas vezes sobre o ClientDataSet abre-se o form
Editor
Usar o botão direito para inserir campos de forma individual,
inserir todos os campos ou então inserir campos novos que
não existem na tabela (New Field)
Campo lookup pode ser utilizado para obter um campo de outra tabela
Pode “arrastar” os campos para dentro do form
Eventos
Cada um dos botões do form vai efetuar a ação do
DBNavigator
No evento onClick de cada botão inserir o seguinte:
Anterior
DataModule1->ClientDataSet1->Prior();
Delete
DataModule1->ClientDataSet1->Delete();
Update
DataModule1->ClientDataSet1->Post();
Acrescer
DataModule1->ClientDataSet1->Insert();
Seguinte
DataModule1->ClientDataSet1->Next();
Não esqueça de fazer o Form
usar o Data Module (Alt + f11)
Ajuste os eventos
Ajuste os seguintes eventos do ClientDataSet acrescendo
as seguintes linhas de código senão os dados não serão
atualizados
AfterPost  disparado após operação de edit ou insert
ClientDataSet1->ApplyUpdates(0); // Esse metodo envia
comando para efetivar as alteracoes efetuadas na tabela no banco
de dados
AfterDelete  disparado após uma deleção
ClientDataSet1->ApplyUpdates(0);
Execute a aplicação
Note que se você possui um cadastro de clientes bastante
simples porém funcional
Usando comandos SQL
Vamos criar um novo Form e usá-lo para acrescer dados na
tabela cidade usando comando SQL
Acrescer um TSQLQuery no Data Module e alterar a
propriedade SQLConnection para SQLConnection1
Usando comandos SQL
No evento onClick do botão acrescer o seguinte código
DataModule1->SQLQuery1->Active = false;
DataModule1->SQLQuery1->SQL->Clear();
DataModule1->SQLQuery1->SQL->Add("INSERT INTO
cidade(id, nome) values (NULL, '"+ Edit1->Text +"') ");
DataModule1->SQLQuery1->ExecSQL();
ShowMessage("Cidade cadastrada com sucesso!");
Não esqueça de fazer o Form
usar o Data Module (Alt + f11)
Execute a aplicação e veja que você consegue cadastrar uma
cidade na base de dados usando SQL
Master / Detail
Inicie uma nova aplicação
Vamos criar um relacionamento Master / Detail.
Como exemplo utilizaremos as tabelas usuarios e
ocorrencias, onde usuarios tabela Master e ocorrencias será
a Detail
Em um relacionamento Master/Detail, para cada registro da
tabela Master, são relacionados apenas os registros da
tabela Detail que tiverem os mesmos valores de chaves
primária e estrangeira, respectivamente (no nosso exemplo
id da tabela usuarios = id_usuario da tabela ocorrencias)
Acrescer tabela de ocorrências no mysql
Vamos usar a mesma base de dados cadastro criada
anteriormente e criar uma tabela para armazenar as
ocorrências associadas a um usuário.
Um usuário pode conter N ocorrências
# mysql –u root -p
mysql> USE cadastro;
CREATE TABLE `ocorrencias` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`ocorrencia` varchar(255) DEFAULT NULL,
`id_usuario` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
);
Visão do formulário
Acrescer mais os seguinte componentes
ao Data Module
SQLTable3
SQLConnection: SQLConnection1
TableName: ocorrencias
DataSetProvider2
Dataset: SQLTable3
Datasource2
Dataset: ClientDataSet 2
ClientDataSet2
ProviderName: DataSetProvider2
Active: True
Relacionamentos
Selecione a propriedade
MasterSource da tabela detail
SQLTable3, e escolha o nome
do DataSource da tabela
master, no caso DataSource1
(que foi vinculado a usuarios).
Dê duplo-clique na propriedade
MasterField (chave primária da
tabela master) na tabela
SQLTable3 para ver a janela de
designer do relacionamento.
Selecione id_usuario (da tabela
ocorrencias) em Detail Fields e
id (da tabela usuarios) em
Master Fields.O relacionamento
pode ser feito selecionando-se
as chaves primária e
estrangeira das duas tabelas e
clicando no botão Add.
Relacionamentos
Faça a mesma coisa com o
ClientDataSet 2. Selecione a
propriedade MasterSource
desse componente e escolha o
nome do DataSource da tabela
master, no caso DataSource1
(que foi vinculado a usuarios).
Dê duplo-clique na propriedade
MasterField (chave primária da
tabela master) para ver a janela
de designer do relacionamento.
Selecione id_usuario (da tabela
ocorrencias) em Detail Fields e
id (da tabela usuarios) em
Master Fields.O relacionamento
pode ser feito selecionando-se
as chaves primária e
estrangeira das duas tabelas e
clicando no botão Add.
Removendo obrigatoriedade do campo
do banco de dados
Como o campo “id” no banco de
dados foi definido como
auto_increment deve-se passar o
seu valor com NULL. Entretanto
se ele for deixado em branco no
DBGrid dará um erro (da figura ao
lado)
Pare resolver isso vá no Data
Module e clique duas vezes sobre
a SQLTable3. Abrirá o editor de
campos, clique com o botão direito
e acresça todos os campos (Add
all fields). Clique sobre o campo
“id” e mude a propriedade
Required para false
Removendo um campo do DBGrid
Pode-se remover um campo do DBGrid
Clicar duas vezes no DBGrid e no editor de campo clicar com o botão
direito e selecionar Acrescer todos os campos (Add All Fields).
Clicar no campo que se quer remover e pressionar a tecla Delete
Acresca mais os seguintes componentes
no Form
DBGrid
DataSource: DataModule1.DataSource2
DBNavigator2
DataSource: DataModule1.DataSource2
Execute a aplicação para ver os resultados
Localizar registros via SQL
Vamos utilizar um comando SQL para fazer uma query no
banco procurando pelo nome de um usuário (campo nome
do banco de dados)
Crie o seguinte form com um Edit, um Button e um DBGrid
No exemplo está se usando um DBGrid, mas pode-se usar
outros componentes para mostrar o resultado
Localizar registros via SQL
Acresça os seguintes componentes no Data Module
SQLQuery1
SQLConnection: SQLConnection1
DataSetProvider3
Dataset: SQLQuery1
Datasource3
Dataset: ClientDataSet 3
ClientDataSet3
ProviderName: DataSetProvider3
Localizar registros via SQL
No evento onClick do Button acresça o seguinte código:
DataModule1->SQLQuery1->Active = false;
DataModule1->SQLQuery1->SQL->Clear();
DataModule1->SQLQuery1->SQL->Add("SELECT * FROM usuarios WHERE
nome like '%"+ Edit1->Text +"%' ");
DataModule1->SQLQuery1->Open();
DataModule1->ClientDataSet3->Open();
if (DataModule1->ClientDataSet3->IsEmpty())
ShowMessage("Nada foi encontrado");
else{
DBGrid1->DataSource = DataModule1->DataSource3;
}
Acessando um campo da consulta SQL
Pode-se atribuir o resultado da consulta SQL a um componente
qualquer, como por exemplo, um label
DataModule1->SQLQuery1->Active = false;
DataModule1->SQLQuery1->SQL->Clear();
DataModule1->SQLQuery1->SQL->Add("SELECT * FROM usuarios WHERE nome
like '%"+ Edit1->Text +"%' ");
DataModule1->SQLQuery1->Open();
DataModule1->ClientDataSet3->Open();
if (DataModule1->ClientDataSet3->IsEmpty())
ShowMessage("Nada foi encontrado");
else{
Label2->Caption= DataModule1->SQLQuery1->FieldByName("nome")->AsString;
Isso é o label com
o valor de retorno
do campo nome
Download

db_parte2