Sie sind auf Seite 1von 334

Delphi com Banco de Dados Cliente/Servidor

Nota sobre Direitos Autorais

Este e-book é de autoria dos autores Rodrigo Costa e Sergio Ferreira, sendo comercializado diretamente através do site www.juliobattisti.com.br e através do site de Leilões Mercado Livre: www.mercadolivre.com.br, pelo usuário GROZA. Nenhum outro usuário e/ou site está autorizado a vender este e-book.

Ao adquirir este e-book você tem o direito de lê-lo na tela do computador e de imprimir quantas cópias desejar. É vetada a distribuição deste arquivo, mediante cópia ou qualquer outro meio de reprodução, para outras pessoas. Se você recebeu este e-book através do e- mail ou via ftp de algum site da Internet, ou através de um CD de revista, saiba que você está com uma cópia pirata, não autorizada. O Valor cobrado por este arquivo é praticamente simbólico pelas horas que ele representa. Novos cursos somente podem ser desenvolvidos pela honestidade de pessoas que adquirem o arquivo do curso e não o distribuem livremente para outras pessoas. Se você recebeu uma cópia deste arquivo se tê-la adquirido diretamente com os autores, seja honesto, entre em contato através dos e-mails rdgcosta@msn.com ou maissergio@hotmail.com para regularizar esta cópia.

PIRATARIA É CRIME, COM PENA DE CADEIA. AGRADECEMOS PELA SUA HONESTIDADE. SE VOCÊ COMPROU UMA CÓPIA DESTE CURSO, DIRETAMENTE COM OS AUTORES, NÃO DISTRIBUA CÓPIAS PARA OUTRAS PESSOAS. SE VOCÊ RECEBEU UMA CÓPIA ILEGAL DESTE ARQUIVO NÃO ADQUIRIDA DIRETAMENTE ATRAVÉS DOS SITES WWW.JULIOBATTISTI.COM.BR OU WWW.MERCADOLIVRE.COM.BR, COM O VENDEDOR GROZA, ENTRE EM CONTATO E REGULARIZE SUA CÓPIA.

Ao regularizar a sua cópia você estará remunerando, mediante uma pequena quantia, o trabalho do autor e incentivando que novos trabalhos sejam disponibilizados. Se você tiver sugestões sobre novos cursos que gostaria de ver publicados entre em contato pelos e-mails rdgcosta@msn.com ou maissergio@hotmail.com.

Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades.

Confira os outros trabalhos dos autores:

Livro: Desvendando e Dominando o Registro do Windows

e-book: Montando Redes para Residências e Escritórios

e-Book: Delphi básico

Delphi com Banco de Dados Cliente/Servidor

Introdução

Sumário

Módulo 1: Introdução aos Sistemas Gerenciadores de Banco de Dados

Conhecendo o SQL Server 2000

Modelagem de Dados

Instrução SELECT

Instrução INSERT

Instrução UPDATE

Instrução DELETE

Módulo 2: Conectando o Delphi ao SQL Server

Componentes de Acesso a Dados

Recuperando e exibindo dados

Inserindo dados

Atualizando dados

Excluindo dados

Tratando erros de banco de dados

Módulo 3: Projetando uma Aplicação de Banco de Dados

Planejando a aplicação: “Gerenciador de Cursos de Informática

Criando um Diagrama de Funcionalidades

Projetando o banco de dados

Criando as tabelas

Iniciando a programação

Módulo 4: Criando o Controle de Acesso

Criando a tela de Splash

Programando o processo de autenticação no Servidor

Configurando a tela de Logon

Criando o mecanismo de verificação de usuários e permissões

Montando o cadastro de usuários e permissões

Módulo 5: Criando as Funcionalidades da Aplicação

Cadastro de Cursos

Cadastro de Instrutores

Cadastro de Turmas

Cadastro de Alunos

Cadastro de Matrículas

Criando o Lançamento de Aulas

Criando o Lançamento de Presença

Montando o Pagamento de Instrutores

Módulo 6: Criando os Relatórios

Relação de Cursos

Relação de Turmas por Curso

Relação de Alunos por Turma

Relatório de Faltas dos Alunos

Relatório de Aulas por Instrutor

Conclusão

Delphi com Banco de Dados Cliente/Servidor

Introdução

Atualmente existem diversos paradigmas de programação, vários são os conceitos e metodologias adotadas para o desenvolvimento de aplicações. Ouve-se muito sobre “Desenvolvimento em Camadas” e “Desenvolvimento para a Internet”. Todos os grandes sistemas construídos recentemente seguem esta nova onda. Entretanto, não 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 primórdios da programação, o que reinava eram os computadores de Grande Porte que com grande poder de processamento ficavam responsáveis por todo o trabalho. Os poderosos Mainframes possuíam terminais “burros” que apenas contavam com um monitor e um teclado sem qualquer processamento local. Mas apesar de jurássicos, os sistemas em COBOL (linguagem de programação mais comum para Mainframe) ainda respondem pelas principais operações de grandes organizações como bancos e instituições financeiras. Com o surgimento e popularização dos microcomputadores, surgiu o modelo de desenvolvimento Cliente/Servidor. Este modelo veio para “substituir” os antigos Mainframes, pois oferecia uma grande facilidade para construção de aplicações baseadas em redes de microcomputadores. O modelo Cliente/Servidor trouxe várias ferramentas para desenvolvimento nesta plataforma que proporcionavam um alto índice de produtividade e um produto final mais bonito e amigável ao usuário através da interface gráfica. Mesmo com todos os benefícios oferecidos, o modelo Cliente/Servidor não fez com que os grandes sistemas em COBOL fossem exterminados. A “explicação” é 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 programação 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! Então por que jogar tudo fora e fazer de novo em ambiente Web? Sem sombra de dúvidas, o avanço da tecnologia é algo muito importante para o aperfeiçoamento da programação. É óbvio que os novos sistemas devem utilizar as novas tecnologias de desenvolvimento de aplicações. Não podemos ser hipócritas e negar os benefícios de cada novo lançamento nesta área, porém, temos que ter o amadurecimento para não esquecer de tudo o que já foi feito e saber reconhecer que ainda precisamos dos sistemas que estão rodando por aí. Afinal, quando algum sistema Cliente/Servidor precisar de uma manutenção, teremos que realiza-la ou alguém ainda acha que é melhor escrever tudo de novo para a internet do que corrigir algumas linhas de código?

Este

material

foi

desenvolvido

com

programação Cliente/Servidor.

o

objetivo

de

elucidar

os

interessados

na

Autores: Rodrigo Costa e Sergio Ferreira Divulgação: www.juliobattisti.com.br

Página 3

Delphi com Banco de Dados Cliente/Servidor

Aqui você obterá conhecimentos suficientes para o desenvolvimento de aplicações Cliente/Servidor com Delphi. Além do aprendizado na linguagem de programação, você

também 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 aceitação no mercado de trabalho.

Os assuntos serão mencionados numa ordem natural para um bom entendimento de todo o curso. Primeiro iremos entender o que é o modelo Cliente/Servidor e como desenvolver aplicações seguindo este modelo de programação. Em seguida, conheceremos o SQL Server 2000. Veremos as ferramentas para manipulação do banco de dados e como nos conectar a ele. A linguagem SQL é o próximo assunto a ser mencionado. Veremos como recuperar os dados através do comando SELECT e como modifica-los através das instruções INSERT, UPDATE e DELETE. Após sabermos como trabalhar com o SQL Server (no nível de desenvolvedor), iremos ver os componentes que o Delphi disponibiliza para a manipulação de banco de dados. Além dos objetos de interação 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 através do Delphi, iremos criar uma aplicação de banco de dados Cliente/Servidor completa. Este projeto simulará um sistema para administração de cursos de informática. Mas antes de desenvolver a aplicação, faremos todo o planejamento da mesma. Criaremos um diagrama da funcionalidade do sistema, elaboraremos o modelo de dados e então criaremos as tabelas no SQL Server.

Ao término da fase de projeto, partiremos para a programação do sistema em Delphi. Criaremos o controle de acesso e todas as funcionalidades da aplicação com todos os cadastros

e movimentações envolvidas no contexto do sistema. Ao final do projeto criaremos os relatórios da aplicação.

Delphi com Banco de Dados Cliente/Servidor

Módulo 1:

Delphi com Banco de Dados Cliente/Servidor Módulo 1: Introdução aos Sistemas Gerenciadores de Banco de Dados

Introdução aos Sistemas Gerenciadores de Banco de Dados

N este módulo iremos conhecer o modelo Cliente/Servidor e um Banco de Dados que trabalha nesta plataforma: o Microsoft SQL Server 2000. Veremos como nos conectar a ele através do Enterprise

Manager e do Query Analyzer que são as principais ferramentas de interação com o Banco de Dados. Em seguida aprenderemos um pouco sobre modelagem de dados. Apesar da modelagem de dados não ser o foco deste livro, este assunto será abordado, pois é muito importante que o desenvolvedor conheça o modelo relacional e saiba trabalhar com ele. Continuando nossa jornada no mundo dos SGBD’s, conheceremos a linguagem SQL (Structured Query Language ou Linguagem de Consulta Estruturada) a qual permitirá que recuperemos e modifiquemos as informações contidas em um banco de dados.

Delphi com Banco de Dados Cliente/Servidor

Conhecendo o SQL Server 2000

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

Antigamente os sistemas rodavam em uma única máquina, um computador com grande poder de processamento conhecido como Mainframe. Neste computador ficavam o banco de dados e a aplicação ao mesmo tempo. Os usuários utilizavam os sistemas através 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:

disso. Veja a figura abaixo para um melhor entendimento: Com o surgimento dos microcomputadores e das

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 própria”, ou seja, ele possui poder de processamento. Sendo assim, ele não 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 aplicação. Apenas o banco de dados continuou no servidor já que é preciso que os dados estejam centralizados num único lugar de forma que todos os usuários tenham acesso às informações consolidadas. Nasce então o modelo Cliente/Servidor, onde temos basicamente dois elementos neste ambiente: o cliente, encarregado de executar a aplicação e o servidor de banco de dados,

Delphi com Banco de Dados Cliente/Servidor

responsável por armazenar as informações do sistema. Veja a figura abaixo que representa o ambiente Cliente/Servidor:

a figura abaixo que representa o ambiente Cliente/Servidor: Resumindo, um sistema Cliente/Servidor é dividido em duas

Resumindo, um sistema Cliente/Servidor é dividido em duas partes: uma que excuta em um servidor e uma que executa em estações de trabalho. O lado do servidor fornece segurança, tolerância a falhas, desempenho, concorrência e backups confiáveis. O lado do cliente fornece a interface com o usuário que possui os relatórios, as consultas e os formulários. O SQL Server é a parte do servidor onde vários clientes podem se conectar a ele. Em computação 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 não somente poupa tráfego na rede como também pode ser mais rápido do que ter as estações realizando as consultas.

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

