Você está na página 1de 333

ndice Introduo .................................................................................................... Mdulo 1: Introduo aos Sistemas Gerenciadores de Banco de Dados ..................

Conhecendo o SQL Server 2000 .............................................................. Modelagem de Dados ............................................................................. Instruo SELECT .................................................................................. Instruo INSERT .................................................................................. Instruo UPDATE ................................................................................. Instruo DELETE ..................................................................................

2 4 5 14 27 47 51 54

Mdulo 2: Conectando o Delphi ao SQL Server ................................................... 61 Componentes de Acesso a Dados ............................................................. 62 Recuperando e exibindo dados ................................................................ 65 Inserindo dados .................................................................................... 82 Atualizando dados ................................................................................. 93 Excluindo dados .................................................................................... 99 Tratando erros de banco de dados ........................................................... 103 Mdulo 3: Projetando uma Aplicao de Banco de Dados ..................................... 115 Planejando a aplicao: Gerenciador de Cursos de Informtica ............ 116 Criando um Diagrama de Funcionalidades ................................................. 118 Projetando o banco de dados .................................................................. 121 Criando as tabelas ................................................................................. 126 Iniciando a programao ........................................................................ 140 Mdulo 4: Criando o Controle de Acesso ............................................................ 145 Criando a tela de Splash ......................................................................... 146 Programando o processo de autenticao no Servidor ................................ 150 Configurando a tela de Logon .................................................................. 155 Criando o mecanismo de verificao de usurios e permisses .................... 163 Montando o cadastro de usurios e permisses ......................................... 167 Mdulo 5: Criando as Funcionalidades da Aplicao ............................................. 187 Cadastro de Cursos ............................................................................... 188 Cadastro de Instrutores .......................................................................... 198 Cadastro de Turmas .............................................................................. 210 Cadastro de Alunos ................................................................................ 231 Cadastro de Matrculas ........................................................................... 236 Criando o Lanamento de Aulas ............................................................... 251 Criando o Lanamento de Presena .......................................................... 256 Montando o Pagamento de Instrutores ..................................................... 262 Mdulo 6: Criando os Relatrios ....................................................................... 285 Relao de Cursos ................................................................................. 286 Relao de Turmas por Curso .................................................................. 296 Relao de Alunos por Turma .................................................................. 305 Relatrio de Faltas dos Alunos ................................................................. 314 Relatrio de Aulas por Instrutor ............................................................... 323 Concluso ..................................................................................................... 332

Delphi com Banco de Dados Cliente/Servidor

2 de 332

Introduo
Atualmente existem diversos paradigmas de programao, vrios so os conceitos e metodologias adotadas para o desenvolvimento de aplicaes. Ouve-se muito sobre Desenvolvimento em Camadas e Desenvolvimento para a Internet. Todos os grandes sistemas construdos recentemente seguem esta nova onda. Entretanto, no podemos fechar os olhos para o que j existe. Muito dos sistemas que revolucionaram o mercado de desenvolvimento foram programados seguindo o modelo Cliente/Servidor. Nos primrdios da programao, o que reinava eram os computadores de Grande Porte que com grande poder de processamento ficavam responsveis por todo o trabalho. Os poderosos Mainframes possuam terminais burros que apenas contavam com um monitor e um teclado sem qualquer processamento local. Mas apesar de jurssicos, os sistemas em COBOL (linguagem de programao mais comum para Mainframe) ainda respondem pelas principais operaes de grandes organizaes como bancos e instituies financeiras. Com o surgimento e popularizao dos microcomputadores, surgiu o modelo de desenvolvimento Cliente/Servidor. Este modelo veio para substituir os antigos Mainframes, pois oferecia uma grande facilidade para construo de aplicaes baseadas em redes de microcomputadores. O modelo Cliente/Servidor trouxe vrias ferramentas para

desenvolvimento nesta plataforma que proporcionavam um alto ndice de produtividade e um produto final mais bonito e amigvel ao usurio atravs da interface grfica. Mesmo com todos os benefcios oferecidos, o modelo Cliente/Servidor no fez com que os grandes sistemas em COBOL fossem exterminados. A explicao simples: Por que trocar tudo o que j funciona por algo novo s porque est na moda? Seria um absurdo abandonar todo um legado de sistemas que atendem perfeitamente s necessidades por um novo modelo de programao com a justificativa de que o que h de mais moderno no mercado. Este mesmo entendimento se aplica ao combate Cliente/Servidor X Web. Muitos sistemas foram desenvolvidos com o modelo Cliente/Servidor e ainda hoje continuam funcionando! Ento por que jogar tudo fora e fazer de novo em ambiente Web? Sem sombra de dvidas, o avano da tecnologia algo muito importante para o aperfeioamento da programao. bvio que os novos sistemas devem utilizar as novas tecnologias de desenvolvimento de aplicaes. No podemos ser hipcritas e negar os benefcios de cada novo lanamento nesta rea, porm, temos que ter o amadurecimento para no esquecer de tudo o que j foi feito e saber reconhecer que ainda precisamos dos sistemas que esto rodando por a. Afinal, quando algum sistema Cliente/Servidor precisar de uma manuteno, teremos que realiza-la ou algum ainda acha que melhor escrever tudo de novo para a internet do que corrigir algumas linhas de cdigo?

Este material foi desenvolvido com o objetivo de elucidar os interessados na programao Cliente/Servidor.

Delphi com Banco de Dados Cliente/Servidor

3 de 332

Aqui voc obter conhecimentos suficientes para o desenvolvimento de aplicaes Cliente/Servidor com Delphi. Alm do aprendizado na linguagem de programao, voc tambm aprender como trabalhar com um SGBD (Sistema Gerenciador de Banco de Dados). O SGBD escolhido o Microsoft SQL Server 2000, um poderoso banco de dados que possui uma grande aceitao no mercado de trabalho.

Os assuntos sero mencionados numa ordem natural para um bom entendimento de todo o curso. Primeiro iremos entender o que o modelo Cliente/Servidor e como desenvolver aplicaes seguindo este modelo de programao. Em seguida, conheceremos o SQL Server 2000. Veremos as ferramentas para manipulao do banco de dados e como nos conectar a ele. A linguagem SQL o prximo assunto a ser mencionado. Veremos como recuperar os dados atravs do comando SELECT e como modifica-los atravs das instrues INSERT, UPDATE e DELETE. Aps sabermos como trabalhar com o SQL Server (no nvel de desenvolvedor), iremos ver os componentes que o Delphi disponibiliza para a manipulao de banco de dados. Alm dos objetos de interao com o banco de dados, aprenderemos como prevenir e como tratar os erros de banco de dados. Depois de aprendermos como trabalhar com o SQL Server e como interagir com ele atravs do Delphi, iremos criar uma aplicao de banco de dados Cliente/Servidor completa. Este projeto simular um sistema para administrao de cursos de informtica. Mas antes de desenvolver a aplicao, faremos todo o planejamento da mesma. Criaremos um diagrama da funcionalidade do sistema, elaboraremos o modelo de dados e ento criaremos as tabelas no SQL Server. Ao trmino da fase de projeto, partiremos para a programao do sistema em Delphi. Criaremos o controle de acesso e todas as funcionalidades da aplicao com todos os cadastros e movimentaes envolvidas no contexto do sistema. Ao final do projeto criaremos os relatrios da aplicao.

Delphi com Banco de Dados Cliente/Servidor

4 de 332

Mdulo 1:
Introduo aos Sistemas Gerenciadores de Banco de Dados

Manager e do Query Analyzer que so as principais ferramentas de interao com o Banco de Dados. Em seguida aprenderemos um pouco sobre modelagem de dados. Apesar da modelagem de dados no ser o foco deste livro, este assunto ser abordado, pois muito importante que o

este mdulo 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 atravs do Enterprise

desenvolvedor conhea o modelo relacional e saiba trabalhar com ele. Continuando nossa jornada no mundo dos SGBDs, conheceremos a linguagem SQL (Structured Query Language ou Linguagem de Consulta Estruturada) a qual permitir que recuperemos e modifiquemos as informaes contidas em um banco de dados.

Delphi com Banco de Dados Cliente/Servidor

5 de 332

Conhecendo o SQL Server 2000


O SQL Server 2000 o principal produto da linha de sistemas de banco de dados da Microsoft. O Microsoft SQL Server ou simplesmente MSSQL o mecanismo de banco de dados principal na indstria de computao para a plataforma Windows NT/2000/XP/2003. O MSSQL um Sistema Gerenciador de Banco de Dados que, como tantos outros, opera voltado para o Ambiente Cliente/Servidor. Antes de ver mais de perto o SQL Server e aprender a utiliz-lo, vamos entender o que e como funciona o modelo Cliente/Servidor.

Antigamente os sistemas rodavam em uma nica mquina, um computador com grande poder de processamento conhecido como Mainframe. Neste computador ficavam o banco de dados e a aplicao ao mesmo tempo. Os usurios utilizavam os sistemas atravs de terminais burros que eram compostos apenas por um monitor e um teclado. Todo o processamento era executado no mainframe e os terminais apenas serviam para exibir o resultado disso. Veja a figura abaixo para um melhor entendimento:

Com o surgimento dos microcomputadores e das redes de microcomputadores, nasceu o modelo Cliente/Servidor. Diferentemente de um terminal de mainframe, um

microcomputador possui vida prpria, ou seja, ele possui poder de processamento. Sendo assim, ele no depende de um outro computador para executar suas tarefas podendo ele mesmo processar localmente tudo o que precisar. Com isto, os desenvolvedores de sistemas resolveram utilizar o processamento dos microcomputadores tirando do servidor a

responsabilidade de executar a aplicao. Apenas o banco de dados continuou no servidor j que preciso que os dados estejam centralizados num nico lugar de forma que todos os usurios tenham acesso s informaes consolidadas. Nasce ento o modelo Cliente/Servidor, onde temos basicamente dois elementos neste ambiente: o cliente, encarregado de executar a aplicao e o servidor de banco de dados,

Delphi com Banco de Dados Cliente/Servidor

6 de 332

responsvel por armazenar as informaes do sistema. Veja a figura abaixo que representa o ambiente Cliente/Servidor:

Resumindo, um sistema Cliente/Servidor dividido em duas partes: uma que excuta em um servidor e uma que executa em estaes de trabalho. O lado do servidor fornece segurana, tolerncia a falhas, desempenho, concorrncia e backups confiveis. O lado do cliente fornece a interface com o usurio que possui os relatrios, as consultas e os formulrios. O SQL Server a parte do servidor onde vrios clientes podem se conectar a ele. Em computao Cliente/Servidor, quando uma consulta executada, o servidor pesquisa o banco de dados e envia apenas as linhas que correspondem pesquisa do cliente. Esse processo no somente poupa trfego na rede como tambm pode ser mais rpido do que ter as estaes realizando as consultas.

Para ter acesso ao SQL Server, existem um conjunto de ferramentas disponveis no grupo de programas do Menu Iniciar. Para v-las, clique em Iniciar > Programas > Microsoft SQL Server.

Delphi com Banco de Dados Cliente/Servidor

7 de 332

Dentre as ferramentas disponveis para utilizao do SQL Server 2000, iremos utilizar apenas duas, as mais importantes: o Enterprise Manager e o Query Analyzer.

O Enterprise Manager a interface grfica administrativa do SQL Server. Atravs dela possvel visualizar todos os banco de dados criados no servidor e fazer praticamente tudo como criar tabelas, consultar e inserir registros, administrar usurios e fazer backup.

O SQL Server 2000 possui vrios bancos de dados que so criados durante a instalao. Dentre eles, existem os bancos de dados de sistema, que so utilizados pelo SQL Server 2000 e os bancos de dados de exemplos. Os bancos de dados de sistema so: master, model, msdb e tempdb. Cada um deles possui uma funo especfica para o funcionamento do SQL Server e no podem ser excludos! Existem tambm dois bancos de dados de exemplo: Northwind e pubs. Estes bancos de dados so apenas amostras para ajudar no aprendizado do SQL Server e podem ser excludos sem problemas. Alm dos bancos de dados padro do SQL Server, voc pode criar seus prprios bancos de dados e certamente faremos isto durante este curso.

Delphi com Banco de Dados Cliente/Servidor

8 de 332

Para exemplificarmos o uso do Enterprise Manager, vamos consultar as informaes contidas em uma tabela do banco de dados Northwind. Para isso, navegue at a opo Tables do banco de dados Northwind e clique com o boto direito do mouse sobre a tabela Categories. Na caixa de dilogo que aparecer, clique em Open Table > Return all rows.

Ento sero exibidos todos os registros contidos nesta tabela.

Para voltar tela anterior feche a janela de visualizao dos dados da tabela.

Delphi com Banco de Dados Cliente/Servidor

9 de 332

Alm 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 boto direito do mouse sobre a tabela Categories. Na caixa de dilogo que aparecer, clique em Design Table.

Ento ser exibida a estrutura da tabela Categories.

Delphi com Banco de Dados Cliente/Servidor

10 de 332

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 extenso da linguagem SQL, ou seja, um conjunto de comandos adicionados linguagem SQL que padro para todos os bancos de dados relacionais. No prximo captulo 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 usurio 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 mquina que voc est utilizando) no necessrio informar o nome do servidor.

Aps efetuar o logon, o Query Analyzer ir se conectar ao servidor informado e ao banco de dados default (geralmente o master). Para conectar em outro banco de dados do servidor, basta selecionar o banco desejado na caixa de seleo presente na parte superior da tela. Observe a figura a seguir onde est sendo selecionado o banco de dados Northwind.

Delphi com Banco de Dados Cliente/Servidor

11 de 332

Na barra de ttulos da janela de conexo do Query Analyzer voc pode observar em que servidor/banco de dados/usurio est em uso no momento.

Em nosso exemplo, estamos conectados no servidor RODRIGO, no banco de dados Northwind e usando o usurio sa. O usurio sa o usurio administrador do SQL Server, o nome sa quer dizer system administrator ou administrador do sistema.

Delphi com Banco de Dados Cliente/Servidor

12 de 332

Para exemplificarmos o uso do Query Analyzer, vamos consultar as informaes contidas em na tabela do Categories do banco de dados Northwind como fizemos com o Enterprise Manager. Para isso, digite o seguinte comando sem as aspas: select * from categories. Em seguida clique em Execute Query ou pressione F5 no teclado para executar o comando digitado.

Aps executar o comando, sero exibidos os registros contidos na tabela Categories do banco Northwind.

Para verificar a estrutura da tabela Categories atravs do Query Analyzer, digite o comando sp_help categories. No preciso apagar o comando anterior, basta voc selecionar o comando que deseja executar e pressionar F5 ou clicar em Execute Query que o Query Analyzer vai executar apenas o comando que estiver selecionado. Observe a figura abaixo para visualizar a estrutura da tabela obtida atravs do comando executado.

Delphi com Banco de Dados Cliente/Servidor

13 de 332

Existem muitas outras coisas que podemos fazer atravs das ferramentas do SQL Server 2000, no entanto este curso no tem o objetivo de dominar o SQL Server, mas apenas ensinar o suficiente para a criao de uma aplicao 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 Jlio Battisti.

Delphi com Banco de Dados Cliente/Servidor

14 de 332

Modelagem de Dados
O SQL Server utiliza um tipo de banco de dados denominado banco de dados relacional. Em bancos de dados relacionais, os dados so organizados na forma de tabelas. As tabelas so organizadas agrupando dados sobre o mesmo assunto e contm colunas e linhas de informaes. As tabelas ento so relacionadas entre si pelo mecanismo de banco de dados. Em geral, pode-se considerar um banco de dados como um conjunto de dados relacionados. Antigamente, um banco de dados era normalmente apenas um arquivo, por exemplo: funcionarios.dbf, que continha uma nica tabela de dados. Dentro do arquivo funcionarios.dbf estavam colunas relacionando dados de funcionrios como salrio, data de admisso, nome, cpf, matrcula e assim por diante. O arquivo continha uma linha para cada pessoa na empresa, com valores correspondentes nas colunas apropriadas. Os ndices, utilizados para aumentar a velocidade dos dados, estavam em um arquivo separado. No SQL Server, um banco de dados no est necessariamente associado a um arquivo ele mais um conceito lgico baseado em uma coleo de objetos relacionados. Por exemplo, um banco de dados no MSSQL no contm somente os dados, ele tambm contm a estrutura do banco de dados, quaisquer ndices, a segurana do banco e talvez outros objetos como views e stored procedures.

Como podemos perceber, um banco de dados relacional composto de diferentes tipos de objetos. Alguns dos objetos mais comuns so os seguintes:

Tabelas: so os objetos que contm os tipos de dados e os dados reais; Colunas: so as partes da tabela que armazenam os dados. Cada coluna possui um tipo de dado e estas devem ter um nome nico. Tipos de dados: so o tipo de armazenamento bsico de seus dados. Existem vrios tipos de dados, como caractere, data e numrico. Linhas: so os registros da tabela, ou seja, so as ocorrncias dos dados. Cada linha composta pelas colunas da tabela. Chaves primrias: embora no sejam objetos propriamente ditos, so essenciais para os bancos de dados relacionais. Elas impem a unicidade entre linhas, fornecendo uma maneira de identificar unicamente cada item

armazenado na tabela. Chaves estrangeiras: so uma ou mais colunas que referenciam a chave primria de outras tabelas. O MSSQL utiliza chaves primrias e estrangeiras para relacionar dados entre si a partir de tabelas separadas quando as consultas so realizadas.

Veja o diagrama a seguir para entender melhor estes conceitos:

Delphi com Banco de Dados Cliente/Servidor

15 de 332

Acima esto representadas duas tabelas: Departamentos e Funcionarios. Cada tabela possui um conjunto de colunas e cada coluna possui um tipo de dados. A tabela Departamentos possui duas colunas: codigo_departamento e nome. A coluna codigo_departamento do tipo int (int o tipo de dados para armazenar valores numricos inteiros no SQL Server). A coluna nome do tipo varchar (varchar o tipo de dados para armazenar caracteres no SQL Server) e possui um tamanho mximo de 30 caracteres, ou seja, se algum tentar inserir um departamento cujo nome tenha mais de 30 letras ou nmeros no ir conseguir. No diagrama tambm podemos perceber que a coluna codigo_departamento da tabela Departamentos est destacada, isto significa que esta coluna a chave primria desta tabela. Esta chave primria garantir que no existiro

departamentos com o mesmo cdigo. A tabela Funcionarios tambm possui colunas de diversos tipos de dados, como por exemplo, a coluna salario que do tipo money (money o tipo de dados para armazenar valores monetrios no SQL Server). A chave primria da tabela Funcionarios a coluna matricula que servir para identificar unicamente cada funcionrio.

Observe que existe um relacionamento entre as tabelas Departamentos e Funcionarios, pois cada funcionrio deve pertencer a um departamento. Este relacionamento ocorre atravs da coluna codigo_departamento que est na tabela Funcionarios. Esta coluna diz a que departamento o funcionrio pertence, ou seja, ela uma referncia coluna

codigo_departamento da tabela Departamentos. Sendo assim, podemos afirmar que a coluna codigo_departamento da tabela Funcionarios uma chave estrangeira. A chave estrangeira garantir que no existiro funcionrios sem departamentos, ou o que chamamos de registros rfos. Este relacionamento do tipo 1 para N (ou um-para-muitos), pois cada departamento pode possuir 1 ou mais funcionrios e cada funcionrio s pode pertencer a 1 departamento.

A modelagem de dados consiste basicamente em organizar os dados em tabelas relacionadas. muito importante definir e criar um diagrama ou modelo de dados para que voc possa projetar e identificar possveis falhas em sua estrutura de armazenamento de dados. Evidentemente, tabelas bem projetadas so essenciais para o sucesso dos bancos de dados.

Delphi com Banco de Dados Cliente/Servidor

16 de 332

A ttulo de exerccio, imagine a seguinte situao: Em uma determinada rodoviria existem diversas empresas de nibus. Todos os nibus possuem um motorista e um trajeto diferente. O administrador desta rodoviria precisa de um sistema que cadastre as empresas, os nibus e os motoristas. Este sistema deve armazenar o nome e o cdigo de cada empresa, o nmero, a empresa, o motorista e o trajeto de cada nibus e o nome, nmero, idade, sexo e salrio de cada motorista. Com base nas informaes acima, iremos criar um modelo de dados que atenda s necessidades da rodoviria.

Antes de iniciar o desenho do diagrama, precisamos identificar as entidades, os atributos e os relacionamentos envolvidos no contexto do sistema. As entidades so as pessoas, objetos, bens, produtos ou servios que fazem parte do negcio da aplicao. Podemos ento perceber que as entidades neste caso sero: as empresas, os nibus e os motoristas. Os atributos so as informaes ou caractersticas de cada entidade. Por exemplo, os atributos da entidade empresas so: cdigo e nome; enquanto os atributos da entidade motorista so: nome, nmero, idade, sexo e salrio. Os relacionamentos, como o prprio nome diz, so as relaes entre entidades. Por exemplo, precisamos saber qual o motorista de cada nibus e a que empresa o nibus pertence. Estes relacionamentos do origem a novos atributos que identificam a dependncia de uma entidade. No caso da entidade nibus, ser preciso dois novos atributos, um para identificar o motorista e outro para identificar a empresa. Com isto, para cadastrar um nibus ser necessrio primeiro cadastrar a empresa e o motorista.

As entidades sero as tabelas e os atributos sero as colunas das tabelas. Os relacionamentos sero as colunas que impem a relao entre as tabelas e consequentemente a integridade dos dados.

Sendo assim, criamos o seguinte modelo de dados:

Como em quase tudo, o planejamento e o projeto so a parte mais chata. Entretanto, esta fase fundamental para o sucesso de uma boa aplicao.

Delphi com Banco de Dados Cliente/Servidor

17 de 332

Vamos agora implementar o modelo de dados que acabamos de construir, ou seja, vamos criar fisicamente as tabelas em um banco de dados do SQL Server. Abra o Enterprise Manager para podermos criar nossas tabelas. Vamos criar um novo Banco de Dados exclusivamente para este sistema da rodoviria. Para isto, expanda o cone do servidor e clique com o boto direito do mouse sobre a opo Databases. Na caixa de dilogo que surgir, clique em New Database...

Em seguida, ser exibida a janela Database Properties. Preencha a caixa de texto Name com o nome do novo banco de dados, em nosso caso: Rodoviaria (sem aspas). Clique em OK para criar o novo Banco de Dados.

Obs.: O nome de um banco de dados, assim como de tabelas, colunas e outros objetos do SQL Server, no deve possuir caracteres especiais, acentos ou espaos.

Delphi com Banco de Dados Cliente/Servidor

18 de 332

Aps criar o banco de dados Rodoviaria, acesse a seo Tables para criarmos as tabelas do modelo de dados. Voc perceber que j existiro outras tabelas criadas no Banco de Dados Rodoviaria. Estas tabelas sys_alguma_coisa so para uso exclusivo do SQL Server, portanto, ignore-as. Clique com o boto direito sobre a opo 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 especificaes 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 primria desta tabela.

O tamanho de uma coluna do tipo int por padro igual a 4 e no pode ser alterado. Este 4 no representa a quantidade de algarismos que podero ser armazenados e sim a quantidade de bytes em disco que esta coluna pode ocupar. O tipo int suporta nmeros inteiros positivos ou negativos que vo de -2.147.483.657 +2.147.483.657, ou seja, d para armazenar muitos nmeros nesta coluna. Preencha agora o nome da segunda coluna da tabela Empresas: nome. Em Data Type selecione o tipo varchar e defina o tamanho mximo de 30 caracteres em Length. Diferentemente do tipo int, o tamanho de uma coluna do tipo varchar especifica a quantidade mxima de caracteres permitidos nesta coluna. Desmarque a opo Allow Nulls (Permitir nulo) da coluna nome, pois esta coluna deve ter preenchimento obrigatrio. A coluna cod_empresa tambm obrigatria, mais como j definimos que ela chave primria,

Delphi com Banco de Dados Cliente/Servidor

19 de 332

automaticamente o SQL Server desmarca a opo Allow Nulls, pois a chave primria sempre obrigatria. 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 opo serve para salvar as alteraes feitas e para definir o nome da tabela quando isto ainda no foi feito. Obviamente, salve a tabela com o nome: Empresas.

Pronto, a tabela foi criada! Feche a janela de edio 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 boto direito e em seguida clicar em Design Table.

Delphi com Banco de Dados Cliente/Servidor

20 de 332

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 no sejam exibidas, faa o seguinte:

Clique com o boto direito do mouse sobre a opo que representa seu servidor e depois clique em Edit SQL Server Registration properties....

Na janela de propriedades, desmarque a opo: Show system databases and system objects e clique em OK. Isto far com que todos os databases e objetos de sistema do SQL Server no sejam exibidos no Enterprise Manager tornando a tela bem mais limpa.

Prosseguindo com a construo das tabelas de nosso modelo de dados, vamos agora criar a tabela Motoristas.

Delphi com Banco de Dados Cliente/Servidor

21 de 332

Clique com o boto direito sobre a opo Tables do banco de dados Rodoviaria e em seguida em New Table... Crie a estrutura da tabela Motoristas seguindo as especificaes do modelo de dados assim como fizemos com a tabela Empresas. Preencha corretamente os nomes das colunas e selecione os respectivos tipos de dados. No esquea de definir o tamanho de 40 caracteres para a coluna nome e de especificar a coluna num_motorista como chave primria da tabela. A coluna sexo possui um tamanho mximo de 1 caractere, pois iremos armazenar apenas M ou F. Aps criar a estrutura, salve a tabela como nome Motoristas.

