Académique Documents
Professionnel Documents
Culture Documents
Este e-book é de autoria dos autores Rodrigo Costa e Sergio Ferreira, sendo comercializado
diretamente através do site www.juliobattisti.com.br e através do site de Leilões Mercado
Livre: www.mercadolivre.com.br, pelo usuário GROZA. Nenhum outro usuário e/ou site está
autorizado a vender este e-book.
Ao adquirir este e-book você tem o direito de lê-lo na tela do computador e de imprimir
quantas cópias desejar. É vetada a distribuição deste arquivo, mediante cópia ou qualquer
outro meio de reprodução, para outras pessoas. Se você recebeu este e-book através do e-
mail ou via ftp de algum site da Internet, ou através de um CD de revista, saiba que você está
com uma cópia pirata, não autorizada. O Valor cobrado por este arquivo é praticamente
simbólico pelas horas que ele representa. Novos cursos somente podem ser desenvolvidos pela
honestidade de pessoas que adquirem o arquivo do curso e não o distribuem livremente para
outras pessoas. Se você recebeu uma cópia deste arquivo se tê-la adquirido diretamente com
os autores, seja honesto, entre em contato através dos e-mails rdgcosta@msn.com ou
maissergio@hotmail.com para regularizar esta cópia.
Ao regularizar a sua cópia você estará remunerando, mediante uma pequena quantia, o
trabalho do autor e incentivando que novos trabalhos sejam disponibilizados. Se você tiver
sugestões sobre novos cursos que gostaria de ver publicados entre em contato pelos e-mails
rdgcosta@msn.com ou maissergio@hotmail.com.
Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades.
Sumário
Introdução
• Cadastro de Cursos
• Cadastro de Instrutores
• Cadastro de Turmas
• Cadastro de Alunos
• Cadastro de Matrículas
• Criando o Lançamento de Aulas
• Criando o Lançamento de Presença
• Montando o Pagamento de Instrutores
• Relação de Cursos
• Relação de Turmas por Curso
• Relação de Alunos por Turma
• Relatório de Faltas dos Alunos
• Relatório de Aulas por Instrutor
Conclusão
Introdução
Módulo 1:
Introdução aos Sistemas Gerenciadores
de Banco de Dados
N
este módulo iremos conhecer o modelo Cliente/Servidor e um Banco
de Dados que trabalha nesta plataforma: o Microsoft SQL Server
2000. Veremos como nos conectar a ele através do Enterprise
Manager e do Query Analyzer que são as principais ferramentas de interação
com o Banco de Dados. Em seguida aprenderemos um pouco sobre
modelagem de dados. Apesar da modelagem de dados não ser o foco deste
livro, este assunto será abordado, pois é muito importante que o
desenvolvedor conheça o modelo relacional e saiba trabalhar com ele.
Continuando nossa jornada no mundo dos SGBD’s, conheceremos a linguagem
SQL (Structured Query Language ou Linguagem de Consulta Estruturada) a
qual permitirá que recuperemos e modifiquemos as informações contidas em
um banco de dados.
responsável por armazenar as informações do sistema. Veja a figura abaixo que representa o
ambiente Cliente/Servidor:
Dentre as ferramentas disponíveis para utilização do SQL Server 2000, iremos utilizar
apenas duas, as mais importantes: o Enterprise Manager e o Query Analyzer.
O SQL Server 2000 possui vários bancos de dados que são criados durante a instalação.
Dentre eles, existem os bancos de dados de sistema, que são utilizados pelo SQL Server 2000
e os bancos de dados de exemplos. Os bancos de dados de sistema são: master, model,
msdb e tempdb. Cada um deles possui uma função específica para o funcionamento do SQL
Server e não podem ser excluídos! Existem também dois bancos de dados de exemplo:
Northwind e pubs. Estes bancos de dados são apenas amostras para ajudar no aprendizado
do SQL Server e podem ser excluídos sem problemas.
Além dos bancos de dados padrão do SQL Server, você pode criar seus próprios bancos
de dados e certamente faremos isto durante este curso.
Para voltar à tela anterior feche a janela de visualização dos dados da tabela.
Além dos dados contidos na tabela, podemos verificar a estrutura dela, ou seja, as
colunas com seus tipos de dados e tamanhos. Para isso, clique com o botão direito do mouse
sobre a tabela “Categories”. Na caixa de diálogo que aparecerá, clique em Design Table.
A outra ferramenta que iremos utilizar é o Query Analyzer, ele é a interface que permite
a entrada de comandos Transact-SQL. O Transact-SQL ou apenas T-SQL é a linguagem
utilizada pelo SQL Server. O T-SQL é uma extensão da linguagem SQL, ou seja, um conjunto
de comandos adicionados à linguagem SQL que é padrão para todos os bancos de dados
relacionais. No próximo capítulo falaremos mais sobre o T-SQL e a linguagem SQL.
Para abrir o Query Analyzer é preciso fornecer as credencias de logon, ou seja, informar
qual o servidor que deseja conectar e passar o usuário e a senha. Indique o nome ou o IP do
servidor onde está instalado o SQL Server. Caso o SQL Server esteja instalado localmente (na
mesma máquina que você está utilizando) não é necessário informar o nome do servidor.
Na barra de títulos da janela de conexão do Query Analyzer você pode observar em que
servidor/banco de dados/usuário está em uso no momento.
Existem muitas outras coisas que podemos fazer através das ferramentas do SQL
Server 2000, no entanto este curso não tem o objetivo de dominar o SQL Server, mas apenas
ensinar o suficiente para a criação de uma aplicação de banco de dados com Delphi e SQL
Server. Para um conhecimento mais aprofundado do Microsoft SQL Server 2000, sugerimos o
livro de SQL Server 2000 do Júlio Battisti.
Modelagem de Dados
Como em quase tudo, o planejamento e o projeto são a parte mais chata. Entretanto,
esta fase é fundamental para o sucesso de uma boa aplicação.
Obs.: O nome de um banco de dados, assim como de tabelas, colunas e outros objetos
do SQL Server, não deve possuir caracteres especiais, acentos ou espaços.
Após criar o banco de dados Rodoviaria, acesse a seção Tables para criarmos as
tabelas do modelo de dados. Você perceberá que já existirão outras tabelas criadas no Banco
de Dados Rodoviaria. Estas tabelas “sys_alguma_coisa” são para uso exclusivo do SQL Server,
portanto, ignore-as. Clique com o botão direito sobre a opção Tables e em seguida em New
Table...
Será exibida uma tela para criarmos a estrutura da nova tabela. Vamos criar primeiro a
tabela “Empresas”, para isso basta seguir as especificações do modelo que criamos
anteriormente. Digite o nome da primeira coluna da tabela Empresas que, segundo nosso
modelo, é “cod_empresa”. Em Data Type escolha o tipo de dado “int” e em seguida clique no
ícone que possui a figura de uma chave para especificar que esta coluna é a chave primária
desta tabela.
O tamanho de uma coluna do tipo int é por padrão igual a 4 e não pode ser alterado.
Este 4 não representa a quantidade de algarismos que poderão ser armazenados e sim a
quantidade de bytes em disco que esta coluna pode ocupar. O tipo int suporta números
inteiros positivos ou negativos que vão de -2.147.483.657 à +2.147.483.657, ou seja, dá para
armazenar muitos números nesta coluna.
Preencha agora o nome da segunda coluna da tabela Empresas: “nome”. Em Data
Type selecione o tipo varchar e defina o tamanho máximo de 30 caracteres em Length.
Diferentemente do tipo int, o tamanho de uma coluna do tipo varchar especifica a quantidade
máxima de caracteres permitidos nesta coluna. Desmarque a opção Allow Nulls (Permitir
nulo) da coluna “nome”, pois esta coluna deve ter preenchimento obrigatório. A coluna
“cod_empresa” também é obrigatória, mais como já definimos que ela é chave primária,
Autores: Rodrigo Costa e Sergio Ferreira Página 19
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
automaticamente o SQL Server desmarca a opção Allow Nulls, pois a chave primária sempre
é obrigatória. Com isto, criamos a estrutura da tabela “Empresas” de acordo com o que foi
especificado no modelo de dados.
Só falta definir o nome da tabela, para isto clique sobre o ícone que possui a figura de
um disquete. Esta opção serve para salvar as alterações feitas e para definir o nome da tabela
quando isto ainda não foi feito. Obviamente, salve a tabela com o nome: Empresas.
Pronto, a tabela foi criada! Feche a janela de edição e você verá a nova tabela na lista
de tabelas do banco de dados Rodoviaria.
Caso você precise alterar ou corrigir alguma coisa na estrutura da tabela, basta clicar
sobre ela com o botão direito e em seguida clicar em Design Table.
Você deve ter percebido que fica um pouco confuso visualizar nossa tabela entre um
monte de tabelas de sistema do SQL Server. Caso você deseje que estas tabelas do SQL
Server não sejam exibidas, faça o seguinte:
Clique com o botão direito do mouse sobre a opção que representa seu servidor e
depois clique em “Edit SQL Server Registration properties...”.
Prosseguindo com a construção das tabelas de nosso modelo de dados, vamos agora
criar a tabela “Motoristas”.
Autores: Rodrigo Costa e Sergio Ferreira Página 21
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Clique com o botão direito sobre a opção Tables do banco de dados Rodoviaria e em
seguida em New Table...
Crie a estrutura da tabela “Motoristas” seguindo as especificações do modelo de dados
assim como fizemos com a tabela “Empresas”. Preencha corretamente os nomes das colunas e
selecione os respectivos tipos de dados. Não esqueça de definir o tamanho de 40 caracteres
para a coluna “nome” e de especificar a coluna “num_motorista” como chave primária da
tabela. A coluna “sexo” possui um tamanho máximo de 1 caractere, pois iremos armazenar
apenas “M” ou “F”. Após criar a estrutura, salve a tabela como nome “Motoristas”.
A próxima (e última) tabela que iremos criar é a tabela “Onibus”. Deixamos esta tabela
por último pelo simples fato dela “depender” das outras duas, ou seja, ela possui chave
estrangeira para as tabelas “Empresas” e “Onibus”. Nós poderíamos ter criado ela antes das
outras, só que depois teríamos que editá-la para referenciar as chaves estrangeiras. Assim,
com as outras tabelas já criadas, iremos fazer tudo de uma vez.
Novamente clique com o botão direito sobre a opção Tables do banco de dados
Rodoviaria e em seguida em New Table... Preencha os campos de acordo com o modelo de
dados.
Após preencher os campos, salve a tabela como “Onibus”, mas deixe a janela de edição
aberta para que possamos configurar as chaves estrangeiras. Clique sobre a opção “Table and
Index Properties” que está representada através de um ícone com uma figura de uma mão
segurando um pedaço de papel.
Nesta tela é que iremos criar nossas chaves estrangeiras. Só para lembrar: uma chave
estrangeira é uma coluna que “aponta” para outra coluna de uma outra tabela. A chave
estrangeira somente pode apontar para uma coluna que seja chave primária ou que possua
uma chave única (este conceito não será abordado neste curso). O termo “Chave Primária” é
mais conhecido como “Primary Key” ou apenas “PK” e o termo “Chave Estrangeira” é
conhecido como “Foreign Key” ou simplesmente “FK”.
Para criar nossa primeira chave estrangeira, clique sobre o botão “New”. Na caixa de
seleção “Primary key table”, selecione a tabela Empresas e logo abaixo selecione a coluna
“cod_empresa”. Na caixa de seleção “Foreign key table”, selecione a tabela “Onibus” e em
seguida selecione a coluna “cod_empresa”. O que acabamos de fazer foi: dizer para o SQL
Server que a coluna “cod_empresa” da tabela Onibus está ligada à coluna “cod_empresa” da
tabela “Empresas”.
Agora vamos criar a chave estrangeira para a tabela “Motoristas”. Clique novamente
sobre o botão “New” e repita o procedimento apontando a coluna “num_motorista” da tabela
“Onibus” para a coluna “num_motorista” da coluna “Motoristas”.
Clique sobre o botão “Fechar” e depois salve as alterações clicando sobre o botão com o
ícone de um disquete. O SQL Server informará que as alterações efetuadas afetarão outras
tabelas.
Clique em Avançar para exibir a próxima tela onde iremos selecionar as tabelas que
farão parte do nosso diagrama.
Selecione todas as tabelas e clique no botão “Add >”. Em seguida, clique em Avançar e
na tela seguinte em Concluir. Então o SQL Server montará o diagrama com as tabelas e seus
respectivos relacionamentos.
Com base no diagrama montado pelo SQL Server podemos concluir que criamos as
tabelas e os relacionamentos corretamente de acordo com nosso modelo de dados.
Modelo de dados
Instrução SELECT
De uma forma geral, se você conhecer bem a linguagem SQL padrão, não terá
dificuldades em utilizar um ou outro SGBD, você apenas precisará aprender as funções
específicas de cada software.
Digite todas as linhas mesmo sem entender o que está digitando. Estas linhas são
comandos de inserção de dados através da instrução INSERT que iremos aprender mais
adiante neste curso.
Após digitar os comandos acima, sua tela deve ficar semelhante à exibida na figura a
seguir:
Após executar o script, o Query Analyzer exibirá o painel de resultados. Se você digitou
corretamente as linhas acima, deverá ser exibido o texto “(1 row(s) affected)” para cada
INSERT realizado.
No Query Analyzer você pode salvar seu script em arquivo do tipo texto com a extensão
“.sql”. Para salvar o script recém criado, clique em File > Save.
Defina um nome para o arquivo e onde o mesmo será gravado, em seguida clique em
Salvar.
É muito interessante você salvar seus scripts, pois nunca se sabe quando vai precisar
deles novamente. Para abrir um script gravado, basta clicar em File > Open, selecionar o
arquivo desejado e clicar em Abrir.
O Query Analyzer também permite que você trabalhe com várias janelas
simultaneamente. Você pode abrir novas janelas através da opção New Query.
Vamos afinal, conhecer o comando SELECT. Feche a janela do script que executamos
para popular o banco de dados Rodoviaria e deixe apenas uma janela limpa aberta.
Para recuperar mais de uma coluna da tabela você deve digitar o nome de cada coluna
separado por vírgula. Por exemplo, para obter o nome, a idade e o sexo dos motoristas, o
comando seria o seguinte:
Para selecionar todas as colunas de uma tabela, você pode digitar o nome de cada uma
delas separado por vírgula ou simplesmente colocar um asterisco “*” no lugar dos nomes das
colunas. Por exemplo, para obter todas as colunas da tabela Motoristas, o comando seria o
seguinte:
O símbolo asterisco (*) representa todas as colunas de uma tabela, sendo assim,
sempre que quiser obter todas as colunas de uma tabela basta colocar um asterisco ao invés
de digitar o nome de todas as colunas.
Você pode atribuir um título para cada coluna retornada em sua consulta caso não
deseje que título seja o próprio nome da coluna. Por exemplo, se ao invés de aparecer
“num_motorista” você quiser que apareça “Número do Motorista”, você então deverá utilizar
um apelido. Exemplo:
Autores: Rodrigo Costa e Sergio Ferreira Página 34
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Você pode atribuir um apelido para cada coluna da consulta, isto é bem interessante
para gerar relatórios com títulos de coluna mais descritivos. Abaixo mais um exemplo de
utilização de apelidos.
Além da sintaxe básica da instrução SELECT que recupera todos os registros de uma
tabela, podemos utilizar a cláusula WHERE para restringir o resultado desejado. Por exemplo,
o comando “SELECT NOME FROM MOTORISTAS” devolve a coluna nome de todos os registros
existentes na tabela Motoristas e se quiséssemos obter somente o nome dos motoristas que
são do sexo Masculino, o comando seria:
O comando acima pode ser lido desta forma: “Obtenha o nome dos motoristas onde o
sexo seja igual a ‘M’”. Para obter o nome dos motoristas que sejam do sexo Feminino basta
alterar o valor M para F:
A cláusula WHERE permite que você defina mais de uma restrição, para isto basta
separar cada condição através do operador “AND”. Por exemplo, para obter os motoristas que
sejam do sexo masculino e tenham mais de 30 anos, o comando seria o seguinte:
Você também pode restringir o resultado de uma consulta utilizando o operador LIKE.
Este operador permite que você crie uma condição parcial como aqueles casos em que não é
possível utilizar os operadores “=” (igual) ou “<>” (diferente). Por exemplo, obter os
motoristas cujos nomes comecem pela letra “A”. O operador LIKE é utilizado juntamente com
o operador “%” (percentagem). O comando então seria:
Para obter os motoristas cujo último nome seja “Silva”, o comando seria:
Outro exemplo de utilização do operador LIKE: Obter os ônibus que possuam o texto
“São João” na coluna trajeto, ou seja, os ônibus que passam por São João. O comando seria:
O SQL Server também permite que você ordene o resultado de uma consulta através da
cláusula ORDER BY. Para ordenar o resultado de consulta basta incluir a cláusula ORDER BY
e o nome da coluna no fim do comando SELECT. O ORDER BY sempre deve ser a última
cláusula de uma instrução SELECT. Por exemplo, para obter todos os motoristas ordenando o
resultado pelo nome:
A cláusula ORDER BY ordena o resultado por ordem alfabética caso a coluna seja do
tipo texto ou caractere, se a coluna for numérica, o ORDER BY ordenará do menor para o
maior. Você também pode definir se deseja ordenar em ordem ascendente ou descente, por
exemplo, ordenar os funcionários por nome em ordem descendente seria:
OBS.: Se você não informar os parâmetros DESC ou ASC para a cláusula ORDER BY, o
SQL Server assume o parâmetro ASC como padrão, ou seja, se você colocar ASC ou não
colocar nada, dá no mesmo.
Para exemplificar um pouco mais, imagine que você precise gerar uma relação de todos
os motoristas da Rodoviária ordenando-os do maior para o menor salário. O SELECT seria o
seguinte:
Você também pode ordenar por mais de uma coluna, por exemplo, ordenar por sexo
em seguida por nome e depois por salário.
A linguagem SQL também fornece várias funções que são muito úteis no dia-a-dia do
desenvolvimento de aplicações. Aqui iremos conhecer apenas as que serão necessárias a este
curso.
Algumas funções SQL:
Para ter um melhor aproveitamento das funções SQL disponíveis no SQL Server, é
importante conhecer a cláusula GROUP BY. A cláusula GROUP BY tem por finalidade agrupar o
resultado de um consulta. Vamos ver logo um exemplo de utilização do GROUP BY para ilustrar
sua funcionalidade. Imagine que você precisasse emitir um relatório que informasse a
quantidade de motoristas do sexo masculino e sexo feminino. Talvez você possa pensar que
com dois comandos SQL você teria esta informação, exemplo:
Outro exemplo de uso do GROUP BY: relatório de média salarial dos motoristas por
sexo, ou seja, queremos saber em média quem ganha mais: homem ou mulher?
Você deve ter percebido que quando temos mais de uma tabela numa instrução
SELECT, devemos referenciar cada coluna dizendo à que tabela ela pertence, ou seja, devemos
informar a “tabela.coluna” que queremos que seja retornado no SELECT.
Um outro exemplo, para conhecer o nome do motorista de cada ônibus, o SELECT seria
o seguinte:
Instrução INSERT
A instrução INSERT, como seu próprio nome indica, tem a finalidade de inserir registros
em uma tabela. É através do comando INSERT que podemos cadastrar novos registros e
alimentar as tabelas de nosso banco de dados.
Entendo a sintaxe acima: as palavras INSERT e INTO são fixas, portanto você sempre
vai digitá-las. Em seguida vem o nome da tabela que você vai inserir um novo registro. Após o
nome da tabela, você deve especificar o nome de cada coluna que você vai preencher entre
parênteses “( )”. Caso você vá preencher todas as colunas da tabela e na mesma ordem em
que elas estão na tabela, então não é necessário digitar o nome das colunas, caso contrário
você deve digitar apenas o nome das colunas que você vai preencher. Após o nome das
colunas que serão preenchidas, vem outra palavra fixa: VALUES e em seguida você deve
digitar os valores que preencherão as colunas informadas na lista de colunas digitadas.
OBS.: Assim como no Delphi, você deve colocar tudo o que for texto entre aspas
simples “ ‘ ”. Veja que as colunas nome e sexo que são do tipo varchar e por isso os valores
‘José Carlos’ e ‘M’ foram passadas entre aspas simples para que o SQL Server entenda que
estes valores são do tipo texto e não gere um erro de incompatibilidade de tipos de dados.
Exemplo:
Observe que no comando acima não referenciamos as colunas que seriam preenchidas
uma vez que iríamos preencher todas elas.
É importante analisar as tabelas antes de efetuar qualquer inserção para que não haja
erros de integridade de dados. Por exemplo, vamos tentar inserir um novo registro na tabela
Onibus. Digite o comando abaixo e em seguida execute-o:
Instrução UPDATE
A instrução UPDATE é utilizada para atualizar o valor de uma ou mais colunas de uma
tabela. Este comando tem a finalidade de substituir o valor existente em uma coluna por um
novo valor. A sintaxe básica é a seguinte:
Exemplo:
Para atualizar mais de uma coluna, basta especificar cada coluna separado-as por
vírgula, por exemplo, suponhamos que o ônibus que faz o trajeto Nilópolis X Caxias tenha sido
vendido para uma outra empresa e consequentemente terá outro motorista. O comando seria
o seguinte:
A instrução acima está alterando o ônibus que faz o trajeto Nilópolis X Caxias
atualizando a coluna cod_empresa para 106 e a coluna num_motorista para 352.
Observe que não impomos nenhuma condição através da cláusula WHERE, pois
realmente queríamos que todos os registros fossem atualizados. Nesta instrução estamos
atualizando a coluna Salário com o seu próprio valor multiplicado por 1.10, ou seja, estamos
aumentando cada salário em 10%.
Instrução DELETE
No script fictício abaixo, cada instrução SQL é uma transação separada. Se qualquer
uma das instruções falhar, ela não afetará as outras. Cada instrução é bem-sucedida ou falha
por inteiro, independentemente das outras instruções no script.
Se você pensar em operações que são realizadas apenas com uma instrução SQL, como
por exemplo excluir um funcionário da lista de empregados de uma empresa, pode achar que
não tem muita importância trabalhar com transações. Entretanto, quando estamos
trabalhando com operações mais complexas como, por exemplo, pagamento de funcionário, a
simples operação de pagamento pode ser composta por várias instruções SQL que fazem
vários INSERT’S e UPDATE’S em várias tabelas para que um simples pagamento seja
realizado. Desta forma, o pagamento só poderá ser efetivado se todas as alterações forem
efetuadas com sucesso, senão todas as alterações devem ser desfeitas para que não haja
inconsistências num banco de dados.
BEGIN TRANSACTION
Para que possamos excluir registros sem a preocupação de depois ter de inserir tudo de
novo, execute o comando abaixo antes de começar a excluir:
BEGIN TRANSACTION
pode apagar o comando BEGIN TRANSACTION que acabou de executar para poder digitar os
DELETE’S que serão exemplificados neste capítulo. Mais atente para um detalhe, você deve
continuar na mesma janela que executou o BEGIN TRANSACTION pois a transação só é válida
para uma sessão e cada janela do Query Analyzer é uma sessão diferente.
A instrução DELETE, como o próprio nome sugere, tem por finalidade excluir registros
de uma tabela. Sua sintaxe básica é a seguinte:
Você pode verificar se o registro foi realmente excluído executando o seguinte SELECT:
Após analisar o resultado acima, podemos ver que o registro foi excluído, entretanto
esta exclusão ainda não foi efetivada no banco de dados, pois iniciamos uma transação quando
executamos o comando BEGIN TRANSACTION. Execute agora o seguinte comando:
ROLLBACK TRANSACTION
Veja que o registro que tinha sido excluído voltou a aparecer. Isto ocorreu porque
iniciamos uma transação e, após fazer a exclusão, encerramos a transação revertendo o
DELETE através da instrução ROLLBACK TRANSACTION. Se ao invés do ROLLBACK tivéssemos
executado um COMMIT TRANSACTION, a exclusão seria definitiva. O DELETE também seria
definitivo se tivéssemos executado o DELETE sem iniciar uma transação, pois o SQL Server
executaria uma transação automática.
Sendo assim, inicie outra transação executando o comando BEGIN TRANSACTION
para que possamos excluir registros e depois reverter todas as exclusões.
Veja que após executar o comando, o SQL Server gera um erro de chave estrangeira,
pois estamos tentando excluir uma empresa que possui ônibus ligados a ela, ou seja, não
podemos excluir um registro “mãe” que possui registros “filhos”. Para excluir um registro
“mãe” devemos primeiro excluir os registros “filhos”.
Vamos então excluir todos os ônibus que pertencem a empresa FLORES que possui o
código 101:
O comando DELETE também pode ser utilizado para limpar uma tabela, para isto basta
executar a instrução sem utilizar a cláusula WHERE. Exemplo:
O DELETE executado acima excluiu todos os registros da tabela Onibus sem filtrar
qualquer condição porque não utilizamos a cláusula WHERE, ou seja, o comando limpou a
tabela.
Módulo 2:
Conectando o Delphi ao SQL Server
O
Delphi disponibiliza um conjunto de objetos para manipulação de
banco de dados. Aqui veremos todos os objetos que serão
necessários para a criação de uma aplicação baseada em um banco
de dados Cliente/Servidor. Veremos como fazer a conexão como o servidor,
recuperar informações e modificar os dados utilizando os comandos SQL
aprendidos no módulo anterior. Além disso, veremos como prevenir e tratar
erros de banco de dados para que a aplicação não aborte o processo e esteja
preparada para todos os possíveis erros.
• BDE: Essa era a tecnologia padrão de banco de dados nas primeiras versões do
Delphi, mas a Borland agora a considera obsoleta. Isso é particularmente
verdadeiro para o uso do BDE com servidores SQL, pois além do Client do banco
de dados, você deve instalar o BDE em cada estação de trabalho que usará o
sistema. Você pode visualizar os componentes do BDE através da guia BDE
presente na pela de componentes.
• ADO: o ActiveX Data Objects é a interface de alto nível da Microsoft para acesso
a banco de dados. O ADO é implementado na tecnologia de acesso a dados OLE
DB da Microsoft, que fornece acesso a banco de dados relacionais, bem como a
sistemas de arquivos, email e objetos corporativos personalizados. O ADO é um
mecanismo com recursos muito interessantes como independência de servidor
de banco de dados. Sua configuração é simplificada e a instalação também, pois
o mecanismo já faz parte das versões atuais do Windows. Os objetos do ADO
estão disponíveis na guia ADO da paleta de componentes.
• dbExpress: Um dos novos recursos do Delphi nos últimos anos foi a introdução
da biblioteca de banco de dados dbExpress (DBX), disponível para Linux e
Windows. O DBX é uma biblioteca e não um mecanismo de acesso a dados,
porque usa uma estratégia leve e basicamente não exige nenhuma configuração
nas máquinas dos usuários finais. Comparado com outros mecanismos de banco
de dados, o dbExpress é muito limitado em termos de recursos. Ele pode
acessar apenas servidores SQL, não recurso de cachê e oferece apenas acesso
unidirecional aos dados. Acesse a guia dbExpress da paleta de componentes
para visualizar os componentes DBX.
Obviamente, devemos escolher que tecnologia de acesso a dados iremos utilizar. Não
cabe aqui dizermos qual é a melhor ou pior, devemos definir qual mecanismo utilizar
dependendo do ambiente que estamos trabalhando e das tecnologias envolvidas.
Neste curso iremos criar aplicações de banco de dados cliente/servidor para o sistema
operacional Windows utilizando o servidor de banco de dados SQL Server. Logo podemos
perceber que estamos num ambiente totalmente Microsoft, sendo assim, a melhor opção neste
caso é utilizar o mecanismo de acesso a dados ADO que é nativo da própria Microsoft e já está
presente em qualquer versão do Windows atualmente sendo desnecessário a instalação destes
componentes nas estações de trabalho.
Para criar nossas aplicações, precisaremos apenas de dois objetos da guia ADO: o
ADOConnection e o ADOQuery. O objeto ADOConnection é usado fazer a conexão com o banco
de dados e o objeto ADOQuery é usado para executar comandos SQL e para retornar dados
através da instrução SELECT. Mais adiante veremos como configurá-los.
(BDE, ADO, DBX...). Este componentes estão disponíveis nas através das guias Data Access e
Data Controls.
Da guia Data Access somente iremos utilizar o objeto DataSource. Este objeto faz o
intercâmbio entre os objetos do mecanismo de banco de dados (ADO, BDE, DBX...) o os
objetos de manipulação de dados que estão na guia Data Controls.
Os objetos da guia Data Controls são utilizados para manipulação dos dados. Por
exemplo, o objeto DbGrid pode ser utilizado para visualização e para edição dos dados, o
objeto DbEdit é semelhante ao objeto Edit da paleta Standard com a diferença de somente
ser utilizado quando ligado a uma coluna de uma tabela de banco de dados. Durante o curso
veremos a utilização dos objetos da guia Data Controls.
Neste capítulo iremos ver como recuperar informações através de um programa Delphi
usando a instrução SELECT. Usaremos como exemplo o banco de dados “Rodoviaria” que tem
sido nosso objeto de estudo até agora.
Antes de qualquer coisa, crie uma pasta chamada “Projeto Rodoviária” para salvar os
arquivos que iremos criar. Em seguida abra o Delphi para começarmos!
A primeira coisa que o Delphi vai pedir para salvar é a Unit do Form_menu, portanto
salve o arquivo como o nome “Unit_menu”. Lembre-se de salvar os arquivos na pasta que
criamos para este propósito.
Autores: Rodrigo Costa e Sergio Ferreira Página 66
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Em seguida o Delphi pedirá que salve o arquivo do projeto, salve-o como nome
“Rodoviaria”.
Após salvar os arquivos, insira 4 objetos BitBtn ao Form_menu. Estes botões serão
utilizados para chamar as outras telas do programa e para fechar a aplicação.
A primeira opção que devemos configurar é o software de banco de dados que iremos
acessar, em nosso caso, iremos acessar um servidor SQL Server, portanto selecione a opção
Microsoft OLE DB Provider for SQL Server. Clique em Avançar para continuar com a
configuração do objeto ConexaoDB.
Agora devemos informar o nome do servidor SQL Server que desejamos acessar. Você
também pode informar o endereço IP do servidor caso não saiba ou não queira usar o nome do
servidor.
A última opção a configurar é o banco de dados que iremos acessar. Como vimos
anteriormente neste curso, um servidor SQL Server possui vários banco de dados e aqui
podemos então selecionar qual deles iremos acessar. Selecione o banco de dados Rodoviaria.
Agora insira um novo Form ao projeto. Este novo Form será utilizado para o cadastro de
Empresas.
A partir de agora até o final deste curso, toda vez que for solicitado a criação de um
botão Fechar, repita os procedimentos que acabamos de executar. Assim não precisaremos
ficar repetindo toda hora o que você já vai estar careca de saber!
Além da propriedade SQL do objeto, devemos definir a conexão que o objeto utilizará
para executar a instrução SQL. A conexão a ser utilizada pelo adoquery_empresas e por todos
os outros objetos que iremos criar, foi configurada através do objeto conexaoBD que está no
form_menu. Sendo assim, devemos ligar o objeto adoquery_empresas ao objeto conexaoBD.
Como o objeto ConexaoBD está no form_menu, devemos informar ao Delphi que o
form_empresas terá acesso ao form_menu. Para isto, clique em File > Use Unit.
O objeto DBGrid, assim como todos os objetos da guia Data Controls, não “fala”
diretamente com os objetos ADO, portanto será necessário mais um objeto que fará o
intercâmbio entre eles: o DataSource que está na guia Data Access.
Não é muito interessante deixar o adoquery ativo, é sempre muito melhor ativá-lo
durante a execução do programa, pois assim ele sempre estará atualizado, portanto coloque
False na propriedade Active do adoquery_empresas. Vamos fazer o seguinte: ativar o
adoquery_empresas quando o form_empresas for exibido e desativá-lo quando o
form_empresas for fechado.O evento executado na exibição de um Form é OnShow e o
executado quando um form é fechado é OnClose.
Sendo assim, acesse o evento OnShow do form_empresas e digite:
“adoquery_empresas.Open;”
Agora salve todas as alterações clicando em Save All e execute a aplicação. Quando
você clicar sobre o botão Run ou pressionar F9 para executar a aplicação o Delphi informará
que o form_menu está fazendo menção ao form_empresas e lhe questiona se deseja que ele
crie automaticamente esta referência no código. Clique em Yes e execute a aplicação.
Após testar a aplicação feche o projeto que está executando clicando sobre o botão
fechar que colocamos no form_menu. Vamos agora fazer o mesmo para Motoristas e Ônibus.
Repita os mesmos passos que fizemos para criar a tela de Empresas: Insira um novo Form,
altere Name e Caption, salve com o nome apropriado... Releia as páginas anteriores para
lembrar de todos os procedimentos.
O SELECT a ser usado para a tela de Motoristas será:
O SELECT para a tela de Ônibus será um pouco mais complicado, pois faremos JOIN
com as outras tabelas para poder exibir o nome da empresa e do motorista:
Inserindo Dados
Para incluir informações em uma tabela, o usuário vai precisar de campos de entrada
de dados, portanto vamos incluir alguns objetos que permitirão o usuário digitar as
informações desejadas.
Nós já temos um objeto ADOQuery que realiza o SELECT para visualização dos registros
existentes na tabela Empresas do banco de dados Rodoviaria, agora precisaremos de outro
objeto ADOQuery para executar a instrução INSERT e os demais comandos SQL (UPDATE e
DELETE) necessários para a funcionalidade desta tela. Insira então um objeto ADOQuery,
altere a propriedade Name dele para adoquery_aux (“aux” de auxiliar, pois vai nos auxiliar a
executar as instruções SQL) e selecione o objeto ConexaoDB na propriedade Connection para
ligá-lo ao objeto ADOConnection que está no form_menu.
As linhas começadas com “//” são comentários e por isso não são executadas pelo
Delphi, elas servem para documentar o código e explicar o que ele está fazendo. Você pode
alterar as cores de letra e background dos comentários através do menu do Delphi Tools >
Editor Options.
Após digitar o código acima, salve todas as alterações clicando sobre o botão Save All.
Em seguida execute o projeto para testar a nova funcionalidade.
Insira mais alguns registros para testar a aplicação. Apenas certifique-se de que não vai
inserir uma empresa com um código que já esteja cadastrado, do contrário ocorrerá um erro
de violação de chave primária. Mais adiante neste curso veremos como tratar erros de banco
de dados.
Autores: Rodrigo Costa e Sergio Ferreira Página 86
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Insira dois objetos Edit ao form_onibus, um para o usuário digitar o número do ônibus e
o outro para o usuário digitar o trajeto do mesmo. Altere a propriedade Name deles para
“edt_num” e “edt_trajeto” respectivamente. Para os outros dois campos da tabela:
num_motorista e cod_empresa, usaremos o objeto ComboBox (guia Standard), pois como
estas informações já estão cadastradas, iremos exibir uma lista para que o usuário selecione a
que desejar. Insira dois objetos ComboBox, um para o motorista e o outro para a empresa.
Esta tela não será tão simples como as outras, pois iremos exibir informações de outras
tabelas através dos objetos combobox o que exigirá uma programação mais elaborada. Vamos
alimentar os objetos ComboBox quando o a tela de ônibus for exibida, para isto adicione o
código abaixo no evento OnShow do form_menu:
Os objetos ComboBox irão exibir os nomes dos motoristas e das empresas, entretanto o
que deve ser gravado na tabela é o número do motorista e o código da empresa e não os
nomes. Sendo assim, vamos criar duas variáveis que servirão para armazenar estes valores.
Agora só falta programar o botão “Inserir”. Para isto digite o código abaixo:
Atualizando dados
Primeiro iremos configurar o DBGrid para que a marca de seleção destaque toda a linha
e não somente uma célula.
Antes
Depois
Faça o mesmo para a tela de motoristas (não esqueça de declarar a variável para
armazenara chave primária). O código do evento OnClick do botão Alterar será o seguinte:
Para a tela de Ônibus, repita mais uma vez os procedimentos. O código do evento
OnClick do botão Alterar será o seguinte:
Excluindo Dados
Nos capítulos anteriores nós vimos como recuperar, inserir e atualizar informações de
um banco de dados através de uma aplicação Delphi usando as instruções SELECT, INSERT e
UPDATE. Agora veremos como excluir dados também através do Delphi usando a instrução
DELETE. Seguindo a mesma seqüência até aqui, vamos programar a tela de Empresas.
Insira mais um objeto BitBtn ao form_empresas e altere a propriedade Name para
“btn_excluir” e Caption para “Excluir”. Sua tela deve ficar semelhante à exibida abaixo:
Após digitar o código acima, salve e execute a aplicação para testar a funcionalidade de
exclusão de dados.
A mensagem acima está notificando que ao tentarmos excluir a empresa, o SQL Server
gerou um erro de FK (FK_Onibus_Empresas), pois tentamos excluir uma empresa que possui
Ônibus ligados à ela, ou seja, precisaremos excluir os Ônibus desta empresa antes de deletá-
la. Com certeza esta mensagem não é muito clara ao usuário comum, por isso, no próximo
capítulo veremos como tratar os erros de banco de dados a fim de emitir uma mensagem mais
amigável ao usuário. Por enquanto, deixe como está, vamos prosseguir e programar a tela de
Motoristas.
Repita os procedimentos adotados para a tela de Empresas e no evento OnClick do
botão Excluir da tela de Motoristas digite o seguinte:
Após digitar o código acima, salve e execute a aplicação para testar a funcionalidade de
exclusão de Motoristas.
Já que para excluir Empresas e/ou Motoristas precisaremos excluir os Ônibus que por
ventura estejam ligados a eles, vamos criar a funcionalidade de exclusão para a tela de
Ônibus.
Acesse o Form_onibus e repita os passos de inserir um botão, renomeá-lo e etc. No
evento OnClick do btn_excluir do Form_onibus, digite o seguinte código:
Após digitar o código acima, salve e execute a aplicação para testar a funcionalidade de
exclusão de Ônibus.
Exclua alguns Ônibus e em seguida tente excluir Motoristas e Empresas que não
possuam mais Ônibus ligados a eles.
AdoConnection.BeginTrans;
Adoquery.sql.text := ‘DELETE FROM EMPRESAS’;
Try
Adoquery.ExecSQL;
AdoConnection.CommitTrans;
Except
Showmessage(‘Ocorreu um erro nesta operação !’);
AdoConnection.RollbackTrans;
End;
O trecho de código acima está tentando excluir todos os registros da tabela “Empresas”,
caso ocorra algum erro na execução do comando SQL ou na confirmação da transação, o
Delphi irá executar os comandos que estão na seção Except.
Obs.: Quando ocorre algum erro durante a execução de um programa, dizemos que foi
levantada uma exception (exceção) e por isso o nome “try...except”.
AdoConnection.BeginTrans;
Adoquery.sql.text := ‘DELETE FROM EMPRESAS’;
Try
Adoquery.ExecSQL;
AdoConnection.CommitTrans;
Except
on E : Exception do
begin
Showmessage('Ocorreu o seguinte erro: '+ E.Message);
AdoConnection.RollbackTrans;
end;
End;
Isto é particularmente útil para obter a mensagem de erro gerada, assim podemos
“interpretá-la” e então exibir uma mensagem mais amigável ao usuário.
Por exemplo, ao invés de deixar o programa exibir a mensagem original do erro de FK,
exibiríamos uma mensagem que qualquer usuário conseguiria entender:
Vamos aprender melhor como isto funciona na prática utilizando esta técnica para
tratar erros de banco de dados em nosso projeto Rodoviário. Nós iremos usar o try...except
nas operações de inserção, atualização e exclusão de dados primeiramente na tela de
Empresas.
Antes de começar a programar, temos que verificar quais são os possíveis erros de
banco de dados em cada operação. Por exemplo, na inserção de dados pode ser que ocorra um
erro de duplicação de PK (Primary Key ou Chave Primária) se o usuário tentar inserir uma nova
empresa com um código que já esteja cadastrado. Toda vez que ocorre um erro de violação da
restrição de dados, o SQL Server devolve na mensagem de erro o nome da restrição que foi
violada. Desta forma, basta verificarmos se o nome da restrição que queremos checar está na
mensagem de erro devolvida pelo SQL Server ao programa Delphi. Nós podemos ver o nome
de todas as restrições de dados (conhecidas como CONSTRAINTS) através do Enterprise
Manager. Por exemplo, para ver o nome da restrição de PK da tabela Empresas, clique com o
botão direito do mouse sobre a tabela e em seguida clique em “Design Table”.
Na janela que surgirá, acesse a guia Indexes/Keys e veja no campo “Index Name” o
nome da restrição de dados.
Uma vez conhecido o nome da violação, temos que alterar o código do programa para
verificar se este nome aparece na mensagem de erro. Se aparecer, então exibimos uma
mensagem clara para o usuário, do contrário, devemos exibir a mensagem original já que é
difícil imaginar que tipo de erro pode acontecer em uma operação de inserção que não seja o
erro de PK. Mas antes de alterar a código de inserção da tela de empresas, vamos criar uma
função para verificar se o nome da restrição está na mensagem de erro já que iremos precisar
fazer isto várias vezes. Esta função deve ficar na Unit do Form_menu porque precisaremos
dela em outros forms e o form_menu está na seção “Uses” de todos eles, pois compartilha o
objeto ConexaoBD.
Esta função irá receber dois parâmetros: a mensagem de erro e o nome da violação
que queremos verificar se está presente na mensagem. A função irá retornar ‘Sim’ se o texto
com o nome da violação estiver na mensagem e ‘Não’ caso contrário. Como no Delphi não
existe a função Like da linguagem SQL, devemos verificar a existência de um texto dentro de
outro texto da seguinte maneira:
O código acima está fazendo exatamente o que foi descrito anteriormente quando
especificamos o seu funcionamento.
Pronto, já temos a função que irá fazer a verificação da mensagem para que possamos
interpretá-la durante o tratamento do erro. Vamos então programar o tratamento do possível
erro de PK na tela de Empresas.
Acesse a Unit do Form_empresas e altere o evento OnClick do botão “Inserir” de forma
que ele fique igual ao exibido abaixo:
Observe que estamos fazendo uso de uma variável chamada deu_erro. Estamos
utilizando esta variável para fazer o controle se houve ou não erro e assim executar os
comandos de acordo com a situação.
Esta variável deve ser declarada na seção Var da Unit_empresas como do tipo boolean
(lógica). Veja o destaque na imagem abaixo:
Acesse as propriedades da tabela assim como fizemos para ver o nome da restrição de
PK da tabela Empresas. Para ver os nomes das FK’s, acesse a guia Relationships e verifique
no campo “Relationship name” o nome da FK referente ao relacionamento.
Form_menu.ConexaoBD.BeginTrans;
adoquery_aux.SQL.Text:='UPDATE EMPRESAS SET ' +
' COD_EMPRESA = ' + edt_cod.Text + ',' +
' NOME = ' + QuotedStr(edt_nome.Text) +
' WHERE COD_EMPRESA = ' + cod_empresa;
try
adoquery_aux.ExecSQL;
deu_erro := false;
except
on E : Exception do
begin
deu_erro := true;
if Form_menu.ErroBD(E.Message,'FK_Onibus_Empresas') = 'Sim' then
ShowMessage('Impossível atualizar o código pois existem Ônibus ligados a esta Empresa!')
else if Form_menu.ErroBD(E.Message,'PK_Empresas') = 'Sim' then
ShowMessage('Código já cadastrado!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
cod_empresa:=adoquery_empresas.fieldbyname('cod_empresa').AsString;
Form_menu.ConexaoBD.BeginTrans;
adoquery_aux.SQL.Text:=' DELETE FROM EMPRESAS'+
' WHERE COD_EMPRESA = ' + cod_empresa;
deu_erro := false;
try
adoquery_aux.ExecSQL;
except
on E: Exception do
begin
deu_erro := true;
if Form_menu.ErroBD(E.Message,'FK_Onibus_Empresas') = 'Sim' then
ShowMessage('Impossível excluir pois existem Ônibus ligados a esta Empresa!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Módulo 3:
Projetando uma Aplicação de Banco de
Dados Cliente/Servidor
A
ntes de iniciar qualquer desenvolvimento, é fundamental planejar e
projetar a aplicação que será construída. Afinal, como vamos construir
algo que não sabemos como vai ser? É extremamente importante
definir o escopo da aplicação, ou seja, especificar qual o objetivo do sistema
que vai ser criado. Devemos sempre projetar as funcionalidades que o sistema
vai possuir para então sair programando cada uma delas. Com este
pensamento, criamos este módulo que irá nos ajudar a planejar e a projetar a
aplicação que servirá de base para nosso aprendizado. Neste módulo iremos
definir o objetivo do sistema, criar um diagrama das funcionalidades da
aplicação, projetar o modelo de dados, criar as tabelas e iniciar o
desenvolvimento propriamente dito.
O código do curso e o código da turma são criados pela própria escola de informática,
na verdade, estes códigos são formados por um conjunto de caracteres que possui um
significado representativo para os funcionários da escola.
O código do curso é composto por 3 letras que identificam o curso, abaixo alguns
exemplos:
WIN : Curso de Windows
DOC : Curso de Word
XLS : Curso de Excel
HTM : Curso de Internet
O código da turma é composto pelo código do curso acrescido do ano e mês de início da
turma, por exemplo, o código de uma turma do Curso de Windows que tem início em Fevereiro
de 2005 seria: WIN200502 e o de uma turma de Excel com início em Março de 2005 seria:
XLS200503.
O código do instrutor e do aluno são números seqüenciais, portanto devem ser gerados
pelo sistema.
A aplicação também deverá fazer o controle de freqüência dos alunos. Para cada aula
lançada pelo instrutor o sistema deve registrar se o aluno faltou ou esteve presente na
mesma. Este controle se aplica a todos os alunos matriculados na turma sem exceção. Este
controle será usado pelos instrutores após o lançamento de cada aula.
O sistema ainda deve possuir uma ferramenta que permita ao responsável pela escola
de informática fazer o pagamento dos instrutores. Esta ferramenta deve contabilizar as aulas
dadas pelo instrutor em um determinado mês e gerar um demonstrativo com o valor total a
ser pago por elas. Após a geração do demonstrativo o sistema deve marcar cada aula como
paga.
Atenção: Todas as operações do sistema devem ter uma restrição de acesso para que
apenas as pessoas autorizadas possam acessá-las. O sistema deverá permitir que o
responsável pela escola de informática defina as funcionalidades que cada pessoa poderá
acessar na aplicação.
Obs.: Neste curso não iremos apresentar uma metodologia específica. Nosso propósito
não é ensinar UML, análise estruturada, essencial, orientada a objetos ou qualquer outra
metodologia de desenvolvimento de software. Nós apenas queremos mostrar que a
representação gráfica do funcionamento de um sistema é muito útil aos profissionais que irão
construir a aplicação. O leitor não precisa utilizar o mesmo método adotado neste curso para a
criação de diagramas, você pode e deve utilizar a metodologia que quiser. O mais importante
neste aspecto é que você tenha a iniciativa de desenhar ou pelo menos rascunhar como será o
funcionamento da aplicação a ser desenvolvida.
Com base nas informações contidas no capítulo anterior, iremos construir um diagrama
(uma espécie de DFD - Diagrama de Fluxo de Dados) que representará cada processo do
sistema e quais operações ele executará, neste diagrama também representaremos os
depósitos de dados que serão utilizados por cada processo.
Instrutores
Cursos Consulta Consulta
Curso Instrutor
Consulta
Cadastra Cadastra Aula
Curso Realiza Instrutor
Cadastros
Lança
Aulas
Consulta
Cadastra
Turma
Cadastra Turma
Aluno
Turmas Cadastra
Aula
Consulta
Alunos Consulta Turma
Aluno Realiza
Matrículas
Aulas
Consulta Consulta
Aula Aulas
Cadastra Lança
Matrícula Frequências
Gera
Consulta
Pagamento
Alunos Cadastra
Instrutores
Matriculados Frequência
Matrículas Frequências
Cada processo (bolinha amarela) será uma ou mais telas do programa. Por exemplo, o
processo “Realiza Matrículas” será a tela de cadastro de matrícula do sistema e o processo
“Realiza Cadastros” será formado pelas telas de cadastro de cursos, cadastro de instrutores,
cadastro de turmas e cadastro de alunos.
Cada database será uma ou mais tabelas do banco de dados do sistema. Por exemplo,
o database “Cursos” será a tabela de cursos no banco de dados e o database “Aulas” será a
tabela de aulas.
As setinhas indicam que tabelas cada tela irá utilizar para leitura e/ou escrita.
Veja que um simples diagrama nos ajuda a entender o que devemos fazer. Com base
neste diagrama já podemos iniciar a codificação no Delphi, mas ainda não iremos fazer isso,
pois falta projetarmos o banco de dados da aplicação, ou seja, definir como serão as tabelas.
No próximo capítulo iremos criar o modelo de dados baseado no diagrama que
acabamos de criar e nas informações existentes no capítulo anterior.
instrutores. Para o sexo usaremos o tipo varchar com o tamanho de 1 caracteres por razões
óbvias.
Abaixo segue a tabela de turma, a chave primária será a coluna do código da turma:
Para o registro de aulas, o sistema deve armazenar o código da turma e a data da aula.
O código da turma será do tipo varchar com o tamanho de 9 caracteres da mesma maneira
que na tabela de turmas. Para a data da aula usaremos o tipo datetime.
Sendo assim, segue a tabela de aulas, a chave primária será composta pelas duas
colunas, pois são necessárias ambas as colunas para identificar uma aula:
O campo usuário irá armazenar o login de cada usuário, por exemplo, o login do usuário
Rodrigo Costa poderá ser rcosta e o login do usuário Sergio Ferreira poderá ser sferreira.
O campo nome, obviamente, irá armazenar o nome de cada usuário e o campo senha irá
armazenar o que você já sabe.
Embora o campo senha tenha sido definido com o tamanho de 30 caracteres, na
aplicação iremos restringir a senha ao no máximo 10 caracteres. Fizemos isto, pois iremos
armazenar a senha codificada no padrão ASCII. O padrão ASCII utiliza uma combinação de 3
números para representar cada caractere alfanumérico. Por exemplo, o código ASCII para o
caractere “a” é 097 e o código ASCII para o caractere “1” é 049. Sendo assim, caso o usuário
cadastre uma senha de 10 caracteres precisaremos de 30 posições para representá-la.
Obs.: Iremos armazenar a senha criptografada apenas para dar mais segurança e
confiabilidade ao sistema. Você não precisa obrigatoriamente criptografar as senhas dos
usuários, isto é apenas uma boa prática que costumamos adotar.
Para o código da função utilizamos um campo varchar com 6 posições. Desta forma
podemos criar códigos mnemônicos que identifiquem facilmente a função. No campo nome
podemos cadastrar o nome ou uma pequena descrição da função. Por exemplo, a função de
cadastro de cursos poderia ser cadastrada da seguinte maneira:
cod_funcao: “CADCUR”
nome: “Cadastro de Cursos”
E por fim, para armazenar as permissões de cada usuário, iremos registrar o código da
função e o login do usuário:
Criando as tabelas
Após criar o banco de dados Academico, acesse a seção Tables para criarmos as
tabelas do modelo de dados. Clique com o botão direito sobre a opção Tables e em seguida
em New Table...
Será exibida uma tela para criarmos a estrutura da nova tabela. Vamos criar primeiro a
tabela “Cursos”, para isso basta seguir as especificações do modelo que criamos
anteriormente. Digite o nome da primeira coluna da tabela Cursos que, segundo nosso
modelo, é “cod_curso”. Em Data Type escolha o tipo de dado “varchar” depois defina o
tamanho de 3 caracteres na opção Lenght. Em seguida clique no ícone que possui a figura de
uma chave para especificar que esta coluna é a chave primária desta tabela.
Preencha agora o nome da segunda coluna da tabela Cursos: “nome”. Em Data Type
selecione o tipo varchar e defina o tamanho máximo de 20 caracteres em Length.
Desmarque a opção Allow Nulls (Permitir nulo) da coluna “nome”, pois esta coluna deve ter
preenchimento obrigatório. A coluna “cod_curso” também é obrigatória, mais como já
definimos que ela é chave primária, automaticamente o SQL Server desmarca a opção Allow
Nulls, pois a chave primária sempre é obrigatória. Com isto, criamos a estrutura da tabela
“Cursos” de acordo com o que foi especificado no modelo de dados.
Só falta definir o nome da tabela, para isto clique sobre o ícone que possui a figura de
um disquete. Esta opção serve para salvar as alterações feitas e para definir o nome da tabela
quando isto ainda não foi feito. Obviamente, salve a tabela com o nome: Cursos.
Pronto, a tabela foi criada! Feche a janela de edição e você verá a nova tabela na lista
de tabelas do banco de dados Academico.
Caso você precise alterar ou corrigir alguma coisa na estrutura da tabela, basta clicar
sobre ela com o botão direito e em seguida clicar em Design Table.
Prosseguindo com a construção das tabelas de nosso modelo de dados, vamos agora
criar a tabela “Instrutores”. Clique com o botão direito sobre a opção Tables do banco de
dados Academico e em seguida em New Table...
A propriedade Identity, quando ativada, gera um número seqüencial para cada registro
que é inserido semelhantemente ao tipo de dados AutoNumeração do Access.
Após criar a estrutura, salve a tabela como nome “Motoristas”.
A próxima tabela que iremos criar é a tabela “Turmas”. Esta tabela “depende” das
outras duas, ou seja, ela possui chave estrangeira para as tabelas “Cursos” e “Instrutores”.
Nós poderíamos ter criado ela antes das outras, só que depois teríamos que editá-la para
referenciar as chaves estrangeiras. Assim, com as outras tabelas já criadas, iremos fazer tudo
de uma vez.
Novamente clique com o botão direito sobre a opção Tables do banco de dados
Academico e em seguida em New Table... Preencha os campos de acordo com o modelo de
dados.
Após preencher os campos, salve a tabela como “Turmas”, mas deixe a janela de edição
aberta para que possamos configurar as chaves estrangeiras. Clique sobre a opção “Table and
Index Properties” que está representada através de um ícone com uma figura de uma mão
segurando um pedaço de papel.
Nesta tela é que iremos criar nossas chaves estrangeiras. Só para lembrar: uma chave
estrangeira é uma coluna que “aponta” para outra coluna de uma outra tabela. A chave
estrangeira somente pode apontar para uma coluna que seja chave primária ou que possua
uma chave única (este conceito não será abordado neste curso). O termo “Chave Primária” é
mais conhecido como “Primary Key” ou apenas “PK” e o termo “Chave Estrangeira” é
conhecido como “Foreign Key” ou simplesmente “FK”.
Para criar nossa primeira chave estrangeira, clique sobre o botão “New”. Na caixa de
seleção “Primary key table”, selecione a tabela Cursos e logo abaixo selecione a coluna
“cod_curso”. Na caixa de seleção “Foreign key table”, selecione a tabela “Turmas” e em
seguida selecione a coluna “cod_curso”. O que acabamos de fazer foi: dizer para o SQL Server
que a coluna “cod_cuso” da tabela Turmas está ligada à coluna “cod_curso” da tabela
“Cursos”.
Agora vamos criar a chave estrangeira para a tabela “Instrutores”. Clique novamente
sobre o botão “New” e repita o procedimento apontando a coluna “cod_instrutor” da tabela
“Turmas” para a coluna “cod_instrutor” da coluna “Instrutores”.
Clique sobre o botão “Fechar” e depois salve as alterações clicando sobre o botão com o
ícone de um disquete. O SQL Server informará que as alterações efetuadas afetarão outras
tabelas.
Agora criaremos a tabela de “Alunos”. Para isto siga os mesmos passos da criação da
tabela de Instrutores, pois elas são bem parecidas. Não se esqueça de configurar a
propriedade Identity para o campo cod_aluno.
A próxima tabela a ser criada é “Matriculas”. Nesta tabela, ambas as colunas serão
chave primária e chave estrangeira ao mesmo tempo. A coluna cod_turma se referencia à
coluna cod_turma da tabela Turmas e a coluna cod_aluno se referencia à coluna cod_aluno da
tabela Alunos. Crie a tabela e configure seus relacionamentos.
A última tabela a ser criada é a tabela de freqüências. Crie a tabela seguindo o modelo
de dados.
Esta tabela tem sua chave primária composta por 3 colunas: cod_turma, cod_aluno e
data. A coluna cod_turma, além de fazer parte da chave primária, ela será chave estrangeira
para duas tabelas ao mesmo tempo. A coluna cod_turma junto com a coluna cod_aluno se
referencia à tabela “Matriculas” e a coluna cod_turma junto com a coluna data se referencia à
tabela “Aulas”.
Neste caso, veja como ficarão as telas de relacionamento:
Pronto! Acabamos de criar todas as tabelas, confira a lista de todas as tabelas que
acabamos de criar.
Clique em Avançar para exibir a próxima tela onde iremos selecionar as tabelas que
farão parte do nosso diagrama.
Selecione todas as tabelas e clique no botão “Add >”. Em seguida, clique em Avançar e
na tela seguinte em Concluir. Então o SQL Server montará o diagrama com as tabelas e seus
respectivos relacionamentos.
Com base no diagrama montado pelo SQL Server podemos concluir que criamos as
tabelas e os relacionamentos corretamente de acordo com nosso modelo de dados da
aplicação.
Modelo de dados da aplicação
Uma vez terminada a criação das tabelas, criaremos um novo diagrama do SQL Server
apenas com as tabelas do controle de acesso. Lembramos que o diagrama do SQL Server é
uma ótima maneira de conferir se as tabelas e seus relacionamentos foram criados
corretamente.
Iniciando a programação
Vamos agora dar início à programação do sistema. Antes de qualquer coisa, crie uma
pasta chamada “Gerenciador de Cursos” para salvar os arquivos que iremos criar. Em
seguida abra o Delphi para começarmos!
A primeira coisa que o Delphi vai pedir para salvar é a Unit do Form_logon, portanto
salve o arquivo como o nome “Unit_logon”. Lembre-se de salvar os arquivos na pasta que
criamos para este propósito.
Em seguida o Delphi pedirá que salve o arquivo do projeto, salve-o com o nome
“Academico”.
Atenção: Estas configurações devem ser aplicadas a todos os novos formulários que
serão criados para este sistema. Não se esqueça de fazer isto, pois senão a aplicação ficará
despadronizada.
Após a tela de login, o sistema deve exibir a tela de Menu com todas as funções
disponíveis na aplicação, portanto vamos criar a tela de menu do sistema. Insira um novo
Form ao projeto.
Após realizar as configurações, clique novamente sobre o botão Save All para salvar as
alterações realizadas e novo Form inserido. Salve a unit do novo Form como “Unit_menu”.
Para compor a tela de Menu do sistema utilizaremos uma interface icônica, ou seja,
ícones que representam funções do sistema. Como esta aplicação não possui muitas funções,
fica desnecessária a utilização dos menus tradicionais. Por isto usaremos objetos BitBtn ao
invés do objeto MainMenu.
Insira 11 objetos BitBtn ao form_menu. Cada objeto servirá para chamar uma
determinada função, portanto altere as propriedades Name e Caption de cada um deles
seguindo a tabela abaixo:
Name Caption
btn_cadcursos Cadastro de Cursos
btn_cadinstrutores Cadastro de Instrutores
btn_cadturmas Cadastro de Turmas
btn_cadalunos Cadastro de Alunos
btn_matriculas Matrículas
btn_aulas Lançamento de Aulas
btn_frequencias Freqüências
btn_paginstrutores Pagamento de Instrutores
btn_relatorios Relatórios
btn_controle Controle de Acesso
btn_fechar Fechar
Você também pode colocar uma figura para cada BitBtn através da propriedade Glyph,
escolha a imagem que você achar que faça sentido com a função do objeto. Veja abaixo como
ficou a tela de Menu do sistema após a configuração dos botões:
Módulo 4:
Criando o Controle de Acesso
U
ma vez terminado a fase de projeto e a programação inicial, devemos
criar o mecanismo de controle de acesso. Este mecanismo será
responsável por controlar os usuários e suas respectivas permissões a
cada funcionalidade da aplicação. Já foi o tempo em que um sistema tinha um
único usuário e podia acessar todas as opções. Hoje em dia, qualquer sistema
decente é multiusuário, e portanto, deve exigir que cada usuário se identifique
através de uma tela de Logon onde deve informar um nome de usuário e uma
senha. Sendo assim, devemos programar a autenticação do sistema no
servidor de banco de dados e validação dos usuários junto à aplicação. Além
da validação dos usuários, devemos controlar as funcionalidades que cada
usuário tem acesso, habilitando somente as opções que o usuário tem
permissão. Neste módulo iremos criar toda esta parafernália necessária para a
segurança dos dados. Os conceitos aprendidos neste módulo podem ser
aplicados em qualquer outra aplicação que você venha criar em Delphi.
Após fazer as configurações clique em Save All para salvar o form_splash. Salve-o
como “Unit_splash”.
Criamos o form_splash, mas até agora ele não passa de um form comum como os
demais. Para fazer com que ele seja realmente a apresentação do sistema precisaremos
alterar a Unit principal do projeto.
Clique sobre o botão View Unit ou pressione Ctrl+F12.
Observe que na unit “Academico” está o código que cria todos os forms quando a
aplicação é executada. A tela de splash deve ser a primeira a ser exibida e deve desaparecer
quando a aplicação terminar de criar todos os forms. Então vamos alterar o código da unit
“Academico” para isto aconteça. Faça as alterações de forma que a unit fique igual à exibida
na figura abaixo:
Pronto, configuramos nossa tela de Splash! Clique em Save All para salvar as
alterações.
Se você executar o projeto, verá a tela de splash surgindo e depois desaparecendo
antes de ser exibida a tela de Logon. Talvez não consiga perceber a tela de splash, pois ela
aparecerá e sumirá rapidamente. Isto porque o projeto tem apenas 2 forms por enquanto.
Depois que criarmos o processo de autenticação e à medida que a quantidade de forms for
aumentando, a exibição do splash durará mais tempo na tela.
Para fazer logon no banco de dados, utilizaremos um único usuário. Ele será utilizado
para fazer as consultas e modificações no banco de dados. É interessante que a aplicação
tenha um usuário específico, portanto vamos criar um que seja para uso exclusivo do sistema.
Abra o Enterprise Manager e navegue até a opção “Logins” que está disponível na
seção Security. Clique sobre a opção “Logins” com o botão direito do mouse e em seguida
clique em New Login...
Obs.: Você deve está logado com uma conta com privilégios administrativos para poder
criar logins no SQL Server.
Na tela que surgirá, preencha o campo Name com “admin_academico”. Este será o
nome do usuário que será utilizado pela nossa aplicação. Na seção Authentication, selecione
a opção SQL Server Authentication e defina uma senha para o usuário.
Após criar o novo usuário ele aparecerá na relação de usuários do SQL Server.
Feche o Enterprise Manager e volte ao Delphi. Vamos então criar uma função que fará a
autenticação no servidor utilizando o usuário recém-criado. Iremos criá-la na Unit do
Form_logon, portanto acesse-a. Esta função irá retornar “True” se conseguir autenticar ou
“False” se ocorrer algum erro.
Vá até a seção public da unit_logon e declare a função:
Após fazer a declaração, pressione Shit+Ctrl+C para o Delphi criar o corpo da function
na seção implementation.
Após inserir e configurar o objeto, volte para Unit e programe a função com o código
abaixo:
Vamos criar uma função na unit do form_logon que irá verificar se o usuário pode ou
não se logar no sistema.
Após fazer a declaração, pressione Shit+Ctrl+C para o Delphi criar o corpo da function
na seção implementation.
realizar uma consulta no banco de dados com o usuário informado. Para fazer consultas ou
para executar qualquer comandos SQL em banco de dados, precisaremos de um objeto
ADOQuery, portanto insira um objeto ADOQuery ao form_logon.
Após inserir e configurar o ADOQuery, volte para a Unit para programarmos a função de
validação dos usuários. Antes de escrever o código da função, declare duas variáveis
(“usuario_logado” e “senha_usuario” do tipo string) na seção public da unit_logon. Estas
variáveis serão alimentadas por esta função e utilizadas posteriormente em outras telas da
aplicação.
O código acima está fazendo o seguinte: Faz um SELECT na tabela de usuários de pegar
a senha que está cadastrada para o usuário passado como parâmetro à função. Se o
ADOQuery retornar vazio indica que o usuário não existe na tabela de usuários, então exibe
uma mensagem de erro e faz a função retorna False. Se o SELECT encontrar o usuário, então
verifica se a senha cadastrada na tabela é diferente da que foi passada como parâmetro à
função. Se as senhas forem diferentes, então exibe mensagem de erro e faz a função retornar
False, caso contrário alimenta a variável de usuário logado no sistema e faz a função retornar
True.
Esta função irá obter o código ASCII de cada caractere da senha de trás para frente.
Por exemplo, para criptografar a palavra “teste”:
t = 116
e = 101
s = 115
t = 116
e = 101
Agora vamos criar a função que irá descriptografar, ou seja, fazer o contrário da função
que criptografa. Declare a função na seção public da unit_logon:
Após criar as funções de criptografia, devemos alterar a função que faz a validação de
usuários para que descriptografe a senha cadastrada na tabela antes de fazer a verificação da
senha. Veja a alteração abaixo:
Vamos agora programar o evento OnClick do botão Ok de forma que ao pressionar este
botão, o sistema faça a validação de usuário.
Autores: Rodrigo Costa e Sergio Ferreira Página 161
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Faltam só mais alguns ajustes ma tela de logon para concluí-la. Selecione o edt_senha
e altere a propriedade PasswordChar para * (asterisco). Isto é necessário para que apareça
asteriscos ao invés da senha digitada pelo usuário. Altere também a propriedade MaxLength
para 10, assim somente será permitido que o usuário digite 10 caracteres para a senha. Para o
edt_usuario defina a propriedade MaxLength como 30. Salve as alterações clicando em Save
All.
Para testar a validação de usuários, precisaremos inserir um registro na tabela de
usuários do banco de dados. Abra o Query Analyzer, faça logon com o usuário
admin_academico, selecione o banco de dados Academico e execute o seguinte comando:
Agora volte ao Delphi e execute o projeto para testar a validação de usuários. Quando
você executar o projeto, o Delphi irá informar que o Fom_logon está fazendo menção do
Form_menu e lhe pergunta se deseja que ele crie esta referencia na cláusula Uses. Clique em
Yes. Assuma este procedimento como padrão para toda vez que o Delphi fizer esta pergunta.
Agora faça logon com o usuário “administrador” e com a senha “system” para testar o
sistema.
Agora vamos criar o mecanismo que irá verificar as permissões de cada usuário para
habilitar somente os botões do menu que o usuário logado tenha acesso. Antes de criar este
mecanismo, devemos cadastrar as funções do sistema no banco de dados.
Caso você o tenha fechado, abra o Query Analyzer, faça logon com o usuário
admin_academico, selecione o banco de dados Academico e execute os seguintes comandos
para cadastrar as funções do sistema:
Mais uma vez precisaremos de um objeto ADOQuery para fazer as consultas no banco
de dados. Insira um ADOQuery e altere a propriedade Name dele para “ADOQuery_aux”. Ele
usará a conexão estabelecida pelo objeto ConexaoBD que está no form_logon, então acesse o
menu File > Use Unit... e clique na Unit_logon. Desta forma os objetos do form_logon
estarão disponíveis para o form_menu. Salve as alterações clicando em Save All. Agora altere
a propriedade Connection do ADOQuery_aux para “Form_logon.ConexaoBD”.
if ADOQuery_aux.Locate('COD_FUNCAO','CADCUR',[loCaseInsensitive]) then
btn_cadcurso.Enabled := True
else
btn_cadcurso.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','CADINS',[loCaseInsensitive]) then
btn_cadinstrutores.Enabled := True
else
btn_cadinstrutores.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','CADTUR',[loCaseInsensitive]) then
btn_cadturmas.Enabled := True
else
btn_cadturmas.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','CADALU',[loCaseInsensitive]) then
btn_cadalunos.Enabled := True
else
btn_cadalunos.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','CADMAT',[loCaseInsensitive]) then
btn_matriculas.Enabled := True
else
btn_matriculas.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','LANAUL',[loCaseInsensitive]) then
btn_aulas.Enabled := True
else
btn_aulas.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','LANFRE',[loCaseInsensitive]) then
btn_frequencias.Enabled := True
else
btn_frequencias.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','PAGINS',[loCaseInsensitive]) then
btn_paginstrutores.Enabled := True
else
btn_paginstrutores.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','RELATO',[loCaseInsensitive]) then
btn_relatorios.Enabled := True
else
btn_relatorios.Enabled := False;
if ADOQuery_aux.Locate('COD_FUNCAO','CONTRO',[loCaseInsensitive]) then
btn_controle.Enabled := True
else
btn_controle.Enabled := False;
ADOQuery_aux.Close;
Clique em Save All para salvar todas as modificações feitas até aqui. Em seguida
execute o projeto para verificar o funcionamento da procedure de verificação de permissões de
usuários.
Observe que ao efetuar logon com o usuário administrador, o sistema desabilita todos
os botões do menu.
Isto aconteceu porque o usuário não tem nenhuma permissão cadastrada na tabela de
permissões. Faça o seguinte, execute os comandos abaixo no Query Analyzer e em seguida
execute novamente o projeto.
Para que não seja necessário ficar cadastrando os usuários e suas respectivas
permissões “na mão” através de comandos SQL, vamos criar uma funcionalidade no sistema
com este objetivo.
Insira um novo Form ao projeto.
Name Caption
btn_novo Novo
btn_salvar Salvar
btn_alterar Alterar
btn_cancelar Cancelar
btn_excluir Excluir
btn_fechar Fechar
Se desejar, configure uma imagem para cada um dos botões. Seu form deve ficar
semelhante ao exibido a seguir:
Como você já deve ter percebido, estes botões serão responsáveis por executar as
operações de cadastro do form_usuarios. Vamos agora criar 2 procedures que irão
habilitar/desabilitar os botões dependendo da situação. Acesse a Unit do form_usuarios e
declare as duas procedures mostradas abaixo. Declare também a variável “operacao” que será
utilizada para sabermos que operação foi realizada pelo usuário.
Criaremos ainda mais uma procedure. Esta procedure irá limpar os campos da tela.
Declare-a na seção public, pressione Shift+Ctrl+C e digite seu código:
Pronto, criamos as procedures básicas que irão dar suporte as operações executadas
pelos usuários. Vamos agora iniciar a programação de banco de dados. A idéia é a seguinte, a
tela será inicialmente exibida vazia, ou seja, sem nenhum registro para edição. Desta forma, o
usuário poderá clicar em Novo para poder cadastrar um novo usuário ou então pesquisar um
usuário que já esteja cadastrado através de uma tela de pesquisa e então alterá-lo ou excluí-
lo.
Insira um objeto ADOQuery ao form_usuarios e altere a propriedade Name para
ADOQuery_aux. Usaremos este objeto para executar os comandos SQL no banco de dados,
porém, precisamos configurar a propriedade Connection do ADOQuery_aux.
O ADOQuery irá utilizar a conexão fornecida pelo objeto ConexaoBD que está no
form_logon, portanto, vá em File > Use Unit... e selecione a Unit_logon. Em seguida
selecione o objeto ConexaoBD na propriedade Connection do ADOQuery_aux.
Vamos então programar o vento do botão “Novo”. Antes, declare na seção public uma
variável chamada “pk” do tipo string. Usaremos esta variável para armazenar a chave primária
(primary key) do registro corrente.
Agora sim, acesse o evento OnClick do botão “Novo” e digite o código abaixo:
Após o usuário clicar em Novo e digitar as informações, ele provavelmente irá salvar o
novo usuário, então vamos programar este botão.
Agora volte para o form_usuarios e digite o seguinte código no evento OnClick do botão
Salvar:
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Usuarios') = 'Sim' then
ShowMessage('Usuário já cadastrado!')
else if Form_logon.ErroBD(E.Message,'FK_Permissoes_Usuarios') = 'Sim' then
Showmessage('Existem permissões cadastradas para este usuário!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Além de inserir um novo usuário, a pessoa que estiver usando o sistema poderá alterar
um usuário já cadastrado. Para esta operação digite o código abaixo no evento OnClick do
botão Alterar:
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Permissoes_Usuarios') = 'Sim' then
Showmessage('Existem permissões cadastradas para este usuário!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Close;
Após programar todos os eventos acima descritos, falta apenas criar a funcionalidade
de pesquisa de usuários e de concessão de permissões. Iremos primeiro construir a tela de
pesquisa de usuários.
Insira um novo Form ao projeto. Configure a propriedade Name do novo Form como
“Form_pesquisa”. Aplique as mesmas configurações feitas para o form_logon para manter o
mesmo padrão. Após fazer as configurações, clique em Save All para salvar o novo form.
Salve-o como “Unit_pesquisa”.
Agora declare duas (chave e sql_pesquisa) variáveis do tipo string na seção public da
unit do form_pesquisa. A variável “chave” será utilizada para armazenar a chave primária do
registro que for selecionado e a variável “sql_pesquisa” será utilizada para montar o SELECT
de pesquisa.
OnShow do Form_pesquisa:
Este botão irá chamar o form_pesquisa, portanto vá em File > Use Unit... e selecione
a unit_pesquisa. Em seguida salve as alterações clicando em Save All.
Insira um novo Form ao projeto. Configure a propriedade Name do novo Form como
“Form_permissoes” e Caption como “Permissões”. Aplique as mesmas configurações feitas
para o form_logon para manter o mesmo padrão. Após fazer as configurações, clique em Save
All para salvar o novo form. Salve-o como “Unit_permissoes”.
Este botão irá chamar o form_permissoes, portanto vá em File > Use Unit... e
selecione a unit_permissoes. Em seguida salve as alterações clicando em Save All.
Módulo 5:
Criando as Funcionalidades da Aplicação
E
ste módulo é um dos mais importantes deste curso, pois aqui iremos
criar as funcionalidades da aplicação. Para o usuário, o que realmente
importa é o que o sistema faz. Ele não quer saber como foi
desenvolvido a aplicação e sim qual o trabalho que ela executa. Nesta parte do
curso, iremos construir as opções que serão utilizadas pelo usuário. Neste
módulo criaremos os cadastros de todos os elementos envolvidos no contexto
do sistema e todas as operações necessárias à movimentação de cada
elemento como a realização de matrículas de alunos, o lançamento de aulas e
o pagamento dos instrutores.
Cadastro de Cursos
Name Caption
btn_novo Novo
btn_salvar Salvar
btn_alterar Alterar
btn_cancelar Cancelar
btn_excluir Excluir
btn_fechar Fechar
Vamos agora criar as procedures e variáveis que fazem o controle da tela, àquelas que
habilitam/desabilitam botões e os campos da tela conforme fizemos no cadastro de usuários.
Declare as variáveis e procedures conforme a imagem abaixo:
Procedure “bloqueia_campos”:
Procedure “desabilita_salvar”:
Procedure “habilita_salvar”:
Procedure “libera_campos”:
Procedure “limpa_campos”:
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Cursos') = 'Sim' then
ShowMessage('Curso já cadastrado!')
else if Form_logon.ErroBD(E.Message,'FK_Turmas_Cursos') = 'Sim' then
Showmessage('Existem turmas cadastradas para este curso!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Turmas_Cursos') = 'Sim' then
Showmessage('Existem turmas cadastradas para este curso!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Após programar todos os eventos acima descritos, falta apenas criar a funcionalidade
de pesquisa de cursos. A tela de pesquisa criada durante a criação do cadastro de usuários foi
desenvolvida de forma genérica, ou seja, foi construída de maneira que seja possível utilizá-la
em outras situações. Iremos então utilizar o form_pesquisa também aqui no cadastro de
cursos. Portanto, insira um objeto BitBtn ao form_cursos e altere as propriedades Name e
Caption para btn_localizar e “Localizar” respectivamente. Arrume o objeto conforme mostrado
a seguir:
Este botão irá chamar o form_pesquisa, portanto vá em File > Use Unit... e selecione
a unit_pesquisa. Em seguida salve as alterações clicando em Save All.
Pronto, o cadastro de cursos já está concluído! Vamos agora alterar o form_menu para
chamar o form_cursos. Acesse o form_menu e digite o seguinte no evento OnClick do botão
“Cadastro de Cursos”:
Cadastro de Instrutores
Name Caption
btn_novo Novo
btn_salvar Salvar
btn_alterar Alterar
btn_cancelar Cancelar
btn_excluir Excluir
btn_fechar Fechar
Vamos agora criar as procedures e variáveis que fazem o controle da tela, àquelas que
habilitam/desabilitam botões e os campos da tela conforme fizemos no cadastro de usuários e
no cadastro de cursos. Declare as variáveis e procedures conforme a imagem abaixo:
Procedure “bloqueia_campos”:
Procedure “desabilita_salvar”:
Procedure “habilita_salvar”:
Procedure “libera_campos”:
Procedure “limpa_campos”:
objeto ConexaoBD que está no form_logon, portanto, vá em File > Use Unit... e selecione a
Unit_logon. Em seguida selecione o objeto ConexaoBD na propriedade Connection do
ADOQuery_aux.
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Instrutores') = 'Sim' then
ShowMessage('Instrutor já cadastrado!')
else if Form_logon.ErroBD(E.Message,'FK_Turmas_Instrutores') = 'Sim' then
Showmessage('Existem turmas cadastradas para este Instrutor!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Turmas_Instrutores') = 'Sim' then
Showmessage('Existem turmas cadastradas para este instrutor!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Após programar todos os eventos acima descritos, falta apenas criar a funcionalidade
de pesquisa de instrutores. Iremos utilizar o form_pesquisa também aqui no cadastro de
instrutores. Portanto, insira um objeto BitBtn ao form_instrutores e altere as propriedades
Name e Caption para btn_localizar e “Localizar” respectivamente. Arrume o objeto conforme
mostrado a seguir:
Autores: Rodrigo Costa e Sergio Ferreira Página 208
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Este botão irá chamar o form_pesquisa, portanto vá em File > Use Unit... e selecione
a unit_pesquisa. Em seguida salve as alterações clicando em Save All.
Cadastro de Turmas
O cadastro de turmas será bem semelhante aos cadastros já criados até aqui.
Entretanto, o cadastro de Turmas possui algumas particularidades em relação aos cadastros de
usuários, cursos e instrutores. O cadastro de turmas depende de registros de outras tabelas e,
desta forma, precisaremos manipular as tabelas de Cursos e Instrutores além da tabela
“Turmas” neste cadastro. Mãos à obra!
Insira um novo Form ao projeto.
Name Caption
btn_novo Novo
btn_salvar Salvar
btn_alterar Alterar
btn_cancelar Cancelar
btn_excluir Excluir
btn_fechar Fechar
Vamos agora criar as procedures e variáveis que fazem o controle da tela, àquelas que
habilitam/desabilitam botões e os campos da tela conforme fizemos nos cadastros anteriores.
No cadastro de turmas teremos algumas variáveis a mais. Declare as variáveis e procedures
conforme a imagem abaixo:
Procedure “bloqueia_campos”:
Procedure “desabilita_salvar”:
Procedure “habilita_salvar”:
Procedure “libera_campos”:
Procedure “limpa_campos”:
Atenção: Os campos “Curso” e “Instrutor” não serão digitados pelo usuário. Eles serão
selecionados através de pesquisa. Sendo assim, o usuário não poderá digitar nestes campos e,
portanto, devemos alterar a procedure “libera_campos” para que ela não libere os objetos
“edt_curso” e “edt_instrutor”. Acesse a procedure libera_campos da unit_turmas e faça a
seguinte alteração:
Para que o usuário possa selecionar o curso e o instrutor da turma que ele estiver
cadastrando ou alterando, iremos inserir 2 objetos BitBtn. Renomeie os objetos para
“btn_curso” e “btn_instrutor”, em seguida selecione uma imagem para os botões através da
propriedade Glyph. Organize estes novos botões conforme mostrado da imagem abaixo:
Estes novos botões só devem estar habilitados quando o form_turmas estiver em modo
de edição. Sendo assim, devemos alterar as procedures habilita_gravar e desabilita_gravar
contemplando os novos objetos.
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Turmas') = 'Sim' then
ShowMessage('Turma já cadastrada!')
else if Form_logon.ErroBD(E.Message,'FK_Turmas_Cursos') = 'Sim' then
Showmessage('Curso inválido!')
else if Form_logon.ErroBD(E.Message,'FK_Turmas_Instrutores') = 'Sim' then
Showmessage('Instrutor inválido!')
else if Form_logon.ErroBD(E.Message,'FK_Matriculas_Turmas') = 'Sim' then
Showmessage('Existem alunos matriculados nesta turma!')
else if Form_logon.ErroBD(E.Message,'FK_Aulas_Turmas') = 'Sim' then
Showmessage('Existem aulas cadastradas para esta turma!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Matriculas_Turmas') = 'Sim' then
Showmessage('Existem alunos matriculados nesta turma!')
else if Form_logon.ErroBD(E.Message,'FK_Aulas_Turmas') = 'Sim' then
Showmessage('Existem aulas cadastradas para esta turma!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
O campo Valor de cada aula será utilizado para o usuário informar valores numéricos
e, portanto devemos formatá-lo de maneira apropriada. Devemos formatar este campo para
exibição na tela, edição do valor e para gravá-lo no banco, ou seja, este campo será formatado
de 3 maneiras diferentes dependendo da situação.
Para exibir o valor na tela devemos formatá-lo com os símbolos de casas decimais (,),
milhar (.) e monetário (R$). Quando o usuário for editar o valor, devemos retirar os símbolos
de milhar (.) e monetário (R$). Já para a gravação no banco de dados devemos trocar a
vírgula (,) por ponto (.), pois os gerenciadores de banco de dados (incluindo o SQL Server)
utilizam como símbolo decimal o ponto (.) seguindo o padrão americano. Além disso, também
devemos retirar os símbolos de milhar e monetário.
Vamos então criar uma função que faça as devidas formatações de acordo com a
situação. Declare uma função chamada “formata_valor” que receberá dois parâmetros: o valor
a ser formatado e o destino da formatação (Tela, Edição ou Banco de Dados). Esta função
retornará uma string com o valor formatado.
Após programar todos os eventos acima descritos, falta apenas criar a funcionalidade
de pesquisa de turmas. Para este cadastro não iremos utilizar o form_pesquisa, pois
precisaremos de uma tela de pesquisa mais rebuscada e desta forma a tela genérica não nos
atende. Vamos criar uma tela de específica para pesquisa de turmas.
ADOQuery_pesquisa_turma.Close;
ADOQuery_pesquisa_turma.SQL.Text := sql + condicao;
ADOQuery_pesquisa_turma.Open;
end;
end;
Este botão irá chamar o form_pesquisa_turmas, portanto vá em File > Use Unit... e
selecione a unit_pesquisa_turmas. Em seguida salve as alterações clicando em Save All.
Form_pesquisa_turmas.ShowModal;
if Form_pesquisa_turmas.chave <> '' then
begin
pk := Form_pesquisa_turmas.chave;
ADOQuery_aux.SQL.Text := sql;
ADOQuery_aux.Open;
edt_cod.Text := ADOQuery_aux.fieldbyname('COD_TURMA').AsString;
edt_valor.Text := ADOQuery_aux.fieldbyname('VALOR_AULA').AsString;
edt_valor.Text := formata_valor(edt_valor.Text,'T');
edt_curso.Text := ADOQuery_aux.fieldbyname('CURSO').AsString;
edt_instrutor.Text := ADOQuery_aux.fieldbyname('INSTRUTOR').AsString;
cod_curso := ADOQuery_aux.fieldbyname('COD_CURSO').AsString;
cod_instrutor := ADOQuery_aux.fieldbyname('COD_INSTRUTOR').AsString;
end;
end;
Cadastro de Alunos
Os códigos dos eventos OnClick dos botões “Salvar”, “Excluir” e “Localizar” devem ser
ajustados para a tabela Alunos.
Abaixo segue os códigos destes botões:
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Alunos') = 'Sim' then
ShowMessage('Aluno já cadastrado!')
else if Form_logon.ErroBD(E.Message,'FK_Matriculas_Alunos') = 'Sim' then
Showmessage('Existem matrículas cadastradas para este aluno!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
begin
Form_logon.ConexaoBD.CommitTrans;
if operacao = 'novo' then
begin
ADOQuery_aux.SQL.Text:='SELECT COD_ALUNO FROM ALUNOS ' +
'WHERE NOME = '+ QuotedStr(edt_nome.Text) +
'AND IDADE ='+ edt_idade.Text +
'AND TELEFONE ='+ QuotedStr(edt_telefone.Text) +
'AND SEXO ='+ QuotedStr(edt_sexo.Text);
ADOQuery_aux.Open;
pk := ADOQuery_aux.fieldbyname('COD_ALUNO').AsString;
ADOQuery_aux.Close;
end;
desabilita_salvar(sender);
bloqueia_campos;
edt_cod.Text := pk;
end;
end;
end;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Matriculas_Alunos') = 'Sim' then
Showmessage('Existem matrículas cadastradas para este aluno!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Cadastro de Matrículas
Name Caption
btn_novo Novo
btn_salvar Salvar
btn_alterar Alterar
btn_cancelar Cancelar
btn_excluir Excluir
btn_fechar Fechar
Vamos agora criar as procedures e variáveis que fazem o controle da tela, àquelas que
habilitam/desabilitam botões e os campos da tela conforme fizemos nos cadastros anteriores.
No cadastro de matrículas teremos duas variáveis “pk”, pois a chave primária é composta pelo
código do aluno e pelo código da turma. Faça as seguintes declarações:
Procedure “bloqueia_campos”:
Procedure “desabilita_salvar”:
Procedure “habilita_salvar”:
Procedure “libera_campos”:
Procedure “limpa_campos”:
Atenção: Os campos “Aluno” e “Turma” não serão digitados pelo usuário. Eles serão
selecionados através de pesquisa. Sendo assim, o usuário não poderá digitar nestes campos e,
portanto, devemos alterar a procedure “libera_campos” para que ela não libere os objetos
“edt_aluno” e “edt_turma”. Acesse a procedure libera_campos da unit_matriculas e faça a
seguinte alteração:
Para que o usuário possa selecionar o aluno e a turma, iremos inserir 2 objetos BitBtn.
Renomeie os objetos para “btn_aluno” e “btn_turma”, em seguida selecione uma imagem para
os botões através da propriedade Glyph. Organize estes novos botões conforme mostrado da
imagem abaixo:
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Matriculas') = 'Sim' then
ShowMessage('Matrícula já cadastrada!')
else if Form_logon.ErroBD(E.Message,'FK_Frequencias_Matriculas') = 'Sim' then
Showmessage('Existem frequências lançadas para esta matrícula!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E : Exception do
begin
deuerro := true;
if Form_logon.ErroBD(E.Message,'FK_Frequencias_Matriculas') = 'Sim' then
Showmessage('Existem frequências lançadas para esta matrícula!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Após programar todos os eventos acima descritos, falta apenas criar a funcionalidade
de pesquisa de matrículas. O usuário irá pesquisar uma matrícula através do aluno, ou seja,
através do aluno o usuário irá selecionar a matrícula desejada. Sendo assim, podemos utilizar
a tela genérica de pesquisa: o form_pesquisa. Entretanto, precisaremos fazer uma pequena
modificação no form_pesquisa, mas nada que afete as outras telas que também fazem uso
dele. O form_pesquisa, da maneira como está, retorna como chave primária o primeiro campo
do registro selecionado. Como o cadastro de matrículas possui uma chave composta por dois
campos, iremos alterar o form_pesquisa para que ele retorne também o segundo campo do
registro selecionado.
Acesse a seção public da unit_pesquisa e declare a variável “chave_aux”.
Este botão irá chamar o form_pesquisa, portanto vá em File > Use Unit... e selecione
a unit_pesquisa. Em seguida salve as alterações clicando em Save All.
No evento OnClick do objeto btn_localizar digite o seguinte código:
O lançamento de aulas é uma das funcionalidades mais simples deste sistema. Ele
consiste basicamente em uma tela para executar um comando INSERT. Esta funcionalidade
será utilizada pelos instrutores da escola de informática. Eles irão utilizar esta opção apenas
para lançar as aulas que já aconteceram, pois não será permitido lançar aulas
antecipadamente conforme especificado no capítulo de planejamento da aplicação.
Insira um novo Form ao projeto.
Após salvar o novo form, insira 2 objetos Label e um objeto Edit ao form_lanca_aulas.
Altere a propriedade Caption dos Label’s para “Turma” e “Data”. Renomeie o objeto Edit para
edt_turma, limpe a propriedade Text, configure a propriedade Enable como “False” e Color
como “clInfoBk”.
Insira também um objeto DateTimePicker que está localizada na guia Win32 da
paleta de componentes. Este objeto é uma espécie de calendário.
Propriedade Valor
Format dd/MM/yyyy
Name dt_aula
Time 00:00:00
Após estas configurações, seu form deve ficar semelhante ao exibido abaixo:
Form_logon.ConexaoBD.BeginTrans;
try
ADOQuery_aux.ExecSQL;
deuerro := false;
except
on E: Exception do
begin
Autores: Rodrigo Costa e Sergio Ferreira Página 254
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
deuerro := true;
if Form_logon.ErroBD(E.Message,'PK_Aulas') = 'Sim' then
Showmessage('Aula já lançada!')
else
ShowMessage('Ocorreu o seguinte erro: ' + E.Message);
end;
end;
Após salvar o novo form, insira 2 objetos Label, 1 objeto Edit e um ComboBox ao
form_lanca_presenca. Altere a propriedade Caption dos Label’s para “Turma” e “Data da Aula”.
Renomeie o objeto Edit para edt_turma, limpe a propriedade Text, configure a propriedade
Enable como “False” e Color como “clInfoBk”. Altere a propriedade Name do ComboBox para
cb_aulas e a propriedade Style para “csDropDownList”.
Insira 3 objetos BitBtn ao form_lanca_presenca, configure Name como
“btn_listar_alunos”, “btn_lancar” e “btn_fechar”. Configure Caption como “Listar”, “Confirmar”
e “Fechar”. Além disso, insira um outro BitBtn para selecionar a turma. Configure-o da mesma
maneira que foi configurado no form_matriculas.
Insira também um objeto CheckListBox que está localizada na guia Additional da
paleta de componentes. Este objeto será utilizado para listar os alunos matriculados na turma
selecionada.
Após estas configurações, seu form deve ficar semelhante ao exibido abaixo:
data := ADOQuery_aux.fieldbyname('DATA').AsDateTime;
cb_aulas.Items.Add(FormatDateTime('dd/mm/yyyy',data));
ADOQuery_aux.Next;
end;
end;
ADOQuery_aux.Close;
end;
end;
if ck_lista_alunos.Checked[i] then
presente := 'S'
else
presente := 'N';
Após salvar o novo form, insira 2 objetos Label, 1 objeto Edit e um ComboBox ao
form_pag_instrutores. Altere a propriedade Caption dos Label’s para “Instrutor” e “Mês/Ano”.
Renomeie o objeto Edit para edt_instrutor, limpe a propriedade Text, configure a propriedade
Enable como “False” e Color como “clInfoBk”. Altere a propriedade Name do ComboBox para
cb_mes_ano e a propriedade Style para “csDropDownList”. Insira 2 objetos BitBtn ao
form_pag_instrutores, configure Name como “btn_gerar”, e “btn_cancelar”. Configure Caption
como “Gerar demonstrativo”, e “Cancelar”. Além disso, insira um outro BitBtn para selecionar
o instrutor. Configure-o da mesma maneira que foi configurado no form_turmas.
Em seguida, insira dois objetos ADOQuery. Nós iremos utilizar um para fazer as
consultas e demais operações no banco e o outro para montar o SELECT do demonstrativo.
Altere a propriedade Name dos ADOQuery’s para “ADOQuery_demonstrativo” e
“ADOQuery_aux”. Configure a propriedade Connection deles para Fom_logon.ConexaoBD.
Mas antes vá em File > Use Unit... e selecione a Unit_logon. Após estas configurações, seu
form deve ficar semelhante ao exibido abaixo:
Para criar o demonstrativo, iremos utilizar o editor de relatórios Rave Reports que faz
parte do Delphi 7. Os componentes necessários à criação de um relatório usando o Rave
Reports estão na guia Rave da paleta de componentes. Precisamos utilizar apenas dois
componentes desta guia para montar nosso demonstrativo.
A primeira opção que devemos configurar é o software de banco de dados que iremos
acessar, em nosso caso, iremos acessar um servidor SQL Server, portanto selecione a opção
Microsoft OLE DB Provider for SQL Server. Clique em Avançar para continuar com a
configuração do objeto ConexaoDB.
Agora devemos informar o nome do servidor SQL Server que desejamos acessar. Você
também pode informar o endereço IP do servidor caso não saiba ou não queira usar o nome do
servidor.
A próxima opção é usuário e a senha utilizada para acessar o servidor. Aqui você pode
utilizar o usuário “admin_academico” que criamos para ser utilizado pela aplicação. Marque a
opção “Permitir salvamento de senha”. A última opção a configurar é o banco de dados que
iremos acessar. Selecione o banco de dados Academico.
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Na janela que surgirá, selecione a opção Direct Data View e clique em Next.
Será exibido outra tela, então selecione o objeto “ds_demonstrativo” para ligar o Rave
com o ADOQuery_demonstrativo que possui o SELECT que configuramos anteriormente.
Vamos então montar nosso relatório, para isso vá até a guia Report. Veja os principais
objetos:
Insira um objeto Region ao relatório. Aumente o objeto de forma que ele ocupe todo o
espaço disponível da página. Para facilitar este trabalho, utilize o menu Zoom para ajustar a
visualização.
Na propriedade BandStyle, clique no botão “...” e marque a opção Body Header. Isto
determinará que essa banda seja o cabeçalho do relatório.
Como dito anteriormente, o demonstrativo de aulas do instrutor deve ser agrupado por
turma, portanto, iremos inserir mais uma banda que será o cabeçalho do grupo. Insira um
objeto Band. Renomeie o objeto para “cabecalho_turma”. Na propriedade BandStyle, clique
em “...” e marque a opção Group Header. Assim esta banda será o cabeçalho do
agrupamento de turmas.
Agora vamos inserir a banda principal, onde serão listadas as aulas dadas pelos
instrutores. A banda principal deve ser uma DataBand e não uma Band comum. Então insira
um DataBand. Renomeie o objeto para “aulas”. Na propriedade BandStyle, clique em “...” e
marque a opção Detail.
Após criar a banda de detalhe, vamos inserir as bandas de rodapé de grupo e de rodapé
do relatório. Insira 2 objetos Band, renomeie o primeiro como “rodape_turma” e o segundo
como “rodape”. O BandStyle do primeiro será “Group Footer” e do segundo “Body Footer”.
Até agora o que fizemos foi apenas criar as bandas e definir o estilo de cada uma.
Vamos então configurar as propriedades de cada uma.
Propriedade Valor
ControllerBand aulas
Propriedade Valor
DataView DataView1
DetailKey DATA
Propriedade Valor
ControllerBand aulas
GroupDataView DataView1
GroupKey COD_TURMA
Propriedade Valor
ControllerBand aulas
A partir de agora, sempre que quiser salvar as alterações no projeto deste relatório,
basta clicar sobre o botão Save Project:
Após salvar o nosso projeto Rave, vamos agora inserir os objetos nas bandas criadas.
Iremos utilizar 3 objetos para este relatório:
Insira 3 objetos Text à Band “cabecalho”. Altere a propriedade Text deles para
“Demonstrativo de Aulas”, “Código do Instrutor” e “Nome do Instrutor”. Em seguida, os
organize conforme exibido na imagem abaixo:
Agora só falta inserir os objetos das bandas de rodapé. Insira um objeto CalcText na
Band “rodape_turma”. Insira também um objeto Hline (guia Drawing).
Propriedade Valor
CalcType ctSum
Controller aulas
DataView DataView1
DataField VALOR_AULA
DisplayFormat R$ ,0.00
FontJustify pjRight
E por fim, vamos inserir os objetos da Band “rodape”. Insira um objeto Rectangle
(guia Drawing).
Insira também 1 objeto Text e 1 objeto DataText. Altere a propriedade Text do objeto
Text para “Valor total à pagar:”. Em seguida altere as propriedades do CalcText de acordo com
a tabela abaixo:
Propriedade Valor
CalcType ctSum
Controller aulas
DataView DataView1
DataField VALOR_AULA
DisplayFormat R$ ,0.00
FontJustify pjRight
Na janela que surgirá, clique novamente com o botão direito do mouse e selecione a
opção Add all fields:
ADOQuery_demonstrativo.SQL.Text := sql;
ADOQuery_demonstrativo.Open;
ADOQuery_demonstrativo.Close;
Form_logon.ConexaoBD.BeginTrans;
ADOQuery_aux.SQL.Text := sql;
ADOQuery_aux.ExecSQL;
Form_logon.ConexaoBD.CommitTrans;
Showmessage('Aulas quitadas com sucesso!');
cb_mes_ano.Clear;
edt_instrutor.Clear;
cod_instrutor := '';
end;
end;
end;
Módulo 6:
Criando os Relatórios
F
inalizando este curso, iremos construir os relatórios do sistema. Os
relatórios são a forma que o usuário possui para visualizar de maneira
organizada as informações contidas no banco de dados. Os relatórios
também são utilizados como uma ferramenta de consulta. Neste módulo
veremos como parametrizar cada relatório de forma que o usuário possa
definir o que ele quer que o sistema exiba.
Relação de Cursos
Neste último módulo iremos apenas criar relatórios. A palavra “apenas” não significa
que será pouco trabalho ou que será um trabalho sem importância. Os relatórios são as
ferramentas de controle mais utilizadas pelos usuários. Através deles os usuários podem tomar
conhecimento das diversas informações contidas no sistema. Além disso, os relatórios
possibilitam que os dados sejam impressos em papel de maneira simples e organizada.
Iremos criar uma tela que concentrará todos os relatórios do sistema, assim o usuário
terá, em um único lugar, acesso a eles.
Insira um novo Form ao projeto.
Após salvar o novo form, insira 6 objetos BitBtn. Altere as propriedades Name e Caption
de cada um deles seguindo a tabela abaixo:
Name Caption
btn_rel_curso Relação de Cursos
btn_rel_turmas Relação de Turmas por Curso
btn_rel_alunos Relação de Alunos por Turma
btn_rel_faltas Relatório de Faltas dos Alunos
btn_rel_aulas Relatório de Aulas por Instrutor
btn_fechar Fechar
Agora iremos criar nosso primeiro relatório: “Relação de Cursos”. Este relatório é bem
simples, pois consiste em listar os cursos cadastrados na tabela cursos do sistema. Para este
relatório, insira 1 objeto ADOQuery, 1 objeto Rvproject e 1 objeto RvDataSetConnection.
Altere a propriedade Name do ADOQuery para “ADOQuery_rel_cursos”. Configure a
propriedade Connection dele para Fom_logon.ConexaoBD. Mas antes vá em File > Use
Unit... e selecione a Unit_logon. Na propriedade SQL digite o seguinte comando: “SELECT *
FROM CURSOS ORDER BY NOME”. Renomeie o RvProject para “rel_cursos” e o
RvDataSetConnection para “ds_rel_cursos”. Agora ligue o ds_rel_cursos ao
ADOQuery_rel_cursos através da propriedade DataSet.
Como já sabemos, para criar o relatório no ambiente do Rave Reports é necessário
estabelecer conexão com o banco de dados e ativar o ADOQuery que será utilizado pelo
relatório. Portanto, estabeleça a conexão através do ConexaoBD que está no form_logon e
ative o ADOQuery_rel_cursos. Se tiver alguma dúvida neste procedimento consulte o capítulo
anterior.
Autores: Rodrigo Costa e Sergio Ferreira Página 288
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Vamos então montar nosso relatório. Insira um objeto Region ao relatório. Aumente o
objeto de forma que ele ocupe todo o espaço disponível da página. Para facilitar este trabalho,
utilize o menu Zoom para ajustar a visualização.
Agora vamos inserir a banda principal, onde serão listadas os cursos da escola de
informática. A banda principal deve ser uma DataBand e não uma Band comum. Então insira
um DataBand. Renomeie o objeto para “cursos”. Na propriedade BandStyle, clique em “...” e
marque a opção Detail.
Propriedade Valor
ControllerBand cursos
Propriedade Valor
DataView DataView1
DetailKey COD_CURSO
A partir de agora, sempre que quiser salvar as alterações no projeto deste relatório,
basta clicar sobre o botão Save Project:
Após salvar o nosso projeto Rave, vamos agora inserir os objetos nas bandas criadas.
Insira 3 objetos Text à Band “cabecalho”. Altere a propriedade Text deles para “Relação de
Cursos”, “Código do Curso” e “Nome do Curso”. Em seguida, os organize conforme exibido na
imagem abaixo:
Pronto, a relação de cursos já está concluída! Vamos agora alterar o form_menu para
chamar o form_relatorios. Acesse o form_menu e digite o seguinte no evento OnClick do botão
“Relatórios”:
A relação de turmas por curso funcionará da seguinte maneira: o usuário irá selecionar
o curso desejado e então a aplicação listará todos as turmas daquele curso. Como podemos
perceber, precisaremos de uma tela de parâmetros, para que o usuário possa selecionar o
curso desejado.
Insira um novo Form ao projeto.
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Autores: Rodrigo Costa e Sergio Ferreira Página 299
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
Vamos então montar nosso relatório. Insira um objeto Region ao relatório. Aumente o
objeto de forma que ele ocupe todo o espaço disponível da página. Para facilitar este trabalho,
utilize o menu Zoom para ajustar a visualização.
Agora vamos inserir a banda principal, onde serão listadas as turmas do curso
escolhido. A banda principal deve ser uma DataBand e não uma Band comum. Então insira
um DataBand. Renomeie o objeto para “turmas”. Na propriedade BandStyle, clique em “...” e
marque a opção Detail.
Propriedade Valor
ControllerBand turmas
Propriedade Valor
DataView DataView1
DetailKey TURMA
Após salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 4
objetos Text à Band “cabecalho”. Altere a propriedade Text deles para “Relação de Turmas por
Curso”, “Curso”, “Turma” e “Instrutor”. Insira também 1 DataText, altere a propriedade
DataView para “DataView1” e DataField para “CURSO”. Em seguida, os organize conforme
exibido na imagem abaixo:
Pronto, a relação de turmas por curso já está concluída! Vamos agora alterar o
form_relatorios para chamar o form_rel_turmas. Acesse o form_relatorios e digite o seguinte
no evento OnClick do botão “Relação de Turmas por Curso”:
A relação de alunos por turma será bem semelhante ao último relatório que criamos.
Neste relatório, teremos uma tela de parâmetro onde o usuário deverá selecionar a turma
desejada e então a aplicação irá listar os alunos desta turma.
Insira um novo Form ao projeto.
Após fazer a declaração, insira 1 objeto Label e 1 objeto Edit ao form_rel_alunos. Altere
a propriedade Caption do Label para “Turma”. Renomeie o objeto Edit para edt_turma, limpe a
propriedade Text, configure a propriedade Enable como “False” e Color como “clInfoBk”. Insira
2 objetos BitBtn ao form_rel_alunos, configure Name como “btn_ok” e “btn_fechar”. Configure
Caption como “Ok” e “Fechar”. Além disso, insira um outro BitBtn para selecionar a turma.
Configure-o da mesma maneira que foi configurado no form_matriculas. Em seguida, insira
dois objetos ADOQuery. Nós iremos utilizar um para fazer as consultas no banco e o outro para
montar o SELECT do relatório. Altere a propriedade Name dos ADOQuery’s para
“ADOQuery_rel_alunos” e “ADOQuery_aux”. Configure a propriedade Connection deles para
Fom_logon.ConexaoBD. Mas antes vá em File > Use Unit... e selecione a Unit_logon. Após
estas configurações, seu form deve ficar semelhante ao exibido abaixo:
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Vamos então montar nosso relatório. Insira um objeto Region ao relatório. Aumente o
objeto de forma que ele ocupe todo o espaço disponível da página. Para facilitar este trabalho,
utilize o menu Zoom para ajustar a visualização.
Agora vamos inserir a banda principal, onde serão listadas os alunos da turma
escolhida. A banda principal deve ser uma DataBand e não uma Band comum. Então insira
um DataBand. Renomeie o objeto para “alunos”. Na propriedade BandStyle, clique em “...” e
marque a opção Detail.
Propriedade Valor
ControllerBand alunos
Propriedade Valor
DataView DataView1
DetailKey COD_ALUNO
Após salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 7
objetos Text à Band “cabecalho”. Altere a propriedade Text deles para “Relação de Alunos por
Turma”, “Turma”, “Código do Aluno”, “Nome do Aluno”, “Idade”, “Telefone” e “Sexo”. Insira
também 1 DataText, altere a propriedade DataView para “DataView1” e DataField para
“TURMA”. Em seguida, os organize conforme exibido na imagem abaixo:
Pronto, a relação de alunos por turma já está concluída! Vamos agora alterar o
form_relatorios para chamar o form_rel_alunos. Acesse o form_relatorios e digite o seguinte
no evento OnClick do botão “Relação de Alunos por Turma”:
O relatório de faltas dos alunos será um relatório onde serão listados os alunos de uma
turma com a quantidade de faltas de cada um deles. Também teremos uma tela de
parâmetros idêntica ao relatório de alunos por turma.
Insira um novo Form ao projeto.
Após salvar o novo form, acesse a unit_rel_faltas e declare a seguinte variável na seção
public:
Após fazer a declaração, insira 1 objeto Label e 1 objeto Edit ao form_rel_faltas. Altere
a propriedade Caption do Label para “Turma”. Renomeie o objeto Edit para edt_turma, limpe a
propriedade Text, configure a propriedade Enable como “False” e Color como “clInfoBk”. Insira
2 objetos BitBtn ao form_rel_faltas, configure Name como “btn_ok” e “btn_fechar”. Configure
Caption como “Ok” e “Fechar”. Além disso, insira um outro BitBtn para selecionar a turma.
Configure-o da mesma maneira que foi configurado no form_matriculas. Em seguida, insira
dois objetos ADOQuery. Nós iremos utilizar um para fazer as consultas no banco e o outro para
montar o SELECT do relatório. Altere a propriedade Name dos ADOQuery’s para
“ADOQuery_rel_faltas” e “ADOQuery_aux”. Configure a propriedade Connection deles para
Fom_logon.ConexaoBD. Mas antes vá em File > Use Unit... e selecione a Unit_logon. Após
estas configurações, seu form deve ficar semelhante ao exibido abaixo:
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Vamos então montar nosso relatório. Insira um objeto Region ao relatório. Aumente o
objeto de forma que ele ocupe todo o espaço disponível da página. Para facilitar este trabalho,
utilize o menu Zoom para ajustar a visualização.
Agora vamos inserir a banda principal, onde serão listadas as faltas dos alunos da
turma escolhida. A banda principal deve ser uma DataBand e não uma Band comum. Então
insira um DataBand. Renomeie o objeto para “faltas”. Na propriedade BandStyle, clique em
“...” e marque a opção Detail.
Propriedade Valor
ControllerBand alunos
Propriedade Valor
DataView DataView1
DetailKey COD_ALUNO
Após salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 5
objetos Text à Band “cabecalho”. Altere a propriedade Text deles para “Relação de Faltas dos
Alunos”, “Turma”, “Código do Aluno”, “Nome do Aluno” e “Faltas”. Insira também 1 DataText,
altere a propriedade DataView para “DataView1” e DataField para “TURMA”. Em seguida, os
organize conforme exibido na imagem abaixo:
Pronto, o relatório de faltas dos alunos já está concluído! Vamos agora alterar o
form_relatorios para chamar o form_rel_faltas. Acesse o form_relatorios e digite o seguinte no
evento OnClick do botão “Relatório de Faltas dos Alunos”:
Autores: Rodrigo Costa e Sergio Ferreira Página 322
Divulgação: www.juliobattisti.com.br
Delphi com Banco de Dados Cliente/Servidor
O relatório de aulas por Instrutor será um relatório onde deverá constar a quantidade
de aulas que o instrutor selecionado deu em cada turma. Neste relatório teremos uma tela de
parâmetros onde o usuário selecionará o instrutor desejado.
Insira um novo Form ao projeto.
Após salvar o novo form, acesse a unit_rel_aulas e declare a seguinte variável na seção
public:
Após fazer a declaração, insira 1 objeto Label e 1 objeto Edit ao form_rel_aulas. Altere
a propriedade Caption do Label para “Instrutor”. Renomeie o objeto Edit para edt_instrutor,
limpe a propriedade Text, configure a propriedade Enable como “False” e Color como
“clInfoBk”. Insira 2 objetos BitBtn ao form_rel_aulas, configure Name como “btn_ok” e
“btn_fechar”. Configure Caption como “Ok” e “Fechar”. Além disso, insira um outro BitBtn para
selecionar o instrutor. Configure-o da mesma maneira que foi configurado no
form_pag_instrutores. Em seguida, insira dois objetos ADOQuery. Nós iremos utilizar um para
fazer as consultas no banco e o outro para montar o SELECT do relatório. Altere a propriedade
Name dos ADOQuery’s para “ADOQuery_rel_aulas” e “ADOQuery_aux”. Configure a
propriedade Connection deles para Fom_logon.ConexaoBD. Mas antes vá em File > Use
Unit... e selecione a Unit_logon. Após estas configurações, seu form deve ficar semelhante ao
exibido abaixo:
Expanda a Report Library até chegar ao item Page1. Selecione-o e altere a propriedade
Orientation para “poPortrait” (Página na Vertical) e a propriedade PageSize para A4.
Vamos então montar nosso relatório. Insira um objeto Region ao relatório. Aumente o
objeto de forma que ele ocupe todo o espaço disponível da página. Para facilitar este trabalho,
utilize o menu Zoom para ajustar a visualização.
Agora vamos inserir a banda principal, onde serão listadas as aulas do instrutor
escolhido. A banda principal deve ser uma DataBand e não uma Band comum. Então insira
um DataBand. Renomeie o objeto para “aulas”. Na propriedade BandStyle, clique em “...” e
marque a opção Detail.
Propriedade Valor
ControllerBand aulas
Propriedade Valor
DataView DataView1
DetailKey COD_TURMA
Após salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 5
objetos Text à Band “cabecalho”. Altere a propriedade Text deles para “Relatório de Aulas por
Instrutor”, “Código do Instrutor”, “Nome do Instrutor”, “Turma” e “Aulas”. Insira também 2
DataText’s, altere a propriedade DataView para “DataView1” e DataField para
“COD_INSTRUTOR” e “NOME”. Em seguida, os organize conforme exibido na imagem abaixo:
Pronto, o relatório de aulas por instrutor já está concluído! Vamos agora alterar o
form_relatorios para chamar o form_rel_aulas. Acesse o form_relatorios e digite o seguinte no
evento OnClick do botão “Relatório Aulas por Instrutor”:
Conclusão
Em fim terminamos! Ufa... Depois de tantas horas dedicadas a este curso você deve
estar um pouco cansado e satisfeito (esperamos que sim). Acreditamos que o objetivo deste
curso foi alcançado: Mostrar como desenvolver aplicações Delphi com um banco de dados
Cliente/Servidor. Aqui desenvolvemos assuntos que foram desde a introdução aos sistemas
gerenciadores de banco de dados, passando pelo aprendizado básico do SQL Server 2000 e o
controle de transações até a construção de uma aplicação de banco de dados. Conhecemos a
linguagem SQL e como ela pode ser útil em programas Delphi. Durante os exemplos citados
foram mostrados muitos conceitos que podem ser utilizados em outras aplicações.
Obviamente, a aplicação desenvolvida neste curso foi projetada com um propósito meramente
didático, entretanto você pode adaptá-la para ter uma abordagem mais comercial.
Despedimos-nos certos de que este trabalho será de grande importância aos
interessados no assunto. Esperamos que faça bom proveito deste material !