em Iniciar > Programas > Microsoft SQL Server . Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Dentre as ferramentas disponíveis para utilização do SQL Server 2000, iremos utilizar apenas duas, as mais importantes: o Enterprise Manager e o Query Analyzer.

O Enterprise Manager é a interface gráfica administrativa do SQL Server. Através dela é

possível visualizar todos os banco de dados criados no servidor e fazer praticamente tudo como criar tabelas, consultar e inserir registros, administrar usuários e fazer backup.

e inserir regi stros, administrar usuá rios e fazer backup. O SQL Server 2000 possui vários

O SQL Server 2000 possui vários bancos de dados que são criados durante a instalação.

Dentre eles, existem os bancos de dados de sistema, que são utilizados pelo SQL Server 2000 e os bancos de dados de exemplos. Os bancos de dados de sistema são: master, model, msdb e tempdb. Cada um deles possui uma função específica para o funcionamento do SQL

Server e não podem ser excluídos! Existem também dois bancos de dados de exemplo:

Northwind e pubs. Estes bancos de dados são apenas amostras para ajudar no aprendizado do SQL Server e podem ser excluídos sem problemas. Além dos bancos de dados padrão do SQL Server, você pode criar seus próprios bancos de dados e certamente faremos isto durante este curso.

Delphi com Banco de Dados Cliente/Servidor

Para exemplificarmos o uso do Enterprise Manager, vamos consultar as informações contidas em uma tabela do banco de dados Northwind. Para isso, navegue até a opção “Tables” do banco de dados Northwind e clique com o botão direito do mouse sobre a tabela “Categories”. Na caixa de diálogo que aparecerá, clique em Open Table > Return all rows.

aparecerá, clique em Open Table > Return all rows . Então serão exibidos todos os registros

Então serão exibidos todos os registros contidos nesta tabela.

serão exibidos todos os registros contidos nesta tabela. Para voltar à tela anterior feche a jane

Para voltar à tela anterior feche a janela de visualização dos dados da tabela.

Delphi com Banco de Dados Cliente/Servidor

Além dos dados contidos na tabela, podemos verificar a estrutura dela, ou seja, as colunas com seus tipos de dados e tamanhos. Para isso, clique com o botão direito do mouse sobre a tabela “Categories”. Na caixa de diálogo que aparecerá, clique em Design Table.

caixa de diálogo que aparecerá, clique em Design Table . Então será exibida a estrutura da

Então será exibida a estrutura da tabela “Categories”.

Então será exibida a estrutura da tabela “Categories”. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

A outra ferramenta que iremos utilizar é o Query Analyzer, ele é a interface que permite a entrada de comandos Transact-SQL. O Transact-SQL ou apenas T-SQL é a linguagem utilizada pelo SQL Server. O T-SQL é uma extensão da linguagem SQL, ou seja, um conjunto de comandos adicionados à linguagem SQL que é padrão para todos os bancos de dados relacionais. No próximo capítulo falaremos mais sobre o T-SQL e a linguagem SQL.

Para abrir o Query Analyzer é preciso fornecer as credencias de logon, ou seja, informar qual o servidor que deseja conectar e passar o usuário e a senha. Indique o nome ou o IP do servidor onde está instalado o SQL Server. Caso o SQL Server esteja instalado localmente (na mesma máquina que você está utilizando) não é necessário informar o nome do servidor.

utilizando) não é necessário informar o nome do servidor. Após efetuar o logon, o Query Analyzer

Após 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 seleção presente na parte superior da tela. Observe a figura a seguir onde está sendo selecionado o banco de dados Northwind.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Na barra de títulos da janela de conexão do Query

Na barra de títulos da janela de conexão do Query Analyzer você pode observar em que servidor/banco de dados/usuário está em uso no momento.

servidor/banco de dados/usuário está em uso no momento. Em nosso exemplo, estamos conectados no servidor “

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

Delphi com Banco de Dados Cliente/Servidor

Para exemplificarmos o uso do Query Analyzer, vamos consultar as informações 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.

pressione F5 no teclado para executar o comando digitado. Após executar o comando, serão exibidos os

Após executar o comando, serão exibidos os registros contidos na tabela Categories do banco Northwind.

registros contidos na tabela Categories do banco Northwind. Para verificar a estrutura da tabela Catego ries

Para verificar a estrutura da tabela Categories através do Query Analyzer, digite o comando “sp_help categories”. Não é 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 através do comando executado.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Existem muitas outras coisas que podemos fazer através das ferramentas

Existem muitas outras coisas que podemos fazer através das ferramentas do SQL Server 2000, no entanto este curso não tem o objetivo de dominar o SQL Server, mas apenas ensinar o suficiente para a criação de uma aplicação de banco de dados com Delphi e SQL Server. Para um conhecimento mais aprofundado do Microsoft SQL Server 2000, sugerimos o livro de SQL Server 2000 do Júlio Battisti.

Delphi com Banco de Dados Cliente/Servidor

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 são organizados na forma de tabelas. As tabelas são organizadas agrupando dados sobre o mesmo assunto e contêm colunas e linhas de informações. As tabelas então são 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 funcionários como salário, data de admissão, nome, cpf, matrícula 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 não está necessariamente associado a um arquivo – ele é mais um conceito lógico baseado em uma coleção de objetos relacionados. Por exemplo, um banco de dados no MSSQL não contém somente os dados, ele também contém a estrutura do banco de dados, quaisquer índices, a segurança 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 são os seguintes:

Colunas: são 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: são o tipo de armazenamento básico de seus dados. Existem vários tipos de dados, como caractere, data e numérico. Linhas: são os registros da tabela, ou seja, são as ocorrências dos dados. Cada linha é composta pelas colunas da tabela. Chaves primárias: embora não sejam objetos propriamente ditos, são essenciais para os bancos de dados relacionais. Elas impõem a unicidade entre linhas, fornecendo uma maneira de identificar unicamente cada item armazenado na tabela. Chaves estrangeiras: são uma ou mais colunas que referenciam a chave primária de outras tabelas. O MSSQL utiliza chaves primárias e estrangeiras para relacionar dados entre si a partir de tabelas separadas quando as consultas são realizadas.

Tabelas: são os objetos que contêm os tipos de dados e os dados reais;

Veja o diagrama a seguir para entender melhor estes conceitos:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Acima estão representadas duas tabelas: Departamentos e Funcionarios . Cada

Acima estão 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 numéricos 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 máximo de 30 caracteres, ou seja, se alguém tentar inserir um departamento cujo nome tenha mais de 30 letras ou números não irá conseguir. No diagrama também podemos perceber que a coluna

codigo_departamento da tabela Departamentos está destacada, isto significa que esta coluna é a chave primária desta tabela. Esta chave primária garantirá que não existirão departamentos com o mesmo código.

A tabela Funcionarios também 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 monetários no SQL Server). A chave primária da tabela Funcionarios é a coluna matricula que servirá para identificar unicamente cada funcionário.

Observe que existe um relacionamento entre as tabelas Departamentos e Funcionarios, pois cada funcionário deve pertencer a um departamento. Este relacionamento ocorre através da coluna codigo_departamento que está na tabela Funcionarios. Esta coluna diz a que departamento o funcionário pertence, ou seja, ela é uma referência à 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 não existirão funcionários sem departamentos, ou o que chamamos de registros órfãos. Este relacionamento é do tipo 1 para N (ou um-para-muitos), pois cada departamento pode possuir 1 ou mais funcionários e cada funcionário 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 possíveis falhas em sua estrutura de armazenamento de dados. Evidentemente, tabelas bem projetadas são essenciais para o sucesso dos bancos de dados.

Delphi com Banco de Dados Cliente/Servidor

A título de exercício, imagine a seguinte situação: Em uma determinada rodoviária existem diversas empresas de ônibus. Todos os ônibus possuem um motorista e um trajeto

diferente. O administrador desta rodoviária precisa de um sistema que cadastre as empresas, os ônibus e os motoristas. Este sistema deve armazenar o nome e o código de cada empresa,

o número, a empresa, o motorista e o trajeto de cada ônibus e o nome, número, idade, sexo e

salário de cada motorista. Com base nas informações acima, iremos criar um modelo de dados que atenda às necessidades da rodoviária.

Antes de iniciar o desenho do diagrama, precisamos identificar as entidades, os atributos e os relacionamentos envolvidos no contexto do sistema. As entidades são as pessoas, objetos, bens, produtos ou serviços que fazem parte do negócio da aplicação. Podemos então perceber que as entidades neste caso serão: as empresas, os ônibus e os motoristas. Os atributos são as informações ou características de cada entidade. Por exemplo, os atributos da entidade empresas são: código e nome; enquanto os atributos da entidade motorista são: nome, número, idade, sexo e salário. Os relacionamentos, como o próprio nome diz, são as relações entre entidades. Por exemplo, precisamos saber qual é o motorista de cada ônibus e a que empresa o ônibus pertence. Estes relacionamentos dão origem a novos atributos que identificam a dependência 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á necessário primeiro cadastrar a empresa e o motorista.

As entidades serão as tabelas e os atributos serão as colunas das tabelas. Os

relacionamentos serão as colunas que impõem a relação entre as tabelas e consequentemente

a integridade dos dados.

Sendo assim, criamos o seguinte modelo de dados:

dos dados. Sendo assim, criamos o seguinte modelo de dados: Como em quase tudo, o planejamento

Como em quase tudo, o planejamento e o projeto são a parte mais chata. Entretanto, esta fase é fundamental para o sucesso de uma boa aplicação.

Delphi com Banco de Dados Cliente/Servidor

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 rodoviária. Para isto, expanda o ícone do servidor e clique com o botão direito do mouse sobre a opção Databases. Na caixa de diálogo que surgirá, clique em New Database

. Na caixa de diálogo que surgirá, clique em New Database Em seguida, será exibida a

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.

(sem aspas). Clique em OK para criar o novo Banco de Dados. Obs.: O nome de

Obs.: O nome de um banco de dados, assim como de tabelas, colunas e outros objetos do SQL Server, não deve possuir caracteres especiais, acentos ou espaços.

Delphi com Banco de Dados Cliente/Servidor

Após criar o banco de dados Rodoviaria, acesse a seção Tables para criarmos as tabelas do modelo de dados. Você perceberá que já existirão outras tabelas criadas no Banco de Dados Rodoviaria. Estas tabelas “sys_alguma_coisa” são para uso exclusivo do SQL Server, portanto, ignore-as. Clique com o botão direito sobre a opção Tables e em seguida em New Table

direito sobre a opção Tables e em seguida em New Table Será exibida uma tela para

