Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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.
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.
5 de 332
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,
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.
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.
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.
Para voltar tela anterior feche a janela de visualizao dos dados da tabela.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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,
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.
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.
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.
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.
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.
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.
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...
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.
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
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:
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.
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:
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.
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.
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.
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:
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:
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:
34 de 332
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.
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:
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:
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:
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:
37 de 332
Para obter os motoristas cujo ltimo nome seja Silva, o comando seria:
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:
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:
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:
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:
Voc tambm pode ordenar por mais de uma coluna, por exemplo, ordenar por sexo em seguida por nome e depois por salrio.
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;
41 de 332
42 de 332
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:
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:
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?
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.
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
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
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
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.
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.
INSERT INTO MOTORISTAS (NUM_MOTORISTA, NOME, IDADE, SEXO, SALARIO) VALUES (351,'Jos Antnio',32,'M',1150)
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:
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:
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.
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).
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:
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'
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:
Observe que no impomos nenhuma condio atravs da clusula WHERE, pois realmente queramos que todos os registros fossem atualizados. Nesta instruo estamos
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.
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.
55 de 332
BEGIN TRANSACTION: Inicia uma transao; COMMIT TRANSACTION: efetiva as alteraes; ROLLBACK TRANSACTION: cancela todas as alteraes.
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
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:
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:
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:
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:
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:
O comando DELETE tambm pode ser utilizado para limpar uma tabela, para isto basta executar a instruo sem utilizar a clusula WHERE. Exemplo:
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.
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
62 de 332
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.
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
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.
65 de 332
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.
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.
66 de 332
Em seguida o Delphi pedir que salve o arquivo do projeto, salve-o como nome Rodoviaria.
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.
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...
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.
70 de 332
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.
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.
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.
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.
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.
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:
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
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;
Em
seguida
acesse
evento
OnClose
do
form_empresas
digite:
adoquery_empresas.close;
78 de 332
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;
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;
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.
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:
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.
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.
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:
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.
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.
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.
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.
87 de 332
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
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.
90 de 332
Acesse
seo
Var
da
unit_onibus
que
fica
um
pouco
antes
da
seo
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:
91 de 332
Agora s falta programar o boto Inserir. Para isto digite o cdigo abaixo:
92 de 332
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.
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:
95 de 332
Salve as modificaes clicando em Save All e em seguida execute a aplicao para testar a nova funcionalidade.
96 de 332
Antes
Depois
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:
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:
Pronto! Salve as alteraes e execute o projeto para testar a funcionalidade de atualizao de dados.
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.
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:
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:
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.
103 de 332
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.
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:
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
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.
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
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.
107 de 332
O cdigo acima est fazendo exatamente o que foi descrito anteriormente quando especificamos o seu funcionamento.
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
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;
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.
110 de 332
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.
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
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.
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;
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.
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
116 de 332
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.
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
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.
118 de 332
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.
119 de 332
Cursos
Realiza Cadastros
Cadastra Aluno
Consulta Turma
Lana Aulas
Cadastra Aula
Alunos
Consulta Aluno
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.
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.
121 de 332
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
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:
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
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...
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.
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
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.
139 de 332
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.
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.
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.
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
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.
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.
146 de 332
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.
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.
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.
150 de 332
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.
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.
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.
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.
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:
155 de 332
Vamos criar uma funo na unit do form_logon que ir verificar se o usurio pode ou no se logar no sistema.
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
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.
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.
158 de 332
Esta funo ir obter o cdigo ASCII de cada caractere da senha de trs para frente. Por exemplo, para criptografar a palavra teste:
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:
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.
161 de 332
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
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.
163 de 332
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:
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;
165 de 332
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.
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.
167 de 332
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:
168 de 332
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.
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:
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.
171 de 332
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:
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:
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:
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:
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.
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;
Close;
177 de 332
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.
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.
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.
179 de 332
OnShow do Form_pesquisa:
180 de 332
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:
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.
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.
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.
183 de 332
184 de 332
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:
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.
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:
186 de 332
Aproveitando que estamos alterando o form_menu, digite o seguinte cdigo no evento OnClick do boto Fechar do menu:
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.
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.
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:
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:
190 de 332
Procedure bloqueia_campos:
191 de 332
Procedure desabilita_salvar:
Procedure habilita_salvar:
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:
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.
194 de 332
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;
195 de 332
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;
196 de 332
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.
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:
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.
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:
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:
200 de 332
Procedure bloqueia_campos:
201 de 332
Procedure desabilita_salvar:
Procedure habilita_salvar:
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:
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
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.
205 de 332
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;
206 de 332
207 de 332
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;
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:
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.
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:
209 de 332
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.
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:
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:
212 de 332
Procedure bloqueia_campos:
213 de 332
Procedure desabilita_salvar:
Procedure habilita_salvar:
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:
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:
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.
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.
218 de 332
219 de 332
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;
220 de 332
221 de 332
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;
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.
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.
223 de 332
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:
224 de 332
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.
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:
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.
227 de 332
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;
228 de 332
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.
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;
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:
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.
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.
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:
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
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;
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;
234 de 332
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:
235 de 332
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.
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:
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:
238 de 332
Procedure bloqueia_campos:
239 de 332
Procedure desabilita_salvar:
Procedure habilita_salvar:
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:
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:
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
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.
244 de 332
245 de 332
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;
246 de 332
247 de 332
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;
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:
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:
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:
251 de 332
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.
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.
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:
253 de 332
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
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.
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:
255 de 332
256 de 332
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.
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:
258 de 332
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
259 de 332
260 de 332
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;
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:
262 de 332
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.
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.
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:
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
Renomeie
RvProject
rel_demonstrativo o
ds_demonstrativo.
Agora
ds_demonstrativo
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.
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.
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.
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.
267 de 332
Agora volte ao form_pag_instrutores e selecione o objeto ADOQuery_demonstrativo. Acesse a propriedade SQL dele e digite o seguinte:
Vamos ento criar nosso demonstrativo no Rave. D um clique duplo no objeto rel_demonstrativo, ser exibido o ambiente do Rave Reports.
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:
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.
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.
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.
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.
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.
Valor
Selecione a Band cabealho_turma e altere as propriedades seguindo a tabela abaixo: Propriedade ControllerBand GroupDataView GroupKey aulas DataView1 COD_TURMA Valor
Valor
Valor
COD_TURMA
Valor
Pronto, todas as bandas do demonstrativo esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:
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:
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:
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:
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).
Valor
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:
Valor
279 de 332
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:
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:
281 de 332
282 de 332
283 de 332
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;
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:
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.
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.
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:
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
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.
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.
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.
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.
291 de 332
Valor
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:
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:
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:
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:
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:
295 de 332
Em seguida salve as alteraes e execute o projeto para verificar a funcionalidade do novo relatrio.
296 de 332
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.
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:
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.
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.
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.
Valor
Valor
Pronto, todas as bandas do relatrio esto configuradas! Antes de continuarmos, vamos salvar nosso projeto. Acesse o menu File > Save:
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:
302 de 332
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.
303 de 332
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:
304 de 332
305 de 332
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:
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:
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.
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.
309 de 332
Valor
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:
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:
311 de 332
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.
312 de 332
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:
313 de 332
314 de 332
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:
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:
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.
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.
318 de 332
Valor
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:
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:
320 de 332
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.
321 de 332
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:
322 de 332
323 de 332
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:
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:
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.
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.
327 de 332
Valor
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:
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
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:
329 de 332
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.
330 de 332
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:
331 de 332
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 !