A prxima (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. Ns poderamos ter criado ela antes das outras, s que depois teramos 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 boto direito sobre a opo Tables do banco de dados Rodoviaria e em seguida em New Table... Preencha os campos de acordo com o modelo de dados.

Aps preencher os campos, salve a tabela como Onibus, mas deixe a janela de edio aberta para que possamos configurar as chaves estrangeiras. Clique sobre a opo Table and Index Properties que est representada atravs de um cone com uma figura de uma mo segurando um pedao de papel.

Na janela que surgir, selecione a guia Relationships (Relacionamentos).

Delphi com Banco de Dados Cliente/Servidor

22 de 332

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 primria ou que possua uma chave nica (este conceito no ser abordado neste curso). O termo Chave Primria 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 boto New. Na caixa de seleo Primary key table, selecione a tabela Empresas e logo abaixo selecione a coluna cod_empresa. Na caixa de seleo 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.

Veja abaixo como ficou a tela aps a configurao:

Delphi com Banco de Dados Cliente/Servidor

23 de 332

Agora vamos criar a chave estrangeira para a tabela Motoristas. Clique novamente sobre o boto New e repita o procedimento apontando a coluna num_motorista da tabela Onibus para a coluna num_motorista da coluna Motoristas.

Delphi com Banco de Dados Cliente/Servidor

24 de 332

Clique sobre o boto Fechar e depois salve as alteraes clicando sobre o boto com o cone de um disquete. O SQL Server informar que as alteraes efetuadas afetaro outras tabelas.

Clique em Yes e Pronto! As chaves estrangeiras foram configuradas com sucesso!

Ns podemos ter certeza de que os relacionamentos foram criados corretamente atravs da opo Diagrams do banco de dados Rodoviaria. Nesta opo podemos criar diagramas com as tabelas existentes no banco de dados. Neste diagrama o SQL Server exibe o relacionamento existente entre as tabelas. Clique com o boto direito do mouse sobre a opo Diagrams do banco de dados Rodoviaria e em seguida clique sobre a opo New Database Diagram...

Ser exibida a tela do assistente de criao de diagramas do SQL Server.

Delphi com Banco de Dados Cliente/Servidor

25 de 332

Clique em Avanar para exibir a prxima tela onde iremos selecionar as tabelas que faro parte do nosso diagrama.

Selecione todas as tabelas e clique no boto Add >. Em seguida, clique em Avanar e na tela seguinte em Concluir. Ento o SQL Server montar o diagrama com as tabelas e seus respectivos relacionamentos.

Delphi com Banco de Dados Cliente/Servidor

26 de 332

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

Diagrama gerado pelo SQL Server

Delphi com Banco de Dados Cliente/Servidor

27 de 332

Instruo SELECT
No captulo anterior aprendemos um pouco sobre modelagem de dados e vimos como criar tabelas e relacionamento. Agora iremos aprender como recuperar dados de uma tabela ou de vrias tabelas atravs da famosa instruo SELECT.

O comando SELECT faz parte da linguagem SQL (Structured Query Language ou Linguagem de Consulta Estruturada) que o idioma padro para todos os Sistemas Gerenciadores de Banco de Dados (SGBDs), ou seja, a lngua falada por todos os bancos de dados. No confunda SQL com SQL Server, pois SQL a linguagem dos bancos de dados em geral, enquanto SQL Server o software da Microsoft. A linguagem SQL utilizada por todos os SGBDs do mercado como Oracle, DB2, SYBASE, Interbase, MySQL, Postgree e claro, o SQL Server. Entretanto, cada um destes softwares adiciona linguagem SQL um conjunto de funcionalidades que lhe so particulares. Em virtude disso, cada empresa cria uma nova linguagem a partir da linguagem SQL padro. Por exemplo, a linguagem para manipulao de banco de dados no SQL Server o Transact-SQL ou simplesmente T-SQL, j a linguagem do Oracle o PL/SQL. Apenas para ilustrar esta situao, veja abaixo como seriam os comandos para recuperar os primeiros 10 registros de uma tabela no SQL Server e no Oracle.

SQL Server (T-SQL): SELECT TOP 10 * FROM TABELA Oracle (PL/SQL): SELECT * FROM TABELA WHERE ROWNUM <= 10

Se quisssemos simplesmente recuperar todos os registros da tabela, o comando seria o mesmo tanto para o SQL Server quanto para o Oracle, pois utilizaramos apenas o SQL padro:

SELECT * FROM TABELA

De uma forma geral, se voc conhecer bem a linguagem SQL padro, no ter dificuldades em utilizar um ou outro SGBD, voc apenas precisar aprender as funes especficas de cada software.

A principal ferramenta do SQL Server para trabalharmos com a linguagem SQL o Query Analyzer que conhecemos anteriormente neste curso. Portanto, execute-o para que iniciemos nosso aprendizado em SQL.

A instruo SELECT o comando utilizado para recuperar dados de uma ou mais tabelas de um banco de dados. Atravs deste comando que conseguimos visualizar tudo o que est gravado no banco de dados.

Delphi com Banco de Dados Cliente/Servidor

28 de 332

Utilizaremos o banco de dados Rodoviaria (que acabamos de criar) como cobaia em nossos estudos. Mas antes de comearmos, precisamos alimentar as tabelas do banco Rodoviaria, pois as mesmas esto vazias e tabelas vazias no servem para muita coisa.

Selecione o banco de dados Rodoviaria na caixa de seleo de banco de dados e em seguida digite as linhas abaixo:

INSERT INTO EMPRESAS VALUES (101,'FLORES'); INSERT INTO EMPRESAS VALUES (102,'REGINAS'); INSERT INTO EMPRESAS VALUES (103,'MASTER'); INSERT INTO EMPRESAS VALUES (104,'RUBANIL'); INSERT INTO EMPRESAS VALUES (105,'REAL');

INSERT INTO MOTORISTAS VALUES (341,'Paulo Roberto',35,'M',1200); INSERT INTO MOTORISTAS VALUES (342,'Anderson Moraes',24,'M',1150); INSERT INTO MOTORISTAS VALUES (343,'Fernando Santana',28,'M',1170); INSERT INTO MOTORISTAS VALUES (344,'Carlos Paiva',40,'M',1320); INSERT INTO MOTORISTAS VALUES (345,'Alberto Arajo',25,'M',890); INSERT INTO MOTORISTAS VALUES (346,'Jorge Luiz',43,'M',1400); INSERT INTO MOTORISTAS VALUES (347,'Maria Padilha',29,'F',900); INSERT INTO MOTORISTAS VALUES (348,'Claudia da Silva',32,'F',1000); INSERT INTO MOTORISTAS VALUES (349,'Jeferson Gomes',30,'M',1380); INSERT INTO MOTORISTAS VALUES (350,'Felipe Castro',19,'M',650);

INSERT INTO ONIBUS VALUES (2451,101,341,'Nova Iguau x Caxias'); INSERT INTO ONIBUS VALUES (2452,101,342,'So Joo X Praa XV'); INSERT INTO ONIBUS VALUES (2453,101,343,'Mesquita X Praa Mau'); INSERT INTO ONIBUS VALUES (4213,102,344,'Pavuna X Castelo'); INSERT INTO ONIBUS VALUES (4214,102,345,'Nova Iguau X Pavuna'); INSERT INTO ONIBUS VALUES (4215,102,346,'Caxias X So Joo'); INSERT INTO ONIBUS VALUES (4216,102,347,'Nilpolis X Caxias'); INSERT INTO ONIBUS VALUES (5987,103,348,'Queimados X Pavuna'); INSERT INTO ONIBUS VALUES (5988,103,349,'Campo Grande X Caxias'); INSERT INTO ONIBUS VALUES (1702,104,350,'So Joo X Itagua');

Digite todas as linhas mesmo sem entender o que est digitando. Estas linhas so comandos de insero de dados atravs da instruo INSERT que iremos aprender mais adiante neste curso.

Aps digitar os comandos acima, sua tela deve ficar semelhante exibida na figura a seguir:

Delphi com Banco de Dados Cliente/Servidor

29 de 332

Quando reunimos um conjunto de comandos SQL (como o que acabamos de fazer), damos o nome de script. Um script de banco de dados nada mais do que uma seqncia de comandos SQL que sero executados todos de uma s vez. Para executar os comandos que acabamos de digitar, basta clicar sobre o boto Execute ou pressionar F5 no teclado.

Aps 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.

Delphi com Banco de Dados Cliente/Servidor

30 de 332

No Query Analyzer voc pode salvar seu script em arquivo do tipo texto com a extenso .sql. Para salvar o script recm 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.

Delphi com Banco de Dados Cliente/Servidor

31 de 332

Query

Analyzer

tambm

permite

que

voc

trabalhe

com

vrias

janelas

simultaneamente. Voc pode abrir novas janelas atravs da opo 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.

A sintaxe bsica do comando SELECT a seguinte:

Por exemplo, para recuperar o nome dos motoristas o comando seria:

SELECT NOME FROM MOTORISTAS

Delphi com Banco de Dados Cliente/Servidor

32 de 332

Digite o comando acima no Query Analyzer e clique em Execute Query ou pressione F5 no teclado. Veja que o SQL Server retorna todos os nomes cadastrados na tabela Motoristas. OBS.: Os comandos SQL podem ser escritos em letras maisculas ou minsculas, pois o SQL Server no se importa com isso. Os comandos esto em letras maisculas neste livro apenas por uma questo de preferncia.

Para recuperar mais de uma coluna da tabela voc deve digitar o nome de cada coluna separado por vrgula. Por exemplo, para obter o nome, a idade e o sexo dos motoristas, o comando seria o seguinte:

SELECT NOME,IDADE,SEXO FROM MOTORISTAS

O resultado do comando acima apresentado abaixo:

Delphi com Banco de Dados Cliente/Servidor

33 de 332

Como podemos perceber, o comando SELECT muito fcil de entender. Voc praticamente escreve (em ingls) o que voc quer e o SQL Server te entrega. Desta forma, o comando que acabamos de executar SELECT NOME,IDADE,SEXO FROM MOTORISTAS pode facilmente ser lido assim: Selecione as colunas nome, idade e sexo da tabela motoristas.

Para selecionar todas as colunas de uma tabela, voc pode digitar o nome de cada uma delas separado por vrgula 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:

SELECT NUM_MOTORISTA, NOME, IDADE, SEXO, SALARIO FROM MOTORISTAS

Entretanto, poderamos obter o mesmo resultado com o seguinte comando:

SELECT * FROM MOTORISTAS

O smbolo 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 invs de digitar o nome de todas as colunas.

Voc pode atribuir um ttulo para cada coluna retornada em sua consulta caso no deseje que ttulo seja o prprio nome da coluna. Por exemplo, se ao invs de aparecer num_motorista voc quiser que aparea Nmero do Motorista, voc ento dever utilizar um apelido. Exemplo:

Delphi com Banco de Dados Cliente/Servidor

34 de 332

SELECT NUM_MOTORISTA AS 'NMERO DO MOTORISTA', NOME FROM MOTORISTAS

Voc pode atribuir um apelido para cada coluna da consulta, isto bem interessante para gerar relatrios com ttulos de coluna mais descritivos. Abaixo mais um exemplo de utilizao de apelidos.

Delphi com Banco de Dados Cliente/Servidor

35 de 332

Alm da sintaxe bsica da instruo SELECT que recupera todos os registros de uma tabela, podemos utilizar a clusula 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 quisssemos obter somente o nome dos motoristas que so do sexo Masculino, o comando seria:

SELECT NOME FROM MOTORISTAS WHERE SEXO = 'M'

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:

SELECT NOME FROM MOTORISTAS WHERE SEXO = 'F'

Delphi com Banco de Dados Cliente/Servidor

36 de 332

Na clusula WHERE podemos restringir o resultado desejado impondo uma condio para o SQL Server onde ele s trar os registros que atendam condio imposta. Caso no existam registros que atendam condio imposta na clusula WHERE o resultado ser nulo. Exemplo: Execute o comando abaixo que tenta obter o nome dos motoristas que possuem sexo igual a B. Obviamente, no existe sexo igual a B e portanto o SQL Server no trar resultado.

A clusula WHERE permite que voc defina mais de uma restrio, para isto basta separar cada condio atravs 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:

SELECT * FROM MOTORISTAS WHERE SEXO = 'M' AND IDADE > 30

Voc tambm pode restringir o resultado de uma consulta utilizando o operador LIKE. Este operador permite que voc crie uma condio parcial como aqueles casos em que no possvel 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 ento seria:

Delphi com Banco de Dados Cliente/Servidor

37 de 332

SELECT * FROM MOTORISTAS WHERE NOME LIKE 'A%'

Para obter os motoristas cujo ltimo nome seja Silva, o comando seria:

SELECT * FROM MOTORISTAS WHERE NOME LIKE '%Silva'

Outro exemplo de utilizao do operador LIKE: Obter os nibus que possuam o texto So Joo na coluna trajeto, ou seja, os nibus que passam por So Joo. O comando seria:

SELECT * FROM ONIBUS WHERE TRAJETO LIKE '%So Joo%'

Delphi com Banco de Dados Cliente/Servidor

38 de 332

O SQL Server tambm permite que voc ordene o resultado de uma consulta atravs da clusula ORDER BY. Para ordenar o resultado de consulta basta incluir a clusula ORDER BY e o nome da coluna no fim do comando SELECT. O ORDER BY sempre deve ser a ltima clusula de uma instruo SELECT. Por exemplo, para obter todos os motoristas ordenando o resultado pelo nome:

SELECT * FROM MOTORISTAS ORDER BY NOME

A clusula ORDER BY ordena o resultado por ordem alfabtica caso a coluna seja do tipo texto ou caractere, se a coluna for numrica, o ORDER BY ordenar do menor para o maior. Voc tambm pode definir se deseja ordenar em ordem ascendente ou descente, por exemplo, ordenar os funcionrios por nome em ordem descendente seria:

SELECT * FROM MOTORISTAS ORDER BY NOME DESC

Para ordenar em ordem ascendente seria:

SELECT * FROM MOTORISTAS ORDER BY NOME ASC

Delphi com Banco de Dados Cliente/Servidor

39 de 332

OBS.: Se voc no informar os parmetros DESC ou ASC para a clusula ORDER BY, o SQL Server assume o parmetro ASC como padro, ou seja, se voc colocar ASC ou no colocar nada, d no mesmo.

Para exemplificar um pouco mais, imagine que voc precise gerar uma relao de todos os motoristas da Rodoviria ordenando-os do maior para o menor salrio. O SELECT seria o seguinte:

SELECT * FROM MOTORISTAS ORDER BY SALARIO DESC

Voc tambm pode ordenar por mais de uma coluna, por exemplo, ordenar por sexo em seguida por nome e depois por salrio.

Delphi com Banco de Dados Cliente/Servidor

40 de 332

A linguagem SQL tambm fornece vrias funes que so muito teis no dia-a-dia do desenvolvimento de aplicaes. Aqui iremos conhecer apenas as que sero necessrias a este curso. Algumas funes SQL:

COUNT: Retorna a quantidade de registros; MAX: Retorna o maior valor da coluna informada; MIN: Retorna o menor valor da coluna informada; SUM: Soma todos os valores da coluna informada; AVG: Retorna a mdia de valores da coluna informada;

Vamos ento exemplificar o uso de cada uma.

Exemplo COUNT - Quantidade de empresas da rodoviaria:

Exemplo COUNT - Quantidade de motoristas do sexo feminino:

Delphi com Banco de Dados Cliente/Servidor

41 de 332

Exemplo MAX - Maior salrio dos motoristas:

Exemplo MAX - Maior idade dos motoristas:

Exemplo MIN - Menor idade e menor salrio dos motoristas:

Delphi com Banco de Dados Cliente/Servidor

42 de 332

Exemplo SUM Obter o somatrio de todos os salrios dos motoristas:

Exemplo AVG Obter a mdia de idade dos motoristas:

Para ter um melhor aproveitamento das funes SQL disponveis no SQL Server, importante conhecer a clusula GROUP BY. A clusula GROUP BY tem por finalidade agrupar o resultado de um consulta. Vamos ver logo um exemplo de utilizao do GROUP BY para ilustrar sua funcionalidade. Imagine que voc precisasse emitir um relatrio que informasse a quantidade de motoristas do sexo masculino e sexo feminino. Talvez voc possa pensar que com dois comandos SQL voc teria esta informao, exemplo:

SELECT COUNT(*) AS 'HOMENS' FROM MOTORISTAS WHERE SEXO = 'M'

SELECT COUNT(*) AS 'MULHERES' FROM MOTORISTAS WHERE SEXO = 'F'

Delphi com Banco de Dados Cliente/Servidor

43 de 332

Os comandos acima iro trazer a quantidade de motoristas do sexo masculino e feminino respectivamente. Entretanto existe uma maneira mais inteligente de fazer isso, e atravs do GROUP BY que permitir trazer as informaes desejadas num nico SELECT. Exemplo:

SELECT SEXO, COUNT(*) AS 'QTD' FROM MOTORISTAS GROUP BY SEXO

Traduzindo o comando acima: SELECIONE O SEXO E QUANTIDADE DE REGISTROS DA TABELA MOTORISTAS AGRUPANDO O RESULTADO PELA COLUNA SEXO.

Outro exemplo de uso do GROUP BY: relatrio de mdia salarial dos motoristas por sexo, ou seja, queremos saber em mdia quem ganha mais: homem ou mulher?

No decorrer do curso veremos mais exemplos de utilizao da clusula GROUP BY.

Delphi com Banco de Dados Cliente/Servidor

44 de 332

Um outro assunto muito importante a ser abordado no aprendizado da instruo SELECT a correlao de dados, os famosos JOINS. No captulo anterior vimos como criar tabelas e seus relacionamentos, pois agora, vamos ver como recuperar dados de duas ou mais tabelas usando os relacionamentos existentes entre elas. Quando relacionamos uma tabela com outra numa instruo SELECT, dizemos que estamos fazendo um JOIN entre tabelas. Para fazer JOINS de tabelas, voc deve fazer uma comparao de uma ou mais colunas de uma tabela com uma ou mais colunas de uma outra tabela. Para este trabalho usaremos a instruo INNER JOIN. Vamos direto para a aplicao prtica deste conceito.

Com base em nosso modelo de dados...

A coluna cod_empresa da tabela Onibus faz referncia coluna cod_empresa da tabela Empresas. Ento, para saber o nome da empresa qual cada nibus pertence, precisaremos fazer um JOIN entre a tabela Empresas e a tabela nibus. O comando seria o seguinte:

SELECT ONIBUS.NUM_ONIBUS AS 'NIBUS', EMPRESAS.NOME AS 'EMPRESA' FROM ONIBUS INNER JOIN EMPRESAS ON ONIBUS.COD_EMPRESA = EMPRESAS.COD_EMPRESA

Delphi com Banco de Dados Cliente/Servidor

45 de 332

Traduzindo o comando acima: SELECIONE A COLUNA NUM_ONIBUS DA TABELA ONIBUS E A COLUNA NOME DA TABELA EMPRESAS FAZENDO JOIN DA TABELA ONIBUS COM A TABELA EMPRESAS ONDE A COLUNA COD_EMPRESA DA TABELA ONIBUS SEJA IGUAL COLUNA COD_EMPRESA DA TABELA EMPRESAS.

Voc deve ter percebido que quando temos mais de uma tabela numa instruo 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:

SELECT ONIBUS.NUM_ONIBUS AS 'NIBUS', MOTORISTAS.NOME AS 'MOTORISTA' FROM ONIBUS INNER JOIN MOTORISTAS ON ONIBUS.NUM_MOTORISTA = MOTORISTAS.NUM_MOTORISTA

Delphi com Banco de Dados Cliente/Servidor

46 de 332

J para recuperar o nome do motorista e o nome da empresa de cada nibus, ser preciso fazer JOIN da tabela Onibus com as tabelas Motoristas e Empresas, comparando os campos que implementam os relacionamentos. O SELECT seria:

SELECT ONIBUS.NUM_ONIBUS, MOTORISTAS.NOME AS 'MOTORISTA' ,EMPRESAS.NOME AS 'EMPRESA' FROM ONIBUS INNER JOIN MOTORISTAS ON ONIBUS.NUM_MOTORISTA = MOTORISTAS.NUM_MOTORISTA INNER JOIN EMPRESAS ON ONIBUS.COD_EMPRESA = EMPRESAS.COD_EMPRESA

Delphi com Banco de Dados Cliente/Servidor

47 de 332

Instruo INSERT
A instruo INSERT, como seu prprio nome indica, tem a finalidade de inserir registros em uma tabela. atravs do comando INSERT que podemos cadastrar novos registros e alimentar as tabelas de nosso banco de dados.

A sintaxe da instruo INSERT a seguinte:

Entendo a sintaxe acima: as palavras INSERT e INTO so fixas, portanto voc sempre vai digit-las. Em seguida vem o nome da tabela que voc vai inserir um novo registro. Aps o nome da tabela, voc deve especificar o nome de cada coluna que voc vai preencher entre parnteses ( ). Caso voc v preencher todas as colunas da tabela e na mesma ordem em que elas esto na tabela, ento no necessrio digitar o nome das colunas, caso contrrio voc deve digitar apenas o nome das colunas que voc vai preencher. Aps o nome das colunas que sero preenchidas, vem outra palavra fixa: VALUES e em seguida voc deve digitar os valores que preenchero as colunas informadas na lista de colunas digitadas.

Exemplo de um comando INSERT para inserir um novo motorista na tabela Motoristas:

INSERT INTO MOTORISTAS (NUM_MOTORISTA, NOME, IDADE, SEXO, SALARIO) VALUES (351,'Jos Antnio',32,'M',1150)

Delphi com Banco de Dados Cliente/Servidor

48 de 332

Traduzindo o comando acima: INSIRA NA TABELA MOTORISTAS PARA OS CAMPOS NUM_MOTORISTA, NOME, IDADE, SEXO E SALARIO OS SEGUINTES VALORES: 351, Jos Antnio, 32, M e 115.

OBS.: Assim como no Delphi, voc deve colocar tudo o que for texto entre aspas simples . Veja que as colunas nome e sexo que so 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 so do tipo texto e no gere um erro de incompatibilidade de tipos de dados.

Como neste exemplo estamos preenchendo todas as colunas da tabela Motoristas, tambm poderamos inserir um novo registro sem precisar referenciar o nome das colunas, bastando apenas passar todos os valores aps a palavra VALUES.

Exemplo:

INSERT INTO MOTORISTAS VALUES (352,'Dbora dos Santos',35,'F',1000)

Observe que no comando acima no referenciamos as colunas que seriam preenchidas uma vez que iramos preencher todas elas.

importante analisar as tabelas antes de efetuar qualquer insero para que no 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:

INSERT INTO ONIBUS VALUES (6258,106,351,'Pavuna X Mier')

Delphi com Banco de Dados Cliente/Servidor

49 de 332

Aps executar o comando INSERT, o SQL Server retorna um erro de integridade de dados informando que a instruo conflita com o relacionamento existente entre a tabela Onibus e a tabela Empresas. Isto ocorreu porque tentamos inserir um nibus de uma empresa (106) que no est cadastrada na tabela Empresas. Para evitar este tipo de erro, devemos sempre analisar o modelo de dados e checar se existem dependncias que devem ser atendidas antes de inserir qualquer coisa em uma tabela. Antes de cadastrar este nibus devemos ento cadastrar a empresa que possui o cdigo 106 ou ento verificar se ele pertence a alguma outra empresa que j esteja cadastrada.

Vamos cadastrar a empresa 106 de nome Nilopolitana:

INSERT INTO EMPRESAS VALUES (106,'Nilopolitana')

Delphi com Banco de Dados Cliente/Servidor

50 de 332

Pronto, j podemos cadastrar o novo nibus, pois a empresa j est cadastrada e o motorista (351) tambm (se no iria dar erro novamente).

INSERT INTO ONIBUS VALUES (6258,106,351,'Pavuna X Mier')

Delphi com Banco de Dados Cliente/Servidor

51 de 332

Instruo UPDATE
A instruo 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 bsica a seguinte:

Exemplo:

UPDATE MOTORISTAS SET IDADE = 40 WHERE NUM_MOTORISTA = 352

Traduzindo o comando acima: ATUALIZE A TABELA MOTORISTAS ALTERANDO A COLUNA IDADE PARA 40 ONDE A COLUNA NUM_MOTORISTA FOR IGUAL A 352. Em outras palavras este comando est alterando a idade do motorista 352 para 40 anos.

Para atualizar mais de uma coluna, basta especificar cada coluna separado-as por vrgula, por exemplo, suponhamos que o nibus que faz o trajeto Nilpolis X Caxias tenha sido vendido para uma outra empresa e consequentemente ter outro motorista. O comando seria o seguinte:

UPDATE ONIBUS SET COD_EMPRESA = 106, NUM_MOTORISTA = 352 WHERE TRAJETO = 'Nilpolis X Caxias'

Delphi com Banco de Dados Cliente/Servidor

52 de 332

A instruo acima est alterando o nibus que faz o trajeto Nilpolis X Caxias atualizando a coluna cod_empresa para 106 e a coluna num_motorista para 352.

importante especificar com bastante critrio a condio ou as condies presentes na clusula WHERE, pois se mais de um registro atender a condio, todos sero atualizados, e se nenhum atender a condio, nenhum registro ser atualizado. Caso voc no especifique uma condio utilizando a clusula WHERE, todos os registros da tabela em questo sofrero a atualizao. Isto no muito comum, mas pode ser que voc precise atualizar todos os registros de uma tabela sem qualquer restrio. Imagine que voc precise executar uma instruo UPDATE que aumente o salrio de todos os motoristas em 10%. O comando UPDATE para esta situao seria o seguinte:

UPDATE MOTORISTAS SET SALARIO = SALARIO * 1.10

Observe que no impomos nenhuma condio atravs da clusula WHERE, pois realmente queramos que todos os registros fossem atualizados. Nesta instruo estamos

Delphi com Banco de Dados Cliente/Servidor

53 de 332

atualizando a coluna Salrio com o seu prprio valor multiplicado por 1.10, ou seja, estamos aumentando cada salrio em 10%.

OBS.: O Asterisco presente no comando acima apenas o operador de multiplicao e nada tem a ver com o asterisco utilizado para obter todas as colunas de uma tabela atravs da instruo SELECT.

No decorrer do curso veremos mais exemplos da instruo UPDATE.

Delphi com Banco de Dados Cliente/Servidor

54 de 332

Instruo DELETE
Antes de iniciarmos o aprendizado sobre o uso da instruo DELETE, importante aprendermos o conceito de transao. Uma transao de banco de dados uma unidade de trabalho em que todas as instrues so processadas com sucesso ou nenhuma das instrues processada. As transaes garantem que o trabalho que est sendo realizado ser bemsucedido ou falhar completamente. Durante uma transao, nenhuma outra transao pode modificar os dados at que voc decida que as modificaes sero definitivas. Decidimos falar sobre transao aqui neste captulo que destinado a instruo DELETE apenas para que possamos excluir registros vontade e depois consigamos reverter todas as excluses sem que seja necessrio inserir tudo novamente. Embora estejamos conhecendo o conceito de transaes neste captulo, ele vale para todas as operaes de modificao de dados (INSERT, UPDATE e DELETE). Em cada instruo que executamos est ocorrendo uma transao, mesmo que no tenhamos conhecimento disso. Por exemplo, quando executamos um INSERT, o SQL Server inicia uma transao automaticamente e tenta efetuar a insero, caso a insero seja realizada com sucesso, ele confirma a alterao tornando-a definitiva, caso contrrio, o SQL Server encerra a transao sem efetuar o INSERT.

No script fictcio abaixo, cada instruo SQL uma transao separada. Se qualquer uma das instrues falhar, ela no afetar as outras. Cada instruo bem-sucedida ou falha por inteiro, independentemente das outras instrues no script.

INSERT INTO TABELA VALUES (VALOR1,VALOR2) UPDATE TABELA SET COLUNA1 = VALOR2 WHERE COLUNA1 > 0 DELETE FROM TABELA WHERE COLUNA1 = VALOR1

Se voc pensar em operaes que so realizadas apenas com uma instruo SQL, como por exemplo excluir um funcionrio da lista de empregados de uma empresa, pode achar que no tem muita importncia trabalhar com transaes. Entretanto, quando estamos

trabalhando com operaes mais complexas como, por exemplo, pagamento de funcionrio, a simples operao de pagamento pode ser composta por vrias instrues SQL que fazem vrios INSERTS e UPDATES em vrias tabelas para que um simples pagamento seja realizado. Desta forma, o pagamento s poder ser efetivado se todas as alteraes forem efetuadas com sucesso, seno todas as alteraes devem ser desfeitas para que no haja inconsistncias num banco de dados.

Delphi com Banco de Dados Cliente/Servidor

55 de 332

Voc pode controlar transaes no SQL Server atravs das instrues:

BEGIN TRANSACTION: Inicia uma transao; COMMIT TRANSACTION: efetiva as alteraes; ROLLBACK TRANSACTION: cancela todas as alteraes.

Abaixo est um outro script fictcio que utiliza o conceito de transaes:

BEGIN TRANSACTION

INSERT INTO TABELA VALUES (VALOR1,VALOR2) UPDATE TABELA SET COLUNA1 = VALOR2 WHERE COLUNA1 > 0 DELETE FROM TABELA WHERE COLUNA1 = VALOR1

SE TODAS AS ALTERAES OCORRERAM COM SUCESSO ENTO COMMIT TRANSACTION SENO ROLLBACK TRANSACTION

Obviamente, o script acima s uma ilustrao de tratamento de transaes. Durante o curso, iremos ver na prtica com isso funciona atravs de uma aplicao em Delphi. Por hora, basta conhecermos os comandos que iniciam, confirmam e cancelam uma transao.

Para que possamos excluir registros sem a preocupao de depois ter de inserir tudo de novo, execute o comando abaixo antes de comear a excluir:

BEGIN TRANSACTION

A partir de agora, todas as instrues de modificao de dados s sero efetivadas aps um COMMIT TRANSACTION ou descartadas aps um ROLLBACK TRANSACTION. Voc

Delphi com Banco de Dados Cliente/Servidor

56 de 332

pode apagar o comando BEGIN TRANSACTION que acabou de executar para poder digitar os DELETES que sero exemplificados neste captulo. Mais atente para um detalhe, voc deve continuar na mesma janela que executou o BEGIN TRANSACTION pois a transao s vlida para uma sesso e cada janela do Query Analyzer uma sesso diferente.

A instruo DELETE, como o prprio nome sugere, tem por finalidade excluir registros de uma tabela. Sua sintaxe bsica a seguinte:

Atravs do comando DELETE possvel excluir um ou mais registros dependendo da condio, ou pode no excluir registro algum caso nenhum deles se encaixe na condio imposta. Exemplo de um comando DELETE:

DELETE FROM MOTORISTAS WHERE NUM_MOTORISTA = 347

Traduzindo o comando acima: EXCLUA O REGISTRO DA TABELA MOTORISTAS ONDE A COLUNA NUM_MOTORISTA FOR IGUAL A 347.

Voc pode verificar se o registro foi realmente excludo executando o seguinte SELECT:

SELECT * FROM MOTORISTAS ORDER BY NUM_MOTORISTA

Veja se no resultado aparece o motorista de nmero 347.

Delphi com Banco de Dados Cliente/Servidor

57 de 332

Aps analisar o resultado acima, podemos ver que o registro foi excludo, entretanto esta excluso ainda no foi efetivada no banco de dados, pois iniciamos uma transao quando executamos o comando BEGIN TRANSACTION. Execute agora o seguinte comando:

ROLLBACK TRANSACTION

O comando que acabamos de executar encerrou a transao que tnhamos iniciado descartando a excluso que fizemos. Para constatar isto, execute novamente o comando:

SELECT * FROM MOTORISTAS ORDER BY NUM_MOTORISTA

Delphi com Banco de Dados Cliente/Servidor

58 de 332

Veja que o registro que tinha sido excludo voltou a aparecer. Isto ocorreu porque iniciamos uma transao e, aps fazer a excluso, encerramos a transao revertendo o DELETE atravs da instruo ROLLBACK TRANSACTION. Se ao invs do ROLLBACK tivssemos executado um COMMIT TRANSACTION, a excluso seria definitiva. O DELETE tambm seria definitivo se tivssemos executado o DELETE sem iniciar uma transao, pois o SQL Server executaria uma transao automtica. Sendo assim, inicie outra transao executando o comando BEGIN TRANSACTION para que possamos excluir registros e depois reverter todas as excluses.

Quando executamos um DELETE temos que verificar se existe alguma dependncia de chave estrangeira na tabela em questo. Por exemplo, vamos tentar excluir a Empresa FLORES:

Delphi com Banco de Dados Cliente/Servidor

59 de 332

Veja que aps 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, no podemos excluir um registro me que possui registros filhos. Para excluir um registro me devemos primeiro excluir os registros filhos. Vamos ento excluir todos os nibus que pertencem a empresa FLORES que possui o cdigo 101:

Agora que exclumos os nibus da empresa FLORES podemos ento exclu-la:

O comando DELETE tambm pode ser utilizado para limpar uma tabela, para isto basta executar a instruo sem utilizar a clusula WHERE. Exemplo:

DELETE FROM ONIBUS

Delphi com Banco de Dados Cliente/Servidor

60 de 332

O DELETE executado acima excluiu todos os registros da tabela Onibus sem filtrar qualquer condio porque no utilizamos a clusula WHERE, ou seja, o comando limpou a tabela.

Pronto! Acabamos o captulo sobre a instruo DELETE e para desfazer todas as excluses feitas, execute o comando ROLLBACK TRANSACTION.

Delphi com Banco de Dados Cliente/Servidor

61 de 332

Mdulo 2:
Conectando o Delphi ao SQL Server

de dados Cliente/Servidor. Veremos como fazer a conexo como o servidor, recuperar informaes e modificar os dados utilizando os comandos SQL aprendidos no mdulo anterior. Alm disso, veremos como prevenir e tratar erros de banco de dados para que a aplicao no aborte o processo e esteja preparada para todos os possveis erros.

Delphi disponibiliza um conjunto de objetos para manipulao de banco de dados. Aqui veremos todos os objetos que sero

necessrios para a criao de uma aplicao baseada em um banco

Delphi com Banco de Dados Cliente/Servidor

62 de 332

Componentes de Acesso a Dados


O Delphi disponibiliza um conjunto de objetos para acesso e manipulao de banco de dados. O suporte do Delphi a aplicativos de banco de dados um dos principais recursos do ambiente de programao. Nas primeiras verses do Delphi, somente era possvel acessar um banco de dados atravs do BDE (Borland Database Engine). A verso 7 que utilizamos neste curso incluem o ADO, os componentes nativos do Interbase, a biblioteca dbExpress e ainda o BDE. Abaixo segue uma breve descrio de cada uma destas tecnologias:

BDE: Essa era a tecnologia padro de banco de dados nas primeiras verses do Delphi, mas a Borland agora a considera obsoleta. Isso particularmente verdadeiro para o uso do BDE com servidores SQL, pois alm do Client do banco de dados, voc deve instalar o BDE em cada estao de trabalho que usar o sistema. Voc pode visualizar os componentes do BDE atravs da guia BDE presente na pela de componentes.

ADO: o ActiveX Data Objects a interface de alto nvel 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 independncia de servidor de banco de dados. Sua configurao simplificada e a instalao tambm, pois o mecanismo j faz parte das verses atuais do Windows. Os objetos do ADO esto disponveis na guia ADO da paleta de componentes.

Interbase

Express:

Delphi

tambm

disponibiliza

um

conjunto

de

componentes de acesso a dados para o Interbase: o IBX (Interbase Express). Estes componentes so especficos para o banco de dados Interbase que prprio da Borland. Os componentes IBX esto localizados na guia Interbase da paleta de componentes.

Delphi com Banco de Dados Cliente/Servidor

63 de 332

dbExpress: Um dos novos recursos do Delphi nos ltimos anos foi a introduo da biblioteca de banco de dados dbExpress (DBX), disponvel para Linux e Windows. O DBX uma biblioteca e no um mecanismo de acesso a dados, porque usa uma estratgia leve e basicamente no exige nenhuma configurao nas mquinas dos usurios finais. Comparado com outros mecanismos de banco de dados, o dbExpress muito limitado em termos de recursos. Ele pode acessar apenas servidores SQL, no 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. No 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 aplicaes 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 opo neste caso utilizar o mecanismo de acesso a dados ADO que nativo da prpria Microsoft e j est presente em qualquer verso do Windows atualmente sendo desnecessrio a instalao destes componentes nas estaes de trabalho.

Para criar nossas aplicaes, precisaremos apenas de dois objetos da guia ADO: o ADOConnection e o ADOQuery. O objeto ADOConnection usado fazer a conexo com o banco de dados e o objeto ADOQuery usado para executar comandos SQL e para retornar dados atravs da instruo SELECT. Mais adiante veremos como configur-los.

Alm dos componentes do mecanismo de acesso a dados, o Delphi disponibiliza outros objetos que so utilizados para manipulao de banco de dados. Este objetos so utilizados em conjunto com os componentes de acesso a dados independentemente da tecnologia adotada

Delphi com Banco de Dados Cliente/Servidor

64 de 332

(BDE, ADO, DBX...). Este componentes esto disponveis nas atravs das guias Data Access e Data Controls.

Da guia Data Access somente iremos utilizar o objeto DataSource. Este objeto faz o intercmbio entre os objetos do mecanismo de banco de dados (ADO, BDE, DBX...) o os objetos de manipulao de dados que esto na guia Data Controls.

Os objetos da guia Data Controls so utilizados para manipulao dos dados. Por exemplo, o objeto DbGrid pode ser utilizado para visualizao e para edio dos dados, o objeto DbEdit semelhante ao objeto Edit da paleta Standard com a diferena de somente ser utilizado quando ligado a uma coluna de uma tabela de banco de dados. Durante o curso veremos a utilizao dos objetos da guia Data Controls.

Delphi com Banco de Dados Cliente/Servidor

65 de 332

Recuperando e exibindo dados


Neste captulo iremos ver como recuperar informaes atravs de um programa Delphi usando a instruo 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 Rodoviria para salvar os arquivos que iremos criar. Em seguida abra o Delphi para comearmos!

Conforme sabemos, o Delphi ao ser iniciado j disponibiliza um novo projeto, selecione ento o Form1 e altere a propriedade Caption para Menu Rodoviria e a propriedade Name para Form_menu.

Em seguida clique em Save All para salvarmos logo nosso projeto.

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 propsito.

Delphi com Banco de Dados Cliente/Servidor

66 de 332

Em seguida o Delphi pedir que salve o arquivo do projeto, salve-o como nome Rodoviaria.

Delphi com Banco de Dados Cliente/Servidor

67 de 332

Aps salvar os arquivos, insira 4 objetos BitBtn ao Form_menu. Estes botes sero utilizados para chamar as outras telas do programa e para fechar a aplicao.

Altere a propriedade Caption dos botes para Empresas, Motoristas, nibus e Fechar respectivamente. Altere tambm a propriedade Name para btn_empresas, btn_mototristas, btn_onibus e btn_fechar de cada boto correspondente. Se desejar formate a fonte utilizada e redimensione os botes e o Form_menu como quiser. Organize os botes conforme exibido abaixo:

Acesse

evento

OnClick

do

boto

btn_fechar

digite

comando

Application.Terminate;. Esta instruo far com que a aplicao seja encerrada quando algum clicar no boto Fechar.

Vamos agora inserir um objeto ADOConnection ao Form_menu, este objeto far a conexo com o banco de dados.

Delphi com Banco de Dados Cliente/Servidor

68 de 332

Selecione o objeto ADOConnection que inserimos no Form_menu e altere sua propriedade Name para ConexaoBD e a propriedade Login Prompt para False.

Em seguida, clique sobre o boto ... da propriedade ConnectionString. A propriedade ConnectionString que define o banco de dados que iremos acessar. Aqui definimos se vamos acessar um banco de dados Oracle, SQL Server ou Microsoft Access entre outros, alm disso, especificamos o nome do servidor, o usurio e a senha que ser utilizada para acessar o banco de dados. Na tela que surgiu aps clicar sobre o boto ..., clique sobre o boto Build...

Delphi com Banco de Dados Cliente/Servidor

69 de 332

A primeira opo que devemos configurar o software de banco de dados que iremos acessar, em nosso caso, iremos acessar um servidor SQL Server, portanto selecione a opo Microsoft OLE DB Provider for SQL Server. Clique em Avanar para continuar com a configurao do objeto ConexaoDB.

Agora devemos informar o nome do servidor SQL Server que desejamos acessar. Voc tambm pode informar o endereo IP do servidor caso no saiba ou no queira usar o nome do servidor.

A prxima opo usurio e a senha utilizada para acessar o servidor. Digite um usurio e a senha desejada. Sugerimos que voc utilize o mesmo usurio/senha que usou para se conectar no Query Analyzer. Marque a opo Permitir salvamento de senha. Iremos deixar esta opo marcada temporariamente enquanto estamos programando para que no seja necessrio informar a senha toda hora.

A ltima opo a configurar o banco de dados que iremos acessar. Como vimos anteriormente neste curso, um servidor SQL Server possui vrios banco de dados e aqui podemos ento selecionar qual deles iremos acessar. Selecione o banco de dados Rodoviaria.

Delphi com Banco de Dados Cliente/Servidor

70 de 332

Clique no boto Testar conexo para checar se est tudo Ok.

V clicando em OK at voltar ao Form_menu. Agora selecione o objeto ConexaoBD e altere a propriedade Connected mudando o valor de False para True. Isto faz com que o objeto estabelea a conexo com o servidor de banco de dados.

Agora insira um novo Form ao projeto. Este novo Form ser utilizado para o cadastro de Empresas.

Delphi com Banco de Dados Cliente/Servidor

71 de 332

Configure as propriedades Name e Caption do novo Form como Form_empresas e Empresas respectivamente. Em seguida clique novamente sobre o boto Save All para salvar as alteraes realizadas e novo Form inserido.

Salve a unit do Form_empresas como Unit_empresas.

Delphi com Banco de Dados Cliente/Servidor

72 de 332

Insira um objeto BitBtn ao Form_empresas, altere a propriedade Name dele para btn_fechar e a propriedade Caption para Fechar. Acesse o evento OnClick e digite o comando Close;. Este comando ir fechar o form_empresas quando o usurio clicar sobre o boto Fechar.

A partir de agora at o final deste curso, toda vez que for solicitado a criao de um boto Fechar, repita os procedimentos que acabamos de executar. Assim no precisaremos ficar repetindo toda hora o que voc j vai estar careca de saber!

OBS.: A instruo Close; no funciona como a instruo Application.Terminate;, embora tenham funes semelhantes, cada uma tem uma finalidade diferente. O comando Close; fecha apenas o Form em que ele foi executado enquanto o comando

Application.Terminate; encerra toda a aplicao independentemente de qual form a instruo foi executada.

Delphi com Banco de Dados Cliente/Servidor

73 de 332

Vamos ento recuperar as informaes contidas no banco de dados. Como estamos programando o cadastro de Empresas, vamos recuperar os registros da tabela Empresas que est no banco de dados Rodoviria. Insira um objeto ADOQuery ao form_empresas.

Altere

propriedade

Name

dele

para

adoquery_empresas.

objeto

adoquery_empresas ser utilizada para recuperar os registros da tabela Empresas. Como j sabemos, a instruo SQL para este caso o comando SELECT. Acesse a propriedade SQL do adoquery_empresas e clique sobre o boto .... Ser exibida uma janela onde devemos digitar a instruo SQL que ser executada pelo adoquery_empresas. Digite ento a seguinte instruo: SELECT * FROM EMPRESAS ORDER BY NOME.

Clique em OK para fechar a janela de edio da propriedade SQL do objeto.

Delphi com Banco de Dados Cliente/Servidor

74 de 332

Alm da propriedade SQL do objeto, devemos definir a conexo que o objeto utilizar para executar a instruo SQL. A conexo a ser utilizada pelo adoquery_empresas e por todos os outros objetos que iremos criar, foi configurada atravs 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.

Na janela que surgir, selecione a unit_menu e clique em OK.

Em seguida, salve as alteraes clicando sobre o boto Save All.

Delphi com Banco de Dados Cliente/Servidor

75 de 332

Agora j podemos ligar o objeto adoquery_empresas (que est no form_empresas) ao objeto ConexaoBD (que est no form_menu). Para isto, selecione o adoquery_empresas e altere a propriedade Connection para ConexaoBD.

Para testar se configurou tudo corretamente e executar a instruo SQL, altere a propriedade Active do adoquery_empresas para True. Quando colocamos True na propriedade Active, o Delphi executa a instruo configurada na propriedade SQL do objeto. Entretanto, visualmente parece que nada aconteceu. Para exibir o resultado do SELECT executado pelo adoquery_empresas, vamos utilizar o componente DBGrid que tem a finalidade de exibir informaes de banco de dados. Ento insira um objeto DBGrid (que est na guia Data Controls da paleta de componentes) ao form_empresas.

O objeto DBGrid, assim como todos os objetos da guia Data Controls, no fala diretamente com os objetos ADO, portanto ser necessrio mais um objeto que far o intercmbio entre eles: o DataSource que est na guia Data Access.

Altere a propriedade Name do DBGrid para dbgrid_empresas e do DataSource para ds_empresas. Organize-os conforme a figura abaixo:

Delphi com Banco de Dados Cliente/Servidor

76 de 332

Vamos ento interligar os componentes. Como dito anteriormente, os objetos Data Controls no falam diretamente com os objetos ADO, quem faz este trabalho o Data Source. Ento vamos ligar o ds_empresas ao adoquery_empresas e o dbgrid_empresas ao

ds_empresas.

Selecione

objeto

ds_empresas

altere

propriedade

DataSet

para

adoquery_empresas.

Selecione ds_empresas.

objeto

dbgrid_empresas

altere

propriedade

DataSource

para

Delphi com Banco de Dados Cliente/Servidor

77 de 332

Pronto, agora basta ativar o adoquery_empresas colocando True em sua propriedade Active e os registros sero exibidos no dbgrid_empresas.

No muito interessante deixar o adoquery ativo, sempre muito melhor ativ-lo durante a execuo 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 exibio 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;

O mtodo Open do objeto adoquery o equivalente a colocar True na propriedade Active.

Em

seguida

acesse

evento

OnClose

do

form_empresas

digite:

adoquery_empresas.close;

Delphi com Banco de Dados Cliente/Servidor

78 de 332

O mtodo Close do objeto adoquery o equivalente a colocar False na propriedade Active.

Devemos fazer a mesma coisa com o objeto ConexaoBD, estabelecer a conexo e encerr-la dinamicamente na execuo do programa. Para isto, primeiro v at o form_menu e coloque False na propriedade Connected do objeto ConexaoBD. Em seguida, acesse o evento OnShow do form_menu e digite ConexaoBD.Open;

No evento OnClose do form_menu digite ConexaoBD.Close;

Antes de executar a aplicao para testarmos se est tudo funcionando, devemos programar o boto btn_empresas do form_menu para chamar o form_empresas. Para isto, digite o seguinte no evento OnClick do boto btn_empresas form_empresas.showmodal;

Delphi com Banco de Dados Cliente/Servidor

79 de 332

Agora salve todas as alteraes clicando em Save All e execute a aplicao. Quando voc clicar sobre o boto Run ou pressionar F9 para executar a aplicao o Delphi informar que o form_menu est fazendo meno ao form_empresas e lhe questiona se deseja que ele crie automaticamente esta referncia no cdigo. Clique em Yes e execute a aplicao.

Delphi com Banco de Dados Cliente/Servidor

80 de 332

Aps testar a aplicao feche o projeto que est executando clicando sobre o boto 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 pginas 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:

Delphi com Banco de Dados Cliente/Servidor

81 de 332

Pronto! Voc j pode executar a aplicao. Se voc seguiu corretamente os passos descritos para a criao da tela de empresas, as telas de motoristas e nibus devero estar funcionando corretamente. No se esquea de programar os botes da tela de menu para chamar as novas telas criadas, do contrrio eles no serviro para alguma coisa.

Delphi com Banco de Dados Cliente/Servidor

82 de 332

Inserindo Dados
No captulo anterior vimos como recuperar informaes de um banco de dados com o Delphi atravs de seus componentes e da instruo SELECT. Neste captulo iremos aprender como inserir informaes em banco de dados com o Delphi usando a instruo INSERT. Vamos primeiro programar a tela do cadastro de Empresas e depois programamos as telas de Motoristas e de nibus.

Para incluir informaes em uma tabela, o usurio vai precisar de campos de entrada de dados, portanto vamos incluir alguns objetos que permitiro o usurio digitar as informaes desejadas.

A tabela Empresas possui 2 colunas, e por isso precisaremos disponibilizar 2 campos para o usurio preencher. Insira dois objetos Edit (guia Standard).

Renomeie os objetos atravs da propriedade Name para edt_cod e edt_nome respectivamente. Limpe o contedo da propriedade Text de ambos os Edits, pois esta propriedade a responsvel por armazenar o texto que foi digitado para o usurio e por isso deve estar vazia para o usurio digitar o que desejar. Altere a propriedade MaxLength do edt_cod para 10 e do edt_nome para 30. Esta propriedade define a quantidade mxima de caracteres que podem ser digitados em um Edit. Insira tambm dois objetos Label (guia Standard), um para cada Edit. Altere a propriedade Caption deles para Cdigo e Nome respectivamente.

Organize os objetos conforme exibido na figura abaixo.

Delphi com Banco de Dados Cliente/Servidor

83 de 332

Ns j temos um objeto ADOQuery que realiza o SELECT para visualizao dos registros existentes na tabela Empresas do banco de dados Rodoviaria, agora precisaremos de outro objeto ADOQuery para executar a instruo INSERT e os demais comandos SQL (UPDATE e DELETE) necessrios para a funcionalidade desta tela. Insira ento um objeto ADOQuery, altere a propriedade Name dele para adoquery_aux (aux de auxiliar, pois vai nos auxiliar a executar as instrues SQL) e selecione o objeto ConexaoDB na propriedade Connection para lig-lo ao objeto ADOConnection que est no form_menu.

Alm dos objetos para entrada de dados e do adoquery, precisaremos de um boto para disparar o comando INSERT. Insira um objeto BitBtn ao form_empresas, altere a propriedade Name dele para btn_inserir e Caption para Inserir. No evento OnClick do btn_inserir digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

84 de 332

As linhas comeadas com // so comentrios e por isso no so executadas pelo Delphi, elas servem para documentar o cdigo e explicar o que ele est fazendo. Voc pode alterar as cores de letra e background dos comentrios atravs do menu do Delphi Tools > Editor Options.

Delphi com Banco de Dados Cliente/Servidor

85 de 332

Aps digitar o cdigo acima, salve todas as alteraes clicando sobre o boto Save All. Em seguida execute o projeto para testar a nova funcionalidade.

Insira mais alguns registros para testar a aplicao. Apenas certifique-se de que no vai inserir uma empresa com um cdigo que j esteja cadastrado, do contrrio ocorrer um erro de violao de chave primria. Mais adiante neste curso veremos como tratar erros de banco de dados.

Delphi com Banco de Dados Cliente/Servidor

86 de 332

Vamos agora programar a mesma funcionalidade para a tela de Motoristas. Repita os mesmos procedimentos adotados para a tela de Empresas, obviamente aplicando as particularidades da tabela Motoristas.

A tela deve ficar semelhante exibida na figura abaixo:

No evento OnClick do boto Inserir digite o cdigo exibido na imagem abaixo.

OBS.: Neste cdigo retiramos os comentrios para diminuir o tamanho da imagem e, alm disso, praticamente idntico ao cdigo do boto Inserir da tela de Empresas, portanto segue a mesma explicao.

Delphi com Banco de Dados Cliente/Servidor

87 de 332

Salve as alteraes e execute a aplicao para testar a nova funcionalidade.

Delphi com Banco de Dados Cliente/Servidor

88 de 332

Agora criaremos a funcionalidade de Incluso para o cadastro de nibus. Vamos incluir os campos para entrada de dados da tabela Onibus do banco de dados Rodoviaria.

Insira dois objetos Edit ao form_onibus, um para o usurio digitar o nmero do nibus e o outro para o usurio 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 informaes j esto cadastradas, iremos exibir uma lista para que o usurio selecione a que desejar. Insira dois objetos ComboBox, um para o motorista e o outro para a empresa.

Altere a propriedade Name deles para cb_motorista e cb_empresa respectivamente. Tambm limpe a propriedade Text de ambos e insira objetos Label para todos os campos. Insira um boto para inserir e um ADOQuery conforme fizemos para as outras telas, no se esquea de configurar suas propriedades. Organize os objetos conforme exibido na imagem abaixo:

Esta tela no ser to simples como as outras, pois iremos exibir informaes de outras tabelas atravs dos objetos combobox o que exigir uma programao mais elaborada. Vamos

Delphi com Banco de Dados Cliente/Servidor

89 de 332

alimentar os objetos ComboBox quando o a tela de nibus for exibida, para isto adicione o cdigo abaixo no evento OnShow do form_menu:

//Limpa o combobox de motoristas cb_motorista.Clear; // Define o SELECT para obter o nome dos motoristas adoquery_aux.SQL.Text:='SELECT NOME FROM MOTORISTAS ORDER BY NOME'; // Abre a query com o Select definido adoquery_aux.Open; // Enquanto no chegar ao final da query faa... While Not ADOQuery_aux.Eof do begin // Adiciona ao combobox o nome do motorista do registro corrente cb_motorista.Items.Add(adoquery_aux.fieldbyname('NOME').AsString); // Passa para o prximo registro da query adoquery_aux.Next; end; // Fecha a query de motoristas adoquery_aux.close;

// Limpa o combobox de empresas cb_empresa.Clear; // Define o Select para obter o nome das empresas adoquery_aux.SQL.Text:='SELECT NOME FROM EMPRESAS ORDER BY NOME'; // Abre a query com o Select definido adoquery_aux.Open; // Enquanto no chegar ao final da query faa... While Not ADOQuery_aux.Eof do begin // Adiciona ao combobox o nome da empresa do registro corrente cb_empresa.Items.Add(adoquery_aux.fieldbyname('NOME').AsString); // Passa para o prximo registro da query adoquery_aux.Next; end; // Fecha a query de empresas adoquery_aux.Close;

Os objetos ComboBox iro exibir os nomes dos motoristas e das empresas, entretanto o que deve ser gravado na tabela o nmero do motorista e o cdigo da empresa e no os nomes. Sendo assim, vamos criar duas variveis que serviro para armazenar estes valores.

Delphi com Banco de Dados Cliente/Servidor

90 de 332

Acesse

seo

Var

da

unit_onibus

que

fica

um

pouco

antes

da

seo

implementation e declare as seguintes variveis: num_motorista e cod_empresa do tipo integer.

Ns iremos alimentar estas variveis quando o usurio selecionar o motorista e a empresa nos combobox, ou seja, quando o usurio selecionar o nome de um motorista no combobox, iremos obter o nmero dele no banco de dados e atribuir varivel. Faremos a mesma coisa para a empresa. O evento executado quando o usurio seleciona uma opo no combobox o evento OnChange. Acesse o evento OnChange do cb_motorista e digite o seguinte cdigo:

No evento OnChange do objeto cb_empresa digite o seguinte cdigo:

Delphi com Banco de Dados Cliente/Servidor

91 de 332

Agora s falta programar o boto Inserir. Para isto digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

92 de 332

Pronto, execute a aplicao para testar a nova funcionalidade!

Insira mais alguns nibus para verificar o funcionamento do programa.

Delphi com Banco de Dados Cliente/Servidor

93 de 332

Atualizando dados
Neste captulo criaremos a funcionalidade de atualizao de dados. Todo sistema deve permitir que o usurio atualize as informaes gravadas em um banco de dados, ou seja, deve possibilitar que as informaes sejam alteradas sem que seja necessrio exclu-la para inserir novamente. Esta nova funcionalidade ser implementada da seguinte maneira: o usurio seleciona no DBGrid o registro que deseja atualizar e clica em um boto chamado Alterar. Neste momento a aplicao dever preencher as caixas de entrada de dados com as informaes cadastradas na tabela para que o usurio altere somente o que ele precisa. Aps alterar as informaes desejadas, o usurio clica em um boto chamado Salvar e o sistema executa o UPDATE para atualizar as informaes. Iremos criar esta programao na tela de Empresas depois na tela de Motoristas e por ltimo na tela de nibus seguindo a mesma seqncia desde o inicio deste mdulo.

Primeiro iremos configurar o DBGrid para que a marca de seleo destaque toda a linha e no somente uma clula.

Para isto, expanda a propriedade Options do DBGrid e altere a opo dgRowSelect para true. Isto s para criar um efeito visual mais claro ao usurio, no fundamental para nossa programao.

Delphi com Banco de Dados Cliente/Servidor

94 de 332

Como o DBGrid est ligado ao adoquery_empresas (atravs do ds_empresas), quando o usurio seleciona um registro no DBGrid o Delphi seleciona o mesmo registro no adoquery_empresas, sendo assim, basta acessar a propriedade FieldbyName do

adoquery_empresas para obter os dados do registro selecionado pelo usurio. Crie uma varivel para armazenar o cdigo da empresa que ser atualizada. Ns utilizaremos esta varivel para saber que registro devemos atualizar, pois se o usurio alterar o cdigo da empresa que a chave primria da tabela, no teramos como saber que registro deve ser atualizado.

Insira um objeto BitBtn ao Fom_empresas e altere a propriedade Name para btn_alterar e a propriedade Caption para Alterar. Em seu evento OnClick, digite o cdigo abaixo:

O cdigo acima ir guardar o cdigo da empresa na varivel e preencher as caixas de texto com o registro selecionado para que o usurio altere o que quiser. Falta agora criar um boto para salvar as alteraes, ou seja, executar o comando UPDATE. Insira mais um objeto BitBtn e altere a propriedade Name dele para btn_salvar e Caption para Salvar Alteraes. Sua tela deve ficar semelhante exibida na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

95 de 332

Digite o seguinte cdigo no evento OnClick do objeto btn_salvar:

Salve as modificaes clicando em Save All e em seguida execute a aplicao para testar a nova funcionalidade.

Delphi com Banco de Dados Cliente/Servidor

96 de 332

Antes

Depois

Altere vrios registros para se certificar de que fez tudo corretamente!

Delphi com Banco de Dados Cliente/Servidor

97 de 332

Faa o mesmo para a tela de motoristas (no esquea de declarar a varivel para armazenara chave primria). O cdigo do evento OnClick do boto Alterar ser o seguinte:

O cdigo do boto Salvar ser:

Delphi com Banco de Dados Cliente/Servidor

98 de 332

Para a tela de nibus, repita mais uma vez os procedimentos. O cdigo do evento OnClick do boto Alterar ser o seguinte:

O cdigo do boto Salvar ser:

Pronto! Salve as alteraes e execute o projeto para testar a funcionalidade de atualizao de dados.

Delphi com Banco de Dados Cliente/Servidor

99 de 332

Excluindo Dados
Nos captulos anteriores ns vimos como recuperar, inserir e atualizar informaes de um banco de dados atravs de uma aplicao Delphi usando as instrues SELECT, INSERT e UPDATE. Agora veremos como excluir dados tambm atravs do Delphi usando a instruo DELETE. Seguindo a mesma seqncia 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:

Vamos utilizar a mesma idia da atualizao de dados: o usurio seleciona no DBgrid o registro desejado e clica sobre o boto excluir, neste momento o programa obtm, atravs da propriedade FieldByName do adoquery, o cdigo da empresa que foi selecionada e usa-o para executar o comando DELETE.

Acesse o evento OnClick do objeto btn_excluir e digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

100 de 332

Aps digitar o cdigo acima, salve e execute a aplicao para testar a funcionalidade de excluso de dados.

Ao tentar excluir uma empresa qualquer, provavelmente o Delphi emitir a seguinte mensagem de erro:

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 deletla. Com certeza esta mensagem no muito clara ao usurio comum, por isso, no prximo captulo veremos como tratar os erros de banco de dados a fim de emitir uma mensagem mais amigvel ao usurio. 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 boto Excluir da tela de Motoristas digite o seguinte:

Delphi com Banco de Dados Cliente/Servidor

101 de 332

Aps digitar o cdigo acima, salve e execute a aplicao para testar a funcionalidade de excluso de Motoristas.

Ao tentar excluir um motorista qualquer, provavelmente o Delphi tambm emitir a mensagem de erro de Chave Estrangeira (FK_Onibus_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 excluso para a tela de nibus. Acesse o Form_onibus e repita os passos de inserir um boto, renome-lo e etc. No evento OnClick do btn_excluir do Form_onibus, digite o seguinte cdigo:

Delphi com Banco de Dados Cliente/Servidor

102 de 332

Aps digitar o cdigo acima, salve e execute a aplicao para testar a funcionalidade de excluso de nibus.

Observe que ao excluir um nibus qualquer, no recebemos nenhuma mensagem de erro, pois a tabela Onibus ocupa a posio de filho na relao de dependncia, ou seja, possvel existir um Motorista ou uma Empresa sem nibus, mas o contrrio no!

Exclua alguns nibus e em seguida tente excluir Motoristas e Empresas que no possuam mais nibus ligados a eles.

Delphi com Banco de Dados Cliente/Servidor

103 de 332

Tratando erros de banco de dados


Nos captulos anteriores ns aprendemos como modificar informaes em um banco de dados atravs de operaes de insero, atualizao e excluso de dados. Entretanto, fizemos tudo isso sem nos preocuparmos com eventuais erros de banco que as operaes executadas podem ocasionar. Por exemplo, excluir um registro da tabela Empresas que possua um registro relacionado na tabela Onibus geraria um erro de FK (Foreign Key ou Chave Estrangeira) devido restrio de integridade que impomos no momento da criao das tabelas. Quando um programa no est preparado para tratar eventuais erros de banco de dados, pode ser que ele aborte ou continue a execuo de forma errada, pois como o erro no foi previsto pelo programador, o programa no sabe o que fazer. Sendo assim, devemos sempre que possvel preparar o programa para possveis erros de banco de dados de forma que ele saiba como se comportar em cada situao. Para o tratamento de erros no Delphi utilizamos a instruo: try...except. Exemplo de cdigo usando a instruo try...except:

AdoConnection.BeginTrans; Adoquery.sql.text := DELETE FROM EMPRESAS; Try Adoquery.ExecSQL; AdoConnection.CommitTrans; Except Showmessage(Ocorreu um erro nesta operao !); AdoConnection.RollbackTrans; End;

O trecho de cdigo acima est tentando excluir todos os registros da tabela Empresas, caso ocorra algum erro na execuo do comando SQL ou na confirmao da transao, o Delphi ir executar os comandos que esto na seo Except.

Obs.: Quando ocorre algum erro durante a execuo de um programa, dizemos que foi levantada uma exception (exceo) e por isso o nome try...except.

Ns podemos armazenar a exception em um objeto e, desta forma, acessar suas propriedades e mtodos. Abaixo segue o cdigo de exemplo onde armazenamos a exception em um objeto e em seguida acessamos sua propriedade Message que do tipo String.

Delphi com Banco de Dados Cliente/Servidor

104 de 332

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 ento exibir uma mensagem mais amigvel ao usurio. Por exemplo, ao invs de deixar o programa exibir a mensagem original do erro de FK, exibiramos uma mensagem que qualquer usurio conseguiria entender:

Mensagem de erro sem tratamento

Mensagem de erro amigvel

Vamos aprender melhor como isto funciona na prtica utilizando esta tcnica para tratar erros de banco de dados em nosso projeto Rodovirio. Ns iremos usar o try...except nas operaes de insero, atualizao e excluso de dados primeiramente na tela de Empresas. Antes de comear a programar, temos que verificar quais so os possveis erros de banco de dados em cada operao. Por exemplo, na insero de dados pode ser que ocorra um erro de duplicao de PK (Primary Key ou Chave Primria) se o usurio tentar inserir uma nova empresa com um cdigo que j esteja cadastrado. Toda vez que ocorre um erro de violao da

Delphi com Banco de Dados Cliente/Servidor

105 de 332

restrio de dados, o SQL Server devolve na mensagem de erro o nome da restrio que foi violada. Desta forma, basta verificarmos se o nome da restrio que queremos checar est na mensagem de erro devolvida pelo SQL Server ao programa Delphi. Ns podemos ver o nome de todas as restries de dados (conhecidas como CONSTRAINTS) atravs do Enterprise Manager. Por exemplo, para ver o nome da restrio de PK da tabela Empresas, clique com o boto direito do mouse sobre a tabela e em seguida clique em Design Table.

Em seguida clique sobre o boto Table and Index Properties

Na janela que surgir, acesse a guia Indexes/Keys e veja no campo Index Name o nome da restrio de dados.

Uma vez conhecido o nome da violao, temos que alterar o cdigo do programa para verificar se este nome aparece na mensagem de erro. Se aparecer, ento exibimos uma

Delphi com Banco de Dados Cliente/Servidor

106 de 332

mensagem clara para o usurio, do contrrio, devemos exibir a mensagem original j que difcil imaginar que tipo de erro pode acontecer em uma operao de insero que no seja o erro de PK. Mas antes de alterar a cdigo de insero da tela de empresas, vamos criar uma funo para verificar se o nome da restrio est na mensagem de erro j que iremos precisar fazer isto vrias vezes. Esta funo deve ficar na Unit do Form_menu porque precisaremos dela em outros forms e o form_menu est na seo Uses de todos eles, pois compartilha o objeto ConexaoBD.

Esta funo ir receber dois parmetros: a mensagem de erro e o nome da violao que queremos verificar se est presente na mensagem. A funo ir retornar Sim se o texto com o nome da violao estiver na mensagem e No caso contrrio. Como no Delphi no existe a funo Like da linguagem SQL, devemos verificar a existncia de um texto dentro de outro texto da seguinte maneira:

1 Saber a quantidade de caracteres que a mensagem possui; 2 Saber a quantidade de caracteres que o texto a ser verificado possui; 3 Ir comparando (do primeiro ao ltimo caractere) pedaos da mensagem com o texto pesquisado. Caso algum pedao da mensagem seja igual ao texto pesquisado, ento paramos de comparar e retornamos o valor Sim. Caso terminemos de comparar e nenhum pedao seja igual ao texto pesquisado, ento retornamos o valor No.

Acesse a seo Public da unit do form_menu e declare o cabealho da funo que chamaremos de ErroBD conforme exibido abaixo:

Aps declarar a funo, pressione simultaneamente as teclas SHIFT+CTRL+C para criar automaticamente o corpo da funo na seo Implementation logo aps a ltima procedure ou funo j existente.

Delphi com Banco de Dados Cliente/Servidor

107 de 332

Agora programe a funo conforme exibido a seguir:

O cdigo acima est fazendo exatamente o que foi descrito anteriormente quando especificamos o seu funcionamento.

Delphi com Banco de Dados Cliente/Servidor

108 de 332

Pronto, j temos a funo que ir fazer a verificao da mensagem para que possamos interpret-la durante o tratamento do erro. Vamos ento programar o tratamento do possvel erro de PK na tela de Empresas. Acesse a Unit do Form_empresas e altere o evento OnClick do boto Inserir de forma que ele fique igual ao exibido abaixo:

if (trim(edt_cod.Text)='') or (trim(edt_nome.Text)='') then begin Showmessage('Preencha todos os campos !'); end else begin Form_menu.ConexaoBD.BeginTrans; adoquery_aux.SQL.Text:=' INSERT INTO EMPRESAS VALUES (' + edt_cod.Text + ',' + QuotedStr(edt_nome.Text) + ')'; try adoquery_aux.ExecSQL; deu_erro := false; except on E : Exception do begin deu_erro := true; //Se for erro de PK ento // exibe mensagem amigvel

//Seno // exibe a mensagem sem tratamento mesmo !

if Form_menu.ErroBD(E.Message,'PK_Empresas') = 'Sim' then ShowMessage('Cdigo j cadastrado!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end;

if deu_erro = false then begin Form_menu.ConexaoBD.CommitTrans; ADOQuery_empresas.Close; ADOQuery_empresas.Open; Showmessage('Operao executada com sucesso !'); edt_cod.Clear; edt_nome.Clear; end else begin Form_menu.ConexaoBD.RollbackTrans; end; end;

Delphi com Banco de Dados Cliente/Servidor

109 de 332

Observe que estamos fazendo uso de uma varivel chamada deu_erro. Estamos utilizando esta varivel para fazer o controle se houve ou no erro e assim executar os comandos de acordo com a situao. Esta varivel deve ser declarada na seo Var da Unit_empresas como do tipo boolean (lgica). Veja o destaque na imagem abaixo:

Aps fazer as alteraes, salve e compile o projeto. Depois de compilar o projeto, recomendamos que execute o programa por fora do Delphi, ou seja, executando diretamente o arquivo .exe gerado na pasta onde o projeto foi salvo. Isto importante para verificar o real comportamento do programa durante a ocorrncia de erros, pois quando executado por dentro do Delphi, o compilador emite a mensagem de erro e paralisa a execuo lhe obrigando a pressionar novamente o boto Run (F9) para que ento o programa continue a execuo e trate o erro.

Vamos ento testar se o programa est se comportando como o esperado. Tente cadastrar uma outra empresa com um cdigo que j exista.

Delphi com Banco de Dados Cliente/Servidor

110 de 332

Se no tivssemos programado o tratamento de erro, a mensagem seria a seguinte:

Podemos ento concluir que o tratamento de erros de banco de dados fundamental para uma boa aplicao, pois torna o sistema mais robusto e inteligente alm de muito mais amigvel ao usurio.

Vamos agora programar a operao de atualizao de dados. Antes, devemos avaliar que erros podem acontecer nesta operao. Como a tabela empresa possui relacionamento com a tabela nibus, pode ser que ocorra um erro de FK se tentarmos alterar o cdigo de uma empresa que tenha nibus relacionados a ela. Para verificar o nome da FK responsvel pelo relacionamento entre as tabelas Empresas e nibus, usaremos o Enterprise Manager.

Delphi com Banco de Dados Cliente/Servidor

111 de 332

Acesse as propriedades da tabela assim como fizemos para ver o nome da restrio de PK da tabela Empresas. Para ver os nomes das FKs, acesse a guia Relationships e verifique no campo Relationship name o nome da FK referente ao relacionamento.

Se houver alguma atualizao de registro na tabela Empresas que viole a restrio de integridade imposta pelo relacionamento entre Empresas e nibus, o texto

FK_Onibus_Empresas ser exibido na mensagem de erro.

Analisando com mais cuidado a situao, percebemos que na operao de atualizao tambm pode ocorre um erro de PK se o usurio tentar alterar o cdigo da empresa para um outro que j esteja cadastrado. Sendo assim, devemos preparar o programa tambm para este tipo de erro na atualizao.

Para programar o tratamento de erros na atualizao de dados na tela de Empresas, altere o cdigo do evento OnClick do boto Salvar Alteraes de forma que fique igual ao exibido abaixo:

Delphi com Banco de Dados Cliente/Servidor 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

112 de 332

ShowMessage('Impossvel atualizar o cdigo pois existem nibus ligados a esta Empresa!') else if Form_menu.ErroBD(E.Message,'PK_Empresas') = 'Sim' then ShowMessage('Cdigo j cadastrado!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end;

if deu_erro = false then begin Form_menu.ConexaoBD.CommitTrans; ADOQuery_empresas.Close; ADOQuery_empresas.Open; Showmessage('Operao executada com sucesso !'); edt_cod.Clear; edt_nome.Clear; end else begin Form_menu.ConexaoBD.RollbackTrans; end;

Aps fazer as alteraes, salve e compile o projeto. Depois de compilar, execute o programa por fora do Delphi para testar seu comportamento.

Delphi com Banco de Dados Cliente/Servidor

113 de 332

Agora s falta fazer o mesmo tratamento para a operao de excluso. Na excluso o nico erro provvel de ocorrer o de FK caso o usurio tente excluir uma empresa que possua nibus cadastrados. Para fazer o tratamento, altere o cdigo do evento OnClick do boto Excluir de forma que ele fique conforme o cdigo a seguir:

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('Impossvel excluir pois existem nibus ligados a esta Empresa!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end;

if deu_erro = true then Form_menu.ConexaoBD.RollbackTrans else begin Form_menu.ConexaoBD.CommitTrans; adoquery_empresas.Close; adoquery_empresas.Open; showmessage('Empresa excluda com sucesso !'); end;

Delphi com Banco de Dados Cliente/Servidor

114 de 332

Aps fazer as alteraes, salve e compile o projeto. Depois de compilar, execute o programa por fora do Delphi para testar seu comportamento.

Pronto, acabamos de programar o tratamento de erros de banco de dados para a tela de Empresas. Agora, aplique os conhecimentos adquiridos aqui para fazer o tratamento de erros de banco de dados nas telas de Motoristas e nibus.

Delphi com Banco de Dados Cliente/Servidor

115 de 332

Mdulo 3:
Projetando uma Aplicao de Banco de Dados Cliente/Servidor

definir o escopo da aplicao, ou seja, especificar qual o objetivo do sistema que vai ser criado. Devemos sempre projetar as funcionalidades que o sistema vai possuir para ento sair programando cada uma delas. Com este pensamento, criamos este mdulo que ir nos ajudar a planejar e a projetar a aplicao que servir de base para nosso aprendizado. Neste mdulo iremos definir o objetivo do sistema, criar um diagrama das funcionalidades da aplicao, projetar o modelo de dados, criar as tabelas e iniciar o

ntes de iniciar qualquer desenvolvimento, fundamental planejar e projetar a aplicao que ser construda. Afinal, como vamos construir algo que no sabemos como vai ser? extremamente importante

desenvolvimento propriamente dito.

Delphi com Banco de Dados Cliente/Servidor

116 de 332

Planejando a aplicao: Gerenciador de Cursos de Informtica


Nos mdulos anteriores ns aprendemos sobre banco de dados e o modelo Cliente/Servidor. Conhecemos a linguagem SQL e vimos como recuperar e modificar informaes em um banco de dados alm de aprendermos como o Delphi interage com o SQL Server. Agora chegou o momento de colocar em prtica os conhecimentos adquiridos. Faremos isto simulando o desenvolvimento de uma aplicao de banco de dados. Todos os mdulos seguintes abordaro aspectos importantes na construo de um sistema baseado em banco de dados. Comearemos projetando a aplicao, ou seja, definindo o seu escopo.

O primeiro passo no desenvolvimento de qualquer sistema definir o seu objetivo, devemos saber qual a sua finalidade e para que ele servir. Neste curso simularemos o desenvolvimento de uma aplicao para uma escola de informtica que oferece cursos bsicos de Windows, Office e Internet como centenas delas que existem pelo Brasil. Esta aplicao ser utilizada pela escola de informtica para fazer o gerenciamento dos cursos de informtica oferecidos por ela. Sendo assim, chamaremos nosso sistema de Gerenciador de Cursos de Informtica.

Aps definir o objetivo do sistema, vamos especificar suas funcionalidades.

O Gerenciador de Cursos de Informtica ser o responsvel pelo controle de todos os cursos, instrutores, turmas e alunos da escola. O sistema dever cadastrar:

O cdigo e o nome de cada curso; O cdigo, o nome, a idade, o telefone e o sexo de cada instrutor; O cdigo, o curso, o instrutor e o valor da aula de cada turma; O cdigo, o nome, a idade, o telefone e o sexo de cada aluno;

O cdigo do curso e o cdigo da turma so criados pela prpria escola de informtica, na verdade, estes cdigos so formados por um conjunto de caracteres que possui um significado representativo para os funcionrios da escola.

O cdigo 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

Delphi com Banco de Dados Cliente/Servidor

117 de 332

O cdigo da turma composto pelo cdigo do curso acrescido do ano e ms de incio da turma, por exemplo, o cdigo de uma turma do Curso de Windows que tem incio em Fevereiro de 2005 seria: WIN200502 e o de uma turma de Excel com incio em Maro de 2005 seria: XLS200503.

O cdigo do instrutor e do aluno so nmeros seqenciais, portanto devem ser gerados pelo sistema.

Alm dos cadastros, o sistema dever controlar todas as matrculas de alunos da escola. A matrcula ocorre quando um aluno se matricula em um ou mais cursos. Para o controle de matrculas deve-se armazenar o cdigo do aluno e o cdigo da turma.

O sistema dever possuir um mecanismo que possibilite ao instrutor fazer o lanamento de suas aulas. Para este controle, o sistema dever guardar o cdigo da turma em que o instrutor est alocado e a data da aula. O instrutor ir lanar as aulas mediante o acontecimento das mesmas no sendo possvel cadastr-las antecipadamente.

A aplicao tambm dever fazer o controle de freqncia dos alunos. Para cada aula lanada 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 exceo. Este controle ser usado pelos instrutores aps o lanamento de cada aula.

O sistema ainda deve possuir uma ferramenta que permita ao responsvel pela escola de informtica fazer o pagamento dos instrutores. Esta ferramenta deve contabilizar as aulas dadas pelo instrutor em um determinado ms e gerar um demonstrativo com o valor total a ser pago por elas. Aps a gerao do demonstrativo o sistema deve marcar cada aula como paga.

Ateno: Todas as operaes do sistema devem ter uma restrio de acesso para que apenas as pessoas autorizadas possam acess-las. O sistema dever permitir que o responsvel pela escola de informtica defina as funcionalidades que cada pessoa poder acessar na aplicao.

Delphi com Banco de Dados Cliente/Servidor

118 de 332

Criando um Diagrama de Funcionalidades


No captulo anterior fizemos o planejamento da aplicao onde tivemos a oportunidade de tomar conhecimento do sistema que deve ser construdo, saber qual o objetivo da aplicao e ainda recolher as especificaes que iro orientar nosso desenvolvimento.

Aps o planejamento inicial, muito interessante fazer um diagrama que represente toda a funcionalidade do sistema. A criao de um diagrama importante para representar de forma grfica tudo o que foi levantado na especificao durante o planejamento. Alm disso, o diagrama permite ao programador organizar as idias e criticar possveis falhas no processo. Esta a fase de projeto, ou seja, quando voc ir definir o comportamento do programa. Muitos programadores no gostam de projetar o sistema e partem logo para a codificao sem ao menos analisar ou pensar antes de sair programando. Esta no uma boa prtica, pois dificilmente uma aplicao que no foi projetada ou que teve um projeto ruim ter uma boa qualidade. Geralmente quando isto acontece, o programador acaba levando muito mais tempo para concluir o sistema, pois perde um bom tempo dando manuteno e corrigindo falhas do que se tivesse planejado e projetado corretamente a aplicao.

Obs.: Neste curso no iremos apresentar uma metodologia especfica. Nosso propsito no ensinar UML, anlise estruturada, essencial, orientada a objetos ou qualquer outra metodologia de desenvolvimento de software. Ns apenas queremos mostrar que a representao grfica do funcionamento de um sistema muito til aos profissionais que iro construir a aplicao. O leitor no precisa utilizar o mesmo mtodo adotado neste curso para a criao 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 aplicao a ser desenvolvida.

Com base nas informaes contidas no captulo anterior, iremos construir um diagrama (uma espcie de DFD - Diagrama de Fluxo de Dados) que representar cada processo do sistema e quais operaes ele executar, neste diagrama tambm representaremos os depsitos de dados que sero utilizados por cada processo.

Abaixo segue o diagrama de funcionalidades da aplicao:

Delphi com Banco de Dados Cliente/Servidor

119 de 332

Diagrama de Funcionalidades da Aplicao

Cursos

Consulta Curso Cadastra Curso

Consulta Instrutor Cadastra Instrutor

Instrutores Consulta Aula

Realiza Cadastros

Cadastra Aluno

Cadastra Turma Turmas Consulta Turma Realiza Matrculas Consulta Aula

Consulta Turma

Lana Aulas

Cadastra Aula

Alunos

Consulta Aluno

Aulas Consulta Aulas

Cadastra Matrcula Consulta Alunos Matriculados Matrculas

Lana Frequncias Gera Pagamento Instrutores Frequncias

Cadastra Frequncia

Na diagrama acima, os processos do sistema esto representados atravs dos crculos amarelos. As setas azuis representam as operaes de atualizao de dados realizada pelos processos e os databases representam os depsitos de dados utilizados pelos processos. Observe que as setinhas indicam o sentido em que as informaes esto sendo transportadas. As setinhas apontadas para os databases indicam uma operao de gravao no depsito de dados. As setinhas que apontam para os processos indicam uma operao de leitura do depsito de dados. Tambm importante ressaltar que os processos no se falam diretamente, eles apenas se relacionam atravs dos depsitos de dados.

O diagrama acima a representao lgica do sistema, a partir dele que criaremos nosso sistema no Delphi.

Cada processo (bolinha amarela) ser uma ou mais telas do programa. Por exemplo, o processo Realiza Matrculas ser a tela de cadastro de matrcula 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.

Delphi com Banco de Dados Cliente/Servidor

120 de 332

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 codificao no Delphi, mas ainda no iremos fazer isso, pois falta projetarmos o banco de dados da aplicao, ou seja, definir como sero as tabelas. No prximo captulo iremos criar o modelo de dados baseado no diagrama que acabamos de criar e nas informaes existentes no captulo anterior.

Delphi com Banco de Dados Cliente/Servidor

121 de 332

Projetando o banco de dados


Este captulo destinado criao do modelo de dados do Gerenciador de Cursos de Informtica. Partiremos logo para a especificao de cada tabela.

Conforme foi definido no captulo de planejamento e especificao da aplicao, para o cadastro de cursos o sistema deve armazenar o cdigo e o nome de cada curso. O cdigo composto por 3 letras, logo a coluna de cdigo ser do tipo varchar com um tamanho de 3 caracteres. O nome do curso tambm ser do tipo varchar e como no foi especificado o tamanho mximo do nome de um curso, assumiremos um tamanho de 20, pois acreditamos que 20 caracteres sejam suficientes para armazenar o nome de um curso de informtica. Sendo assim, segue a tabela de cursos, a chave primria ser a coluna do cdigo da curso:

Para o cadastro de instrutores, o sistema deve armazenar o cdigo, o nome, a idade, o telefone e o sexo de cada instrutor. O cdigo ser um nmero seqencial, portanto ser utilizado o tipo int. Para o nome usaremos varchar com um tamanho de 30 caracteres. Para a idade usaremos o tipo int por se tratar de valor numrico. Para o telefone usaremos o tipo varchar com um tamanho de 14 caracteres, pois o usurio pode querer digitar parnteses, espaos ou traos para organizar o nmero de telefone do instrutor. Abaixo segue a tabela de Instrutores, a chave primria ser a coluna do cdigo do instrutor:

Para o cadastro de turmas, o sistema deve armazenar o cdigo, o curso, o instrutor e o valor da aula de cada turma. O cdigo da turma composto pelas 3 letras do cdigo do curso acrescido do ano (com 4 dgitos) e ms (2 dgitos) de incio da turma, sendo assim, usaremos o tipo varchar com um tamanho de 9 caracteres. Para o curso usaremos a mesma definio do cdigo da tabela cursos. Para o instrutor usaremos a mesma definio do cdigo da tabela

Delphi com Banco de Dados Cliente/Servidor

122 de 332

instrutores. Para o sexo usaremos o tipo varchar com o tamanho de 1 caracteres por razes bvias. Abaixo segue a tabela de turma, a chave primria ser a coluna do cdigo da turma:

Para o cadastro de alunos, o sistema deve armazenar o cdigo, o nome, a idade, o telefone e o sexo de cada aluno. Usaremos as mesmas definies utilizadas para a tabela instrutores. Abaixo segue a tabela de alunos, a chave primria ser a coluna do cdigo do aluno:

Para o controle de matrculas, o sistema deve registrar o cdigo do aluno e o cdigo da turma em que o aluno se matriculou. Sendo assim, basta utilizar as mesmas definies das colunas de cdigo do aluno e cdigo da turma das respectivas tabelas. Abaixo segue a tabela de matrculas, a chave primria ser composta pelas duas colunas, pois so necessrias ambas as colunas para identificar uma matrcula:

Para o registro de aulas, o sistema deve armazenar o cdigo da turma e a data da aula. O cdigo 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 primria ser composta pelas duas colunas, pois so necessrias ambas as colunas para identificar uma aula:

Delphi com Banco de Dados Cliente/Servidor

123 de 332

Para a o controle de freqncias, o sistema deve armazenar o registro de matrcula de cada aluno que composto pelo cdigo da turma e pelo cdigo do aluno, a data da aula e um campo para gravar P ou F (presena ou falta). Com base nestas definies podemos criar a tabela de freqncias. A chave primria ser composta pelos campos que identificam a matrcula e pela data da aula, pois so necessrias ambas as colunas para identificar a freqncia.

Aps definir cada tabela, j podemos montar o modelo de dados criando os relacionamentos das tabelas atravs das chaves estrangeiras.

Delphi com Banco de Dados Cliente/Servidor

124 de 332

No captulo de planejamento da aplicao foi especificado que todas as operaes do sistema devem possuir um controle de acesso. Este controle deve restringir o acesso ao sistema somente pessoas autorizadas. Para isto, criaremos um mecanismo de validao de usurios, onde cada usurio precisar informar uma senha para poder entrar no sistema. Alm disso, cada usurio poder ter acesso a apenas algumas funes do sistema. Por exemplo, o usurio Joo somente poder acessar o mdulo de matrculas e a usuria Maria somente ter acesso ao mdulo de relatrios. Para fazer este controle, precisaremos de mais algumas tabelas no banco de dados:

Uma tabela para armazenar os usurios e suas senhas; Uma tabela para armazenar as funes do sistema; Uma tabela para gravar as funes que cada usurio tem permisso de acesso.

Para registrar os usurios do sistema precisaremos gravar o login de usurio, a senha do usurio e o nome do usurio. Sendo assim, criaremos a tabela abaixo, a chave primria ser o login do usurio:

O campo usurio ir armazenar o login de cada usurio, por exemplo, o login do usurio Rodrigo Costa poder ser rcosta e o login do usurio Sergio Ferreira poder ser sferreira. O campo nome, obviamente, ir armazenar o nome de cada usurio 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 aplicao iremos restringir a senha ao no mximo 10 caracteres. Fizemos isto, pois iremos armazenar a senha codificada no padro ASCII. O padro ASCII utiliza uma combinao de 3 nmeros para representar cada caractere alfanumrico. Por exemplo, o cdigo ASCII para o caractere a 097 e o cdigo ASCII para o caractere 1 049. Sendo assim, caso o usurio cadastre uma senha de 10 caracteres precisaremos de 30 posies para represent-la.

Obs.: Iremos armazenar a senha criptografada apenas para dar mais segurana e confiabilidade ao sistema. Voc no precisa obrigatoriamente criptografar as senhas dos usurios, isto apenas uma boa prtica que costumamos adotar.

Para registrar as funes do sistema iremos armazenar o cdigo e o nome da cada funo. Abaixo segue a tabela de funes:

Delphi com Banco de Dados Cliente/Servidor

125 de 332

Para o cdigo da funo utilizamos um campo varchar com 6 posies. Desta forma podemos criar cdigos mnemnicos que identifiquem facilmente a funo. No campo nome podemos cadastrar o nome ou uma pequena descrio da funo. Por exemplo, a funo de cadastro de cursos poderia ser cadastrada da seguinte maneira: cod_funcao: CADCUR nome: Cadastro de Cursos

E por fim, para armazenar as permisses de cada usurio, iremos registrar o cdigo da funo e o login do usurio:

Aps definir cada tabela, j podemos montar o modelo de dados criando os relacionamentos das tabelas atravs das chaves estrangeiras.

Ateno: Ns criamos as tabelas do controle de acesso separadas do modelo de dados da aplicao porque elas no possuem qualquer ligao. Por isso criamos dois modelos de dados. Alm disso, o modelo de dados do controle de acesso pode ser aplicado em qualquer sistema e no uma particularidade apenas desta aplicao.

Delphi com Banco de Dados Cliente/Servidor

126 de 332

Criando as tabelas
Vamos agora implementar o modelo de dados que acabamos de construir, ou seja, vamos criar fisicamente as tabelas em um banco de dados do SQL Server. Abra o Enterprise Manager para podermos criar nossas tabelas. Vamos criar um novo Banco de Dados exclusivamente para este sistema gerenciador de cursos de informtica. Para isto, expanda o cone do servidor e clique com o boto direito do mouse sobre a opo Databases. Na caixa de dilogo que surgir, clique em New Database...

Em seguida, ser exibida a janela Database Properties. Preencha a caixa de texto Name com o nome do novo banco de dados, em nosso caso usaremos: Academico (sem aspas). Clique em OK para criar o novo Banco de Dados.

Delphi com Banco de Dados Cliente/Servidor

127 de 332

Aps criar o banco de dados Academico, acesse a seo Tables para criarmos as tabelas do modelo de dados. Clique com o boto direito sobre a opo 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 especificaes 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 opo Lenght. Em seguida clique no cone que possui a figura de uma chave para especificar que esta coluna a chave primria desta tabela.

Preencha agora o nome da segunda coluna da tabela Cursos: nome. Em Data Type selecione o tipo varchar e defina o tamanho mximo de 20 caracteres em Length. Desmarque a opo Allow Nulls (Permitir nulo) da coluna nome, pois esta coluna deve ter preenchimento obrigatrio. A coluna cod_curso tambm obrigatria, mais como j definimos que ela chave primria, automaticamente o SQL Server desmarca a opo Allow Nulls, pois a chave primria sempre obrigatria. Com isto, criamos a estrutura da tabela Cursos de acordo com o que foi especificado no modelo de dados.

Delphi com Banco de Dados Cliente/Servidor

128 de 332

S falta definir o nome da tabela, para isto clique sobre o cone que possui a figura de um disquete. Esta opo serve para salvar as alteraes feitas e para definir o nome da tabela quando isto ainda no foi feito. Obviamente, salve a tabela com o nome: Cursos.

Pronto, a tabela foi criada! Feche a janela de edio 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 boto direito e em seguida clicar em Design Table.

Prosseguindo com a construo das tabelas de nosso modelo de dados, vamos agora criar a tabela Instrutores. Clique com o boto direito sobre a opo Tables do banco de dados Academico e em seguida em New Table...

Crie a estrutura da tabela Instrutores seguindo as especificaes do modelo de dados assim como fizemos com a tabela Cursos. Preencha corretamente os nomes das colunas e selecione os respectivos tipos de dados. No esquea de especificar a coluna cod_instrutor como chave primria da tabela.

Delphi com Banco de Dados Cliente/Servidor

129 de 332

Obs.: No captulo referente ao planejamento foi especificado que o cdigo do instrutor deve ser um nmero seqencial, portanto iremos configurar este campo de forma que o SQL Server gere automaticamente os nmeros medida que os instrutores sejam cadastrados. Para isto usaremos a propriedade Identity. Selecione a coluna cod_instrutor e defina a propriedade Identity como Yes conforme a imagem abaixo.

A propriedade Identity, quando ativada, gera um nmero seqencial para cada registro que inserido semelhantemente ao tipo de dados AutoNumerao do Access. Aps criar a estrutura, salve a tabela como nome Motoristas.

A prxima 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. Ns poderamos ter criado ela antes das outras, s que depois teramos que edit-la para referenciar as chaves estrangeiras. Assim, com as outras tabelas j criadas, iremos fazer tudo de uma vez.

Delphi com Banco de Dados Cliente/Servidor

130 de 332

Novamente clique com o boto direito sobre a opo Tables do banco de dados Academico e em seguida em New Table... Preencha os campos de acordo com o modelo de dados.

Aps preencher os campos, salve a tabela como Turmas, mas deixe a janela de edio aberta para que possamos configurar as chaves estrangeiras. Clique sobre a opo Table and Index Properties que est representada atravs de um cone com uma figura de uma mo segurando um pedao de papel.

Na janela que surgir, selecione a guia Relationships (Relacionamentos).

Delphi com Banco de Dados Cliente/Servidor

131 de 332

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 primria ou que possua uma chave nica (este conceito no ser abordado neste curso). O termo Chave Primria 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 boto New. Na caixa de seleo Primary key table, selecione a tabela Cursos e logo abaixo selecione a coluna cod_curso. Na caixa de seleo 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.

Veja abaixo como ficou a tela aps a configurao:

Delphi com Banco de Dados Cliente/Servidor

132 de 332

Agora vamos criar a chave estrangeira para a tabela Instrutores. Clique novamente sobre o boto New e repita o procedimento apontando a coluna cod_instrutor da tabela Turmas para a coluna cod_instrutor da coluna Instrutores.

Clique sobre o boto Fechar e depois salve as alteraes clicando sobre o boto com o cone de um disquete. O SQL Server informar que as alteraes efetuadas afetaro outras tabelas.

Clique em Yes e Pronto! As chaves estrangeiras foram configuradas com sucesso!

Delphi com Banco de Dados Cliente/Servidor

133 de 332

Agora criaremos a tabela de Alunos. Para isto siga os mesmos passos da criao da tabela de Instrutores, pois elas so bem parecidas. No se esquea de configurar a propriedade Identity para o campo cod_aluno.

A prxima tabela a ser criada Matriculas. Nesta tabela, ambas as colunas sero chave primria 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.

Criaremos agora a tabela Aulas. Crie a estrutura da tabela conforme o especificado no modelo de dados. Nesta tabela, a chave primria composta pelas colunas cod_turma e data. A coluna cod_turma tambm uma chave estrangeira que se referencia a tabela Turmas.

A ltima tabela a ser criada a tabela de freqncias. Crie a tabela seguindo o modelo de dados.

Delphi com Banco de Dados Cliente/Servidor

134 de 332

Esta tabela tem sua chave primria composta por 3 colunas: cod_turma, cod_aluno e data. A coluna cod_turma, alm de fazer parte da chave primria, 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 ficaro as telas de relacionamento:

Relacionamento Freqncias X Matriculas

Relacionamento Freqncias X Aulas

Delphi com Banco de Dados Cliente/Servidor

135 de 332

Pronto! Acabamos de criar todas as tabelas, confira a lista de todas as tabelas que acabamos de criar.

Ns podemos ter certeza de que os relacionamentos foram criados corretamente atravs da opo Diagrams do banco de dados Academico. Nesta opo podemos criar diagramas com as tabelas existentes no banco de dados. Neste diagrama o SQL Server exibe o relacionamento existente entre as tabelas. Clique com o boto direito do mouse sobre a opo Diagrams do banco de dados Academico e em seguida clique sobre a opo New Database Diagram...

Ser exibida a tela do assistente de criao de diagramas do SQL Server.

Delphi com Banco de Dados Cliente/Servidor

136 de 332

Clique em Avanar para exibir a prxima tela onde iremos selecionar as tabelas que faro parte do nosso diagrama.

Selecione todas as tabelas e clique no boto Add >. Em seguida, clique em Avanar e na tela seguinte em Concluir. Ento o SQL Server montar o diagrama com as tabelas e seus respectivos relacionamentos.

Delphi com Banco de Dados Cliente/Servidor

137 de 332

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 aplicao. Modelo de dados da aplicao

Diagrama gerado pelo SQL Server

Delphi com Banco de Dados Cliente/Servidor

138 de 332

Aps criar as tabelas do modelo de dados da aplicao, devemos criar as tabelas do modelo de dados do controle de acesso. Elas tambm devem ser criadas no banco de dados Acadmico, deixamos para cri-las por ltimo apenas por uma questo didtica.

Seguindo os mesmos procedimentos para criao de tabelas, primeiro crie a tabela Usuarios, em seguida a tabela Funcoes e por fim a tabela Permissoes. No se esquea de configurar os relacionamentos da tabela Permissoes.

Uma vez terminada a criao 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.

Delphi com Banco de Dados Cliente/Servidor

139 de 332

Modelo de dados do controle de acesso

Diagrama do SQL Server

Delphi com Banco de Dados Cliente/Servidor

140 de 332

Iniciando a programao
Vamos agora dar incio programao 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 comearmos!

Conforme sabemos, o Delphi ao ser iniciado j disponibiliza um novo projeto, portanto utiliz-lo-emos. A primeira tela que o sistema dever exibir deve ser a tela de Logon onde o usurio ir digitar o login de usurio e a senha. Ento selecione o Form1 e altere a propriedade Caption para Logon e a propriedade Name para Form_logon. Em seguida clique em Save All para salvarmos logo nosso projeto.

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 propsito.

Delphi com Banco de Dados Cliente/Servidor

141 de 332

Em seguida o Delphi pedir que salve o arquivo do projeto, salve-o com o nome Academico.

Aps salvar os arquivos iremos configurar algumas propriedades do Form_logon. Defina a fonte do formulrio como Verdana atravs da propriedade Font. Selecione a opo poScreenCenter na propriedade Position para que o form sempre seja exibido no centro da tela. Defina a propriedade BorderStyle como bsSingle para no permitir que o usurio

redimensione a tela descaracterizando-a. Em seguida acesse a propriedade BorderIcons e coloque False nas opes biMaximize e biMinimize para desabilitar os botes Maximizar e Minimizar da janela.

Ateno: Estas configuraes devem ser aplicadas a todos os novos formulrios que sero criados para este sistema. No se esquea de fazer isto, pois seno a aplicao ficar despadronizada.

Delphi com Banco de Dados Cliente/Servidor

142 de 332

Insira ao form_logon: 2 objetos Label, 2 objetos Edit e 2 objetos BitBtn. Organize-os conforme a imagem abaixo:

Renomeie os objetos Edit como edt_usuario e edt_senha respectivamente e os objetos BitBtn como btn_ok e btn_fechar. Voc pode utilizar a propriedade Kind ou Glyph para colocar uma figura nos objetos BitBtn. A propriedade Kind disponibiliza algumas opes prdefinidas e a propriedade Glyph permite que voc escolha a imagem que desejar. O prprio Delphi tem um diretrio cheio de imagens para serem utilizadas em botes do tipo BitBtn, confira em C:\Arquivos de programas\Arquivos comuns\Borland

Shared\Images\Buttons Aps fazer as configuraes do Form_logon clique em Save All para salvar as alteraes realizadas no projeto.

Aps a tela de login, o sistema deve exibir a tela de Menu com todas as funes disponveis na aplicao, portanto vamos criar a tela de menu do sistema. Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_menu e Menu Gerenciador de Cursos respectivamente. Em seguida aplique as mesmas configuraes feitas para o form_logon.

Delphi com Banco de Dados Cliente/Servidor

143 de 332

Aps realizar as configuraes, clique novamente sobre o boto Save All para salvar as alteraes 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 icnica, ou seja, cones que representam funes do sistema. Como esta aplicao no possui muitas funes, fica desnecessria a utilizao dos menus tradicionais. Por isto usaremos objetos BitBtn ao invs do objeto MainMenu. Insira 11 objetos BitBtn ao form_menu. Cada objeto servir para chamar uma determinada funo, portanto altere as propriedades Name e Caption de cada um deles seguindo a tabela abaixo:

Name btn_cadcursos btn_cadinstrutores btn_cadturmas btn_cadalunos btn_matriculas btn_aulas btn_frequencias btn_paginstrutores btn_relatorios btn_controle btn_fechar

Caption Cadastro de Cursos Cadastro de Instrutores Cadastro de Turmas Cadastro de Alunos Matrculas Lanamento de Aulas Freqncias Pagamento de Instrutores Relatrios Controle de Acesso Fechar

Delphi com Banco de Dados Cliente/Servidor

144 de 332

Voc tambm pode colocar uma figura para cada BitBtn atravs da propriedade Glyph, escolha a imagem que voc achar que faa sentido com a funo do objeto. Veja abaixo como ficou a tela de Menu do sistema aps a configurao dos botes:

Aps fazer as configuraes do Form_menu, clique em Save All para salvar as alteraes realizadas no projeto.

Pronto, terminamos a fase inicial do desenvolvimento! O prximo passo criar o controle de acesso, mas isto ser feito no mdulo seguinte.

Delphi com Banco de Dados Cliente/Servidor

145 de 332

Mdulo 4:
Criando o Controle de Acesso

ma vez terminado a fase de projeto e a programao inicial, devemos criar o mecanismo de controle de acesso. Este mecanismo ser responsvel por controlar os usurios e suas respectivas permisses a

cada funcionalidade da aplicao. J foi o tempo em que um sistema tinha um nico usurio e podia acessar todas as opes. Hoje em dia, qualquer sistema decente multiusurio, e portanto, deve exigir que cada usurio se identifique atravs de uma tela de Logon onde deve informar um nome de usurio e uma senha. Sendo assim, devemos programar a autenticao do sistema no servidor de banco de dados e validao dos usurios junto aplicao. Alm da validao dos usurios, devemos controlar as funcionalidades que cada usurio tem acesso, habilitando somente as opes que o usurio tem permisso. Neste mdulo iremos criar toda esta parafernlia necessria para a segurana dos dados. Os conceitos aprendidos neste mdulo podem ser aplicados em qualquer outra aplicao que voc venha criar em Delphi.

Delphi com Banco de Dados Cliente/Servidor

146 de 332

Criando a tela de Splash


O primeiro passo para a implementao de nosso controle de acesso ser a criao da tela de splash. A tela de splash a tela de apresentao do programa, aquela que surge rapidamente enquanto o programa est sendo carregado. Na verdade o controle de acesso no depende da tela de splash e por sua vez a tela de splash tambm no depende do controle de acesso, ou seja, ela pode ser criada independentemente se o sistema tem ou no um controle de acesso. Ns a criaremos para dar um tom mais profissional ao sistema e aproveitaremos para fazer a autenticao no servidor de banco de dados enquanto ela exibida.

Caso o Delphi esteja fechado, execute-o e abra o projeto Academico.dpr.

Insira um novo Form ao projeto.

Delphi com Banco de Dados Cliente/Servidor

147 de 332

Configure as propriedades Name e Caption do novo Form como Form_splash e Splash respectivamente. Apenas para este Form, no aplique as mesmas configuraes feitas para o form_logon, pois como ser uma tela de apresentao, usaremos configuraes diferentes. Configure a propriedade BorderStyle do form_splash como bsDialog, desta forma a tela no ter uma moldura simplificada. Altere a propriedade Font para Verdana. Altere a propriedade Color para clWhite. Insira um objeto Label e altere a propriedade Caption dele para Gerenciador de Cursos. Configure sua fonte para o tamanho 26 atravs da propriedade Font. Em seguida, insira mais um objeto Label ao form_splash e altere sua propriedade Caption para Aguarde, carregando.... Configure sua fonte para o tamanho 16 atravs da propriedade Font. Redimensione o Form_splash e organize os objetos conforme a imagem abaixo:

Aps fazer as configuraes clique em Save All para salvar o form_splash. Salve-o como Unit_splash.

Delphi com Banco de Dados Cliente/Servidor

148 de 332

Criamos o form_splash, mas at agora ele no passa de um form comum como os demais. Para fazer com que ele seja realmente a apresentao do sistema precisaremos alterar a Unit principal do projeto. Clique sobre o boto View Unit ou pressione Ctrl+F12.

Ser exibida a relao de Units do projeto, selecione a Unit Academico.

Ento o Delphi mostrar o cdigo da Unit Academico.

Delphi com Banco de Dados Cliente/Servidor

149 de 332

Observe que na unit Academico est o cdigo que cria todos os forms quando a aplicao executada. A tela de splash deve ser a primeira a ser exibida e deve desaparecer quando a aplicao terminar de criar todos os forms. Ento vamos alterar o cdigo da unit Academico para isto acontea. Faa as alteraes de forma que a unit fique igual exibida na figura abaixo:

Pronto, configuramos nossa tela de Splash! Clique em Save All para salvar as alteraes. Se voc executar o projeto, ver a tela de splash surgindo e depois desaparecendo antes de ser exibida a tela de Logon. Talvez no 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 autenticao e medida que a quantidade de forms for aumentando, a exibio do splash durar mais tempo na tela.

Delphi com Banco de Dados Cliente/Servidor

150 de 332

Programando o processo de autenticao no Servidor


O processo de autenticao no servidor consiste em fazer o logon no servidor de banco de dados. No confunda o logon da aplicao no servidor com o logon dos usurios no sistema. Aqui estamos falando de dois tipos de usurios: usurio do servidor de banco de dados e usurio do sistema.

Usurios do Servidor Banco de Dados: So os usurios do software de banco de dados, em nosso caso o Microsoft SQL Server 2000. So queles usados para se conectar no Query Analyzer e no Enterprise Manager.

Usurios do Sistema: So os usurios da aplicao, queles que sero cadastrados na tabela de usurios.

Para fazer logon no banco de dados, utilizaremos um nico usurio. Ele ser utilizado para fazer as consultas e modificaes no banco de dados. interessante que a aplicao tenha um usurio especfico, portanto vamos criar um que seja para uso exclusivo do sistema.

Abra o Enterprise Manager e navegue at a opo Logins que est disponvel na seo Security. Clique sobre a opo Logins com o boto direito do mouse e em seguida clique em New Login...

Obs.: Voc deve est logado com uma conta com privilgios administrativos para poder criar logins no SQL Server.

Delphi com Banco de Dados Cliente/Servidor

151 de 332

Na tela que surgir, preencha o campo Name com admin_academico. Este ser o nome do usurio que ser utilizado pela nossa aplicao. Na seo Authentication, selecione a opo SQL Server Authentication e defina uma senha para o usurio.

Em seguida, acesse a guia Database Access para configurar as permisses de acesso deste usurio. Marque o banco de dados Academico e em seguida marque o privilgio db_owner. Desta maneira o usurio admin_academico ter acesso total ao banco de dados Academico.

Delphi com Banco de Dados Cliente/Servidor

152 de 332

Aps configurar o usurio, clique em OK para confirmar a operao. O SQL Server solicitar que confirme a senha. Faa isso!

Aps criar o novo usurio ele aparecer na relao de usurios do SQL Server.

Delphi com Banco de Dados Cliente/Servidor

153 de 332

Feche o Enterprise Manager e volte ao Delphi. Vamos ento criar uma funo que far a autenticao no servidor utilizando o usurio recm-criado. Iremos cri-la na Unit do Form_logon, portanto acesse-a. Esta funo ir retornar True se conseguir autenticar ou False se ocorrer algum erro. V at a seo public da unit_logon e declare a funo:

Aps fazer a declarao, pressione Shit+Ctrl+C para o Delphi criar o corpo da function na seo implementation.

Antes de programar a funo, devemos inserir um objeto ADOConnection ao form_logon, pois precisaremos dele para fazer o logon no SQL Server.

Altere a propriedade Name do ADOConnection para CenexaoBD e coloque False na propriedade LoginPrompt.

Delphi com Banco de Dados Cliente/Servidor

154 de 332

Aps inserir e configurar o objeto, volte para Unit e programe a funo com o cdigo abaixo:

O cdigo acima est configurando a string de conexo dinamicamente. Os parmetros configurados so os seguintes: Provider: Driver do banco de dados Initial Catalog: Nome do database Data Source: Nome do Servidor

Aps configurar os parmetros da propriedade ConnectionString, tentamos abrir a conexo passando o usurio e a senha. Se for tudo ok, ento a funo retorna True seno, a funo retorna False. Agora vamos chamar esta funo durante a exibio da tela de Splash. Para isto, basta cham-la na Unit do projeto (unit Academico) aps todos os forms terem sido criados e antes de destruir a tela de Splash. Altere a unit conforme a imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

155 de 332

Configurando a tela de Logon


Aps programar o processo de autenticao no servidor, vamos ento configurar a tela de Logon que far a autenticao do usurio na aplicao. A autenticao no servidor o procedimento para estabelecer a conexo com o banco de dados, este processo de total desconhecimento das pessoas que utilizaro o sistema. J a autenticao de usurios no sistema ser de conhecimento de todos, pois eles preciso informar um usurio e uma senha para se conectar ao sistema. O que vamos fazer agora criar o procedimento que ir verificar se o usurio pode ou no entrar no sistema.

Vamos criar uma funo na unit do form_logon que ir verificar se o usurio pode ou no se logar no sistema.

V at a seo public da unit_logon e declare mais esta funo:

Aps fazer a declarao, pressione Shit+Ctrl+C para o Delphi criar o corpo da function na seo implementation.

A funo dever, primeiramente, verificar se o usurio est cadastrado no sistema, se estiver ento dever verificar se a senha est correta. Para fazer esta verificao teremos de

Delphi com Banco de Dados Cliente/Servidor

156 de 332

realizar uma consulta no banco de dados com o usurio 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.

Altere a propriedade Name dele para ADOQuery_aux e a propriedade Connection para ConexaoBD.

Aps inserir e configurar o ADOQuery, volte para a Unit para programarmos a funo de validao dos usurios. Antes de escrever o cdigo da funo, declare duas variveis (usuario_logado e senha_usuario do tipo string) na seo public da unit_logon. Estas variveis sero alimentadas por esta funo e utilizadas posteriormente em outras telas da aplicao.

Voltando funo de validao, digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

157 de 332

O cdigo acima est fazendo o seguinte: Faz um SELECT na tabela de usurios de pegar a senha que est cadastrada para o usurio passado como parmetro funo. Se o ADOQuery retornar vazio indica que o usurio no existe na tabela de usurios, ento exibe uma mensagem de erro e faz a funo retorna False. Se o SELECT encontrar o usurio, ento verifica se a senha cadastrada na tabela diferente da que foi passada como parmetro funo. Se as senhas forem diferentes, ento exibe mensagem de erro e faz a funo retornar False, caso contrrio alimenta a varivel de usurio logado no sistema e faz a funo retornar True.

Ateno: Conforme previsto no projeto do banco de dados, a senha ser gravada na tabela de forma criptografada. Sendo assim, quando a funo for verificar a senha digitada pelo usurio, ela sempre ser diferente do que est na tabela, ou seja, o usurio nunca conseguir entrar no sistema. Portanto, devemos descriptografar a senha cadastrada na tabela antes de fazer a verificao. Ento, vamos logo criar a funo para criptografar e para descriptografar.

Primeiro criaremos a funo para criptografar.

Delphi com Banco de Dados Cliente/Servidor

158 de 332

Declare a funo na seo public da unit_logon:

Aps declarar a funo, pressione Shift+Ctrl+C para criar o corpo da function:

Esta funo ir obter o cdigo ASCII de cada caractere da senha de trs para frente. Por exemplo, para criptografar a palavra teste:

Cdigo ASCII de cada caractere:

t = 116 e = 101 s = 115 t = 116 e = 101

Ento, teste criptografado em ASCII de trs para frente ser: 101116115101116.

Digite o cdigo da funo que far isto:

Delphi com Banco de Dados Cliente/Servidor

159 de 332

Agora vamos criar a funo que ir descriptografar, ou seja, fazer o contrrio da funo que criptografa. Declare a funo na seo public da unit_logon:

Aps declarar a funo, pressione Shift+Ctrl+C para criar o corpo da function. Em seguida digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

160 de 332

Aps criar as funes de criptografia, devemos alterar a funo que faz a validao de usurios para que descriptografe a senha cadastrada na tabela antes de fazer a verificao da senha. Veja a alterao abaixo:

Vamos agora programar o evento OnClick do boto Ok de forma que ao pressionar este boto, o sistema faa a validao de usurio.

Delphi com Banco de Dados Cliente/Servidor

161 de 332

Digite o seguinte no OnClick do boto OK:

Agora digite o seguinte no evento OnClick do boto Fechar:

Faltam s mais alguns ajustes ma tela de logon para conclu-la. Selecione o edt_senha e altere a propriedade PasswordChar para * (asterisco). Isto necessrio para que aparea asteriscos ao invs da senha digitada pelo usurio. Altere tambm a propriedade MaxLength para 10, assim somente ser permitido que o usurio digite 10 caracteres para a senha. Para o edt_usuario defina a propriedade MaxLength como 30. Salve as alteraes clicando em Save All. Para testar a validao de usurios, precisaremos inserir um registro na tabela de usurios do banco de dados. Abra o Query Analyzer, faa logon com o usurio

admin_academico, selecione o banco de dados Academico e execute o seguinte comando:

Delphi com Banco de Dados Cliente/Servidor

162 de 332

O cdigo (109101116115121115) que foi cadastrado, representa a palavra system, ou seja, a senha do usurio administrador system!

Agora volte ao Delphi e execute o projeto para testar a validao de usurios. Quando voc executar o projeto, o Delphi ir informar que o Fom_logon est fazendo meno do Form_menu e lhe pergunta se deseja que ele crie esta referencia na clusula Uses. Clique em Yes. Assuma este procedimento como padro para toda vez que o Delphi fizer esta pergunta.

Agora faa logon com o usurio administrador e com a senha system para testar o sistema.

Delphi com Banco de Dados Cliente/Servidor

163 de 332

Criando o mecanismo de verificao de usurios e permisses


Agora vamos criar o mecanismo que ir verificar as permisses de cada usurio para habilitar somente os botes do menu que o usurio logado tenha acesso. Antes de criar este mecanismo, devemos cadastrar as funes do sistema no banco de dados. Caso voc o tenha fechado, abra o Query Analyzer, faa logon com o usurio admin_academico, selecione o banco de dados Academico e execute os seguintes comandos para cadastrar as funes do sistema:

Aps executar os comandos acima, volte para o Delphi.

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 conexo estabelecida pelo objeto ConexaoBD que est no form_logon, ento acesse o menu File > Use Unit... e clique na Unit_logon. Desta forma os objetos do form_logon estaro disponveis para o form_menu. Salve as alteraes clicando em Save All. Agora altere a propriedade Connection do ADOQuery_aux para Form_logon.ConexaoBD.

Criaremos

uma

procedure

para

fazer

trabalho

de

checagem

habilitao/desabilitao de funes do menu do sistema. Acesse a unit do Form_menu e declare a procedure na seo public da unit_menu:

Delphi com Banco de Dados Cliente/Servidor

164 de 332

Aps declarar a procedure, pressione Shift+Ctrl+C para criar o corpo da mesma. Em seguida digite o cdigo abaixo:

ADOQuery_aux.SQL.Text := ' SELECT COD_FUNCAO FROM PERMISSOES ' + ' WHERE USUARIO = ' + QuotedStr(Form_logon.usuario_logado); ADOQuery_aux.Open;

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

Delphi com Banco de Dados Cliente/Servidor

165 de 332

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;

Agora acesse o evento OnShow do form_menu e coloque a chamada procedure para que o sistema execute-a quando a tela de menu for exibida.

Clique em Save All para salvar todas as modificaes feitas at aqui. Em seguida execute o projeto para verificar o funcionamento da procedure de verificao de permisses de usurios.

Observe que ao efetuar logon com o usurio administrador, o sistema desabilita todos os botes do menu.

Delphi com Banco de Dados Cliente/Servidor

166 de 332

Isto aconteceu porque o usurio no tem nenhuma permisso cadastrada na tabela de permisses. Faa o seguinte, execute os comandos abaixo no Query Analyzer e em seguida execute novamente o projeto.

Delphi com Banco de Dados Cliente/Servidor

167 de 332

Montando o cadastro de usurios e permisses


Para que no seja necessrio ficar cadastrando os usurios e suas respectivas permisses na mo atravs de comandos SQL, vamos criar uma funcionalidade no sistema com este objetivo. Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_usuarios e Usurios respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_usuarios.

Insira 6 objetos BitBtn ao form_usuarios. Arrume-os lado-a-lado e altere as propriedades Name e Caption de cada um deles conforme a tabela abaixo:

Delphi com Banco de Dados Cliente/Servidor

168 de 332

Name btn_novo btn_salvar btn_alterar btn_cancelar btn_excluir btn_fechar

Caption Novo Salvar Alterar Cancelar Excluir Fechar

Se desejar, configure uma imagem para cada um dos botes. Seu form deve ficar semelhante ao exibido a seguir:

Como voc j deve ter percebido, estes botes sero responsveis por executar as operaes de cadastro do form_usuarios. Vamos agora criar 2 procedures que iro habilitar/desabilitar os botes dependendo da situao. Acesse a Unit do form_usuarios e declare as duas procedures mostradas abaixo. Declare tambm a varivel operacao que ser utilizada para sabermos que operao foi realizada pelo usurio.

Delphi com Banco de Dados Cliente/Servidor

169 de 332

Pressione

Shift+Crtl+C

para

criar

estrutura

das

procedures

na

seo

implementation. Em seguida, digite o cdigo das procedures que est exibido abaixo:

Delphi com Banco de Dados Cliente/Servidor

170 de 332

Aps programar as procedures, insira ao form_usuarios 3 objetos do tipo Edit e 3 objetos do tipo Label. Organize-os conforme mostrado abaixo:

Renomeie os Edits para edt_usuario, edt_nome e edt_senha alm de limpar o contedo da propriedade Text de ambos. Configure a propriedade MaxLenght dos Edits para 30, 50 e 10 respectivamente. Altere tambm a propriedade Caption dos labels conforme exibido na imagem acima. Em seguida, coloque um asterisco * na propriedade PasswordChar do edt_senha. Vamos agora criar mais duas procedures que iro bloquear/bloquear os Edits para edio dependendo da operao que o usurio estiver executando no form_usuarios. Estas procedures iro ler todos os objetos do form e desabilitar e alterar a cor dos objetos que sejam do tipo Edit, ou seja, iro alterar os objetos que pertencem classe TEdit. Declare as procedures na seo public da unit_usuarios.

Pressione

Shift+Crtl+C

para

criar

estrutura

das

procedures

na

seo

implementation. Em seguida, digite o cdigo das procedures que est exibido abaixo.

Delphi com Banco de Dados Cliente/Servidor

171 de 332

Procedure para bloquear os Edits:

Procedure para liberar os Edits:

Criaremos ainda mais uma procedure. Esta procedure ir limpar os campos da tela. Declare-a na seo public, pressione Shift+Ctrl+C e digite seu cdigo:

Delphi com Banco de Dados Cliente/Servidor

172 de 332

Pronto, criamos as procedures bsicas que iro dar suporte as operaes executadas pelos usurios. Vamos agora iniciar a programao de banco de dados. A idia a seguinte, a tela ser inicialmente exibida vazia, ou seja, sem nenhum registro para edio. Desta forma, o usurio poder clicar em Novo para poder cadastrar um novo usurio ou ento pesquisar um usurio que j esteja cadastrado atravs de uma tela de pesquisa e ento alter-lo ou exclulo. 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, porm, precisamos configurar a propriedade Connection do ADOQuery_aux. O ADOQuery ir utilizar a conexo 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 ento programar o vento do boto Novo. Antes, declare na seo public uma varivel chamada pk do tipo string. Usaremos esta varivel para armazenar a chave primria (primary key) do registro corrente.

Agora sim, acesse o evento OnClick do boto Novo e digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

173 de 332

Aps o usurio clicar em Novo e digitar as informaes, ele provavelmente ir salvar o novo usurio, ento vamos programar este boto.

Ateno: O boto Salvar ir inserir o novo registro ou alterar um registro j cadastrado. Em ambas as situaes poder ocorrer um erro de banco de dados, e como j sabemos, os erros no so muito claros para os usurios. Portanto, devemos tratar estes erros da mesma forma que tratamos no projeto Rodoviria criado no mdulo 2 deste curso. Acesse a unit do form_logon e declare a funo que traduz erros de banco de dados. Iremos declar-la na unit_logon, pois ela comum a todos os forms e desta maneira no precisamos escrev-la mais de uma vez.

Em seguida pressione Shift+Crtl+C para criar o corpo da procedure e depois digite o cdigo abaixo:

Delphi com Banco de Dados Cliente/Servidor

174 de 332

Agora volte para o form_usuarios e digite o seguinte cdigo no evento OnClick do boto Salvar:

procedure TForm_usuarios.btn_salvarClick(Sender: TObject); var deuerro : boolean; senha : string; begin if (edt_usuario.Text='') or (edt_nome.Text='') or (edt_senha.Text='') then begin Showmessage('Preencha todos os campos !'); end else begin senha := Form_logon.criptografa(edt_senha.Text); if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO USUARIOS VALUES '+ '('+ QuotedStr(edt_usuario.Text) + ','+ QuotedStr(edt_nome.Text) + ','+ QuotedStr(senha) + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE USUARIOS SET '+ ' USUARIO ='+ QuotedStr(edt_usuario.Text) + ', NOME ='+ QuotedStr(edt_nome.Text) + ', SENHA'+ QuotedStr(senha) + ' WHERE USUARIO = '+ QuotedStr(pk); 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('Usurio j cadastrado!') else if Form_logon.ErroBD(E.Message,'FK_Permissoes_Usuarios') = 'Sim' then Showmessage('Existem permisses cadastradas para este usurio!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := edt_usuario.Text; desabilita_salvar(sender); bloqueia_campos; end; end; end;

Alm de inserir um novo usurio, a pessoa que estiver usando o sistema poder alterar um usurio j cadastrado. Para esta operao digite o cdigo abaixo no evento OnClick do boto Alterar:

Delphi com Banco de Dados Cliente/Servidor

175 de 332

Aps clicar em Novo ou em Alterar, o usurio pode querer cancelar a edio do registro. Para esta operao digite o cdigo abaixo no evento OnClick do boto Cancelar.

Alm de Inserir ou Alterar um registro, o usurio pode tambm excluir um registro. Para esta operao digite o cdigo abaixo no evento OnClick do boto Excluir.

Delphi com Banco de Dados Cliente/Servidor

176 de 332

procedure TForm_usuarios.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if pk = '' then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM USUARIOS ' + ' WHERE USUARIO = ' + QuotedStr(pk); Form_logon.ConexaoBD.BeginTrans;

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 permisses cadastradas para este usurio!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end;

if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

No evento OnClick do boto Fechar digite:

Close;

Delphi com Banco de Dados Cliente/Servidor

177 de 332

No evento OnShow do form_usuarios digite:

Clique em Save All para salvar todas as alteraes.

Aps programar todos os eventos acima descritos, falta apenas criar a funcionalidade de pesquisa de usurios e de concesso de permisses. Iremos primeiro construir a tela de pesquisa de usurios.

Visando o re-aproveitamento de cdigo, iremos desenvolver uma tela de pesquisa que tambm servir para pesquisar outras entidades do sistema como Cursos, Instrutores e Alunos.

Insira um novo Form ao projeto. Configure a propriedade Name do novo Form como Form_pesquisa. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_pesquisa.

Insira ao form_pesquisa: 1 objeto Label, 1 objeto Edit, 1 objeto DBGrid e 4 objetos BitBtn. Altere a propriedade Caption do Label para Digite o nome ou parte do nome. Altere a propriedade Name do Edit para edt_nome. Altere a propriedade Name dos objetos BitBtn para btn_pesquisar, btn_limpar, btn_selecionar e btn_cancelar. Altera a propriedade Caption dos objetos BitBtn para Pesquisar, Limpar, Selecionar e Cancelar. Altere a propriedade Name do DBGrid para grid_pesquisa, expanda a propriedade Options dele e altere a opo dgRowSelect para true. Insira tambm um ADOQuery e um DataSource ao form_pesquisa.

Organize os objetos do form_pesquisa conforme mostrado abaixo:

Delphi com Banco de Dados Cliente/Servidor

178 de 332

Altere a propriedade Name do ADOQuery para ADOQuery_pesquisa e configure a propriedade Connection para Fom_logon.ConexaoBD. Mas antes v em File > Use Unit... e selecione a Unit_logon.

Altere a propriedade Name do DataSource para ds_pesquisa

e configure a

propriedade DataSet para ADOQuery_pesquisa. Em seguida configure a propriedade DataSource do DBgrid para ds_pesquisa.

Agora declare duas (chave e sql_pesquisa) variveis do tipo string na seo public da unit do form_pesquisa. A varivel chave ser utilizada para armazenar a chave primria do registro que for selecionado e a varivel sql_pesquisa ser utilizada para montar o SELECT de pesquisa.

Agora iremos programar os eventos desta tela.

Delphi com Banco de Dados Cliente/Servidor

179 de 332

OnShow do Form_pesquisa:

OnClick do boto Pesquisar:

OnClick do boto Limpar:

Delphi com Banco de Dados Cliente/Servidor

180 de 332

OnClick do boto Selecionar:

OnClick do boto Cancelar:

Pronto, form_usuarios.

form_pesquisa

est

concludo!

Salve

as

alteraes

volte

ao

Estando no form_usuarios, insira um objeto BitBtn. Altere as propriedades Name e Caption para btn_localizar e Localizar respectivamente. Arrume o objeto conforme mostrado a seguir:

Delphi com Banco de Dados Cliente/Servidor

181 de 332

Este boto ir chamar o form_pesquisa, portanto v em File > Use Unit... e selecione a unit_pesquisa. Em seguida salve as alteraes clicando em Save All.

No evento OnClick do objeto btn_localizar digite o seguinte cdigo:

Pronto, a funcionalidade de pesquisa j est concluda! Vamos agora criar a funcionalidade de concesso de permisses s funes do sistema.

Insira um novo Form ao projeto. Configure a propriedade Name do novo Form como Form_permissoes e Caption como Permisses. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_permissoes.

Aps salvar o form_permissoes, insira os seguintes objetos:

2 Labels: Altere a propriedade Caption deles para Funes do Sistema e Permisses.

Delphi com Banco de Dados Cliente/Servidor

182 de 332

ComboBox:

Altere

propriedade

Name

para

cb_funcoes,

Style

para

csDropDownList e apague o contedo da propriedade Text. 3 BitBtns: Altere Name para btn_inserir, btn_retirar, btn_fechar respectivamente. Alltere Caption para +, -, Fechar respectivamente. 2 ADOQuerys: Altere Name para ADOQuery_permissoes, ADOQuery_aux. V em File > Use Unit... e selecione a unit_logon, em seguida configure a propriedade Connection de ambos os objetos para Form_logon.ConexaoBD. 1 DataSource: Altere Name para ds_permissoes e DataSet para

ADOQuery_permissoes. 1 DBgrid: Altere Name para grid_permissoes e DataSource para ds_permissoes. expanda a propriedade Options dele e altere a opo dgRowSelect para true.

Organize os objetos semelhantemente figura abaixo:

Vamos agora programar os eventos desta tela.

Digite o seguinte cdigo no evento OnShow do form_permissoes:

Delphi com Banco de Dados Cliente/Servidor

183 de 332

Digite o seguinte cdigo no evento OnEnter do cb_funcoes:

Digite o seguinte cdigo no evento OnClick do btn_inserir:

Delphi com Banco de Dados Cliente/Servidor

184 de 332

Digite o seguinte cdigo no evento OnClick do btn_retirar:

Digite o seguinte cdigo no evento OnClick do btn_fechar:

Pronto, o form_permissoes j est concludo! Salve as alteraes e volte ao form_usuarios.

Estando no form_usuarios, insira um objeto BitBtn. Altere as propriedades Name e Caption para btn_permissoes e Permisses respectivamente. Arrume o objeto conforme mostrado a seguir:

Delphi com Banco de Dados Cliente/Servidor

185 de 332

Este boto ir chamar o form_permissoes, portanto v em File > Use Unit... e selecione a unit_permissoes. Em seguida salve as alteraes clicando em Save All.

No evento OnClick do objeto btn_permissoes digite o seguinte cdigo:

Pronto, a funcionalidade de permisses j est concluda! Vamos agora alterar o form_menu para chamar o form_usuarios. Acesse o form_menu e digite o seguinte no evento OnClick do boto Controle de Acesso:

Delphi com Banco de Dados Cliente/Servidor

186 de 332

Aproveitando que estamos alterando o form_menu, digite o seguinte cdigo no evento OnClick do boto Fechar do menu:

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

187 de 332

Mdulo 5:
Criando as Funcionalidades da Aplicao

ste mdulo um dos mais importantes deste curso, pois aqui iremos criar as funcionalidades da aplicao. Para o usurio, o que realmente importa o que o sistema faz. Ele no quer saber como foi

desenvolvido a aplicao e sim qual o trabalho que ela executa. Nesta parte do curso, iremos construir as opes que sero utilizadas pelo usurio. Neste mdulo criaremos os cadastros de todos os elementos envolvidos no contexto do sistema e todas as operaes necessrias movimentao de cada elemento como a realizao de matrculas de alunos, o lanamento de aulas e o pagamento dos instrutores.

Delphi com Banco de Dados Cliente/Servidor

188 de 332

Cadastro de Cursos
O cadastro de cursos, como o prprio nome diz, consiste na funcionalidade que permitir ao usurio cadastrar os cursos que so oferecidos na escola de informtica. Na verdade, esta funcionalidade a maneira interativa e amigvel que o usurio ir dispor para fazer a manuteno das informaes contidas na tabela Cursos do banco de dados Academico. Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_cursos e Cursos respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_cursos.

Delphi com Banco de Dados Cliente/Servidor

189 de 332

Insira 6 objetos BitBtn ao form_cursos. Arrume-os lado-a-lado e altere as propriedades Name e Caption de cada um deles conforme a tabela abaixo:

Name btn_novo btn_salvar btn_alterar btn_cancelar btn_excluir btn_fechar

Caption Novo Salvar Alterar Cancelar Excluir Fechar

Seu form deve ficar semelhante ao exibido a seguir:

Vamos agora criar as procedures e variveis que fazem o controle da tela, quelas que habilitam/desabilitam botes e os campos da tela conforme fizemos no cadastro de usurios. Declare as variveis e procedures conforme a imagem abaixo:

Em seguida pressione Shift+Ctrl+C para criar o corpo das procedures.

Delphi com Banco de Dados Cliente/Servidor

190 de 332

Agora digite o cdigo de cada uma delas

Procedure bloqueia_campos:

Delphi com Banco de Dados Cliente/Servidor

191 de 332

Procedure desabilita_salvar:

Procedure habilita_salvar:

Delphi com Banco de Dados Cliente/Servidor

192 de 332

Procedure libera_campos:

Procedure limpa_campos:

Aps programar as procedures, insira ao form_cursos 2 objetos do tipo Edit e 2 objetos do tipo Label. Organize-os conforme mostrado abaixo:

Delphi com Banco de Dados Cliente/Servidor

193 de 332

Renomeie os Edits para edt_cod e edt_nome alm de limpar o contedo da propriedade Text de ambos. Configure a propriedade MaxLength dos Edits para 3 e 20 respectivamente. Altere tambm a propriedade Caption dos labels conforme exibido na imagem acima.

Insira um objeto ADOQuery ao form_cursos e altere a propriedade Name para ADOQuery_aux. Usaremos este objeto para executar os comandos SQL no banco de dados, porm, precisamos configurar a propriedade Connection do ADOQuery_aux. O ADOQuery ir utilizar a conexo 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.

Agora vamos programar todos os eventos do form_cursos. Os cdigos sero praticamente os mesmos utilizados para o cadastro de usurios.

Cdigo do evento OnShow do Form_cursos:

Cdigo do evento OnClick do boto Novo do Form_cursos:

Delphi com Banco de Dados Cliente/Servidor

194 de 332

Cdigo do evento OnClick do boto Salvar do Form_cursos:

procedure TForm_cursos.btn_salvarClick(Sender: TObject); var deuerro : boolean; begin if (edt_cod.Text='') or (edt_nome.Text='') then begin Showmessage('Preencha todos os campos !'); end else begin if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO CURSOS VALUES '+ '('+ QuotedStr(edt_cod.Text) + ','+ QuotedStr(edt_nome.Text) + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE CURSOS SET '+ ' COD_CURSO ='+ QuotedStr(edt_cod.Text) + ', NOME ='+ QuotedStr(edt_nome.Text) + ' WHERE COD_CURSO = '+ QuotedStr(pk); 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := edt_cod.Text; desabilita_salvar(sender); bloqueia_campos; end; end; end;

Cdigo do evento OnClick do boto Alterar do Form_cursos:

Delphi com Banco de Dados Cliente/Servidor

195 de 332

Cdigo do evento OnClick do boto Cancelar do Form_cursos:

Cdigo do evento OnClick do boto Excluir do Form_cursos:

procedure TForm_cursos.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if pk = '' then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM CURSOS ' + ' WHERE COD_CURSO = ' + QuotedStr(pk); Form_logon.ConexaoBD.BeginTrans; 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

Delphi com Banco de Dados Cliente/Servidor

196 de 332

Cdigo do evento OnClick do boto Fechar do Form_cursos:

Aps programar todos os eventos acima descritos, falta apenas criar a funcionalidade de pesquisa de cursos. A tela de pesquisa criada durante a criao do cadastro de usurios foi desenvolvida de forma genrica, ou seja, foi construda de maneira que seja possvel utiliz-la em outras situaes. Iremos ento utilizar o form_pesquisa tambm 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 boto ir chamar o form_pesquisa, portanto v em File > Use Unit... e selecione a unit_pesquisa. Em seguida salve as alteraes clicando em Save All.

No evento OnClick do objeto btn_localizar digite o seguinte cdigo:

Delphi com Banco de Dados Cliente/Servidor

197 de 332

Pronto, o cadastro de cursos j est concludo! Vamos agora alterar o form_menu para chamar o form_cursos. Acesse o form_menu e digite o seguinte no evento OnClick do boto Cadastro de Cursos:

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

198 de 332

Cadastro de Instrutores
O cadastro de instrutores, como o prprio nome diz, consiste na funcionalidade que permitir ao usurio cadastrar os instrutores que trabalham na escola de informtica. Na verdade, esta funcionalidade a maneira interativa e amigvel que o usurio ir dispor para fazer a manuteno das informaes contidas na tabela Instrutores do banco de dados Academico. Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_instrutores e Instrutores respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_instrutores.

Delphi com Banco de Dados Cliente/Servidor

199 de 332

Insira 6 objetos BitBtn ao form_instrutores. Arrume-os lado-a-lado e altere as propriedades Name e Caption de cada um deles conforme a tabela abaixo:

Name btn_novo btn_salvar btn_alterar btn_cancelar btn_excluir btn_fechar

Caption Novo Salvar Alterar Cancelar Excluir Fechar

Seu form deve ficar semelhante ao exibido a seguir:

Vamos agora criar as procedures e variveis que fazem o controle da tela, quelas que habilitam/desabilitam botes e os campos da tela conforme fizemos no cadastro de usurios e no cadastro de cursos. Declare as variveis e procedures conforme a imagem abaixo:

Em seguida pressione Shift+Ctrl+C para criar o corpo das procedures.

Delphi com Banco de Dados Cliente/Servidor

200 de 332

Agora digite o cdigo de cada uma delas

Procedure bloqueia_campos:

Delphi com Banco de Dados Cliente/Servidor

201 de 332

Procedure desabilita_salvar:

Procedure habilita_salvar:

Delphi com Banco de Dados Cliente/Servidor

202 de 332

Procedure libera_campos:

Procedure limpa_campos:

Aps programar as procedures, insira ao form_instrutores 5 objetos do tipo Edit e 5 objetos do tipo Label. Organize-os conforme mostrado abaixo:

Delphi com Banco de Dados Cliente/Servidor

203 de 332

Renomeie os Edits para edt_cod, edt_nome, edt_idade, edt_telefone e edt_sexo alm de limpar o contedo da propriedade Text de ambos. Configure a propriedade MaxLength dos Edits para 10, 30, 3, 14 e 1 respectivamente. Altere tambm a propriedade Caption dos labels conforme exibido na imagem acima.

Ateno: O cdigo do instrutor um nmero seqencial gerado automaticamente pelo SQL Server. Sendo assim, o usurio no poder digitar no campo Cdigo Instrutor, devemos ento alterar a procedure libera_campos para que ela no libere o objeto edt_cod. Acesse a procedure libera_campos da unit_instrutores e faa a seguinte alterao:

Continuando a construo do cadastro de instrutores... insira um objeto ADOQuery ao form_instrutores e altere a propriedade Name para ADOQuery_aux. Usaremos este objeto para executar os comandos SQL no banco de dados, porm, precisamos configurar a propriedade Connection do ADOQuery_aux. O ADOQuery ir utilizar a conexo fornecida pelo

Delphi com Banco de Dados Cliente/Servidor

204 de 332

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.

Agora vamos programar todos os eventos do form_instrutores. Os cdigos sero praticamente os mesmos utilizados para os cadastros de usurios e cursos.

Cdigo do evento OnShow do Form_instrutores:

Cdigo do evento OnClick do boto Novo do Form_instrutores:

Delphi com Banco de Dados Cliente/Servidor

205 de 332

Cdigo do evento OnClick do boto Salvar do Form_instrutores:

procedure TForm_instrutores.btn_salvarClick(Sender: TObject); var deuerro : boolean; begin if (edt_nome.Text='') or (edt_idade.Text='') or (edt_telefone.Text='') or (edt_sexo.Text='') then begin Showmessage('Preencha todos os campos !'); end else begin if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO INSTRUTORES ' + '(NOME, IDADE, TELEFONE, SEXO) VALUES '+ '('+ QuotedStr(edt_nome.Text) + ','+ edt_idade.Text + ','+ QuotedStr(edt_telefone.Text) + ','+ QuotedStr(edt_sexo.Text) + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE INSTRUTORES SET '+ ' NOME ='+ QuotedStr(edt_nome.Text) + ', IDADE ='+ edt_idade.Text + ', TELEFONE ='+ QuotedStr(edt_telefone.Text) + ', SEXO ='+ QuotedStr(edt_sexo.Text) + ' WHERE COD_INSTRUTOR = '+ pk; 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; if operacao = 'novo' then begin ADOQuery_aux.SQL.Text:='SELECT COD_INSTRUTOR FROM INSTRUTORES ' + '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_INSTRUTOR').AsString; ADOQuery_aux.Close; end; desabilita_salvar(sender); bloqueia_campos; edt_cod.Text := pk; end; end; end;

Delphi com Banco de Dados Cliente/Servidor

206 de 332

Cdigo do evento OnClick do boto Alterar do Form_instrutores:

Cdigo do evento OnClick do boto Cancelar do Form_instrutores:

Delphi com Banco de Dados Cliente/Servidor

207 de 332

Cdigo do evento OnClick do boto Excluir do Form_instrutores:

procedure TForm_instrutores.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if pk = '' then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM INSTRUTORES ' + ' WHERE COD_INSTRUTOR = ' + pk; Form_logon.ConexaoBD.BeginTrans; 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

Cdigo do evento OnClick do boto Fechar do Form_instrutores:

Aps programar todos os eventos acima descritos, falta apenas criar a funcionalidade de pesquisa de instrutores. Iremos utilizar o form_pesquisa tambm 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:

Delphi com Banco de Dados Cliente/Servidor

208 de 332

Este boto ir chamar o form_pesquisa, portanto v em File > Use Unit... e selecione a unit_pesquisa. Em seguida salve as alteraes clicando em Save All.

No evento OnClick do objeto btn_localizar digite o seguinte cdigo:

Pronto, o cadastro de instrutores j est concludo! Vamos agora alterar o form_menu para chamar o form_instrutores. Acesse o form_menu e digite o seguinte no evento OnClick do boto Cadastro de Instrutores:

Delphi com Banco de Dados Cliente/Servidor

209 de 332

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

210 de 332

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 relao aos cadastros de usurios, cursos e instrutores. O cadastro de turmas depende de registros de outras tabelas e, desta forma, precisaremos manipular as tabelas de Cursos e Instrutores alm da tabela Turmas neste cadastro. Mos obra! Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_turmas e Turmas respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_turmas.

Delphi com Banco de Dados Cliente/Servidor

211 de 332

Insira 6 objetos BitBtn ao form_turmas. Arrume-os lado-a-lado e altere as propriedades Name e Caption de cada um deles conforme a tabela abaixo:

Name btn_novo btn_salvar btn_alterar btn_cancelar btn_excluir btn_fechar

Caption Novo Salvar Alterar Cancelar Excluir Fechar

Seu form deve ficar semelhante ao exibido a seguir:

Vamos agora criar as procedures e variveis que fazem o controle da tela, quelas que habilitam/desabilitam botes e os campos da tela conforme fizemos nos cadastros anteriores. No cadastro de turmas teremos algumas variveis a mais. Declare as variveis e procedures conforme a imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

212 de 332

Em seguida pressione Shift+Ctrl+C para criar o corpo das procedures.

Agora digite o cdigo de cada uma delas

Procedure bloqueia_campos:

Delphi com Banco de Dados Cliente/Servidor

213 de 332

Procedure desabilita_salvar:

Procedure habilita_salvar:

Delphi com Banco de Dados Cliente/Servidor

214 de 332

Procedure libera_campos:

Procedure limpa_campos:

Aps programar as procedures, insira ao form_turmas 4 objetos do tipo Edit e 4 objetos do tipo Label. Organize-os conforme mostrado abaixo:

Delphi com Banco de Dados Cliente/Servidor

215 de 332

Renomeie os Edits para edt_cod, edt_valor, edt_curso e edt_instrutor alm de limpar o contedo da propriedade Text de ambos. Configure a propriedade MaxLength dos Edits para 9, 6, 20 e 30 respectivamente. Altere tambm a propriedade Caption dos labels conforme exibido na imagem acima.

Ateno: Os campos Curso e Instrutor no sero digitados pelo usurio. Eles sero selecionados atravs de pesquisa. Sendo assim, o usurio no poder digitar nestes campos e, portanto, devemos alterar a procedure libera_campos para que ela no libere os objetos edt_curso e edt_instrutor. Acesse a procedure libera_campos da unit_turmas e faa a seguinte alterao:

Delphi com Banco de Dados Cliente/Servidor

216 de 332

Aps fazer a alterao descrita acima, insira um objeto ADOQuery ao form_turmas e altere a propriedade Name para ADOQuery_aux. Usaremos este objeto para executar os comandos SQL no banco de dados, porm, precisamos configurar a propriedade Connection do ADOQuery_aux. O ADOQuery ir utilizar a conexo 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.

Para que o usurio 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 botes atravs da propriedade Glyph. Organize estes novos botes conforme mostrado da imagem abaixo:

Estes novos botes s devem estar habilitados quando o form_turmas estiver em modo de edio. Sendo assim, devemos alterar as procedures habilita_gravar e desabilita_gravar contemplando os novos objetos.

Delphi com Banco de Dados Cliente/Servidor

217 de 332

Agora vamos programar todos os eventos do form_turmas comeando pelos novos botes. Estes novos botes faro uso do form_pesquisa e desta forma necessrio criar a referncia da unit_pesquisa na unit_turmas atravs da clusula Uses. Para isto v em File > Use Unit... e selecione a unit_pesquisa.

Cdigo do evento OnClick do objeto btn_curso:

Delphi com Banco de Dados Cliente/Servidor

218 de 332

Cdigo do evento OnClick do objeto btn_instrutor:

Cdigo do evento OnShow do Form_turmas:

Cdigo do evento OnClick do boto Novo do Form_turmas:

Delphi com Banco de Dados Cliente/Servidor

219 de 332

Cdigo do evento OnClick do boto Salvar do Form_turmas:

procedure TForm_turmas.btn_salvarClick(Sender: TObject); var deuerro : boolean; begin if (edt_cod.Text='') or (edt_valor.Text='') or (cod_curso='') or (cod_instrutor='') then begin Showmessage('Preencha todos os campos !'); end else begin if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO TURMAS VALUES ' + '('+ QuotedStr(edt_cod.Text) + ','+ QuotedStr(cod_curso) + ','+ cod_instrutor + ','+ edt_valor.Text + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE TURMAS SET '+ ' COD_TURMA ='+ QuotedStr(edt_cod.Text) + ', COD_CURSO ='+ QuotedStr(cod_curso) + ', COD_INSTRUTOR ='+ cod_instrutor + ', VALOR_AULA ='+ edt_valor.Text + ' WHERE COD_TURMA = '+ QuotedStr(pk); 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 invlido!') else if Form_logon.ErroBD(E.Message,'FK_Turmas_Instrutores') = 'Sim' then Showmessage('Instrutor invlido!') 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := edt_cod.Text; desabilita_salvar(sender); bloqueia_campos; end; end; end;

Delphi com Banco de Dados Cliente/Servidor

220 de 332

Cdigo do evento OnClick do boto Alterar do Form_turmas:

Cdigo do evento OnClick do boto Cancelar do Form_turmas:

Delphi com Banco de Dados Cliente/Servidor

221 de 332

Cdigo do evento OnClick do boto Excluir do Form_turmas:

procedure TForm_turmas.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if pk = '' then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM TURMAS ' + ' WHERE COD_TURMA = ' + QuotedStr(pk); Form_logon.ConexaoBD.BeginTrans; 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; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := ''; cod_curso := ''; cod_instrutor := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

Cdigo do evento OnClick do boto Fechar do Form_turmas:

O que acabamos de fazer foi programar todos os eventos da tela de cadastro de turmas. Entretanto nosso trabalho ainda no terminou, pois alm de construir a funcionalidade de pesquisa de turmas, devemos dar um tratamento especial ao campo Valor de cada aula.

Delphi com Banco de Dados Cliente/Servidor

222 de 332

O campo Valor de cada aula ser utilizado para o usurio informar valores numricos e, portanto devemos format-lo de maneira apropriada. Devemos formatar este campo para exibio na tela, edio do valor e para grav-lo no banco, ou seja, este campo ser formatado de 3 maneiras diferentes dependendo da situao. Para exibir o valor na tela devemos format-lo com os smbolos de casas decimais (,), milhar (.) e monetrio (R$). Quando o usurio for editar o valor, devemos retirar os smbolos de milhar (.) e monetrio (R$). J para a gravao no banco de dados devemos trocar a vrgula (,) por ponto (.), pois os gerenciadores de banco de dados (incluindo o SQL Server) utilizam como smbolo decimal o ponto (.) seguindo o padro americano. Alm disso, tambm devemos retirar os smbolos de milhar e monetrio.

Vamos ento criar uma funo que faa as devidas formataes de acordo com a situao. Declare uma funo chamada formata_valor que receber dois parmetros: o valor a ser formatado e o destino da formatao (Tela, Edio ou Banco de Dados). Esta funo retornar uma string com o valor formatado.

Aps declarar a funo, pressione a combinao de teclas Shift+Ctrl+C para o Delphi criar a estrutura da funo na seo implementation.

Delphi com Banco de Dados Cliente/Servidor

223 de 332

Agora digite o cdigo da funo que est exibido da imagem abaixo:

Com a funo criada, iremos programar os eventos OnEnter e OnExit do edt_valor alm de alterar o evento OnClick do boto Salvar. O evento OnEnter de um objeto executado quando este objeto recebe o foco do cursor e o evento OnExit ocorre quando o objeto perde o foco do cursor. No evento OnEnter do edt_valor iremos executar a funo para formatar o valor para edio. No evento OnExit iremos executar a funo para formatar o valor para exibio. J no OnClick do boto Salvar iremos executar a funo para formatar o valor para gravao no banco. Veja a seguir o cdigo destes eventos:

Delphi com Banco de Dados Cliente/Servidor

224 de 332

OnEnter do objeto edt_valor:

OnExit do objeto edt_valor:

Evento OnClick do boto Salvar (altere as linhas em destaque):

Delphi com Banco de Dados Cliente/Servidor

225 de 332

Aps programar todos os eventos acima descritos, falta apenas criar a funcionalidade de pesquisa de turmas. Para este cadastro no iremos utilizar o form_pesquisa, pois precisaremos de uma tela de pesquisa mais rebuscada e desta forma a tela genrica no nos atende. Vamos criar uma tela de especfica para pesquisa de turmas.

Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_pesquisa_turmas e Caption como Pesquisa Turma. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_pesquisa_turmas.

Insira ao form_pesquisa_turmas: 2 objetos Label, 1 objeto ComboBox, 1 objeto Edit, 1 objeto DBGrid e 4 objetos BitBtn. Altere a propriedade Caption dos objetos Label para Campo da pesquisa: e Texto a ser pesquisado. Altere a propriedade Name do ComboBox para cb_campo e do Edit para edt_texto. Limpe as propriedades Text do Edit e do ComboBox. Acesse a propriedade Items do ComboBox e digite as opes que sero listadas para o usurio. Veja a imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

226 de 332

Altere a propriedade Name dos objetos BitBtn para btn_pesquisar, btn_limpar, btn_selecionar e btn_cancelar. Altera a propriedade Caption dos objetos BitBtn para Pesquisar, Limpar, Selecionar e Cancelar. Altere a propriedade Name do DBGrid para grid_pesquisa_turma, expanda a propriedade Options dele e altere a opo dgRowSelect para True. Insira tambm um ADOQuery e um DataSource ao form_pesquisa_turma. Organize os objetos do form_pesquisa_turma conforme mostrado abaixo:

Altere a propriedade Name do ADOQuery para ADOQuery_pesquisa_turma e configure a propriedade Connection para Fom_logon.ConexaoBD. Mas antes v em File > Use Unit... e selecione a Unit_logon. Altere a propriedade Name do DataSource para ds_pesquisa_turma e configure a

propriedade DataSet para ADOQuery_pesquisa_turma. Em seguida configure a propriedade DataSource do DBgrid para ds_pesquisa_turma. Agora declare uma varivel chamada chave do tipo string na seo public da unit do form_pesquisa_turmas. A varivel chave ser utilizada para armazenar a chave primria do registro que for selecionado.

Delphi com Banco de Dados Cliente/Servidor

227 de 332

Agora iremos programar os eventos desta tela.

Evento OnShow do Form_pesquisa_turma:

Evento OnClick do boto Pesquisar:

procedure TForm_pesquisa_turmas.btn_pesquisaClick(Sender: TObject); var condicao : string; sql : string; begin condicao := ''; if cb_campo.ItemIndex = 0 then condicao := ' WHERE TURMAS.COD_TURMA LIKE ' + QuotedStr(edt_texto.Text) else if cb_campo.ItemIndex = 1 then condicao := ' WHERE CURSOS.NOME LIKE ' + QuotedStr(edt_texto.Text) else if cb_campo.ItemIndex = 2 then condicao := ' WHERE INSTRUTORES.NOME LIKE ' + QuotedStr(edt_texto.Text); if (condicao='') or (edt_texto.Text='') then Showmessage('Pesquisa invlida!') else begin sql := 'SELECT TURMAS.COD_TURMA, ' + ' CURSOS.NOME AS CURSO, ' + ' INSTRUTORES.NOME AS INSTRUTOR ' + 'FROM TURMAS ' + 'INNER JOIN CURSOS '+ ' ON TURMAS.COD_CURSO = CURSOS.COD_CURSO '+ 'INNER JOIN INSTRUTORES '+ ' ON TURMAS.COD_INSTRUTOR = INSTRUTORES.COD_INSTRUTOR '; ADOQuery_pesquisa_turma.Close; ADOQuery_pesquisa_turma.SQL.Text := sql + condicao; ADOQuery_pesquisa_turma.Open; end; end;

Delphi com Banco de Dados Cliente/Servidor

228 de 332

Evento OnClick do boto Limpar:

Evento OnClick do boto Selecionar:

Evento OnClick do boto Cancelar:

Pronto, o form_pesquisa_turmas j est concludo! Salve as alteraes e volte ao form_turmas.

Delphi com Banco de Dados Cliente/Servidor

229 de 332

Estando no form_turmas, insira um objeto BitBtn. Altere as propriedades Name e Caption para btn_localizar e Localizar respectivamente. Arrume o objeto conforme mostrado a seguir:

Este boto ir chamar o form_pesquisa_turmas, portanto v em File > Use Unit... e selecione a unit_pesquisa_turmas. Em seguida salve as alteraes clicando em Save All.

No evento OnClick do objeto btn_localizar digite o seguinte cdigo:

procedure TForm_turmas.btn_localizarClick(Sender: TObject); var sql : string; begin limpa_campos; bloqueia_campos; desabilita_salvar(sender); Form_pesquisa_turmas.ShowModal; if Form_pesquisa_turmas.chave <> '' then begin pk := Form_pesquisa_turmas.chave; sql := 'SELECT TURMAS.COD_TURMA, TURMAS.VALOR_AULA, ' + ' CURSOS.NOME AS CURSO, CURSOS.COD_CURSO, ' + ' INSTRUTORES.NOME AS INSTRUTOR, INSTRUTORES.COD_INSTRUTOR ' + 'FROM TURMAS ' + 'INNER JOIN CURSOS '+ ' ON TURMAS.COD_CURSO = CURSOS.COD_CURSO '+ 'INNER JOIN INSTRUTORES '+ ' ON TURMAS.COD_INSTRUTOR = INSTRUTORES.COD_INSTRUTOR ' + ' WHERE TURMAS.COD_TURMA = ' + QuotedStr(pk); 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;

Delphi com Banco de Dados Cliente/Servidor

230 de 332

Pronto, a funcionalidade de pesquisa de turmas j est concluda! Vamos agora alterar o form_menu para chamar o form_turmas. Acesse o form_menu e digite o seguinte no evento OnClick do boto Cadastro de Turmas:

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

231 de 332

Cadastro de Alunos
O cadastro de alunos a funcionalidade responsvel por fazer a manuteno da tabela Alunos do banco de dados Academico. Neste captulo iremos construir esta funcionalidade.

Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_alunos e Alunos respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_alunos.

Delphi com Banco de Dados Cliente/Servidor

232 de 332

O cadastro de alunos idntico ao cadastro de instrutores. Eles possuem as mesmas funcionalidades. As tabelas Alunos e Instrutores possuem os mesmos campos sendo a nica exceo o nome do campo da chave primria que na tabela de Instrutores cod_instrutor enquanto na tabela Alunos cod_aluno. Sendo assim, repita os mesmos procedimentos descritos no captulo referente ao cadastro de instrutores aplicando as devidas modificaes.

Os cdigos dos eventos OnClick dos botes Salvar, Excluir e Localizar devem ser ajustados para a tabela Alunos. Abaixo segue os cdigos destes botes:

OnClick do boto Salvar do Form_alunos:

procedure TForm_alunos.btn_salvarClick(Sender: TObject); var deuerro : boolean; begin if (edt_nome.Text='') or (edt_idade.Text='') or (edt_telefone.Text='') or (edt_sexo.Text='') then begin Showmessage('Preencha todos os campos !'); end else begin if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO ALUNOS ' + '(NOME, IDADE, TELEFONE, SEXO) VALUES '+ '('+ QuotedStr(edt_nome.Text) + ','+ edt_idade.Text + ','+ QuotedStr(edt_telefone.Text) + ','+ QuotedStr(edt_sexo.Text) + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE ALUNOS SET '+ ' NOME ='+ QuotedStr(edt_nome.Text) + ', IDADE ='+ edt_idade.Text + ', TELEFONE ='+ QuotedStr(edt_telefone.Text) + ', SEXO ='+ QuotedStr(edt_sexo.Text) + ' WHERE COD_ALUNO = '+ pk; 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 matrculas cadastradas para este aluno!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else

Delphi com Banco de Dados Cliente/Servidor

233 de 332

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;

OnClick do boto Excluir do Form_alunos:

procedure TForm_alunos.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if pk = '' then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM ALUNOS ' + ' WHERE COD_ALUNO = ' + pk; Form_logon.ConexaoBD.BeginTrans; 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 matrculas cadastradas para este aluno!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

Delphi com Banco de Dados Cliente/Servidor

234 de 332

OnClick do boto Localizar do Form_alunos:

Aps concluir o cadastro de alunos, altere o form_menu para chamar o form_alunos. Acesse o form_menu e digite o seguinte no evento OnClick do boto Cadastro de Alunos:

Delphi com Banco de Dados Cliente/Servidor

235 de 332

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

236 de 332

Cadastro de Matrculas
O cadastro de matrculas consiste na funcionalidade que permitir ao usurio matricular os alunos nas turmas. Como todos os demais cadastros, esta funcionalidade ser responsvel por fazer a manuteno de uma tabela do banco de dados Academico. Neste caso ser a tabela Matriculas. Para fazer uma matrcula, o usurio deve selecionar o aluno e a turma em que o aluno deseja se matricular. Portanto, nesta tela utilizaremos outras tabelas alm da tabela principal do cadastro. Chega de conversa e vamos ao trabalho! Insira um novo Form ao projeto.

Configure as propriedades Name e Caption do novo Form como Form_matriculas e Matrculas respectivamente. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_matriculas.

Delphi com Banco de Dados Cliente/Servidor

237 de 332

Insira 6 objetos BitBtn ao form_matriculas. Arrume-os lado-a-lado e altere as propriedades Name e Caption de cada um deles conforme a tabela abaixo:

Name btn_novo btn_salvar btn_alterar btn_cancelar btn_excluir btn_fechar

Caption Novo Salvar Alterar Cancelar Excluir Fechar

Seu form deve ficar semelhante ao exibido a seguir:

Vamos agora criar as procedures e variveis que fazem o controle da tela, quelas que habilitam/desabilitam botes e os campos da tela conforme fizemos nos cadastros anteriores. No cadastro de matrculas teremos duas variveis pk, pois a chave primria composta pelo cdigo do aluno e pelo cdigo da turma. Faa as seguintes declaraes:

Em seguida pressione Shift+Ctrl+C para criar o corpo das procedures.

Delphi com Banco de Dados Cliente/Servidor

238 de 332

Agora digite o cdigo de cada uma delas.

Procedure bloqueia_campos:

Delphi com Banco de Dados Cliente/Servidor

239 de 332

Procedure desabilita_salvar:

Procedure habilita_salvar:

Delphi com Banco de Dados Cliente/Servidor

240 de 332

Procedure libera_campos:

Procedure limpa_campos:

Aps programar as procedures, insira ao form_matriculas 2 objetos do tipo Edit e 2 objetos do tipo Label. Organize-os conforme mostrado abaixo:

Delphi com Banco de Dados Cliente/Servidor

241 de 332

Renomeie os Edits para edt_aluno, e edt_turma alm de limpar o contedo da propriedade Text de ambos. Altere tambm a propriedade Caption dos labels conforme exibido na imagem acima.

Ateno: Os campos Aluno e Turma no sero digitados pelo usurio. Eles sero selecionados atravs de pesquisa. Sendo assim, o usurio no poder digitar nestes campos e, portanto, devemos alterar a procedure libera_campos para que ela no libere os objetos edt_aluno e edt_turma. Acesse a procedure libera_campos da unit_matriculas e faa a seguinte alterao:

Aps fazer a alterao descrita acima, insira um objeto ADOQuery ao form_matriculas e altere a propriedade Name para ADOQuery_aux. Usaremos este objeto para executar os comandos SQL no banco de dados, porm, precisamos configurar a propriedade Connection do ADOQuery_aux. O ADOQuery ir utilizar a conexo 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.

Para que o usurio 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 botes atravs da propriedade Glyph. Organize estes novos botes conforme mostrado da imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

242 de 332

Estes novos botes s devem estar habilitados quando o form_matriculas estiver em modo de edio. Sendo assim, devemos alterar as procedures habilita_gravar e

desabilita_gravar contemplando os novos objetos.

Delphi com Banco de Dados Cliente/Servidor

243 de 332

Agora vamos programar todos os eventos do form_matriculas comeando pelos novos botes. Os objetos btn_aluno e btn_turma faro uso do form_pesquisa e

form_pesquisa_turmas respectivamente. Desta forma necessrio criar a referncia da unit_pesquisa e da unit_pesquisa_turmas na unit_matriculas atravs da clusula Uses. Para isto v em File > Use Unit... e selecione a unit_pesquisa e a unit_pesquisa_turmas.

Cdigo do evento OnClick do objeto btn_aluno:

Cdigo do evento OnClick do objeto btn_turma:

Delphi com Banco de Dados Cliente/Servidor

244 de 332

Cdigo do evento OnShow do Form_matriculas:

Cdigo do evento OnClick do boto Novo do Form_matriculas:

Delphi com Banco de Dados Cliente/Servidor

245 de 332

Cdigo do evento OnClick do boto Salvar do Form_matriculas:

procedure TForm_matriculas.btn_salvarClick(Sender: TObject); var deuerro : boolean; begin if (cod_aluno='') or (edt_turma.Text='') then begin Showmessage('Informe todos os campos !'); end else begin if operacao = 'novo' then adoquery_aux.SQL.Text := 'INSERT INTO MATRICULAS VALUES ' + '('+ QuotedStr(cod_turma) + ','+ cod_aluno + ')' else if operacao = 'alterar' then adoquery_aux.SQL.Text := 'UPDATE MATRICULAS SET '+ ' COD_TURMA ='+ QuotedStr(cod_turma) + ' ,COD_ALUNO ='+ cod_aluno + ' WHERE COD_TURMA = '+ QuotedStr(pk_turma) + ' AND COD_ALUNO = '+ pk_aluno; 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('Matrcula j cadastrada!') else if Form_logon.ErroBD(E.Message,'FK_Frequencias_Matriculas') = 'Sim' then Showmessage('Existem frequncias lanadas para esta matrcula!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk_turma := cod_turma; pk_aluno := cod_aluno; desabilita_salvar(sender); bloqueia_campos; end; end; end;

Delphi com Banco de Dados Cliente/Servidor

246 de 332

Cdigo do evento OnClick do boto Alterar do Form_matriculas:

Cdigo do evento OnClick do boto Cancelar do Form_ matriculas:

Delphi com Banco de Dados Cliente/Servidor

247 de 332

Cdigo do evento OnClick do boto Excluir do Form_matriculas:

procedure TForm_matriculas.btn_excluirClick(Sender: TObject); var deuerro : boolean; begin if (pk_turma = '') or (pk_aluno = '') then Showmessage('Impossvel excluir!') else begin adoquery_aux.SQL.Text := ' DELETE FROM MATRICULAS ' + ' WHERE COD_TURMA = ' + QuotedStr(pk_turma) + ' AND COD_ALUNO = ' + cod_aluno; Form_logon.ConexaoBD.BeginTrans; 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 frequncias lanadas para esta matrcula!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then begin Form_logon.ConexaoBD.RollbackTrans; end else begin Form_logon.ConexaoBD.CommitTrans; pk_turma := ''; pk_aluno := ''; cod_turma := ''; cod_aluno := ''; desabilita_salvar(sender); limpa_campos; bloqueia_campos; end; end; end;

Cdigo do evento OnClick do boto Fechar do Form_matriculas:

Delphi com Banco de Dados Cliente/Servidor

248 de 332

Aps programar todos os eventos acima descritos, falta apenas criar a funcionalidade de pesquisa de matrculas. O usurio ir pesquisar uma matrcula atravs do aluno, ou seja, atravs do aluno o usurio ir selecionar a matrcula desejada. Sendo assim, podemos utilizar a tela genrica de pesquisa: o form_pesquisa. Entretanto, precisaremos fazer uma pequena modificao no form_pesquisa, mas nada que afete as outras telas que tambm fazem uso dele. O form_pesquisa, da maneira como est, retorna como chave primria o primeiro campo do registro selecionado. Como o cadastro de matrculas possui uma chave composta por dois campos, iremos alterar o form_pesquisa para que ele retorne tambm o segundo campo do registro selecionado. Acesse a seo public da unit_pesquisa e declare a varivel chave_aux.

Em seguida, acesse o evento OnClick do boto Selecionar e faa a seguinte alterao no cdigo:

Pornto, agora j podemos uilizar o form_pesquisa tambm no cadastro de matrculas!

Delphi com Banco de Dados Cliente/Servidor

249 de 332

Insira um objeto BitBtn ao form_matriculas e altere as propriedades Name e Caption para btn_localizar e Localizar respectivamente. Arrume o objeto conforme mostrado a seguir:

Este boto ir chamar o form_pesquisa, portanto v em File > Use Unit... e selecione a unit_pesquisa. Em seguida salve as alteraes clicando em Save All. No evento OnClick do objeto btn_localizar digite o seguinte cdigo:

Delphi com Banco de Dados Cliente/Servidor

250 de 332

Pronto, o cadastro de matriculas j est concludo! Vamos agora alterar o form_menu para chamar o form_matriculas. Acesse o form_menu e digite o seguinte no evento OnClick do boto Matrculas:

Agora s executar o projeto e testar tudo o que foi criado!

Delphi com Banco de Dados Cliente/Servidor

251 de 332

Criando o Lanamento de Aulas


O lanamento 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 informtica. Eles iro utilizar esta opo apenas para lanar as aulas que j aconteceram, pois no ser permitido lanar aulas

antecipadamente conforme especificado no captulo de planejamento da aplicao. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_lanca_aulas e Caption como Lanamento de aulas. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_lanca_aulas.

Delphi com Banco de Dados Cliente/Servidor

252 de 332

Aps salvar o novo form, insira 2 objetos Label e um objeto Edit ao form_lanca_aulas. Altere a propriedade Caption dos Labels 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 tambm um objeto DateTimePicker que est localizada na guia Win32 da paleta de componentes. Este objeto uma espcie de calendrio.

Configure as propriedades do objeto DateTimePicker exatamente como a tabela abaixo:

Propriedade Format Name Time

Valor dd/MM/yyyy dt_aula 00:00:00

Insira 2 objetos BitBtn ao form_lanca_aulas, configure Name como btn_lancar e btn_cancelar. Configure Caption como Lanar e Cancelar. Alm disso, insira um outro BitBtn para selecionar a turma. Configure-o da mesma maneira que foi configurado no form_matriculas. Em seguida, insira um ADOQuery. Altere a propriedade Name do ADOQuery para ADOQuery_aux e configure a propriedade Connection para Fom_logon.ConexaoBD. Mas antes v em File > Use Unit... e selecione a Unit_logon.

Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

Agora vamos programar os eventos desta tela.

Delphi com Banco de Dados Cliente/Servidor

253 de 332

Evento OnShow do form_lanca_aulas:

Evento OnClick do btn_turma:

Evento OnClick do btn_lancar

procedure TForm_lanca_aulas.btn_lancarClick(Sender: TObject); var data_aula : string; deuerro : boolean; begin if edt_turma.Text = '' then ShowMessage('Informe a turma!') else if dt_aula.Date > date then ShowMessage('No permitido lanar aulas antecipadamente !') else begin data_aula := FormatDateTime('mm/dd/yyyy',dt_aula.Date); ADOQuery_aux.SQL.Text := 'INSERT INTO AULAS VALUES '+ '('+ QuotedStr(edt_turma.Text) + ','+ QuotedStr(data_aula) + ','+ QuotedStr('N') + ')'; Form_logon.ConexaoBD.BeginTrans; try ADOQuery_aux.ExecSQL; deuerro := false; except on E: Exception do begin

Delphi com Banco de Dados Cliente/Servidor

254 de 332

deuerro := true; if Form_logon.ErroBD(E.Message,'PK_Aulas') = 'Sim' then Showmessage('Aula j lanada!') else ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then Form_logon.ConexaoBD.RollbackTrans else begin Form_logon.ConexaoBD.CommitTrans; ShowMessage('Aula lanada com sucesso!'); edt_turma.Clear; dt_aula.Date := Date; end; end; end;

Obs.: No cdigo acima, formatamos a data para o formato americano mm/dd/yyyy, porque assim que o SQL Server trabalha internamente. Na verdade, o SQL Server armazena datas no formato yyyy-mm-dd, mas tambm entende o formato mm/dd/yyyy que particularmente achamos mais simples.

Evento OnClick do btn_cancelar:

Pronto, o lanamento de aulas j est concludo! Salve as alteraes clicando em Save All. Vamos agora alterar o form_menu para chamar o form_lanca_aulas. Acesse o form_menu e digite o seguinte no evento OnClick do boto Lanamento de Aulas:

Delphi com Banco de Dados Cliente/Servidor

255 de 332

Em seguida, execute o projeto para testar a nova funcionalidade!

Delphi com Banco de Dados Cliente/Servidor

256 de 332

Criando o Lanamento de Presena


O lanamento de presena mais uma funcionalidade a ser utilizada pelos instrutores da escola de informtica. A idia a seguinte: ao trmino da aula o instrutor lana a aula dada e em seguida faz o lanamento de presena. Ele seleciona a turma e a data da aula e o sistema lista todos os alunos matriculados naquela turma. O instrutor ento marca quem est presente e no marca quem faltou, em seguida confirma o lanamento de presena. Neste momento o sistema varre a lista de alunos verificando se cada linha est ou no marcada. Se estiver, o sistema grava S no campo presente da tabela de Frequencias, do contrrio ele grava o campo presente com o valor N. Vamos ento implementar esta lgica. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_lanca_presenca e Caption como Lanamento de Presena. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_lanca_presenca.

Delphi com Banco de Dados Cliente/Servidor

257 de 332

Aps salvar o novo form, insira 2 objetos Label, 1 objeto Edit e um ComboBox ao form_lanca_presenca. Altere a propriedade Caption dos Labels 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. Alm disso, insira um outro BitBtn para selecionar a turma. Configure-o da mesma maneira que foi configurado no form_matriculas. Insira tambm 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.

Em seguida, insira um ADOQuery. Altere a propriedade Name do ADOQuery para ADOQuery_aux e configure a propriedade Connection para Fom_logon.ConexaoBD. Mas antes v em File > Use Unit... e selecione a Unit_logon.

Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

Agora vamos programar os eventos desta tela.

Delphi com Banco de Dados Cliente/Servidor

258 de 332

Evento OnShow do form_lanca_presenca:

Evento OnClick do objeto btn_turma:

Evento OnEnter do objeto cb_aulas:

procedure TForm_lanca_presenca.cb_aulasEnter(Sender: TObject); var data : TDateTime; begin cb_aulas.Clear; if edt_turma.Text = '' then ShowMessage('Selecione uma turma!') else begin //Busca as aulas que ainda no tiveram a frequncia lanada ADOQuery_aux.SQL.Text := 'SELECT DATA FROM AULAS '+ 'WHERE COD_TURMA=' +QuotedStr(edt_turma.Text)+ 'AND DATA NOT IN ' + '(SELECT DATA FROM FREQUENCIAS '+ ' WHERE COD_TURMA='+QuotedStr(edt_turma.Text)+')'+ 'ORDER BY DATA DESC'; ADOQuery_aux.Open; if ADOQuery_aux.IsEmpty then ShowMessage('No existem aulas desta turma para lanamento de frequncia!') else begin While not ADOQuery_aux.Eof do begin

Delphi com Banco de Dados Cliente/Servidor

259 de 332

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;

Evento OnClick do objeto btn_listar_alunos:

Delphi com Banco de Dados Cliente/Servidor

260 de 332

Evento OnClick do objeto btn_confirmar:

procedure TForm_lanca_presenca.btn_confirmarClick(Sender: TObject); var i : integer; cod_aluno, presente, data : string; deuerro : boolean; begin Form_logon.ConexaoBD.BeginTrans; try deuerro := false; data := FormatDateTime('mm/dd/yyyy',StrToDate(cb_aulas.Text)); for i := 0 to ck_lista_alunos.Items.Count -1 do begin ck_lista_alunos.Selected[i] := true; cod_aluno := copy(ck_lista_alunos.Items.Strings[i],1,3); if ck_lista_alunos.Checked[i] then presente := 'S' else presente := 'N'; ADOQuery_aux.SQL.Text := 'INSERT INTO FREQUENCIAS VALUES '+ '('+ QuotedStr(edt_turma.Text) + ','+ cod_aluno + ','+ QuotedStr(data) + ','+ QuotedStr(presente) + ')'; ADOQuery_aux.ExecSQL; end; except on E: Exception do begin deuerro := true; ShowMessage('Ocorreu o seguinte erro: ' + E.Message); end; end; if deuerro = true then form_logon.ConexaoBD.RollbackTrans else begin Form_logon.ConexaoBD.CommitTrans; ShowMessage('Lanamento efetuado com sucesso!'); edt_turma.Clear; cb_aulas.Clear; ck_lista_alunos.Clear; end; end;

Evento OnClick do objeto btn_fechar:

Delphi com Banco de Dados Cliente/Servidor

261 de 332

Pronto, o lanamento de presena j est concludo! Salve as alteraes clicando em Save All. Vamos agora alterar o form_menu para chamar o form_lanca_presenca. Acesse o form_menu e digite o seguinte no evento OnClick do boto Frequncias:

Execute o projeto e confira o que acabamos de construir!

Delphi com Banco de Dados Cliente/Servidor

262 de 332

Montando o Pagamento de Instrutores


Nos dois ltimos captulos construmos os lanamentos de aula e de presena. Estas funcionalidades sero utilizadas pelos instrutores para registrar o trabalho desenvolvido na escola de informtica. Em contrapartida, cada instrutor deve ser remunerado pelas aulas dadas. Portanto, criaremos agora a funcionalidade que permitir ao administrador da escola de informtica contabilizar as aulas de cada instrutor e ento efetuar o devido pagamento.

O pagamento de instrutores, no que diz respeito aplicao, consiste na gerao do demonstrativo de aulas dadas e na marcao de cada aula como paga. Para gerar o demonstrativo, o usurio dever selecionar o instrutor e o ms que deseja contabilizar as aulas. Somente estaro disponveis os meses que possurem aulas no pagas. Aps o usurio selecionar o instrutor e o ms desejado, o sistema ir contabilizar todas as aulas do ms em questo agrupadas por turma. Quando o usurio fechar o demonstrativo, o sistema deve perguntar se o usurio deseja marcar as aulas do demonstrativo como pagas, caso negativo, o sistema cancela a operao. Vamos ento desenvolver o que foi dito acima.

Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_pag_instrutores e Caption como Pagamento de Instrutores. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_pag_instrutores.

Delphi com Banco de Dados Cliente/Servidor

263 de 332

Aps salvar o novo form, insira 2 objetos Label, 1 objeto Edit e um ComboBox ao form_pag_instrutores. Altere a propriedade Caption dos Labels para Instrutor e Ms/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. Alm 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. Ns iremos utilizar um para fazer as consultas e demais operaes no banco e o outro para montar o SELECT do demonstrativo. Altere a propriedade Name dos ADOQuerys 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. Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

Delphi com Banco de Dados Cliente/Servidor

264 de 332

Para criar o demonstrativo, iremos utilizar o editor de relatrios Rave Reports que faz parte do Delphi 7. Os componentes necessrios criao de um relatrio usando o Rave Reports esto na guia Rave da paleta de componentes. Precisamos utilizar apenas dois componentes desta guia para montar nosso demonstrativo.

Insira estes dois objetos ao form_pag_instrutores. O objeto RvProject far referncia ao arquivo de projeto de relatrios que ser criado quando fizermos o demonstrativo no Rave. O RvDataSetConnection o objeto o que utilizaremos para ligue para conectar e ao o ao

ADOQuery_demonstrativo. RvDataSetConnection para

Renomeie

RvProject

rel_demonstrativo o

ds_demonstrativo.

Agora

ds_demonstrativo

ADOQuery_demonstrativo atravs da propriedade DataSet.

Ateno: O comando SELECT do ADOQuery utilizado pelo ds_demonstrativo ser montado dinamicamente via cdigo, entretanto, para construir nosso demonstrativo no ambiente do Rave Reports devemos estabelecer conexo com o banco de dados e ativar o ADOQuery_demonstrativo. Isto necessrio apenas para que o Rave consiga obter a relao de campos presentes no ADOQuery. Quando terminarmos de criar o demonstrativo, iremos desativar o ADOQuery_demonstrativo e finalizar a conexo com o banco de dados.

Vamos agora estabelecer a conexo com o banco de dados atravs do objeto ConexaoBD que est no form_logon. Lembramos que iremos fazer isto apenas para criar o relatrio, assim que acabarmos iremos desconectar o objeto.

Delphi com Banco de Dados Cliente/Servidor

265 de 332

Estando no form_logon, selecione o ConexaoBD e em seguida, clique sobre o boto ... da propriedade ConnectionString. A propriedade ConnectionString que define o banco de dados que iremos acessar. Aqui definimos se vamos acessar um banco de dados Oracle, SQL Server ou Microsoft Access entre outros, alm disso, especificamos o nome do servidor, o usurio e a senha que ser utilizada para acessar o banco de dados. Na tela que surgiu aps clicar sobre o boto ..., clique sobre o boto Build...

A primeira opo que devemos configurar o software de banco de dados que iremos acessar, em nosso caso, iremos acessar um servidor SQL Server, portanto selecione a opo Microsoft OLE DB Provider for SQL Server. Clique em Avanar para continuar com a configurao do objeto ConexaoDB.

Delphi com Banco de Dados Cliente/Servidor

266 de 332

Agora devemos informar o nome do servidor SQL Server que desejamos acessar. Voc tambm pode informar o endereo IP do servidor caso no saiba ou no queira usar o nome do servidor. A prxima opo usurio e a senha utilizada para acessar o servidor. Aqui voc pode utilizar o usurio admin_academico que criamos para ser utilizado pela aplicao. Marque a opo Permitir salvamento de senha. A ltima opo a configurar o banco de dados que iremos acessar. Selecione o banco de dados Academico.

Clique no boto Testar conexo para checar se est tudo Ok.

V clicando em OK at voltar ao Form_logon. Agora selecione o objeto ConexaoBD e altere a propriedade Connected mudando o valor de False para True. Isto faz com que o objeto estabelea a conexo com o servidor de banco de dados.

Delphi com Banco de Dados Cliente/Servidor

267 de 332

Agora volte ao form_pag_instrutores e selecione o objeto ADOQuery_demonstrativo. Acesse a propriedade SQL dele e digite o seguinte:

Aps digitar o SELECT acima, altere a propriedade Active para True.

Vamos ento criar nosso demonstrativo no Rave. D um clique duplo no objeto rel_demonstrativo, ser exibido o ambiente do Rave Reports.

Delphi com Banco de Dados Cliente/Servidor

268 de 332

esquerda temos a janela de propriedades semelhante ao Object Inspector. Na tela principal temos a rea de criao do relatrio e a direita existe uma outra janela onde esto a Report Library, o Global Page Catalog e o Data View Dictionary. Na parte superior temos a paleta de componentes para confeco de relatrios. A guia Report a que mais iremos utilizar:

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object:

Delphi com Banco de Dados Cliente/Servidor

269 de 332

Na janela que surgir, selecione a opo Direct Data View e clique em Next.

Ser exibido outra tela, ento selecione o objeto ds_demonstrativo para ligar o Rave com o ADOQuery_demonstrativo que possui o SELECT que configuramos anteriormente.

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_demonstrativo.

Delphi com Banco de Dados Cliente/Servidor

270 de 332

Vamos ento montar nosso relatrio, para isso v at a guia Report. Veja os principais objetos:

Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho.

Delphi com Banco de Dados Cliente/Servidor

271 de 332

Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Como dito anteriormente, o demonstrativo de aulas do instrutor deve ser agrupado por turma, portanto, iremos inserir mais uma banda que ser o cabealho do grupo. Insira um objeto Band. Renomeie o objeto para cabecalho_turma. Na propriedade BandStyle, clique em ... e marque a opo Group Header. Assim esta banda ser o cabealho do agrupamento de turmas.

Delphi com Banco de Dados Cliente/Servidor

272 de 332

Agora vamos inserir a banda principal, onde sero listadas as aulas dadas pelos instrutores. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para aulas. Na propriedade BandStyle, clique em ... e marque a opo Detail.

Aps criar a banda de detalhe, vamos inserir as bandas de rodap de grupo e de rodap do relatrio. 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.

A regio do relatrio deve ficar semelhante figura abaixo:

Delphi com Banco de Dados Cliente/Servidor

273 de 332

At agora o que fizemos foi apenas criar as bandas e definir o estilo de cada uma. Vamos ento configurar as propriedades de cada uma.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand aulas

Valor

Selecione a Band cabealho_turma e altere as propriedades seguindo a tabela abaixo: Propriedade ControllerBand GroupDataView GroupKey aulas DataView1 COD_TURMA Valor

Selecione a DataBand aulas e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1 DATA

Valor

Selecione a Band rodape_turma e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand GroupDataView GroupKey aulas DataView1

Valor

COD_TURMA

Selecione a Band rodape e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand aulas

Valor

Pronto, todas as bandas do demonstrativo esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Delphi com Banco de Dados Cliente/Servidor

274 de 332

Salve o arquivo do projeto do demonstrativo na mesma pasta do projeto como o nome demonstrativo.rav:

A partir de agora, sempre que quiser salvar as alteraes no projeto deste relatrio, basta clicar sobre o boto Save Project:

Delphi com Banco de Dados Cliente/Servidor

275 de 332

Aps salvar o nosso projeto Rave, vamos agora inserir os objetos nas bandas criadas. Iremos utilizar 3 objetos para este relatrio:

Este objeto utilizado para exibio de textos fixos. Ele semelhante ao objeto Label do Delphi.

Este objeto utilizado para exibio de um campo de uma tabela de um banco de dados.

Este objeto utilizado para realizar clculos com um campo de uma tabela de um banco de dados.

Insira 3 objetos Text Band cabecalho. Altere a propriedade Text deles para Demonstrativo de Aulas, Cdigo do Instrutor e Nome do Instrutor. Em seguida, os organize conforme exibido na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

276 de 332

Agora insira 2 objetos DataText Band cabecalho. Altere a propriedade DataView deles para DataView1. Em seguida, altere a propriedade DataField para COD_INSTRUTOR e NOME respectivamente. Posicione-os lado-a-lado com os objetos Text.

Na Band cabecalho_turma, insira 1 objeto Text e 1 DataText. Altere a propriedade Text do objeto Text para Turma. Altere a propriedade DataView para DataView1 e DataField para COD_TURMA. Insira mais 2 objetos Text Band cabecalho_turma. Altere a propriedade Text para Data da Aula e Valor respectivamente. Veja abaixo como deve ficar seu projeto:

Agora insira 2 objetos DataText DataBand aulas. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para DATA e VALOR_AULA respectivamente. Altere a propriedade FontJustify do DataText DATA para pjCenter e do DataText VALOR_AULA para pjRight. Posicione-os conforme apresentado na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

277 de 332

Agora s falta inserir os objetos das bandas de rodap. Insira um objeto CalcText na Band rodape_turma. Insira tambm um objeto Hline (guia Drawing).

Altere as propriedade do objeto CalcText conforme a tabela abaixo:

Propriedade CalcType Controller DataView DataField DisplayFormat FontJustify ctSum aulas

Valor

DataView1 VALOR_AULA R$ ,0.00 pjRight

Em seguida, arrume o CalcText e o HLine conforme mostrado na figura a seguir:

Delphi com Banco de Dados Cliente/Servidor

278 de 332

E por fim, vamos inserir os objetos da Band rodape. Insira um objeto Rectangle (guia Drawing).

Insira tambm 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 CalcType Controller DataView DataField DisplayFormat FontJustify ctSum aulas

Valor

DataView1 VALOR_AULA R$ ,0.00 pjRight

Agora arrume os objetos da Band rodape conforme exibido na imagem a seguir:

Delphi com Banco de Dados Cliente/Servidor

279 de 332

Salve as alteraes e feche o ambiente do Rave Reports para voltarmos ao Delphi.

Estando de volta ao Delphi, iremos desativar o ADOQuery_demonstrativo e finalizar a conexo estabelecida pelo ConexaoBD. Antes disso, iremos adicionar os campos do SELECT ao ADOQuery_demonstrativo. Faremos isto para poder configurar o formato de exibio dos campos de data e valor de aula.

Clique com o boto direito do mouse sobre o ADOquery_demonstrativo e acesse a opo Fields Editor.

Na janela que surgir, clique novamente com o boto direito do mouse e selecione a opo Add all fields:

Delphi com Banco de Dados Cliente/Servidor

280 de 332

Selecione o campo DATA e altere a propriedade DisplayFormat para dd/mm/yyyy. Em seguida, selecione o campo VALOR_AULA e altere a propriedade DisplayFormat para R$ ,0.00 Estas configuraes so necessrias para formatar a exibio destes campos.

Selecione ADOQuery_demonstrativo. Altere a propriedade Active para False e limpe a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente. Calma, no estamos malucos, isto apenas para o Delphi limpar o cache da conexo.

Depois de todo este trabalho, volte para o form_pag_instrutores e programe os eventos desta tela. Antes de programar os eventos, declare a seguinte varivel:

Delphi com Banco de Dados Cliente/Servidor

281 de 332

Evento OnShow do form_pag_instrutores:

Evento OnClick do boto btn_instrutor:

Delphi com Banco de Dados Cliente/Servidor

282 de 332

Evento OnEnter do objeto cb_mes_ano:

Delphi com Banco de Dados Cliente/Servidor

283 de 332

Evento OnClick do objeto btn_gerar:

procedure TForm_pag_instrutores.btn_gerarClick(Sender: TObject); var mes,ano, sql : string; begin if (cod_instrutor='') or (cb_mes_ano.Text='') then Showmessage('Informaes Invlidas!') else begin mes := copy(cb_mes_ano.Text,1,2); ano := copy(cb_mes_ano.Text,4,4); sql :=' ' ' ' ' ' ' ' ' ' ' ' SELECT INSTRUTORES.COD_INSTRUTOR, INSTRUTORES.NOME, '+ AULAS.COD_TURMA, AULAS.DATA, TURMAS.VALOR_AULA '+ FROM AULAS '+ INNER JOIN TURMAS ON '+ AULAS.COD_TURMA = TURMAS.COD_TURMA '+ INNER JOIN INSTRUTORES ON '+ TURMAS.COD_INSTRUTOR = INSTRUTORES.COD_INSTRUTOR '+ WHERE TURMAS.COD_INSTRUTOR =' + cod_instrutor + AND MONTH(DATA) =' + mes + AND YEAR(DATA) = ' + ano + AND AULAS.PAGA = ' + QuotedStr('N') + ORDER BY TURMAS.COD_TURMA, AULAS.DATA ';

ADOQuery_demonstrativo.SQL.Text := sql; ADOQuery_demonstrativo.Open; rel_demonstrativo.ProjectFile := GetCurrentDir + '\demonstrativo.rav'; rel_demonstrativo.Execute; ADOQuery_demonstrativo.Close; //Pergunta se deseja quitar as aulas do demonstrativo if Application.MessageBox('Deseja quitar estas aulas ?', 'Quitar Aulas ?', mb_yesno+mb_iconquestion) = idyes then begin sql := ' UPDATE AULAS SET AULAS.PAGA =' + QuotedStr('S') + ' FROM AULAS '+ ' INNER JOIN TURMAS ON '+ ' AULAS.COD_TURMA = TURMAS.COD_TURMA '+ ' WHERE TURMAS.COD_INSTRUTOR = ' + cod_instrutor; 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;

Evento OnClick do objeto btn_cancelar:

Delphi com Banco de Dados Cliente/Servidor

284 de 332

Pronto, o pagamento de instrutores j est concludo! Vamos agora alterar o form_menu para chamar o form_pag_instrutores. Acesse o form_menu e digite o seguinte no evento OnClick do boto Pagamento de Instrutores:

Agora execute o projeto e teste a nova funcionalidade!

Delphi com Banco de Dados Cliente/Servidor

285 de 332

Mdulo 6:
Criando os Relatrios

inalizando este curso, iremos construir os relatrios do sistema. Os relatrios so a forma que o usurio possui para visualizar de maneira organizada as informaes contidas no banco de dados. Os relatrios

tambm so utilizados como uma ferramenta de consulta. Neste mdulo veremos como parametrizar cada relatrio de forma que o usurio possa definir o que ele quer que o sistema exiba.

Delphi com Banco de Dados Cliente/Servidor

286 de 332

Relao de Cursos
Neste ltimo mdulo iremos apenas criar relatrios. A palavra apenas no significa que ser pouco trabalho ou que ser um trabalho sem importncia. Os relatrios so as ferramentas de controle mais utilizadas pelos usurios. Atravs deles os usurios podem tomar conhecimento das diversas informaes contidas no sistema. Alm disso, os relatrios possibilitam que os dados sejam impressos em papel de maneira simples e organizada. Iremos criar uma tela que concentrar todos os relatrios do sistema, assim o usurio ter, em um nico lugar, acesso a eles. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_relatorios e Caption como Relatrios. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_relatorios.

Delphi com Banco de Dados Cliente/Servidor

287 de 332

Aps salvar o novo form, insira 6 objetos BitBtn. Altere as propriedades Name e Caption de cada um deles seguindo a tabela abaixo:

Name btn_rel_curso btn_rel_turmas btn_rel_alunos btn_rel_faltas btn_rel_aulas btn_fechar

Caption Relao de Cursos Relao de Turmas por Curso Relao de Alunos por Turma Relatrio de Faltas dos Alunos Relatrio de Aulas por Instrutor Fechar

Organize os botes um em cima do outro semelhante imagem abaixo:

Agora iremos criar nosso primeiro relatrio: Relao de Cursos. Este relatrio bem simples, pois consiste em listar os cursos cadastrados na tabela cursos do sistema. Para este relatrio, 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 ligue para o rel_cursos ds_rel_cursos e o ao

RvDataSetConnection

para

ds_rel_cursos.

Agora

ADOQuery_rel_cursos atravs da propriedade DataSet. Como j sabemos, para criar o relatrio no ambiente do Rave Reports necessrio estabelecer conexo com o banco de dados e ativar o ADOQuery que ser utilizado pelo relatrio. Portanto, estabelea a conexo atravs do ConexaoBD que est no form_logon e ative o ADOQuery_rel_cursos. Se tiver alguma dvida neste procedimento consulte o captulo anterior.

Delphi com Banco de Dados Cliente/Servidor

288 de 332

Aps ativar o ADOQuery_rel_cursos, d um duplo clique sobre o objeto rel_cursos (RvProject) para abrir o ambiente do Rave Reports. Quando o ambiente do Rave Reports for exibido, talvez aparea o ltimo projeto criado. Ento, clique em File > New para disponibilizar um novo arquivo de projeto.

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object. Na janela que surgir, selecione a opo Direct Data View e clique em Next. Ser exibido outra tela, selecione o objeto ds_rel_cursos para ligar o Rave com o ADOQuery_rel_cursos que possui o SELECT que configuramos anteriormente.

Delphi com Banco de Dados Cliente/Servidor

289 de 332

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_rel_cursos.

Vamos ento montar nosso relatrio. Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho. Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Delphi com Banco de Dados Cliente/Servidor

290 de 332

Agora vamos inserir a banda principal, onde sero listadas os cursos da escola de informtica. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para cursos. Na propriedade BandStyle, clique em ... e marque a opo Detail.

Delphi com Banco de Dados Cliente/Servidor

291 de 332

A regio do relatrio deve ficar semelhante figura abaixo:

Vamos agora configurar as propriedades de cada banda do relatrio.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand cursos

Valor

Selecione a DataBand cursos e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1

Valor

COD_CURSO

Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Salve o arquivo do Rave na mesma pasta do projeto do Delphi com o nome rel_cursos.rav:

Delphi com Banco de Dados Cliente/Servidor

292 de 332

A partir de agora, sempre que quiser salvar as alteraes no projeto deste relatrio, basta clicar sobre o boto Save Project:

Aps 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 Relao de Cursos, Cdigo do Curso e Nome do Curso. Em seguida, os organize conforme exibido na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

293 de 332

Agora insira 2 objetos DataText DataBand cursos. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para COD_CURSO e NOME respectivamente. Posicione-os conforme apresentado na imagem abaixo:

Salve as alteraes. Se desejar, pressione F9 no teclado para visualizar a prvia do relatrio.

Feche o ambiente do Rave Reports para voltarmos ao Delphi.

Delphi com Banco de Dados Cliente/Servidor

294 de 332

Estando de volta ao Delphi, selecione ADOQuery_rel_cursos e altere a propriedade Active para False. Neste caso no preciso limpar a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente para o Delphi limpar o cache da conexo.

Volte para o form_relatorios e digite o seguinte cdigo no evento OnClick do boto btn_rel_cursos:

E digite o seguinte no evento OnClick do boto btn_fechar:

Pronto, a relao de cursos j est concluda! Vamos agora alterar o form_menu para chamar o form_relatorios. Acesse o form_menu e digite o seguinte no evento OnClick do boto Relatrios:

Delphi com Banco de Dados Cliente/Servidor

295 de 332

Em seguida salve as alteraes e execute o projeto para verificar a funcionalidade do novo relatrio.

Delphi com Banco de Dados Cliente/Servidor

296 de 332

Relao de Turmas por Cursos


A relao de turmas por curso funcionar da seguinte maneira: o usurio ir selecionar o curso desejado e ento a aplicao listar todos as turmas daquele curso. Como podemos perceber, precisaremos de uma tela de parmetros, para que o usurio possa selecionar o curso desejado. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_rel_turmas e Caption como Relao de Turmas por Curso. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_rel_turmas.

Delphi com Banco de Dados Cliente/Servidor

297 de 332

Aps salvar o novo form, acesse a unit_rel_turmas e declare a seguinte varivel na seo public:

Aps fazer a declarao, insira 1 objeto Label e 1 objeto Edit ao form_rel_turmas. Altere a propriedade Caption do Label para Curso. Renomeie o objeto Edit para edt_curso, limpe a propriedade Text, configure a propriedade Enable como False e Color como clInfoBk. Insira 2 objetos BitBtn ao form_rel_turmas, configure Name como btn_ok e btn_fechar. Configure Caption como Ok e Fechar. Alm disso, insira um outro BitBtn para selecionar o curso. Configure-o da mesma maneira que foi configurado no form_turmas. Em seguida, insira dois objetos ADOQuery. Ns iremos utilizar um para fazer as consultas no banco e o outro para montar o SELECT do relatrio. Altere a propriedade Name dos ADOQuerys para ADOQuery_rel_turmas e ADOQuery_aux. Configure a propriedade

Connection deles para Fom_logon.ConexaoBD. Mas antes v em File > Use Unit... e selecione a Unit_logon. Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

O prximo passo inserir os objetos do Rave Reports. Insira 1 RvProject e 1 RvDataSetConnection.

Delphi com Banco de Dados Cliente/Servidor

298 de 332

Renomeie ds_rel_turmas.

RvProject ligue o

para

rel_turmas ao

RvDataSetConnection atravs

para da

Agora

ds_rel_turmas

ADOQuery_rel_turmas

propriedade DataSet.

Antes de abrir o ambiente do Rave, digite o seguinte comando na propriedade SQL do ADOQuery_rel_turmas:

Como dito anteriormente, para criar o relatrio no ambiente do Rave Reports necessrio estabelecer conexo com o banco de dados e ativar o ADOQuery que ser utilizado pelo relatrio. Portanto, estabelea a conexo atravs do ConexaoBD que est no form_logon e ative o ADOQuery_rel_turmas. Se tiver alguma dvida neste procedimento consulte o captulo Montando o Pagamento de Instrutores. Aps ativar o ADOQuery_rel_turmas, d um duplo clique sobre o objeto rel_turmas (RvProject) para abrir o ambiente do Rave Reports. Quando o ambiente do Rave Reports for exibido, talvez aparea o ltimo projeto criado. Ento, clique em File > New para disponibilizar um novo arquivo de projeto.

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Delphi com Banco de Dados Cliente/Servidor

299 de 332

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object. Na janela que surgir, selecione a opo Direct Data View e clique em Next. Ser exibido outra tela, selecione o objeto ds_rel_turmas para ligar o Rave com o ADOQuery_rel_turmas que possui o SELECT que configuramos anteriormente.

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_rel_turmas.

Vamos ento montar nosso relatrio. Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Delphi com Banco de Dados Cliente/Servidor

300 de 332

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho. Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Agora vamos inserir a banda principal, onde sero listadas as turmas do curso escolhido. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para turmas. Na propriedade BandStyle, clique em ... e marque a opo Detail.

A regio do relatrio deve ficar semelhante figura abaixo:

Vamos agora configurar as propriedades de cada banda do relatrio.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand turmas

Valor

Selecione a DataBand turmas e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1 TURMA

Valor

Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Delphi com Banco de Dados Cliente/Servidor

301 de 332

Salve o arquivo do Rave na mesma pasta do projeto do Delphi com o nome rel_turmas.rav:

Aps salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 4 objetos Text Band cabecalho. Altere a propriedade Text deles para Relao de Turmas por Curso, Curso, Turma e Instrutor. Insira tambm 1 DataText, altere a propriedade DataView para DataView1 e DataField para CURSO. Em seguida, os organize conforme exibido na imagem abaixo:

Agora insira 2 objetos DataText DataBand turmas. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para TURMA e INSTRUTOR respectivamente. Posicione-os conforme apresentado na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

302 de 332

Salve as alteraes e feche o ambiente do Rave Reports para voltarmos ao Delphi.

Estando de volta ao Delphi, iremos desativar o ADOQuery_rel_turmas e finalizar a conexo estabelecida pelo ConexaoBD. Selecione o ADOQuery_rel_turmas, altere a

propriedade Active para False e limpe a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente para o Delphi limpar o cache da conexo.

Voltando ao form_rel_turmas, programe os eventos abaixo.

Evento OnShow do form_rel_turmas:

Evento OnClick do btn_curso:

Delphi com Banco de Dados Cliente/Servidor

303 de 332

Evento OnClick do btn_ok:

Evento OnClick do btn_fechar:

Pronto, a relao de turmas por curso j est concluda! Vamos agora alterar o form_relatorios para chamar o form_rel_turmas. Acesse o form_relatorios e digite o seguinte no evento OnClick do boto Relao de Turmas por Curso:

Delphi com Banco de Dados Cliente/Servidor

304 de 332

Agora execute o projeto e teste o novo relatrio!

Delphi com Banco de Dados Cliente/Servidor

305 de 332

Relao de Alunos por Turma


A relao de alunos por turma ser bem semelhante ao ltimo relatrio que criamos. Neste relatrio, teremos uma tela de parmetro onde o usurio dever selecionar a turma desejada e ento a aplicao ir listar os alunos desta turma. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_rel_alunos e Caption como Relao de Alunos por Turma. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_rel_alunos.

Aps salvar o novo form, acesse a unit_rel_alunos e declare a seguinte varivel na seo public:

Delphi com Banco de Dados Cliente/Servidor

306 de 332

Aps fazer a declarao, 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. Alm 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. Ns iremos utilizar um para fazer as consultas no banco e o outro para montar o SELECT do relatrio. Altere a propriedade Name dos ADOQuerys 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. Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

O prximo passo inserir os objetos do Rave Reports. Insira 1 RvProject e 1 RvDataSetConnection. Renomeie o RvProject para rel_alunos e o RvDataSetConnection para ds_rel_alunos. Agora ligue o ds_rel_alunos ao ADOQuery_rel_alunos atravs da propriedade DataSet. Antes de abrir o ambiente do Rave, digite o seguinte comando na propriedade SQL do ADOQuery_rel_alunos:

Delphi com Banco de Dados Cliente/Servidor

307 de 332

Como dito anteriormente, para criar o relatrio no ambiente do Rave Reports necessrio estabelecer conexo com o banco de dados e ativar o ADOQuery que ser utilizado pelo relatrio. Portanto, estabelea a conexo atravs do ConexaoBD que est no form_logon e ative o ADOQuery_rel_alunos. Se tiver alguma dvida neste procedimento consulte o captulo Montando o Pagamento de Instrutores. Aps ativar o ADOQuery_rel_alunos, d um duplo clique sobre o objeto rel_alunos (RvProject) para abrir o ambiente do Rave Reports. Quando o ambiente do Rave Reports for exibido, talvez aparea o ltimo projeto criado. Ento, clique em File > New para disponibilizar um novo arquivo de projeto.

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object. Na janela que surgir, selecione a opo Direct Data View e clique em Next. Ser exibido outra tela, selecione o objeto ds_rel_alunos para ligar o Rave com o ADOQuery_rel_alunos que possui o SELECT que configuramos anteriormente.

Delphi com Banco de Dados Cliente/Servidor

308 de 332

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_rel_alunos.

Vamos ento montar nosso relatrio. Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho. Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Agora vamos inserir a banda principal, onde sero listadas os alunos da turma escolhida. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para alunos. Na propriedade BandStyle, clique em ... e marque a opo Detail.

A regio do relatrio deve ficar semelhante figura abaixo:

Delphi com Banco de Dados Cliente/Servidor

309 de 332

Vamos agora configurar as propriedades de cada banda do relatrio.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand alunos

Valor

Selecione a DataBand alunos e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1

Valor

COD_ALUNO

Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Salve o arquivo do Rave na mesma pasta do projeto do Delphi com o nome rel_alunos.rav:

Delphi com Banco de Dados Cliente/Servidor

310 de 332

Aps salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 7 objetos Text Band cabecalho. Altere a propriedade Text deles para Relao de Alunos por Turma, Turma, Cdigo do Aluno, Nome do Aluno, Idade, Telefone e Sexo. Insira tambm 1 DataText, altere a propriedade DataView para DataView1 e DataField para TURMA. Em seguida, os organize conforme exibido na imagem abaixo:

Agora insira 5 objetos DataText DataBand alunos. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para CODIGO_ALUNO, NOME, IDADE, TELEFONE e SEXO respectivamente. Posicione-os conforme apresentado na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

311 de 332

Salve as alteraes e feche o ambiente do Rave Reports para voltarmos ao Delphi.

Estando de volta ao Delphi, iremos desativar o ADOQuery_rel_alunos e finalizar a conexo estabelecida pelo ConexaoBD. Selecione o ADOQuery_rel_alunos, altere a propriedade Active para False e limpe a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade

ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente para o Delphi limpar o cache da conexo.

Voltando ao form_rel_alunos, programe os eventos abaixo.

Evento OnShow do form_rel_alunos:

Evento OnClick do btn_turma:

Delphi com Banco de Dados Cliente/Servidor

312 de 332

Evento OnClick do btn_ok:

Evento OnClick do btn_fechar:

Pronto, a relao de alunos por turma j est concluda! Vamos agora alterar o form_relatorios para chamar o form_rel_alunos. Acesse o form_relatorios e digite o seguinte no evento OnClick do boto Relao de Alunos por Turma:

Delphi com Banco de Dados Cliente/Servidor

313 de 332

Agora execute o projeto e teste o novo relatrio!

Delphi com Banco de Dados Cliente/Servidor

314 de 332

Relatrio de Faltas dos Alunos


O relatrio de faltas dos alunos ser um relatrio onde sero listados os alunos de uma turma com a quantidade de faltas de cada um deles. Tambm teremos uma tela de parmetros idntica ao relatrio de alunos por turma. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_rel_faltas e Caption como Relatrio de Faltas dos Alunos. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_rel_faltas.

Aps salvar o novo form, acesse a unit_rel_faltas e declare a seguinte varivel na seo public:

Delphi com Banco de Dados Cliente/Servidor

315 de 332

Aps fazer a declarao, 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. Alm 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. Ns iremos utilizar um para fazer as consultas no banco e o outro para montar o SELECT do relatrio. Altere a propriedade Name dos ADOQuerys 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. Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

O prximo passo inserir os objetos do Rave Reports. Insira 1 RvProject e 1 RvDataSetConnection. Renomeie o RvProject para rel_faltas e o RvDataSetConnection para ds_rel_faltas. Agora ligue o ds_rel_faltas ao ADOQuery_rel_faltas atravs da propriedade DataSet. Antes de abrir o ambiente do Rave, digite o seguinte comando na propriedade SQL do ADOQuery_rel_faltas:

Delphi com Banco de Dados Cliente/Servidor

316 de 332

Como dito anteriormente, para criar o relatrio no ambiente do Rave Reports necessrio estabelecer conexo com o banco de dados e ativar o ADOQuery que ser utilizado pelo relatrio. Portanto, estabelea a conexo atravs do ConexaoBD que est no form_logon e ative o ADOQuery_rel_faltas. Se tiver alguma dvida neste procedimento consulte o captulo Montando o Pagamento de Instrutores. Aps ativar o ADOQuery_rel_faltas, d um duplo clique sobre o objeto rel_faltas (RvProject) para abrir o ambiente do Rave Reports. Quando o ambiente do Rave Reports for exibido, talvez aparea o ltimo projeto criado. Ento, clique em File > New para disponibilizar um novo arquivo de projeto.

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object. Na janela que surgir, selecione a opo Direct Data View e clique em Next. Ser exibido outra tela, selecione o objeto ds_rel_faltas para ligar o Rave com o ADOQuery_rel_faltas que possui o SELECT que configuramos anteriormente.

Delphi com Banco de Dados Cliente/Servidor

317 de 332

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_rel_faltas.

Vamos ento montar nosso relatrio. Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho. Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Agora vamos inserir a banda principal, onde sero listadas as faltas dos alunos da turma escolhida. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para faltas. Na propriedade BandStyle, clique em ... e marque a opo Detail.

A regio do relatrio deve ficar semelhante figura abaixo:

Delphi com Banco de Dados Cliente/Servidor

318 de 332

Vamos agora configurar as propriedades de cada banda do relatrio.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand alunos

Valor

Selecione a DataBand faltas e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1

Valor

COD_ALUNO

Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Salve o arquivo do Rave na mesma pasta do projeto do Delphi com o nome rel_faltas.rav:

Delphi com Banco de Dados Cliente/Servidor

319 de 332

Aps salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 5 objetos Text Band cabecalho. Altere a propriedade Text deles para Relao de Faltas dos Alunos, Turma, Cdigo do Aluno, Nome do Aluno e Faltas. Insira tambm 1 DataText, altere a propriedade DataView para DataView1 e DataField para TURMA. Em seguida, os organize conforme exibido na imagem abaixo:

Agora insira 3 objetos DataText DataBand faltas. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para CODIGO_ALUNO, NOME e FALTAS respectivamente. Posicione-os conforme apresentado na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

320 de 332

Salve as alteraes e feche o ambiente do Rave Reports para voltarmos ao Delphi.

Estando de volta ao Delphi, iremos desativar o ADOQuery_rel_faltas e finalizar a conexo estabelecida pelo ConexaoBD. Selecione o ADOQuery_rel_faltas, altere a propriedade Active para False e limpe a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade

ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente para o Delphi limpar o cache da conexo.

Voltando ao form_rel_faltas, programe os eventos abaixo.

Evento OnShow do form_rel_faltas:

Evento OnClick do btn_turma:

Delphi com Banco de Dados Cliente/Servidor

321 de 332

Evento OnClick do btn_ok:

Evento OnClick do btn_fechar:

Pronto, o relatrio de faltas dos alunos j est concludo! Vamos agora alterar o form_relatorios para chamar o form_rel_faltas. Acesse o form_relatorios e digite o seguinte no evento OnClick do boto Relatrio de Faltas dos Alunos:

Delphi com Banco de Dados Cliente/Servidor

322 de 332

Agora execute o projeto e teste o novo relatrio!

Delphi com Banco de Dados Cliente/Servidor

323 de 332

Relatrio de Aulas por Instrutor


O relatrio de aulas por Instrutor ser um relatrio onde dever constar a quantidade de aulas que o instrutor selecionado deu em cada turma. Neste relatrio teremos uma tela de parmetros onde o usurio selecionar o instrutor desejado. Insira um novo Form ao projeto.

Configure a propriedade Name do novo Form como Form_rel_aulas e Caption como Relatrio Aulas por Instrutor. Aplique as mesmas configuraes feitas para o form_logon para manter o mesmo padro. Aps fazer as configuraes, clique em Save All para salvar o novo form. Salve-o como Unit_rel_aulas.

Aps salvar o novo form, acesse a unit_rel_aulas e declare a seguinte varivel na seo public:

Delphi com Banco de Dados Cliente/Servidor

324 de 332

Aps fazer a declarao, 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. Alm 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. Ns iremos utilizar um para fazer as consultas no banco e o outro para montar o SELECT do relatrio. Altere a propriedade Name dos ADOQuerys 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. Aps estas configuraes, seu form deve ficar semelhante ao exibido abaixo:

O prximo passo inserir os objetos do Rave Reports. Insira 1 RvProject e 1 RvDataSetConnection. Renomeie o RvProject para rel_aulas e o RvDataSetConnection para ds_rel_aulas. Agora ligue o ds_rel_aulas ao ADOQuery_rel_aulas atravs da propriedade DataSet. Antes de abrir o ambiente do Rave, digite o seguinte comando na propriedade SQL do ADOQuery_rel_aulas:

Delphi com Banco de Dados Cliente/Servidor

325 de 332

Como dito anteriormente, para criar o relatrio no ambiente do Rave Reports necessrio estabelecer conexo com o banco de dados e ativar o ADOQuery que ser utilizado pelo relatrio. Portanto, estabelea a conexo atravs do ConexaoBD que est no form_logon e ative o ADOQuery_rel_aulas. Se tiver alguma dvida neste procedimento consulte o captulo Montando o Pagamento de Instrutores. Aps ativar o ADOQuery_rel_aulas, d um duplo clique sobre o objeto rel_aulas (RvProject) para abrir o ambiente do Rave Reports. Quando o ambiente do Rave Reports for exibido, talvez aparea o ltimo projeto criado. Ento, clique em File > New para disponibilizar um novo arquivo de projeto.

Expanda a Report Library at chegar ao item Page1. Selecione-o e altere a propriedade Orientation para poPortrait (Pgina na Vertical) e a propriedade PageSize para A4.

Aps configurar o tamanho e a posio da pgina, iremos criar um objeto de banco de dados. Este objeto tem por finalidade disponibilizar os campos de uma query no relatrio. Clique em File > New Data Object. Na janela que surgir, selecione a opo Direct Data View e clique em Next. Ser exibido outra tela, selecione o objeto ds_rel_aulas para ligar o Rave com o ADOQuery_rel_aulas que possui o SELECT que configuramos anteriormente.

Delphi com Banco de Dados Cliente/Servidor

326 de 332

Observe que agora aparece o objeto DataView1 com os campos do SELECT do ADOQuery_rel_aulas.

Vamos ento montar nosso relatrio. Insira um objeto Region ao relatrio. Aumente o objeto de forma que ele ocupe todo o espao disponvel da pgina. Para facilitar este trabalho, utilize o menu Zoom para ajustar a visualizao.

Em seguida insira um objeto Band. Renomeie o objeto para cabecalho. Na propriedade BandStyle, clique no boto ... e marque a opo Body Header. Isto determinar que essa banda seja o cabealho do relatrio.

Agora vamos inserir a banda principal, onde sero listadas as aulas do instrutor escolhido. A banda principal deve ser uma DataBand e no uma Band comum. Ento insira um DataBand. Renomeie o objeto para aulas. Na propriedade BandStyle, clique em ... e marque a opo Detail.

A regio do relatrio deve ficar semelhante figura abaixo:

Delphi com Banco de Dados Cliente/Servidor

327 de 332

Vamos agora configurar as propriedades de cada banda do relatrio.

Selecione a Band cabecalho e altere as propriedades seguindo a tabela abaixo:

Propriedade ControllerBand aulas

Valor

Selecione a DataBand aulas e altere as propriedades seguindo a tabela abaixo:

Propriedade DataView DetailKey DataView1

Valor

COD_TURMA

Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:

Salve o arquivo do Rave na mesma pasta do projeto do Delphi com o nome rel_aulas.rav:

Delphi com Banco de Dados Cliente/Servidor

328 de 332

Aps salvar o nosso projeto Rave, vamos inserir os objetos nas bandas criadas. Insira 5 objetos Text Band cabecalho. Altere a propriedade Text deles para Relatrio de Aulas por Instrutor, Cdigo do Instrutor, Nome do Instrutor, Turma e Aulas. Insira tambm 2 DataTexts, altere a propriedade DataView para DataView1 e DataField para

COD_INSTRUTOR e NOME. Em seguida, os organize conforme exibido na imagem abaixo:

Agora insira 2 objetos DataText DataBand aulas. Altere a propriedade DataView deles para DataView1. Altere a propriedade DataField para COD_TURMA e AULAS respectivamente. Posicione-os conforme apresentado na imagem abaixo:

Delphi com Banco de Dados Cliente/Servidor

329 de 332

Salve as alteraes e feche o ambiente do Rave Reports para voltarmos ao Delphi.

Estando de volta ao Delphi, iremos desativar o ADOQuery_rel_aulas e finalizar a conexo estabelecida pelo ConexaoBD. Selecione o ADOQuery_rel_aulas, altere a propriedade Active para False e limpe a propriedade SQL. V at o form_logon e selecione o objeto ConexaoBD. Altere a propriedade Connected para False e limpe a propriedade

ConnectionString. Em seguida salve as alteraes clicando em Save All. Feito isso, feche o projeto e o abra novamente para o Delphi limpar o cache da conexo.

Voltando ao form_rel_aulas, programe os eventos abaixo.

Evento OnShow do form_rel_aulas:

Evento OnClick do btn_instrutor:

Delphi com Banco de Dados Cliente/Servidor

330 de 332

Evento OnClick do btn_ok:

Evento OnClick do btn_fechar:

Pronto, o relatrio de aulas por instrutor j est concludo! Vamos agora alterar o form_relatorios para chamar o form_rel_aulas. Acesse o form_relatorios e digite o seguinte no evento OnClick do boto Relatrio Aulas por Instrutor:

Delphi com Banco de Dados Cliente/Servidor

331 de 332

Agora execute o projeto e teste o novo relatrio!

Delphi com Banco de Dados Cliente/Servidor

332 de 332

Concluso
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 alcanado: Mostrar como desenvolver aplicaes Delphi com um banco de dados Cliente/Servidor. Aqui desenvolvemos assuntos que foram desde a introduo aos sistemas gerenciadores de banco de dados, passando pelo aprendizado bsico do SQL Server 2000 e o controle de transaes at a construo de uma aplicao 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 aplicaes.

Obviamente, a aplicao desenvolvida neste curso foi projetada com um propsito meramente didtico, entretanto voc pode adapt-la para ter uma abordagem mais comercial. Despedimos-nos certos de que este trabalho ser de grande importncia aos interessados no assunto. Esperamos que faa bom proveito deste material !

Grande abrao dos autores,

Rodrigo Costa e Sergio Ferreira