Será exibida uma tela para criarmos a estrutura da nova tabela. Vamos criar primeiro a tabela “Empresas”, para isso basta seguir as especificações do modelo que criamos anteriormente. Digite o nome da primeira coluna da tabela Empresas que, segundo nosso modelo, é “cod_empresa”. Em Data Type escolha o tipo de dado “int” e em seguida clique no ícone que possui a figura de uma chave para especificar que esta coluna é a chave primária desta tabela.

que esta col una é a chave primária desta tabela. O tamanho de uma coluna do

O tamanho de uma coluna do tipo int é por padrão igual a 4 e não pode ser alterado. Este 4 não representa a quantidade de algarismos que poderão ser armazenados e sim a quantidade de bytes em disco que esta coluna pode ocupar. O tipo int suporta números inteiros positivos ou negativos que vão de -2.147.483.657 à +2.147.483.657, ou seja, dá para armazenar muitos números nesta coluna. Preencha agora o nome da segunda coluna da tabela Empresas: “nome”. Em Data Type selecione o tipo varchar e defina o tamanho máximo de 30 caracteres em Length. Diferentemente do tipo int, o tamanho de uma coluna do tipo varchar especifica a quantidade máxima de caracteres permitidos nesta coluna. Desmarque a opção Allow Nulls (Permitir nulo) da coluna “nome”, pois esta coluna deve ter preenchimento obrigatório. A coluna “cod_empresa” também é obrigatória, mais como já definimos que ela é chave primária,

Delphi com Banco de Dados Cliente/Servidor

automaticamente o SQL Server desmarca a opção Allow Nulls, pois a chave primária sempre é obrigatória. Com isto, criamos a estrutura da tabela “Empresas” de acordo com o que foi especificado no modelo de dados.

de acordo com o que foi especificado no mo delo de dados. Só falta definir o

Só falta definir o nome da tabela, para isto clique sobre o ícone que possui a figura de um disquete. Esta opção serve para salvar as alterações feitas e para definir o nome da tabela quando isto ainda não foi feito. Obviamente, salve a tabela com o nome: Empresas.

foi feito. Obviamen te, salve a tabela com o nome: Empresas. Pronto, a tabela foi criada!

Pronto, a tabela foi criada! Feche a janela de edição e você verá a nova tabela na lista de tabelas do banco de dados Rodoviaria.

tabela na lista de tabelas do banco de dados Rodoviaria. Caso você precise alterar ou corrigir

Caso você precise alterar ou corrigir alguma coisa na estrutura da tabela, basta clicar sobre ela com o botão direito e em seguida clicar em Design Table.

com o botão direito e em seguida clicar em Design Table . Autores: Rodrigo Costa e

Delphi com Banco de Dados Cliente/Servidor

Você deve ter percebido que fica um pouco confuso visualizar nossa tabela entre um monte de tabelas de sistema do SQL Server. Caso você deseje que estas tabelas do SQL Server não sejam exibidas, faça o seguinte:

Clique com o botão direito do mouse sobre a opção que representa seu servidor e

depois clique em “Edit SQL Server Registration properties

”.

clique em “ Edit SQL Server Registration properties ”. Na janela de propriedades, desmarque a opção:

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

no Enterprise Manager tornando a tela bem mais “limpa”. Prosseguindo com a construção das tabelas de

Prosseguindo com a construção das tabelas de nosso modelo de dados, vamos agora criar a tabela “Motoristas”.

Delphi com Banco de Dados Cliente/Servidor

Clique com o botão direito sobre a opção Tables do banco de dados Rodoviaria e em seguida em New Table Crie a estrutura da tabela “Motoristas” seguindo as especificações do modelo de dados assim como fizemos com a tabela “Empresas”. Preencha corretamente os nomes das colunas e selecione os respectivos tipos de dados. Não esqueça de definir o tamanho de 40 caracteres para a coluna “nome” e de especificar a coluna “num_motorista” como chave primária da tabela. A coluna “sexo” possui um tamanho máximo de 1 caractere, pois iremos armazenar apenas “M” ou “F”. Após criar a estrutura, salve a tabela como nome “Motoristas”.

a estrutura, salve a tabela como nome “Motoristas”. A próxima (e última) tabela que iremos criar

A próxima (e última) tabela que iremos criar é a tabela “Onibus”. Deixamos esta tabela por último pelo simples fato dela “depender” das outras duas, ou seja, ela possui chave

estrangeira para as tabelas “Empresas” e “Onibus”. Nós poderíamos ter criado ela antes das outras, só que depois teríamos que editá-la para referenciar as chaves estrangeiras. Assim, com as outras tabelas já criadas, iremos fazer tudo de uma vez. Novamente clique com o botão direito sobre a opção Tables do banco de dados

Preencha os campos de acordo com o modelo de

Rodoviaria e em seguida em New Table dados.

o modelo de Rodoviaria e em seguida em New Table dados. Após preencher os campos, salve

Após preencher os campos, salve a tabela como “Onibus”, mas deixe a janela de edição aberta para que possamos configurar as chaves estrangeiras. Clique sobre a opção “Table and Index Properties” que está representada através de um ícone com uma figura de uma mão segurando um pedaço de papel.

com uma figura de uma mão segurando um pedaço de papel. Na janela que surgirá, selecione

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

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Nesta tela é que iremos criar nossas chaves estrangeiras. Só

Nesta tela é que iremos criar nossas chaves estrangeiras. Só para lembrar: uma chave estrangeira é uma coluna que “aponta” para outra coluna de uma outra tabela. A chave estrangeira somente pode apontar para uma coluna que seja chave primária ou que possua uma chave única (este conceito não será abordado neste curso). O termo “Chave Primária” é mais conhecido como “Primary Key” ou apenas “PK” e o termo “Chave Estrangeira” é conhecido como “Foreign Key” ou simplesmente “FK”.

Para criar nossa primeira chave estrangeira, clique sobre o botão “New”. Na caixa de seleção “Primary key table”, selecione a tabela Empresas e logo abaixo selecione a coluna “cod_empresa”. Na caixa de seleção “Foreign key table”, selecione a tabela “Onibus” e em seguida selecione a coluna “cod_empresa”. O que acabamos de fazer foi: dizer para o SQL Server que a coluna “cod_empresa” da tabela Onibus está ligada à coluna “cod_empresa” da tabela “Empresas”.

Veja abaixo como ficou a tela após a configuração:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Agora vamos criar a chave estrangeira para a tabela “Motoristas”.

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

a coluna “num_mot orista” da coluna “Motoristas”. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Clique sobre o botão “Fechar” e depois salve as alterações clicando sobre o botão com o ícone de um disquete. O SQL Server informará que as alterações efetuadas afetarão outras tabelas.

que as alterações efetuadas afetarão outras tabelas. Clique em “ Yes ” e Pronto! As chaves

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

Nós podemos ter certeza de que os relacionamentos foram criados corretamente através da opção Diagrams do banco de dados Rodoviaria. Nesta opção 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 botão direito do mouse sobre a opção Diagrams do banco de dados Rodoviaria e em seguida clique sobre a opção New Database Diagram

e em seguida clique sobre a opção New Database Diagram Será exibida a tela do assistente

Será exibida a tela do assistente de criação de diagramas do SQL Server.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Clique em Avançar para exibir a próxima tela onde iremos

Clique em Avançar para exibir a próxima tela onde iremos selecionar as tabelas que farão parte do nosso diagrama.

selecionar as tabelas que farão parte do nosso diagrama. Selecione todas as tabelas e clique no

Selecione todas as tabelas e clique no botão “Add >”. Em seguida, clique em Avançar e na tela seguinte em Concluir. Então o SQL Server montará o diagrama com as tabelas e seus respectivos relacionamentos.

Delphi com Banco de Dados Cliente/Servidor

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

de acordo com nosso modelo de dados. Modelo de dados Diagrama gerado pelo SQL Server Autores:

Diagrama gerado pelo SQL Server

de dados. Modelo de dados Diagrama gerado pelo SQL Server Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Instrução SELECT

No capítulo 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 várias tabelas através da famosa instrução SELECT.

O comando SELECT faz parte da linguagem SQL (Structured Query Language ou

Linguagem de Consulta Estruturada) que é o “idioma” padrão para todos os Sistemas Gerenciadores de Banco de Dados (SGBD’s), ou seja, é a língua falada por todos os bancos de dados. Não 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 SGBD’s 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 são particulares. Em virtude disso, cada empresa cria uma nova linguagem a partir da linguagem SQL padrão. Por exemplo, a linguagem para manipulação 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 situação, 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 quiséssemos simplesmente recuperar todos os registros da tabela, o comando seria o mesmo tanto para o SQL Server quanto para o Oracle, pois utilizaríamos apenas o SQL padrão:

“SELECT * FROM TABELA”

se você conhecer bem a linguagem SQL padrão, não terá

dificuldades em utilizar um ou outro SGBD, você apenas precisará aprender as funções específicas de cada software.

De uma forma geral,

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 instrução SELECT é o comando utilizado para recuperar dados de uma ou mais

tabelas de um banco de dados. Através deste comando é que conseguimos visualizar tudo o

que está gravado no banco de dados.

Autores: Rodrigo Costa e Sergio Ferreira Divulgação: www.juliobattisti.com.br

Página 28

Delphi com Banco de Dados Cliente/Servidor

Utilizaremos o banco de dados Rodoviaria (que acabamos de criar) como cobaia em

nossos estudos. Mas antes de começarmos, precisamos alimentar as tabelas do banco

Rodoviaria, pois as mesmas estão vazias e tabelas vazias não servem para muita coisa.

