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