Selecione o banco de dados Rodoviaria na caixa de seleção 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 Araújo',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 Iguaçu x Caxias'); INSERT INTO ONIBUS VALUES (2452,101,342,'São João X Praça XV'); INSERT INTO ONIBUS VALUES (2453,101,343,'Mesquita X Praça Mauá'); INSERT INTO ONIBUS VALUES (4213,102,344,'Pavuna X Castelo'); INSERT INTO ONIBUS VALUES (4214,102,345,'Nova Iguaçu X Pavuna'); INSERT INTO ONIBUS VALUES (4215,102,346,'Caxias X São João'); INSERT INTO ONIBUS VALUES (4216,102,347,'Nilópolis 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,'São João X Itaguaí');

Digite todas as linhas mesmo sem entender o que está digitando. Estas linhas são

comandos de inserção de dados através da instrução INSERT que iremos aprender mais

adiante neste curso.

Após digitar os comandos acima, sua tela deve ficar semelhante à exibida na figura a

seguir:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Quando reunimos um conjunto de comandos SQL (como o que

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 seqüência de comandos SQL que serão executados todos de uma só vez. Para executar os comandos que acabamos de digitar, basta clicar sobre o botão “Execute” ou pressionar F5 no teclado.

sobre o botão “Execute” ou pression ar F5 no teclado. Após executar o script, o Quer

Após executar o script, o Query Analyzer exibirá o painel de resultados. Se você digitou corretamente as linhas acima, deverá ser exibido o texto “(1 row(s) affected)” para cada INSERT realizado.

texto “(1 row(s) affected)” para cada INSERT realizado. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

No Query Analyzer você pode salvar seu script em arquivo do tipo texto com a extensão .sql”. Para salvar o script recém criado, clique em File > Save.

salvar o script recém criado, clique em File > Save . Defina um nome para o

Defina um nome para o arquivo e onde o mesmo será gravado, em seguida clique em

Salvar.

e onde o mesmo será gravado, em seguida clique em Salvar. É muito interessante você 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.

Open , selecionar o arquivo desejado e clicar em Abrir . Autores: Rodrigo Costa e Sergio

Delphi com Banco de Dados Cliente/Servidor

O Query

Analyzer

também

permite

que

você

trabalhe

com

várias

janelas

simultaneamente. Você pode abrir novas janelas através da opção New Query.

pode abrir novas janelas através da opção New Query . Vamos afinal, conhecer o comando SELECT.
pode abrir novas janelas através da opção New Query . Vamos afinal, conhecer o comando SELECT.

Vamos afinal, conhecer o comando SELECT. Feche a janela do script que executamos para popular o banco de dados Rodoviaria e deixe apenas uma janela limpa aberta.

A sintaxe básica do comando SELECT é a seguinte:

aberta. A sintaxe básica do comando SELECT é a seguinte: Por exemplo, para recuperar o nome

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

SELECT NOME FROM MOTORISTAS

Delphi com Banco de Dados Cliente/Servidor

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 maiúsculas ou minúsculas, pois o SQL Server não se importa com isso. Os comandos estão em letras maiúsculas neste livro apenas por uma questão de preferência.

neste livro apenas por uma questão de preferência. Para recuperar mais de uma coluna da tabela

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

SELECT NOME,IDADE,SEXO FROM MOTORISTAS

O resultado do comando acima é apresentado abaixo:

O resultado do comando acima é apresentado abaixo: Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Como podemos perceber, o comando SELECT é muito fácil de entender. Você praticamente escreve (em inglês) 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 vírgula ou simplesmente colocar um asterisco “*” no lugar dos nomes das colunas. Por exemplo, para obter todas as colunas da tabela Motoristas, o comando seria o seguinte:

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

Entretanto, poderíamos obter o mesmo resultado com o seguinte comando:

SELECT * FROM MOTORISTAS

O símbolo asterisco (*) representa todas as colunas de uma tabela, sendo assim, sempre que quiser obter todas as colunas de uma tabela basta colocar um asterisco ao invés de digitar o nome de todas as colunas.

asterisco ao invés de digitar o nome de todas as colunas. Você pode atribuir um título

Você pode atribuir um título para cada coluna retornada em sua consulta caso não deseje que título seja o próprio nome da coluna. Por exemplo, se ao invés de aparecer “num_motorista” você quiser que apareça “Número do Motorista”, você então deverá utilizar um apelido. Exemplo:

Delphi com Banco de Dados Cliente/Servidor

SELECT NUM_MOTORISTA AS 'NÚMERO DO MOTORISTA', NOME FROM MOTORISTAS

AS 'NÚMERO DO MOTORISTA', NOME FROM MOTORISTAS Você pode atribuir um apelido para cada coluna da

Você pode atribuir um apelido para cada coluna da consulta, isto é bem interessante para gerar relatórios com títulos de coluna mais descritivos. Abaixo mais um exemplo de utilização de apelidos.

Abaixo mais um exemplo de utilização de apelidos. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Além da sintaxe básica da instrução SELECT que recupera todos os registros de uma tabela, podemos utilizar a cláusula WHERE para restringir o resultado desejado. Por exemplo, o comando “SELECT NOME FROM MOTORISTAS” devolve a coluna nome de todos os registros existentes na tabela Motoristas e se quiséssemos obter somente o nome dos motoristas que são do sexo Masculino, o comando seria:

SELECT NOME FROM MOTORISTAS WHERE SEXO = 'M'

seria: SELECT NOME FROM MOTORISTAS WHERE SEXO = 'M' O comando acima pode ser lido desta

O comando acima pode ser lido desta forma: “Obtenha o nome dos motoristas onde o sexo seja igual a ‘M’”. Para obter o nome dos motoristas que sejam do sexo Feminino basta alterar o valor M para F:

SELECT NOME FROM MOTORISTAS WHERE SEXO = 'F'

para F: SELECT NOME FROM MOTORISTAS WHERE SEXO = 'F' Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Na cláusula WHERE podemos restringir o resultado desejado impondo uma condição para o SQL Server onde ele só trará os registros que atendam à condição imposta. Caso não existam registros que atendam à condição imposta na cláusula WHERE o resultado será nulo. Exemplo: Execute o comando abaixo que tenta obter o nome dos motoristas que possuem sexo igual a B. Obviamente, não existe sexo igual a B e portanto o SQL Server não trará resultado.

igual a B e portanto o SQL Server não trará resultado. A cláusula WHERE permite que

A cláusula WHERE permite que você defina mais de uma restrição, para isto basta separar cada condição através do operador “AND”. Por exemplo, para obter os motoristas que sejam do sexo masculino e tenham mais de 30 anos, o comando seria o seguinte:

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

FROM MOTORISTAS WHERE SEXO = 'M' AND IDADE > 30 Você também pode restringir o resultado

Você também pode restringir o resultado de uma consulta utilizando o operador LIKE. Este operador permite que você crie uma condição parcial como aqueles casos em que não é possível utilizar os operadores “=” (igual) ou “<>” (diferente). Por exemplo, obter os motoristas cujos nomes comecem pela letra “A”. O operador LIKE é utilizado juntamente com o operador “%” (percentagem). O comando então seria:

Delphi com Banco de Dados Cliente/Servidor

SELECT * FROM MOTORISTAS WHERE NOME LIKE 'A%'

SELECT * FROM MOTORISTAS WHERE NOME LIKE 'A%' Para obter os motoristas cujo último nome seja

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

SELECT * FROM MOTORISTAS WHERE NOME LIKE '%Silva'

SELECT * FROM MOTORISTAS WHERE NOME LIKE '%Silva' Outro exemplo de utilização do operador LIKE: Obter

Outro exemplo de utilização do operador LIKE: Obter os ônibus que possuam o texto “São João” na coluna trajeto, ou seja, os ônibus que passam por São João. O comando seria:

SELECT * FROM ONIBUS WHERE TRAJETO LIKE '%São João%'

* FROM ONIBUS WHERE TRAJETO LIKE '%São João%' Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

O SQL Server também permite que você ordene o resultado de uma consulta através da

cláusula ORDER BY. Para ordenar o resultado de consulta basta incluir a cláusula ORDER BY e o nome da coluna no fim do comando SELECT. O ORDER BY sempre deve ser a última cláusula de uma instrução SELECT. Por exemplo, para obter todos os motoristas ordenando o resultado pelo nome:

SELECT * FROM MOTORISTAS ORDER BY NOME

resultado pelo nome: SELECT * FROM MOTORISTAS ORDER BY NOME A cláusula ORDER BY ordena o

A cláusula ORDER BY ordena o resultado por ordem alfabética caso a coluna seja do

tipo texto ou caractere, se a coluna for numérica, o ORDER BY ordenará do menor para o maior. Você também pode definir se deseja ordenar em ordem ascendente ou descente, por exemplo, ordenar os funcionários por nome em ordem descendente seria:

SELECT * FROM MOTORISTAS ORDER BY NOME DESC

Para ordenar em ordem ascendente seria:

SELECT * FROM MOTORISTAS ORDER BY NOME ASC

Delphi com Banco de Dados Cliente/Servidor

OBS.: Se você não informar os parâmetros DESC ou ASC para a cláusula ORDER BY, o SQL Server assume o parâmetro ASC como padrão, ou seja, se você colocar ASC ou não colocar nada, dá no mesmo.

Para exemplificar um pouco mais, imagine que você precise gerar uma relação de todos os motoristas da Rodoviária ordenando-os do maior para o menor salário. O SELECT seria o seguinte:

SELECT * FROM MOTORISTAS ORDER BY SALARIO DESC

o seguinte: SELECT * FROM MOTORISTAS ORDER BY SALARIO DESC Você também pode ordenar por mais

Você também pode ordenar por mais de uma coluna, por exemplo, ordenar por sexo em seguida por nome e depois por salário.

ordenar por sexo em seguida por nome e depois por salário. Autores: Rodrigo Costa e Sergio

Delphi com Banco de Dados Cliente/Servidor

A linguagem SQL também fornece várias funções que são muito úteis no dia-a-dia do desenvolvimento de aplicações. Aqui iremos conhecer apenas as que serão necessárias a este curso.

Algumas funções SQL:

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 média de valores da coluna informada;

Vamos então exemplificar o uso de cada uma.

Exemplo COUNT - Quantidade de empresas da rodoviaria:

Exemplo COUNT - Quantidade de empr esas da rodoviaria: Exemplo COUNT - Quantidade de motori stas

Exemplo COUNT - Quantidade de motoristas do sexo feminino:

COUNT - Quantidade de motori stas do sexo feminino: Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Exemplo MAX - Maior salário dos motoristas:

Exemplo MAX - Maior salário dos motoristas: Exemplo MAX - Maior idade dos motoristas: Exemplo MIN

Exemplo MAX - Maior idade dos motoristas:

dos motoristas: Exemplo MAX - Maior idade dos motoristas: Exemplo MIN - Menor idade e menor

Exemplo MIN - Menor idade e menor salário dos motoristas:

Exemplo MIN - Menor idade e menor salário dos motoristas: Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Exemplo SUM – Obter o somatório de todos os salários dos motoristas:

– Obter o somatório de todos os salários dos motoristas: Exemplo AVG – Obter a média

Exemplo AVG – Obter a média de idade dos motoristas:

Exemplo AVG – Obter a média de idade dos motoristas: Para ter um melhor aproveitamento das

Para ter um melhor aproveitamento das funções SQL disponíveis no SQL Server, é importante conhecer a cláusula GROUP BY. A cláusula GROUP BY tem por finalidade agrupar o resultado de um consulta. Vamos ver logo um exemplo de utilização do GROUP BY para ilustrar sua funcionalidade. Imagine que você precisasse emitir um relatório que informasse a quantidade de motoristas do sexo masculino e sexo feminino. Talvez você possa pensar que com dois comandos SQL você teria esta informação, exemplo:

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

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

Delphi com Banco de Dados Cliente/Servidor

Os comandos acima irão trazer a quantidade de motoristas do sexo masculino e feminino respectivamente. Entretanto existe uma maneira mais “inteligente” de fazer isso, e é através do GROUP BY que permitirá trazer as informações desejadas num único SELECT. Exemplo:

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

COUNT(*) AS 'QTD' FROM MOTORISTAS GROUP BY SEXO “Traduzindo” o comando acima: SELECIONE O SEXO E

“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: relatório de média salarial dos motoristas por sexo, ou seja, queremos saber em média quem ganha mais: homem ou mulher?

queremos saber em médi a quem ganha mais: homem ou mulher? No decorrer do curso veremos

No decorrer do curso veremos mais exemplos de utilização da cláusula GROUP BY.

Delphi com Banco de Dados Cliente/Servidor

Um outro assunto muito importante a ser abordado no aprendizado da instrução SELECT é a correlação de dados, os famosos JOINS. No capítulo 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 instrução SELECT, dizemos que estamos fazendo um JOIN entre tabelas. Para fazer JOINS de tabelas, você deve fazer uma comparação de uma ou mais colunas de uma tabela com uma ou mais colunas de uma outra tabela. Para este trabalho usaremos a instrução INNER JOIN. Vamos direto para a aplicação prática deste conceito.

Com base em nosso modelo de dados

prática deste conceito. Com base em nosso modelo de dados A coluna “cod_empresa” da tabela “Onibus”

A coluna “cod_empresa” da tabela “Onibus” faz referência à coluna “cod_empresa” da tabela “Empresas”. Então, 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

JOIN EMPRESAS ON ONIBUS.COD_EMPRESA = EMPRESAS.COD_EMPRESA Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

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 instrução SELECT, devemos referenciar cada coluna dizendo à que tabela ela pertence, ou seja, devemos informar a “tabela.coluna” que queremos que seja retornado no SELECT.

Um outro exemplo, para conhecer o nome do motorista de cada ônibus, o SELECT seria o seguinte:

SELECT ONIBUS.NUM_ONIBUS AS 'ÔNIBUS', MOTORISTAS.NOME AS 'MOTORISTA'

FROM ONIBUS

INNER JOIN MOTORISTAS ON ONIBUS.NUM_MOTORISTA = MOTORISTAS.NUM_MOTORISTA

ON ONIBUS.NUM_M OTORISTA = MOTORISTAS.NUM_MOTORISTA Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

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

JOIN EMPRESAS ON ONIBUS.COD_EMPRESA = EMPRESAS.COD_EMPRESA Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Instrução INSERT

A instrução INSERT, como seu próprio nome indica, tem a finalidade de inserir registros

em uma tabela. É através do comando INSERT que podemos cadastrar novos registros e alimentar as tabelas de nosso banco de dados.

A sintaxe da instrução INSERT é a seguinte:

de dados. A sintaxe da instrução INSERT é a seguinte: Entendo a sintaxe acima: as palavras

Entendo a sintaxe acima: as palavras INSERT e INTO são fixas, portanto você sempre vai digitá-las. Em seguida vem o nome da tabela que você vai inserir um novo registro. Após o nome da tabela, você deve especificar o nome de cada coluna que você vai preencher entre parênteses “( )”. Caso você vá preencher todas as colunas da tabela e na mesma ordem em que elas estão na tabela, então não é necessário digitar o nome das colunas, caso contrário você deve digitar apenas o nome das colunas que você vai preencher. Após o nome das colunas que serão preenchidas, vem outra palavra fixa: VALUES e em seguida você deve digitar os valores que preencherão as colunas informadas na lista de colunas digitadas.

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

INSERT INTO MOTORISTAS (NUM_MOTORISTA, NOME, IDADE, SEXO, SALARIO) VALUES (351,'José Antônio',32,'M',1150)

VALUES (351,'José Antônio',32,'M',1150) Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Traduzindo o comando acima: “INSIRA NA TABELA MOTORISTAS PARA OS CAMPOS NUM_MOTORISTA, NOME, IDADE, SEXO E SALARIO OS SEGUINTES VALORES: 351, José Antônio, 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 são do tipo varchar e por isso os valores ‘José Carlos’ e ‘M’ foram passadas entre aspas simples para que o SQL Server entenda que estes valores são do tipo texto e não gere um erro de incompatibilidade de tipos de dados.

Como neste exemplo estamos preenchendo todas as colunas da tabela Motoristas, também poderíamos inserir um novo registro sem precisar referenciar o nome das colunas, bastando apenas passar todos os valores após a palavra VALUES.

Exemplo:

INSERT INTO MOTORISTAS VALUES (352,'Débora dos Santos',35,'F',1000)

(352,'Débora dos Santos',35,'F',1000) Observe que no comando acima não referenc iamos as colunas

Observe que no comando acima não referenciamos as colunas que seriam preenchidas uma vez que iríamos preencher todas elas.

É importante analisar as tabelas antes de efetuar qualquer inserção para que não haja erros de integridade de dados. Por exemplo, vamos tentar inserir um novo registro na tabela Onibus. Digite o comando abaixo e em seguida execute-o:

INSERT INTO ONIBUS VALUES (6258,106,351,'Pavuna X Méier')

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Após executar o comando INSERT, o SQL Server retorna um

Após executar o comando INSERT, o SQL Server retorna um erro de integridade de dados informando que a instrução 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 não está cadastrada na tabela Empresas. Para evitar este tipo de erro, devemos sempre analisar o modelo de dados e checar se existem dependências que devem ser atendidas antes de inserir qualquer coisa em uma tabela. Antes de cadastrar este ônibus devemos então cadastrar a empresa que possui o código 106 ou então verificar se ele pertence a alguma outra empresa que já esteja cadastrada.

Vamos cadastrar a empresa 106 de nome Nilopolitana:

INSERT INTO EMPRESAS VALUES (106,'Nilopolitana')

INSERT INTO EMPRESAS VA LUES (106,'Nilopolitana') Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Pronto, já podemos cadastrar o novo ônibus, pois a empresa já está cadastrada e o motorista (351) também (se não iria dar erro novamente).

INSERT INTO ONIBUS VALUES (6258,106,351,'Pavuna X Méier')

INTO ONIBUS VALUES (6258,106,351,'Pavuna X Méier') Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Instrução UPDATE

A instrução UPDATE é utilizada para atualizar o valor de uma ou mais colunas de uma tabela. Este comando tem a finalidade de substituir o valor existente em uma coluna por um novo valor. A sintaxe básica é a seguinte:

coluna por um novo valor. A sintaxe básica é a seguinte: Exemplo: UPDATE MOTORISTAS SET IDADE

Exemplo:

UPDATE MOTORISTAS SET IDADE = 40 WHERE NUM_MOTORISTA = 352

UPDATE MOTORISTAS SET IDADE = 40 WHERE NUM_MOTORISTA = 352 Traduzindo o comando acima: “ATUALIZE A

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 vírgula, por exemplo, suponhamos que o ônibus que faz o trajeto Nilópolis X Caxias tenha sido vendido para uma outra empresa e consequentemente terá outro motorista. O comando seria o seguinte:

UPDATE ONIBUS SET COD_EMPRESA = 106, NUM_MOTORISTA = 352 WHERE TRAJETO = 'Nilópolis X Caxias'

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor A instrução acima está alterando o ônibus que faz o

A instrução acima está alterando

o ônibus

que

faz

o

trajeto

Nilópolis X Caxias

atualizando a coluna cod_empresa para 106 e a coluna num_motorista para 352.

É importante especificar com bastante critério a condição ou as condições presentes na cláusula WHERE, pois se mais de um registro atender a condição, todos serão atualizados, e se nenhum atender a condição, nenhum registro será atualizado. Caso você não especifique uma condição utilizando a cláusula WHERE, todos os registros da tabela em questão sofrerão a atualização. Isto não é muito comum, mas pode ser que você precise atualizar todos os registros de uma tabela sem qualquer restrição. Imagine que você precise executar uma instrução UPDATE que aumente o salário de todos os motoristas em 10%. O comando UPDATE para esta situação seria o seguinte:

UPDATE MOTORISTAS SET SALARIO = SALARIO * 1.10

o seguinte: UPDATE MOTORISTAS SET SALARIO = SALARIO * 1.10 Observe que não impomos nenhuma condição

Observe que não impomos nenhuma condição através da cláusula WHERE, pois realmente queríamos que todos os registros fossem atualizados. Nesta instrução estamos

Delphi com Banco de Dados Cliente/Servidor

atualizando a coluna Salário com o seu próprio valor multiplicado por 1.10, ou seja, estamos aumentando cada salário em 10%.

OBS.: O Asterisco presente no comando acima é apenas o operador de multiplicação e nada tem a ver com o asterisco utilizado para obter todas as colunas de uma tabela através da instrução SELECT.

No decorrer do curso veremos mais exemplos da instrução UPDATE.

Delphi com Banco de Dados Cliente/Servidor

Instrução DELETE

Antes de iniciarmos o aprendizado sobre o uso da instrução DELETE, é importante aprendermos o conceito de “transação”. Uma transação de banco de dados é uma unidade de trabalho em que todas as instruções são processadas com sucesso ou nenhuma das instruções é processada. As transações garantem que o trabalho que está sendo realizado será bem- sucedido ou falhará completamente. Durante uma transação, nenhuma outra transação pode modificar os dados até que você decida que as modificações serão definitivas. Decidimos falar sobre transação aqui neste capítulo que é destinado a instrução DELETE apenas para que possamos excluir registros “à vontade” e depois consigamos reverter todas as exclusões sem que seja necessário inserir tudo novamente. Embora estejamos conhecendo o conceito de transações neste capítulo, ele vale para todas as operações de modificação de dados (INSERT, UPDATE e DELETE). Em cada instrução que executamos está ocorrendo uma transação, mesmo que não tenhamos conhecimento disso. Por exemplo, quando executamos um INSERT, o SQL Server inicia uma transação automaticamente e tenta efetuar a inserção, caso a inserção seja realizada com sucesso, ele confirma a alteração tornando-a definitiva, caso contrário, o SQL Server encerra a transação sem efetuar o INSERT.

No script fictício abaixo, cada instrução SQL é uma transação separada. Se qualquer uma das instruções falhar, ela não afetará as outras. Cada instrução é bem-sucedida ou falha por inteiro, independentemente das outras instruções no script.

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

Se você pensar em operações que são realizadas apenas com uma instrução SQL, como por exemplo excluir um funcionário da lista de empregados de uma empresa, pode achar que não tem muita importância trabalhar com transações. Entretanto, quando estamos trabalhando com operações mais complexas como, por exemplo, pagamento de funcionário, a simples operação de pagamento pode ser composta por várias instruções SQL que fazem vários INSERT’S e UPDATE’S em várias tabelas para que um simples pagamento seja realizado. Desta forma, o pagamento só poderá ser efetivado se todas as alterações forem efetuadas com sucesso, senão todas as alterações devem ser desfeitas para que não haja inconsistências num banco de dados.

Delphi com Banco de Dados Cliente/Servidor

Você pode controlar transações no SQL Server através das instruções:

BEGIN TRANSACTION: Inicia uma transação;

COMMIT TRANSACTION: efetiva as alterações;

ROLLBACK TRANSACTION: cancela todas as alterações.

Abaixo está um outro script fictício que utiliza o conceito de transações:

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 ALTERAÇÕES OCORRERAM COM SUCESSO ENTÃO COMMIT TRANSACTION SENÃO ROLLBACK TRANSACTION

Obviamente, o script acima é só uma ilustração de tratamento de transações. Durante o curso, iremos ver na prática com isso funciona através de uma aplicação em Delphi. Por hora, basta conhecermos os comandos que iniciam, confirmam e cancelam uma transação.

Para que possamos excluir registros sem a preocupação de depois ter de inserir tudo de novo, execute o comando abaixo antes de começar a excluir:

BEGIN TRANSACTION

abaixo antes de começar a excluir: BEGIN TRANSACTION A partir de agora, todas as instruções de

A partir de agora, todas as instruções de modificação de dados só serão efetivadas após um COMMIT TRANSACTION ou descartadas após um ROLLBACK TRANSACTION. Você

Autores: Rodrigo Costa e Sergio Ferreira Divulgação: www.juliobattisti.com.br

Página 56

Delphi com Banco de Dados Cliente/Servidor

pode apagar o comando BEGIN TRANSACTION que acabou de executar para poder digitar os DELETE’S que serão exemplificados neste capítulo. Mais atente para um detalhe, você deve continuar na mesma janela que executou o BEGIN TRANSACTION pois a transação só é válida para uma sessão e cada janela do Query Analyzer é uma sessão diferente.

A instrução DELETE, como o próprio nome sugere, tem por finalidade excluir registros de uma tabela. Sua sintaxe básica é a seguinte:

registros de uma tabela. Sua sintaxe básica é a seguinte: Através do comando DELETE é possível

Através do comando DELETE é possível excluir um ou mais registros dependendo da condição, ou pode não excluir registro algum caso nenhum deles se encaixe na condição imposta. Exemplo de um comando DELETE:

DELETE FROM MOTORISTAS WHERE NUM_MOTORISTA = 347

DELETE: DELETE FROM MOTORISTAS WHERE NUM_MOTORISTA = 347 Traduzindo o comando acima: “EXCLUA O REGISTRO DA

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 excluído executando o seguinte SELECT:

SELECT * FROM MOTORISTAS ORDER BY NUM_MOTORISTA

Veja se no resultado aparece o motorista de número 347.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Após analisar o resultado acima, podemos ver que o registro

Após analisar o resultado acima, podemos ver que o registro foi excluído, entretanto esta exclusão ainda não foi efetivada no banco de dados, pois iniciamos uma transação quando executamos o comando BEGIN TRANSACTION. Execute agora o seguinte comando:

ROLLBACK TRANSACTION

Execute agora o seguinte comando: ROLLBACK TRANSACTION O comando que acabamos de executar encerrou a transação

O comando que acabamos de executar encerrou a transação que tínhamos iniciado descartando a exclusão que fizemos. Para constatar isto, execute novamente o comando:

SELECT * FROM MOTORISTAS ORDER BY NUM_MOTORISTA

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Veja que o registro que tinha sido excluído voltou a

Veja que o registro que tinha sido excluído voltou a aparecer. Isto ocorreu porque iniciamos uma transação e, após fazer a exclusão, encerramos a transação revertendo o DELETE através da instrução ROLLBACK TRANSACTION. Se ao invés do ROLLBACK tivéssemos executado um COMMIT TRANSACTION, a exclusão seria definitiva. O DELETE também seria definitivo se tivéssemos executado o DELETE sem iniciar uma transação, pois o SQL Server executaria uma transação automática. Sendo assim, inicie outra transação executando o comando BEGIN TRANSACTION para que possamos excluir registros e depois reverter todas as exclusões.

Quando executamos um DELETE temos que verificar se existe alguma dependência de chave estrangeira na tabela em questão. Por exemplo, vamos tentar excluir a Empresa “FLORES”:

Po r exemplo, vamos tentar excluir a Empresa “FLORES”: Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Veja que após executar o comando, o SQL Server gera um erro de chave estrangeira, pois estamos tentando excluir uma empresa que possui ônibus ligados a ela, ou seja, não podemos excluir um registro “mãe” que possui registros “filhos”. Para excluir um registro “mãe” devemos primeiro excluir os registros “filhos”. Vamos então excluir todos os ônibus que pertencem a empresa FLORES que possui o código 101:

que pertencem a empresa FLORES que possui o código 101: Agora que excluímos os ônibus da

Agora que excluímos os ônibus da empresa FLORES podemos então excluí-la:

os ônibus da empresa FLORES podemos então excluí-la: O comando DELETE também pode ser utilizado para

O comando DELETE também pode ser utilizado para limpar uma tabela, para isto basta executar a instrução sem utilizar a cláusula WHERE. Exemplo:

DELETE FROM ONIBUS

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor O DELETE executado acima excluiu todos os registros da tabela

O DELETE executado acima excluiu todos os registros da tabela Onibus sem filtrar qualquer condição porque não utilizamos a cláusula WHERE, ou seja, o comando limpou a tabela.

Pronto! Acabamos o capítulo sobre a instrução DELETE e para desfazer todas as exclusões feitas, execute o comando ROLLBACK TRANSACTION.

exclusões feitas, execute o comando ROLLBACK TRANSACTION. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Módulo 2:

Delphi com Banco de Dados Cliente/Servidor Módulo 2: Conectando o Delphi ao SQL Server O Delphi

Conectando o Delphi ao SQL Server

O Delphi disponibiliza um conjunto de objetos para manipulação de banco de dados. Aqui veremos todos os objetos que serão necessários para a criação de uma aplicação baseada em um banco

de dados Cliente/Servidor. Veremos como fazer a conexão como o servidor, recuperar informações e modificar os dados utilizando os comandos SQL aprendidos no módulo anterior. Além disso, veremos como prevenir e tratar erros de banco de dados para que a aplicação não aborte o processo e esteja preparada para todos os possíveis erros.

Delphi com Banco de Dados Cliente/Servidor

Componentes de Acesso a Dados

O Delphi disponibiliza um conjunto de objetos para acesso e manipulação de banco de dados. O suporte do Delphi a aplicativos de banco de dados é um dos principais recursos do ambiente de programação. Nas primeiras versões do Delphi, somente era possível acessar um banco de dados através do BDE (Borland Database Engine). A versão 7 que utilizamos neste curso incluem o ADO, os componentes nativos do Interbase, a biblioteca dbExpress e ainda o BDE. Abaixo segue uma breve descrição de cada uma destas tecnologias:

BDE: Essa era a tecnologia padrão de banco de dados nas primeiras versões do Delphi, mas a Borland agora a considera obsoleta. Isso é particularmente verdadeiro para o uso do BDE com servidores SQL, pois além do Client do banco de dados, você deve instalar o BDE em cada estação de trabalho que usará o sistema. Você pode visualizar os componentes do BDE através da guia BDE presente na pela de componentes.

BDE através da guia BDE presente na pela de componentes. • ADO : o ActiveX Data

ADO: o ActiveX Data Objects é a interface de alto nível da Microsoft para acesso

a banco de dados. O ADO é implementado na tecnologia de acesso a dados OLE

DB da Microsoft, que fornece acesso a banco de dados relacionais, bem como a sistemas de arquivos, email e objetos corporativos personalizados. O ADO é um

mecanismo com recursos muito interessantes como independência de servidor

de banco de dados. Sua configuração é simplificada e a instalação também, pois

o mecanismo já faz parte das versões atuais do Windows. Os objetos do ADO

estão disponíveis na guia ADO da paleta de componentes.

estão disponíveis na guia ADO da paleta de componentes. • Interbase Express : O Delphi também

Interbase Express: O Delphi também disponibiliza um conjunto de componentes de acesso a dados para o Interbase: o IBX (Interbase Express). Estes componentes são específicos para o banco de dados Interbase que é próprio da Borland. Os componentes IBX estão localizados na guia Interbase da paleta de componentes.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor • dbExpress : Um dos novos recursos do Delphi nos

dbExpress: Um dos novos recursos do Delphi nos últimos anos foi a introdução da biblioteca de banco de dados dbExpress (DBX), disponível para Linux e Windows. O DBX é uma biblioteca e não um mecanismo de acesso a dados, porque usa uma estratégia leve e basicamente não exige nenhuma configuração nas máquinas dos usuários finais. Comparado com outros mecanismos de banco de dados, o dbExpress é muito limitado em termos de recursos. Ele pode acessar apenas servidores SQL, não recurso de cachê e oferece apenas acesso unidirecional aos dados. Acesse a guia dbExpress da paleta de componentes para visualizar os componentes DBX.

paleta de componentes para visualizar os componentes DBX. Obviamente, devemos escolher que tecnologia de acesso a

Obviamente, devemos escolher que tecnologia de acesso a dados iremos utilizar. Não cabe aqui dizermos qual é a melhor ou pior, devemos definir qual mecanismo utilizar dependendo do ambiente que estamos trabalhando e das tecnologias envolvidas. Neste curso iremos criar aplicações de banco de dados cliente/servidor para o sistema operacional Windows utilizando o servidor de banco de dados SQL Server. Logo podemos perceber que estamos num ambiente totalmente Microsoft, sendo assim, a melhor opção neste caso é utilizar o mecanismo de acesso a dados ADO que é nativo da própria Microsoft e já está presente em qualquer versão do Windows atualmente sendo desnecessário a instalação destes componentes nas estações de trabalho.

Para criar nossas aplicações, precisaremos apenas de dois objetos da guia ADO: o ADOConnection e o ADOQuery. O objeto ADOConnection é usado fazer a conexão com o banco de dados e o objeto ADOQuery é usado para executar comandos SQL e para retornar dados através da instrução SELECT. Mais adiante veremos como configurá-los.

SELECT. Mais adiante veremos como configurá-los. Além dos componentes do mecanismo de acesso a dados, o

Além dos componentes do mecanismo de acesso a dados, o Delphi disponibiliza outros objetos que são utilizados para manipulação de banco de dados. Este objetos são utilizados em conjunto com os componentes de acesso a dados independentemente da tecnologia adotada

Delphi com Banco de Dados Cliente/Servidor

(BDE, ADO, DBX Data Controls.

).

Este componentes estão disponíveis nas através das guias Data Access e

es tão disponíveis nas através das guias Data Access e Da guia Data Access somente iremos
es tão disponíveis nas através das guias Data Access e Da guia Data Access somente iremos

Da guia Data Access somente iremos utilizar o objeto DataSource. Este objeto faz o

os

intercâmbio entre os objetos do mecanismo de banco de dados (ADO, BDE, DBX objetos de manipulação de dados que estão na guia Data Controls.

)

o

manipulação de dados que estão na guia Data Controls. ) o Os objetos da guia Data

Os objetos da guia Data Controls são utilizados para manipulação dos dados. Por exemplo, o objeto DbGrid pode ser utilizado para visualização e para edição dos dados, o objeto DbEdit é semelhante ao objeto Edit da paleta Standard com a diferença de somente ser utilizado quando ligado a uma coluna de uma tabela de banco de dados. Durante o curso veremos a utilização dos objetos da guia Data Controls.

veremos a utilização dos objetos da guia Data Controls. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Recuperando e exibindo dados

Neste capítulo iremos ver como recuperar informações através de um programa Delphi usando a instrução SELECT. Usaremos como exemplo o banco de dados “Rodoviaria” que tem sido nosso objeto de estudo até agora.

Antes de qualquer coisa, crie uma pasta chamada “Projeto Rodoviária” para salvar os arquivos que iremos criar. Em seguida abra o Delphi para começarmos!

Conforme sabemos, o Delphi ao ser iniciado já disponibiliza um novo projeto, selecione então o Form1 e altere a propriedade Caption para “Menu Rodoviária” e a propriedade Name para “Form_menu”.

Rodoviária” e a propriedade Name para “Form_menu”. Em seguida clique em Save All para salvarmos logo

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

clique em Save All para salvarmos logo nosso projeto. A primeira coisa que o Delphi vai

A primeira coisa que o Delphi vai pedir para salvar é a Unit do Form_menu, portanto salve o arquivo como o nome “Unit_menu”. Lembre-se de salvar os arquivos na pasta que criamos para este propósito.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Em seguida o Delphi pedirá que salve o arquivo do

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

o arquivo do projeto, salve-o como nome “Rodoviaria”. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Após salvar os arquivos, insira 4 objetos BitBtn ao Form_menu. Estes botões serão utilizados para chamar as outras telas do programa e para fechar a aplicação.

as outras telas do programa e para fechar a aplicação. Altere a propriedade Caption dos botões

Altere a propriedade Caption dos botões para “Empresas”, “Motoristas”, “Ônibus” e “Fechar” respectivamente. Altere também a propriedade Name para “btn_empresas”, “btn_mototristas”, “btn_onibus” e “btn_fechar” de cada botão correspondente. Se desejar formate a fonte utilizada e redimensione os botões e o Form_menu como quiser. Organize os botões conforme exibido abaixo:

como quiser. Organize os botões conforme exibido abaixo: comando “Application.Terminate;”. Esta instrução fará

comando

“Application.Terminate;”. Esta instrução fará com que a aplicação seja encerrada quando alguém clicar no botão Fechar.

Acesse

o

evento

OnClick

do

botão

btn_fechar

e

digite

o

Acesse o evento OnClick do botã o btn_fechar e digite o Vamos agora inserir um objeto

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

Autores: Rodrigo Costa e Sergio Ferreira Divulgação: www.juliobattisti.com.br

Página 68

Delphi com Banco de Dados Cliente/Servidor

Selecione

Delphi com Banco de Dados Cliente/Servidor Selecione o objeto ADOConne ction que inserimos no Form_menu e

o

objeto

ADOConnection

que

inserimos

no

Form_menu

e

altere

sua

propriedade Name para “ConexaoBD” e a propriedade Login Prompt para “False”.

e a propriedade Login Prompt para “False”. da propriedade ConnectionString . A propriedade

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, além disso, especificamos o nome do servidor, o usuário e a senha que será utilizada

para acessar o banco de dados. Na tela que surgiu após clicar sobre o botão “ o botão Build

clique sobre

Em

seguida,

clique

sobre

o

botão

”,

clique sobre Em seguida, clique sobre o botão “ ” ”, Autores: Rodrigo Costa e Sergio

Delphi com Banco de Dados Cliente/Servidor

A primeira opção que devemos configurar é o software de banco de dados que iremos

acessar, em nosso caso, iremos acessar um servidor SQL Server, portanto selecione a opção Microsoft OLE DB Provider for SQL Server. Clique em Avançar para continuar com a configuração do objeto ConexaoDB.

para continuar com a configuração do objeto ConexaoDB. Agora devemos informar o nome do servidor SQL

Agora devemos informar o nome do servidor SQL Server que desejamos acessar. Você também pode informar o endereço IP do servidor caso não saiba ou não queira usar o nome do servidor.

A próxima opção é usuário e a senha utilizada para acessar o servidor. Digite um

usuário e a senha desejada. Sugerimos que você utilize o mesmo usuário/senha que usou para se conectar no Query Analyzer. Marque a opção “Permitir salvamento de senha”. Iremos deixar esta opção marcada temporariamente enquanto estamos programando para que não seja necessário informar a senha toda hora.

A última opção a configurar é o banco de dados que iremos acessar. Como vimos

anteriormente neste curso, um servidor SQL Server possui vários banco de dados e aqui podemos então selecionar qual deles iremos acessar. Selecione o banco de dados Rodoviaria.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Clique no botão Testar conexão para checar se está tudo

Clique no botão Testar conexão para checar se está tudo Ok.

no botão Testar conexão para checar se está tudo Ok. Vá clicando em OK até voltar

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 estabeleça a conexão com o servidor de banco de dados.

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

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Configure as propriedades Name e Caption do novo Form como

Configure as propriedades Name e Caption do novo Form como “Form_empresas” e “Empresas” respectivamente. Em seguida clique novamente sobre o botão Save All para salvar as alterações realizadas e novo Form inserido.

para salvar as alterações realizadas e novo Form inserido. Salve a unit do Form_empresas como “Unit_empresas”.

Salve a unit do Form_empresas como “Unit_empresas”.

Salve a unit do Form_empresas como “Unit_empresas”. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

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 usuário clicar sobre o botão Fechar.

quando o usuário clicar sobre o botão Fechar. A partir de agora até o final deste

A partir de agora até o final deste curso, toda vez que for solicitado a criação de um botão Fechar, repita os procedimentos que acabamos de executar. Assim não precisaremos ficar repetindo toda hora o que você já vai estar careca de saber!

OBS.: A instrução “Close;” não funciona como a instrução “Application.Terminate;”, embora tenham funções 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 aplicação independentemente de qual form a instrução foi executada.

Delphi com Banco de Dados Cliente/Servidor

Vamos então recuperar as informações 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 Rodoviária. Insira um objeto ADOQuery ao form_empresas.

Rodoviária. Insira um objeto ADOQuery ao form_empresas. Altere a propriedade Name dele para “adoquery_empresas”.

Altere a propriedade Name dele para “adoquery_empresas”. O objeto adoquery_empresas será utilizada para recuperar os registros da tabela Empresas. Como já sabemos, a instrução SQL para este caso é o comando SELECT. Acesse a propriedade SQL do

adoquery_empresas e clique sobre o botão “

Será exibida uma janela onde devemos

digitar a instrução SQL que será executada pelo adoquery_empresas. Digite então a seguinte instrução: “SELECT * FROM EMPRESAS ORDER BY NOME”.

”.

“SELECT * FROM EMPRESAS ORDER BY NOME”. ”. Clique em OK para fechar a janela de

Clique em OK para fechar a janela de edição da propriedade SQL do objeto.

Delphi com Banco de Dados Cliente/Servidor

Além da propriedade SQL do objeto, devemos definir a conexão que o objeto utilizará para executar a instrução SQL. A conexão a ser utilizada pelo adoquery_empresas e por todos os outros objetos que iremos criar, foi configurada através do objeto conexaoBD que está no form_menu. Sendo assim, devemos ligar o objeto adoquery_empresas ao objeto conexaoBD. Como o objeto ConexaoBD está no form_menu, devemos informar ao Delphi que o form_empresas terá acesso ao form_menu. Para isto, clique em File > Use Unit.

ao fo rm_menu. Para isto, clique em File > Use Unit . Na janela que surgirá,

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

janela que surgirá, selecione a unit_menu e clique em OK. Em seguida, salve as altera ções

Em seguida, salve as alterações clicando sobre o botão Save All.

salve as altera ções clicando sobre o botão Save All . Autores: Rodrigo Costa e Sergio

Delphi com Banco de Dados Cliente/Servidor

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.

e altere a propriedade Connection para ConexaoBD. Para testar se configurou tudo corretame nte e executar

Para testar se configurou tudo corretamente e executar a instrução SQL, altere a propriedade Active do adoquery_empresas para True. Quando colocamos True na propriedade Active, o Delphi executa a instrução 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 informações de banco de dados. Então insira um objeto DBGrid (que está na guia Data Controls da paleta de componentes) ao form_empresas.

Data Controls da paleta de comp onentes) ao form_empresas. O objeto DBGrid, assim como todos os

O objeto DBGrid, assim como todos os objetos da guia Data Controls, não “fala” diretamente com os objetos ADO, portanto será necessário mais um objeto que fará o intercâmbio entre eles: o DataSource que está na guia Data Access.

entre eles: o DataSource que está na guia Data Access. Altere a propriedade Name do DBGrid

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

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Vamos então interligar os componentes. Como dito anteriormente, os objetos

Vamos então interligar os componentes. Como dito anteriormente, os objetos Data Controls não falam diretamente com os objetos ADO, quem faz este trabalho é o Data Source. Então vamos ligar o ds_empresas ao adoquery_empresas e o dbgrid_empresas ao ds_empresas.

ao ad oquery_empresas e o dbgrid_empresas ao ds_empresas. Selecione o objeto ds_empresas e altere a

Selecione

o

objeto

ds_empresas

e

altere

a

propriedade

DataSet

para

adoquery_empresas.

 
 
   
 

Selecione

o

objeto

dbgrid_empresas

e

altere

a

propriedade

DataSource

para

ds_empresas.

a propriedade DataSource para ds_empresas. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

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

Active e os registros serão exibidos no dbgrid_empresas. Não é muito interessante deixar o adoquery ativo,

Não é muito interessante deixar o adoquery ativo, é sempre muito melhor ativá-lo

durante a execução do programa, pois assim ele sempre estará atualizado, portanto coloque False na propriedade Active do adoquery_empresas. Vamos fazer o seguinte: ativar o adoquery_empresas quando o form_empresas for exibido e desativá-lo quando o form_empresas for fechado.O evento executado na exibição de um Form é OnShow e o executado quando um form é fechado é OnClose.

Sendo

assim,

acesse

“adoquery_empresas.Open;”

o

evento

OnShow

do

form_empresas

e

digite:

o evento On Show do form_empresas e digite: O método Open do objeto adoquery é o

O método Open do objeto adoquery é o equivalente a colocar True na propriedade

Active.

Em

seguida

acesse

“adoquery_empresas.close;”

o

evento

OnClose

do

form_empresas

e

digite:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor O método Close do objeto adoquery é o equivalente a

O método Close do objeto adoquery é o equivalente a colocar False na propriedade

Active.

Devemos fazer a mesma coisa com o objeto ConexaoBD, estabelecer a conexão e encerrá-la dinamicamente na execução 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;”

o evento OnShow do form_menu e di gite “ConexaoBD.Open;” No evento OnClose do form_menu digite “ConexaoBD.Close;”

No evento OnClose do form_menu digite “ConexaoBD.Close;”

No evento OnClose do form_menu digite “ConexaoBD.Close;” Antes de executar a aplicação para testarmos se está

Antes de executar a aplicação para testarmos se está tudo funcionando, devemos programar o botão btn_empresas do form_menu para chamar o form_empresas. Para isto, digite o seguinte no evento OnClick do botão btn_empresas “form_empresas.showmodal;”

Autores: Rodrigo Costa e Sergio Ferreira Divulgação: www.juliobattisti.com.br

Página 79

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Agora salve todas as alterações clicando em Save All e

Agora salve todas as alterações clicando em Save All e execute a aplicação. Quando você clicar sobre o botão Run ou pressionar F9 para executar a aplicação o Delphi informará que o form_menu está fazendo menção ao form_empresas e lhe questiona se deseja que ele crie automaticamente esta referência no código. Clique em Yes e execute a aplicação.

no có digo. Clique em Yes e execute a aplicação. Autores: Rodrigo Costa e Sergio Ferreira
no có digo. Clique em Yes e execute a aplicação. Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Após testar a aplicação feche o projeto que está executando clicando sobre o botão fechar que colocamos no form_menu. Vamos agora fazer o mesmo para Motoristas e Ônibus.

Repita os mesmos passos que fizemos para criar a tela de Empresas: Insira um novo Form,

altere Name e Caption, salve com o nome apropriado lembrar de todos os procedimentos.

Releia as páginas anteriores para

O SELECT a ser usado para a tela de Motoristas será: O SELECT para a
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:

tabelas para poder exibir o nome da empresa e do motorista: Autores: Rodrigo Costa e Sergio

Delphi com Banco de Dados Cliente/Servidor

Pronto! Você já pode executar a aplicação. Se você seguiu corretamente os passos descritos para a criação da tela de empresas, as telas de motoristas e ônibus deverão estar funcionando corretamente. Não se esqueça de programar os botões da tela de menu para chamar as novas telas criadas, do contrário eles não servirão para alguma coisa.

do contrári o eles não servirão para alguma coisa. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:
do contrári o eles não servirão para alguma coisa. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

Inserindo Dados

No capítulo anterior vimos como recuperar informações de um banco de dados com o Delphi através de seus componentes e da instrução SELECT. Neste capítulo iremos aprender como inserir informações em banco de dados com o Delphi usando a instrução INSERT. Vamos primeiro programar a tela do cadastro de Empresas e depois programamos as telas de Motoristas e de Ônibus.

Para incluir informações em uma tabela, o usuário vai precisar de campos de entrada de dados, portanto vamos incluir alguns objetos que permitirão o usuário digitar as informações desejadas.

permitirão o usuário digitar as informações desejadas. A tabela Empresas possui 2 colunas, e por isso

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

preencher. Insira dois objetos Edit (guia Standard). Renomeie os objetos através da propriedade Name para

Renomeie os objetos através da propriedade Name para “edt_cod” e “edt_nome” respectivamente. Limpe o conteúdo da propriedade Text de ambos os Edit’s, pois esta propriedade é a responsável por armazenar o texto que foi digitado para o usuário e por isso deve estar vazia para o usuário digitar o que desejar. Altere a propriedade MaxLength do edt_cod para 10 e do edt_nome para 30. Esta propriedade define a quantidade máxima de caracteres que podem ser digitados em um Edit. Insira também dois objetos Label (guia Standard), um para cada Edit. Altere a propriedade Caption deles para “Código” e “Nome” respectivamente.

deles para “Código” e “Nome” respectivamente. Organize os objetos conforme exibido na figura abaixo.

Organize os objetos conforme exibido na figura abaixo.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Nós já temos um objeto ADOQuery que realiza o SELECT

Nós já temos um objeto ADOQuery que realiza o SELECT para visualização dos registros existentes na tabela Empresas do banco de dados Rodoviaria, agora precisaremos de outro objeto ADOQuery para executar a instrução INSERT e os demais comandos SQL (UPDATE e DELETE) necessários para a funcionalidade desta tela. Insira então um objeto ADOQuery, altere a propriedade Name dele para adoquery_aux (“aux” de auxiliar, pois vai nos auxiliar a executar as instruções SQL) e selecione o objeto ConexaoDB na propriedade Connection para ligá-lo ao objeto ADOConnection que está no form_menu.

ligá-lo ao objeto ADOConnection que está no form_menu. Além dos objetos para entrada de dados e
ligá-lo ao objeto ADOConnection que está no form_menu. Além dos objetos para entrada de dados e

Além dos objetos para entrada de dados e do adoquery, precisaremos de um botão 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 código abaixo:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor As linhas começadas com “//” são comentários e por isso

As linhas começadas com “//” são comentários e por isso não são executadas pelo Delphi, elas servem para documentar o código e explicar o que ele está fazendo. Você pode alterar as cores de letra e background dos comentários através do menu do Delphi Tools > Editor Options.

através do menu do Delphi Tools > Editor Options . Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Após digitar o código acima, salve todas as alterações clicando

Após digitar o código acima, salve todas as alterações clicando sobre o botão Save All. Em seguida execute o projeto para testar a nova funcionalidade.

seguida execute o projeto para testar a nova funcionalidade. Insira mais alguns registros para testar a

Insira mais alguns registros para testar a aplicação. Apenas certifique-se de que não vai inserir uma empresa com um código que já esteja cadastrado, do contrário ocorrerá um erro de violação de chave primária. Mais adiante neste curso veremos como tratar erros de banco de dados.

Delphi com Banco de Dados Cliente/Servidor

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.

aplicando as particularidades da tabela Motoristas. A tela deve ficar semelhante à exibida na figura abaixo:

A tela deve ficar semelhante à exibida na figura abaixo:

A tela deve ficar semelhante à exibida na figura abaixo: No evento OnClick do botão Inserir

No evento OnClick do botão Inserir digite o código exibido na imagem abaixo.

OBS.: Neste código retiramos os comentários para diminuir o tamanho da imagem e, além disso, é praticamente idêntico ao código do botão Inserir da tela de Empresas, portanto segue a mesma explicação.

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Salve as alterações e execute a aplicação para testar a

Salve as alterações e execute a aplicação para testar a nova funcionalidade.

e execute a aplicação para testar a nova funcionalidade. Autores: Rodrigo Costa e Sergio Ferreira Divulgação:

Delphi com Banco de Dados Cliente/Servidor

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

de dados da tabela Onibus do banco de dados Rodoviaria. Insira dois objetos Edit ao form_onibus,

Insira dois objetos Edit ao form_onibus, um para o usuário digitar o número do ônibus e o outro para o usuário digitar o trajeto do mesmo. Altere a propriedade Name deles para “edt_num” e “edt_trajeto” respectivamente. Para os outros dois campos da tabela:

num_motorista e cod_empresa, usaremos o objeto ComboBox (guia Standard), pois como estas informações já estão cadastradas, iremos exibir uma lista para que o usuário selecione a que desejar. Insira dois objetos ComboBox, um para o motorista e o outro para a empresa.

ComboBox, um para o motorista e o outro para a empresa. Altere a propriedade Name deles

Altere a propriedade Name deles para “cb_motorista” e “cb_empresa” respectivamente. Também limpe a propriedade Text de ambos e insira objetos Label para todos os campos. Insira um botão para inserir e um ADOQuery conforme fizemos para as outras telas, não se esqueça de configurar suas propriedades. Organize os objetos conforme exibido na imagem abaixo:

Orga nize os objetos conforme exibido na imagem abaixo: Esta tela não será tão simples como

Esta tela não será tão simples como as outras, pois iremos exibir informações de outras tabelas através dos objetos combobox o que exigirá uma programação mais elaborada. Vamos

Delphi com Banco de Dados Cliente/Servidor

alimentar os objetos ComboBox quando o a tela de ônibus for exibida, para isto adicione o

código abaixo no evento OnShow do form_menu:

//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 não chegar ao final da query faça 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 próximo 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 não chegar ao final da query faça 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 próximo registro da query adoquery_aux.Next; end; // Fecha a query de empresas adoquery_aux.Close;

Os objetos ComboBox irão exibir os nomes dos motoristas e das empresas, entretanto o

que deve ser gravado na tabela é o número do motorista e o código da empresa e não os

nomes. Sendo assim, vamos criar duas variáveis que servirão para armazenar estes valores.

Delphi com Banco de Dados Cliente/Servidor

pouco antes da seção

implementation” e declare as seguintes variáveis: “num_motorista” e “cod_empresa” do tipo integer.

Acesse

a

seção

Var

da

unit_onibus

que

fica

um

. Acesse a seção “ Var ” da unit_onibus que fica um Nós iremos alimentar estas

Nós iremos alimentar estas variáveis quando o usuário selecionar o motorista e a empresa nos combobox, ou seja, quando o usuário selecionar o nome de um motorista no combobox, iremos obter o número dele no banco de dados e atribuir à variável. Faremos a mesma coisa para a empresa. O evento executado quando o usuário seleciona uma opção no combobox é o evento OnChange. Acesse o evento OnChange do cb_motorista e digite o seguinte código:

to OnChange do cb_motorista e digite o seguinte código: No evento OnChange do objeto cb_empresa digite

No evento OnChange do objeto cb_empresa digite o seguinte código:

Delphi com Banco de Dados Cliente/Servidor

Delphi com Banco de Dados Cliente/Servidor Agora só falta programar o botão “Inserir ”. Para isto

Agora só falta programar o botão “Inserir”. Para isto digite o código abaixo:

o botão “Inserir ”. Para isto digite o código abaixo: Autores: Rodrigo Costa e Sergio Ferreira

Delphi com Banco de Dados Cliente/Servidor

Pronto, execute a aplicação para testar a nova funcionalidade!

execute a aplicação para testar a nova funcionalidade! Insira mais alguns ônibus para verificar o funcionamento

Insira mais alguns ônibus para verificar o funcionamento do programa.