Você está na página 1de 85

ndice 1 INTRODUO AO AMBIENTE DELPHI ................................................. 2 1.1 AMBIENTE DELPHI ........................................................................ 2 1.

2 TIPOS DE ARQUIVOS GERADOS PELO D ELPHI .............................................. 2 1.2.1 Units (.pas) ..................................................................................................................................... 2 1.2.2 Estrutura das units...................................................................................................................... 2 1.2.3 Forms (.dfm) .................................................................................................................................. 3 1.2.4 Projeto (.dpr)................................................................................................................................. 3 1.2.5 Esquema da estrutura dos arquivos ........................................................................................ 3 1.2.6 Outros tipos de arquivos............................................................................................................ 4 1.3 REA DE TRABALHO ....................................................................... 4 1.3.1 Menus ............................................................................................................................................... 5 1.3.2 Botes de atalho........................................................................................................................... 5 1.3.3 Paleta de componentes ............................................................................................................... 5 1.3.4 Object Inspector ......................................................................................................................... 5 1.3.4.1 Properties (aba) .........................................................................................................................................5 1.3.4.2 Events (aba).................................................................................................................................................7 1.3.5 Form (Formulrios) ...................................................................................................................... 8 1.3.6 Unit ................................................................................................................................................... 9 1.3.6.1 Estrutura de uma unit ..............................................................................................................................9 1.4 PROGRAMANDO NO AMBIENTE D ELPHI ..................................................... 9 1.4.1 Principais tipos de dados do ambiente Delphi ..................................................................... 9 1.4.2 Converso de tipos ..................................................................................................................... 10 1.4.3 Declarao de variveis............................................................................................................ 10 1.4.3.1 Variveis globais....................................................................................................................................... 10 1.4.3.2 Variveis locais ......................................................................................................................................... 11 1.4.4 Declarao de procedimentos e funes ............................................................................. 11 1.4.5 Tratamento de erros (excees) .......................................................................................... 13 1.4.5.1 Bloco Try ... Except ................................................................................................................................. 13 1.4.5.2 Bloco Try... Finally ................................................................................................................................... 13 1.4.6 Depurando a aplicao (debugger) ........................................................................................ 14 1.4.6.1 Breakpoints ................................................................................................................................................ 14 1.4.6.2 Watches ..................................................................................................................................................... 15 1.5 TRABALHANDO COM COMPONENTES ......................................................15 1.5.1 Paleta de componentes (Component palettes) .................................................................. 15 1.5.2 Propriedades................................................................................................................................ 16 1.5.3 Eventos (Events) ........................................................................................................................ 16 1.5.4 Mtodos ........................................................................................................................................ 16 2 BANCO DE DADOS INTERBASE........................................................18 2.1 INTRODUO ............................................................................18 2.2 BANCO DE DADOS INTERBASE ............................................................18 2.3 SQL DML (DATA MANIPULATION LANGUAGE) ...........................................18 2.3.1 Clusula Select (selecione)................................................................................................... 19 2.3.2 Clusula From (origem) .......................................................................................................... 19

Prof. Eduardo Cotrin Teixeira

2.3.3 Clusula Where (onde)........................................................................................................... 20 2.3.4 Clusula Order By ...................................................................................................................... 21 2.3.5 Operadores .................................................................................................................................. 21 2.3.5.1 Operadores de comparao .................................................................................................................. 21 2.3.5.2 Operadores lgicos ............................................................................................................................ 22 2.4 SQL DDL (D ATA DEFINITION LANGUAGE) ..............................................22 2.4.1 Criando um banco de dados Interbase ................................................................................ 23 2.4.2 Interbase Interactive SQL .................................................................................................... 25 2.4.3 Criando tabelas no Interbase................................................................................................. 25 3 DESENVOLVENDO UM APLICATIVO COM BANCO DE DADOS (INTERBASE).......28 3.1 INICIANDO UMA NOVA APLICAO ......................................................28 3.2 CONFIGURANDO OPES DO PROJETO ....................................................29 3.3 DEFININDO O MENU DO FORMULRIO PRINCIPAL .........................................29 3.4 CONECTANDO O APLICATIVO (D ELPHI) AO INTERBASE ...................................32 3.4.1 O que so Data Modules?......................................................................................................... 32 3.5 CONECTANDO AO B ANCO.GDB ............................................................32 3.6 TRANSAES E ACESSO CONCORRENTE EM BANCO DE DADOS .............................34 3.6.1 Controlando transaes atravs do componente IBTransaction ................................. 34 3.7 ADICIONADO AS TABELAS DO BANCO DE DADOS .........................................34 3.7.1 Conectando a tabela Departamento ..................................................................................... 34 3.7.2 Conectando a tabela Dependentes........................................................................................ 35 3.7.3 Conectando a tabela Estados.................................................................................................. 35 3.7.4 Conectando a tabela Funcionrios ......................................................................................... 36 3.8 ADICIONANDO OS CAMPOS DAS TABELAS ................................................37 3.9 ADICIONADO CAMPOS L OOKUPS ..........................................................39 3.10 CADASTRO DE ESTADOS ...............................................................41 3.10.1 Habilitando e Desabilitando os botes da barra .............................................................. 44 3.10.2 Adicionando os cdigos dos botes da barra..................................................................... 45 3.10.3 Adicionando cdigo do formulrio ......................................................................................... 46 3.10.4 Validaes de dados .................................................................................................................. 47 3.10.4.1 Verificando a existncia chave primria: ................................................................................... 47 3.10.4.2 Verificando os campos de preenchimento obrigatrio ........................................................... 50 3.10.5 Pesquisa do Cadastro de Estados .......................................................................................... 51 3.11 CONSTRUINDO FORMULRIOS MODELOS (REPOSITRIO) ...............................56 3.11.1 Adicionando o formulrio de Cadastro Estados ao Repositrio ................................... 56 3.11.2 Adicionando o formulrio de Pesquisa de Estados ao Repositrio .............................. 56 3.12 CADASTRO DE DEPARTAMENTO ........................................................56 3.12.1 Pesquisa do Cadastro de Departamento .............................................................................. 58 3.13 CADASTRO DE FUNCIONRIOS .........................................................60 3.13.1 Pesquisa do Cadastro de Funcionrios ................................................................................. 63 3.14 CADASTRO DE DEPENDENTES ..........................................................66 3.14.1 Definindo a tabela Dependente como detalhe da tabela Funcionrio ........................ 68 3.14.2 Quando posso aplicar o recurso mestre-detalhe ? .......................................................... 68 4 RELATRIOS ...............................................................................70 4.1 ELABORANDO
RELATRIO SIMPLES

(RELATRIO

DE

E STADOS)............................70

Prof. Eduardo Cotrin Teixeira

4.2 ELABORANDO RELATRIO MESTRE-DETALHE (FUNCIONRIO E SEUS DEPENDENTES) ......73 4.3 UTILIZANDO QUERY PARA ELABORAR RELATRIO DE SOMA DE SALRIOS POR D EPARTAMENTO ................................................................................77 5 RELACIONANDO O APLICATIVO A AJUDA ON-LINE (F1)...........................82 5.1 5.2 5.3 6 DEFININDO O ARQUIVO DE AJUDA DO APLICATIVO ......................................82 DEFININDO A AJUDA CONTEXTUAL (F1) .................................................82 ATIVANDO A AJUDA PELO FORMULRIO PRINCIPAL .......................................82

CONSTRUINDO O INSTALADOR ........................................................83 6.1 CRIANDO O PROJETO DE INSTALAO ...................................................83 6.2 CONFIGURANDO AS OPES DE INSTALAO .............................................83 6.2.1 Configurando o grupo Set the Visual Design ..................................................................... 84 6.2.2 Configurando o grupo Specify Components and Files ..................................................... 85 6.2.3 Configurando o grupo Select User Interface Components........................................... 86 6.2.4 Configurando o grupo Specify Folders and Icons ............................................................ 86 6.2.5 Configurando o grupo Run Disk Builder ............................................................................... 87 6.2.6 Grupo Create Distribution Media.......................................................................................... 87

REFERNCIAS BIBLIOGRFICAS ........................................................89

Prof. Eduardo Cotrin Teixeira

ndice de Figuras Figura 1 rea de Trabalho............................................................................................................................... 4 Figura 2 Utilizando breakpoints .................................................................................................................. 14 Figura 3 Janela Watch List .......................................................................................................................... 15 Figura 4 Paleta de componentes .................................................................................................................. 16 Figura 5 Estrutura de diretrios utilizada para o desenvolvimento do aplicativo ....................... 23 Figura 6 Janela Create Database ............................................................................................................... 23 Figura 7 Janela Register Database ............................................................................................................ 24 Figura 8 Modelagem de um sistema para cadastrar funcionrios..................................................... 25 Figura 9 Data Module ..................................................................................................................................... 32 Figura 10 Janela Database Component Editor ........................................................................................ 33 Figura 11 Data Module DM_Funcionarios com os componentes ......................................................... 36 Figura 12 Definio de campo Lookup na tabela funcionrio .............................................................. 40 Figura 13 Formulrio de Cadastro de Estados ........................................................................................ 41 Figura 14 Barra de botes............................................................................................................................. 44 Figura 15 Formulrio de Pesquisa de Estados ......................................................................................... 51 Figura 16 Formulrio de Cadastro de Departamentos .......................................................................... 57 Figura 17 Formulrio de Pesquisa de Departamentos ........................................................................... 58 Figura 18 Formulrio de Cadastro de Funcionrios ............................................................................... 61 Figura 19 Formulrio de Pesquisa de Funcionrios................................................................................. 63 Figura 20 Cadastro de Dependentes ......................................................................................................... 66 Figura 21 Relatrio de Estados.................................................................................................................... 70 Figura 22 Relatrio de Funcionrios e Dependentes ............................................................................ 73 Figura 23 Relatrio da soma de Salrios por Departamento.............................................................. 78 Figura 24 Tela inicial do InstallShield ...................................................................................................... 83 Figura 25 Tela de opes de configurao de projeto ......................................................................... 84 Figura 26 Janelas lado a lado ....................................................................................................................... 86 Figura 27 Grupos de arquivos da instalao ............................................................................................ 86 Figura 28 Componentes de Interface ....................................................................................................... 87

Prof. Eduardo Cotrin Teixeira

1 ADVERTNCIA Esta apostila aborda o ambiente Delphi atravs do desenvolvimento de um aplicativo de controle de funcionrios. Para que os resultados sejam alcanados, fundamental que os passos sejam seguidos a risca (nomes de diretrios, nomes de arquivos, nomes de tabelas, nomes de componentes, etc).

DIREITOS AUTORAIS Todos os direitos reservados e protegidos pela Lei 5988 de 14/12/1973. Nenhuma parte desta apostila, sem autorizao prvia por escrito do autor, poder ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrnicos, mecnicos, fotogrficos, gravao ou quaisquer outros. Todo esforo foi feito para fornecer a mais completa e adequada informao. Contudo, o autor no assume responsabilidade pelos resultados e uso da informao fornecida. Recomendo aos leitores testar a informao antes da efetiva utilizao.

MARCAS REGISTRADAS Todos os termos mencionados nesta apostila conhecidos como marcas registradas ou de servios foram devidamente apresentados na forma iniciada por maiscula. O uso de termos nesta apostila no deve ser considerado como infrao a validade das marcas registradas ou de servios. Delphi marca registrada da Borland Corporation. Interbase marca registrada da Interbase Software Corporation. InstallShield marca registrada da InstallShield Corporation. Windows marca registrada da Microsoft Corporation. No caso de erros, omisses, etc , favor enviar e-mail para: cotrin@utfpr.edu.br Autor do material original (Delphi 5): Prof. Edson dos Santos Cordeiro-Unopar Londrina, 2000 Esta adaptao (Delphi 7): Prof. Eduardo Cotrin Teixeira - UTFPR Cornlio Procpio, 2007

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

INTRODUO

AO AMBIENTE DELPHI

1.1

Ambiente Delphi

O desenvolvimento de software com qualidade e rapidez constitui-se em requisitos indispensveis exigidos pelo mercado. Dentre as inmeras ferramentas de desenvolvimento, o ambiente Delphi tem se destacado pela rapidez e grande nmero de recursos oferecidos ao desenvolvedor. Classificado como uma ferramenta RAD (Rapid Application Development), o ambiente Delphi oferece uma srie de recursos que agilizam e facilitam o desenvolvimento de aplicativos. Alm disso, o suporte que o ambiente oferece para acesso a diversos bancos de dados chamou a ateno da comunidade de desenvolvedores fazendo com que a ferramenta, em pouco tempo, fosse adotada por milhes de programadores no mundo todo.

1.2

Tipos de arquivos gerados pelo Delphi

1.2.1 Units (.pas)


Um programa construdo atravs de mdulos de cdigo fonte chamados de units. Cada unit armazenada em seu prprio arquivo (.PAS) e compilada separadamente, gerando um arquivo .DCU (Dephi Compiled Unit). Os arquivos de units compilados (.DCU) so unidos (linked) para criar uma aplicao. As units permitem: Dividir um programa em diversos mdulos que podem ser editados separadamente; Criar bibliotecas que poder ser compartilhadas entre diversas aplicaes; Distribuir bibliotecas para outros desenvolvedores sem disponibilizar o cdigo fonte.

1.2.2 Estrutura das units


unit Unit1; {identificao da unit} interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs; {Clusula uses} type TForm1 = class(TForm) {Declarao de classe} private { Private declarations } {Declaraes privadas} public { Public declarations } {Declaraes pblicas} end; var Form1: TForm1; {declarao de instncia - objeto} implementation {$R *.DFM} {diretiva do compilador para unir - link o formulrio a unit} end. {finaliza a unit}

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

1.2.3 Forms (.dfm)


Formulrios (forms) so a parte visvel de uma aplicao Delphi. Arquivos de formulrios (extenso .dfm) descrevem cada componente presente no formulrio, incluindo os valores de suas propriedades. Cada formulrio em uma aplicao Delphi associado a uma unit (.pas), entretanto, nem toda unit precisa ter um formulrio associado. A unit associada ao formulrio contm o cdigo fonte de qualquer evento associado aos componentes de um formulrio. Os formulrios recebem o mesmo nome da unit que est associado diferenciandose apenas pela extenso (.dfm).

1.2.4 Projeto (.dpr)


O ponto central do cdigo fonte de um projeto chamado de arquivo de projeto. Este arquivo atualizado pelo Delphi durante o desenvolvimento da aplicao. O arquivo de projeto contm referncias para todas as units e forms usados no projeto.
program Project1; uses Forms, Unit1 in 'UNIT1.PAS' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. {identificao do projeto} {indica as units utilizadas pelo projeto} {nome das units associadas ao projeto} {arquivos de recursos associado ao projeto} {incio do bloco principal do programa} {cria o primeiro formulrio automaticamente} {executa a aplicao} {final do bloco principal do programa}

1.2.5 Esquema da estrutura dos arquivos


TESTE

.DPR

.EXE

FORM 1

FORM 2

FORM N

.DCU

.DCU

.DCU

FORM 1

FORM 2

FORM N

.DFM .PAS

UNIT 1

.DFM .PAS

UNIT 2

.DFM .PAS

UNIT N

ROTINAS

.PAS

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

1.2.6 Outros tipos de arquivos


Extenso .DPR Definio Arquivo do Projeto Funo Cdigo fonte em Pascal do arquivo principal do projeto. Lista todos os formulrios e units no projeto, e contm cdigo de inicializao da aplicao. Criado quando o projeto salvo. Contm todas as declaraes, procedimentos, funes e eventos associados aos componentes de um formulrio. Arquivo binrio que contm as propriedades, e seus respectivos valores, de um formulrio contido em um projeto. Um .DFM est sempre associado a um arquivo .PAS do projeto. Armazena o estado corrente da rea de trabalho, como por exemplo onde as janelas (paleta de componentes, Object Inspector, etc.) esto posicionadas, suas medidas, etc. Arquivo binrio que contm o cone, mensagens da aplicao e outros recursos usados pelo projeto. Contm o conjunto de opes do projeto (opes de: compilador, linker, diretrios, diretivas, etc.) Armazena o conjunto de configurao do projeto. Este arquivo tem o mesmo nome do arquivo de projeto, porm, com a extenso .cfg. Gerado quando o projeto salvo pela segunda vez. Se um .PAS alterado, este arquivo gerado. Se voc abrir um .DFM no editor de cdigo e fizer alguma alterao, este arquivo gerado quando voc salva o arquivo.

.PAS .DFM

Cdigo fonte da Unit (Object Pascal) Arquivo grfico do formulrio Situao da rea de Trabalho Arquivo de Recursos do Compilador Delphi Options File Arquivo de configurao do projeto Arquivo de Backup do Projeto Arquivo de Backup da Unit Backup do Arquivo grfico do formulrio

.DSK

.RES .DOF .CFG .~DPR .~PAS .~DFM

1.3

rea de trabalho

Normalmente, quando o Delphi inicializado, criado um projeto (project1.dpr), uma unit (unit1.pas) e um formulrio (form1.dfm) (veja Figura 1). Botes atalho Menus Paleta de componentes

Object Inspector

Form

Unit

Figura 1 rea de Trabalho

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

1.3.1 Menus
Os menus (File, Edit, Search, View, Project,...) possibilitam o acesso a diversos recursos do ambiente Delphi.

1.3.2 Botes de atalho


Os botes de atalho permitem acionar diversos recursos do ambiente Delphi sem precisar acionar o menu correspondente. Funes como salvar podem ser acessadas de maneira rpida. Os botes de atalho podem ser personalizados de acordo com as necessidades do desenvolvedor. Para configurar esta rea, basta dar um clique com o boto direito sobre os botes de atalho e acionar a opo Customize. Atravs desta opo, possvel esconder barras de ferramentas, adicionar ou excluir botes de atalho.

1.3.3 Paleta de componentes


Nesta rea so disponibilizados os diversos componentes (visuais e no visuais) que podem ser utilizados durante a programao de um aplicativo. Os componentes esto organizados por grupos atravs das paletas (Standard, Additional, Win32, ...). Para adicionar um componente ao formulrio (botes, caixa de edio, figuras, ...) d um clique sobre o componente desejado e, logo em seguida, clique sobre o formulrio.

1.3.4 Object Inspector


Quando voc seleciona um componente do formulrio, o Object Inspector mostra suas propriedades publicadas (nem todas as propriedades de um componente aparecem no Object Inspector) e, quando apropriado, permite que sejam alteradas. A janela do Object Inspector divida em duas abas: Properties (Propriedades) e Events (Eventos).

1.3.4.1

Properties (aba)

Esta aba dividida em duas colunas: a primeira coluna mostra o nome da propriedade do componente selecionado e a segunda mostra os possveis valores para a propriedade. Para colunas cujo valor do tipo booleano ou numeral, disponibilizada uma lista (drop-down) onde pode-se escolher o valor desejado com um clique. Se um sinal de mais (+) aparece prximo ao nome da propriedade, pode-se clicar sobre este sinal para que sejam visualizados uma lista de subvalores para a propriedade ( o caso da propriedade Font). Se um sinal de menos (-) aparece prximo a propriedade, pode-se clicar sobre este sinal para que os subvalores sejam escondidos. Quando mais de um componente selecionado, o Object Inspector mostra todas as propriedades que so comuns entre este componentes (exceto o name), se o valor desta propriedade comum for alterado, o novo valor aplicado a todos os componentes selecionados. Algumas propriedades como Font tm um editor de propriedades especial. Isto pode ser observado atravs de um boto com reticncias (...) que aparece no momento em que o valor da

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

propriedade selecionado. Para abrir este editor, basta dar um clique sobre este boto ou um duplo clique sobre o campo onde consta o valor da propriedade. Os editores de propriedade possibilitam maior facilidade na atribuio de valores de propriedades mais complexas.

Propriedades comuns entre componentes: Diversos componentes possuem propriedades que so comuns entre si. Este recurso possibilita que diversos componentes em um formulrio, que possuam uma determinada propriedade em comum, recebam o novo valor de uma nica vez. Por exemplo: voc pode ter diversas labels (rtulos) e edits (caixa de edio) sobre um formulrio e alterar o tamanho e cor da fonte de todos estes componentes uma nica vez selecionado todos estes componentes e alterando os valores na propriedade Font. Abaixo, sero listadas algumas propriedades que so comuns entre diversos componentes:

Posio e tamanho: Quatro propriedades definem a posio e tamanho de um componente em um formulrios: Height: define a altura do componente; Width: define o comprimento do componente; Top: a posio (vertical) do componente em relao ao formulrio; Left: a posio (horizontal) do componente em relao ao formulrio.

Visualizao: Estas propriedades definem a aparncia visual de um componente: BorderStyle: define o estilo da borda de um componente; Color: muda a cor de fundo de um componente; BevelKind: define o estilo da linha da borda de um componente; Font: muda a cor, tipo, tamanho, estilo da fonte do componente.

Navegao: Diversas propriedades definem como o usurio poder navegar entre os componentes de um formulrio: Caption: define o texto que ser visualizado pelo usurio. Nesta propriedade podese definir a tecla de atalho (Arquivo) que sublinham uma determinada letra e, atravs da combinao (ALT+<letra sublinhada>) o usurio acessa a funo deste componente. Este recurso pode ser acessado adicionando o caracter (&) antes da letra de atalho na propriedade Caption (ex.: &Salvar resultaria em Salvar).

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

TabOrder: indica a ordem em que o componente receber foco no formulrio. Inicialmente, a ordem definida a medida que os componentes so adicionados ao formulrio. Esta ordem de foco pode ser alterada mudando o valor que aparece na propriedade TabOrder sendo que 0 (zero) indica o primeiro componente que receber foco no formulrio. A propriedade TabOrder s funcionar se a propriedade TabStop estiver com valor True; TabStop: define se um componente receber foco (True) ou no (False) quando o usurio acionar a tecla TAB.

Propriedades comuns entre componentes de edio de texto: Text: define o texto que aparecer no componente; CharCase: fora a entrada do texto em normal, maiscula ou minscula; ReadOnly: define se o usurio poder (false) ou no (true) alterar o texto existente no componente; MaxLength: limita o tamanho do texto; PasswordChar: substitui o texto por um determinado caracter (normalmente asterisco); HideSelection: define se o texto ser selecionado ou no quando o componente receber foco.

1.3.4.2

Events (aba)

A aba Events (Eventos) do Object Inspector permite que formulrios e componentes sejam conectados a rotinas do programa. Os eventos permitem que uma rotina (procedimento ou funo) associada a um formulrio ou componente seja executada. Deste modo, podemos, por exemplo, associar ao clique de um boto a execuo de uma rotina que fecha um determinado formulrio.

O usurio clica sobre um boto (ao); Ao clicar sobre o boto disparado um evento; O evento clicar dispara uma rotina (procedimento ou funo)

Ao clique

evento ao clicar

rotina fecha formulrio

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

Portanto, o evento o meio pelo qual pode-se associar a execuo de uma rotina definida na aplicao a um determinado componente. A aba Events do Object Inspector mostra todos os eventos do componente selecionado. Eventos comuns entre componentes Assim como as propriedades, existem diversos eventos que so comuns entre os componentes. Muitos destes eventos, como o evento OnClick (ao clicar), esto presentes em mais de um componente. Quando componentes possuem eventos em comum, pode-se associar estes eventos a diversos componentes ao mesmo tempo e, consequentemente, a mesma rotina associada ao evento comum poder ser disparada de diversos componentes (reuso de cdigo). Para visualizar eventos comuns entre dois ou mais componentes, basta selecionar estes componentes e observar a aba Events. A aba Events mostrar apenas os eventos comuns entre os componentes selecionados. Abaixo so apresentados alguns dos eventos que so comuns entre componentes: OnClick: este evento ocorre quando clica-se sobre um determinado componente; OnEnter: ocorre quando o componente recebe foco; OnExit: ocorre quando o foco sai do componente; OnKeyDown: ocorre quando pressionada uma tecla enquanto o componente est selecionado (foco); OnKeyPress: ocorre quando digitado um caracter.

Como associar uma rotina (procedimento ou funo) a um determinado evento A aba Events possui duas colunas: a primeira mostra uma lista dos eventos do componente selecionado, e a segunda mostra o nome das rotinas associadas. Para habilitar um evento e associar uma rotina a este evento, basta dar um duplo clique na segunda coluna (coluna de valores que localiza-se logo aps o nome do evento que deseja-se habilitar). Automaticamente ser criado um bloco de cdigo onde a rotina a ser executada poder ser implementada.

1.3.5 Form (Formulrios)


Formulrios so a base de toda as aplicaes desenvolvidas em Delphi. uma janela (tela) onde pode ser definida uma interface (janelas principais, caixa de dilogo, etc). Este componente pode conter outros componentes, desempenhando o papel de continer de componentes. Assim, possvel adicionar a um formulrio diversos outros componentes como: botes, caixas de edio, menus, etc. Por tratar-se de uma janela, inclui funcionalidades comuns de uma janela como: menu de controle, botes de maximizar e minimizar, barra de ttulo e bordas redimensionveis. Estas propriedades, como outras, podem ser acessadas atravs do Object Inspector. As rotinas pertencentes ao formulrio e aos componentes adicionados ao mesmo, so acondicionados na unit correspondente. Assim, para cada formulrio criado uma unit.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

1.3.6 Unit
Nas units (mdulos) so implementados os procedimentos e funes do formulrios ou dos componentes do formulrio.

1.3.6.1

Estrutura de uma unit Define o nome da unit (nome do mdulo). O nome da unit definido no momento em que aciona-se a opo Save no menu File; Esta seo inicia-se na palavra reservada Interface e continua at a seo Implementation. Na seo Interface so declaradas constantes, tipos, variveis, procedimentos e funes. No caso de procedimentos ou funes, so declarados apenas os cabealhos. Lista as units e bibliotecas utilizadas pela unit atual. Os nomes so separados por vrgula e, ao final, ponto e vrgula (;). A clusula uses tambm pode aparecer na seo Implementation para evitar a referncia circular entre units. A seo Implementation define os procedimentos e funes declarados na seo Interface, ou seja, onde so implementadas as rotinas a serem executadas. Os procedimentos e funes podem ser chamados em qualquer ordem. Na seo Implementation podem ser declaradas constantes, tipos, variveis, procedimentos, funes, porm, estas declaraes no podero ser acessadas por outras units. Se for necessrio adicionar outra clusula uses na seo Implementation, esta deve aparecer imediatamente depois da palavra reservada Implementation.

Unit unit1 Interface

Uses

Implementation

1.4

Programando no ambiente Delphi

1.4.1 Principais tipos de dados do ambiente Delphi


Tipos inteiros Tipo Integer Shortint Smallint Longint Int64 Byte Word Longword Faixa 2147483648..2147483647 128..127 32768..32767 2147483648..2147483647 2^63..2^631 0..255 0..65535 0..4294967295 Formato 32 bits 8 bits 16 bits 32 bits 64 bits 8 bits 16 bits 32 bits

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase Tipos reais Tipo Real48 Single Double Extended Comp Currency Real Tipos string Tipo ShortString String AnsiString WideString

UTFPR Universidade Tecnolgica Federal do PR

10

Faixa 2.9 x 10^39 .. 1.7 x 10^38 1.5 x 10^45 .. 3.4 x 10^38 5.0 x 10^324 .. 1.7 x 10^308 3.6 x 10^4951 .. 1.1 x 10^4932 2^63+1 .. 2^63 1 922337203685477.5808.. 922337203685477.5807 5.0 x 10^324 .. 1.7 x 10^308

Formato 1112 78 1516 1920 1920 1920 1516

Em bytes 6 4 8 10 8 8 8

Tamanho mximo em caracteres 255 255 ~2^31 ~2^30

Memria requerida 2 - 256 bytes 256 bytes 4 bytes - 2GB 8 bits 4 bytes - 2GB

1.4.2 Converso de tipos


O ambiente Delphi possui diversas funes que permitem a converso de tipos de dados. Estas converses freqentemente so necessrias no processo de desenvolvimento de um aplicativo. Dentre as diversas funes de converso de tipos, segue abaixo um quadro das funes mais utilizadas. Funo IntToStr(<tipo inteiro>) StrToInt(<tipo string>) StrToFloat(<tipo string>) FloatToStr(<tipo real>) StrToDate(<tipo string>) DateToStr(<tipo data>) TimeToStr(<tipo horas>) StrToTime(<tipo string>) Retorno String Inteiro Real String Data String String Horas Descrio Converte um inteiro em string Converte um tipo string em um inteiro Converte uma string em real Converte um tipo real em string Converte uma string em tipo data Converte uma data em string Converte horas em string Converte string em horas

1.4.3 Declarao de variveis


1.4.3.1 Variveis globais

As variveis globais, que podem ser utilizados por diversos procedimentos dentro de uma unit podem ser declaradas logo abaixo da seo Implementation. Entretanto, as variveis declaradas nesta seo no sero visveis por outras units. Caso haja a necessidade de uma outra unit utilizar variveis globais, necessrio que esta varivel seja declarada na seo Public.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

11

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } z : string; //varivel global pblica, pode ser acessada pela prpria unit e por outras units end; var Form1: TForm1; implementation {$R *.DFM} var s : string[20]; //varivel global, s pode ser acessada pela prpria unit. end.

1.4.3.2

Variveis locais

As variveis locais devem ser declaradas dentro do procedimento ou funo em que so utilizadas, entre o cabealho do procedimento/funo e a palavra reservada begin, com o nome da varivel antecedida da palavra reservada var e precedida do tipo de dado.
Procedimento Teste; var VariavelLocal : string; begin bloco de cdigo end;

1.4.4 Declarao de procedimentos e funes


Para a declarao de um procedimento ou funo deve ser especificado seu nome, nome e tipo de parmetro (opcional) e, no caso de funes, o tipo do retorno. Procedure MinhaProcedure (nome, fone: string; idade: integer; salario: double); Function MinhaFuncao(salario, desconto: double) : double; Esta parte da declarao chamada de prottipo ou escopo ou ainda, cabealho. Function MinhaFuncao(salario, desconto: double) : double; Prottipo ou escopo ou cabealho Begin MinhaFuncao := salario desconto; bloco de cdigo ou corpo da funo end; No bloco de cdigo ou corpo da funo/procedimento definida a rotina que ser executada quando a funo/procedimento for chamada. Os procedimentos ou funes podem ser declarados logo aps a palavra reservada Implementation (cabealho e corpo). Neste caso, estas declaraes somente sero visveis para a prpria Unit.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

12

Procedimentos e funes tambm podem ser declarados na seo Interface (somente cabealho). Se o procedimento/funo for declarado na parte Public, poder ser disponibilizado para outras units. Se o procedimento/funo for declarado na parte Private, este somente estar disponvel para a prpria unit. O cabealho e corpo do procedimento/funo devem ser declarados na seo Implementation.
... Private Procedure Teste1; Public Function Teste2 : boolean; ... Implementation ... procedure Tform1. Teste1; <declarao de variveis locais, caso necessrio> begin //bloco de cdigo end; Function Teste2 : boolean; <declarao de variveis locais, caso necessrio> begin //Bloco de cdigo end;

Exerccios sugeridos:
Funes e procedimentos: Elabore uma funo que receber dois valores inteiros (parmetros de entrada) e retorne a multiplicao destes valores. Utilize dois Edits para entrada de valores e uma label para mostrar o resultado. A funo deve ser chamada atravs do evento OnClick de um boto. Elabore um procedimento que verifique se as dimenses do formulrios so menores que (utilize um boto para chamar o procedimento): Height (altura): 500 e, Widht: (largura): 700. Se as dimenses (as duas) forem menores que as apontadas acima, o procedimento deve redimensionar o formulrio para: Height (altura): 600 e, Widht: (largura): 800. Eventos: Utilize o evento OnCreate para verificar se a propriedade WindowState igual a wsNormal, caso afirmativo, a propriedade WindowState deve ser igual a wsMaximized. Propriedades: Utilize o evento OnClick de um boto para mudar o Caption de um formulrio. Sub propriedades: Utilize o evento OnClick de um boto para mudar a cor de um formulrio.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

13

1.4.5 Tratamento de erros (excees)


1.4.5.1 Bloco Try ... Except

Qualquer aplicativo est sujeito a ocorrncia de erros. A origem dos erros pode ser das mais variveis: erros na codificao, entrada de dados, sada de dados, etc. O tratamento de erros ou possveis erros pode ser feito atravs das palavras chaves Try ... Except. Quando um bloco protegido declarado atravs de Try...Except, pode-se definir possveis respostas para os erros que ocorrero neste bloco. Exemplo: Try StrToInt(Edit1.Text); //linha 1 StrToInt(Edit2.Text);//linha 2 StrToInt(Edit3.Text);//linha 3 Except ShowMessage(Digite um valor numrico); End; //end do Try

Inicia a proteo do cdigo Bloco protegido Bloco de tratamento: se ocorrer algum erro no cdigo protegido, a mensagem executada Final do bloco protegido

Quando ocorre um erro (exceo) em qualquer linha do bloco de cdigo protegido, o controle da execuo passa imediatamente para o tratamento, independente de haver ou no outras linhas a serem executadas no bloco protegido. Se ocorrer um erro na linha 1 (exemplo acima), as linhas 2 e 3 no sero executadas sendo passado o controle para o bloco de tratamento. Entretanto, se no ocorrerem erros no bloco protegido, o bloco de tratamento no ser executado, passando o controle ou execuo para o bloco de cdigo seguinte (aps o end do try), se houver.

1.4.5.2

Bloco Try...Finally

Existem situaes onde uma rotina deve ser executada mesmo que ocorra um erro. Utilizando o exemplo ilustrado na seo anterior, podemos definir o seguinte bloco de cdigo: Try StrToInt(Edit1.Text); //linha 1 StrToInt(Edit2.Text);//linha 2 StrToInt(Edit3.Text);//linha 3 Finally Begin Edit1.Clear; Edit2.Clear; Edit3.Clear; End; //end Finally End; //end do Try Inicia a proteo do cdigo Bloco protegido

Bloco de tratamento: ocorrendo ou no erros no bloco protegido, estas linhas sero executadas.

Final do bloco protegido

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

14

No cdigo acima, se ocorrer um erro na linha 1, as linhas 2 e 3 no so executadas e todos os procedimentos existentes no bloco de tratamento so processados. Se no ocorrer nenhum erro nas linhas 1, 2 e 3, o bloco de tratamento tambm executado. Portanto, utilize esta estrutura para executar cdigos que sempre devero ser processados, independente da ocorrncia de erros ou no.

1.4.6 Depurando a aplicao (debugger)


A ocorrncia de erros em uma aplicao exige que o desenvolvedor utilize tcnicas que permitam a localizao destes erros (depurao). O ambiente Delphi oferece diversos recursos que possibilitam ao desenvolvedor a localizao de erros. Estas ferramentas, quando utilizadas adequadamente, podem reduzir o tempo de depurao agilizando a procura e soluo do erro. 1.4.6.1 Breakpoints

Breakpoints permitem marcar um determinado ponto do programa com a finalidade de interromper a execuo do aplicativo neste ponto. Quando a aplicao for executada, na linha do cdigo onde est localizado o breakpoint ocorre uma interrupo de execuo e o cdigo fonte onde o breakpoint est localizado visualizado. Atravs deste recurso possvel examinar valores de variveis, fluxo de controle do algoritmo (F8), loops, etc. Atravs da tecla F8 pode-se executar linha-a-linha o cdigo fonte observando o comportamento do programa. Para um breakpoint ser vlido, necessrio que seja adicionado em uma linha de cdigo executvel. Linhas de cdigo no executveis so, por exemplo, comentrios, linhas em branco, declaraes (procedimento, funes, variveis), etc. As linhas de cdigos que no forem vlidas so visualizadas com um x no cone do breakpoint na margem esquerda do cdigo fonte, durante a depurao. As linhas vlidas so visualizadas com o smbolo ( ) (Figura 2).

Figura 2 Utilizando breakpoints Para adicionar um breakpoint no cdigo fonte, selecione a linha onde ser posicionado o breakpoint e ento utilize um dos seguintes meios: Clique na margem esquerda da linha; Clique com o boto direito do mouse em qualquer parte da linha e escolha Debug|Toggle Breakpoint no menu suspenso; Posicione o cursor em qualquer parte da linha onde ser adicionado o breakpoint e ento pressione a tecla F5; Escolha a opo no menu Run|Add Breakpoint|Source Breakpoint e defina a linha onde ser adicionado o breakpoint; Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

15

Na janela Breakpoint List (View|Debug Windows|BreakPoints), clique com o boto direito do mouse e escolha no menu suspenso a opo Add|Source Breakpoint. 1.4.6.2 Watches

A janela Watch List (View|Debug Windows|Wathces ou Ctrl+Alt+W) mostra os valores correntes de expresses (variveis, propriedades de componentes, resultados de funes, etc) baseado no ponto de execuo do programa. Veja a Figura 3.

Figura 3 Janela Watch List Para adicionar uma expresso na janela Watch, clique com o boto direito sobre a janela e selecione no menu suspenso a opo Add Watch... (Ctrl + A.) No menu suspenso da janela Watch so disponibilizadas diversas funcionalidades que permitem manipular a utilizao deste recurso de depurao, os mais importantes so: Edit Watch: abre a caixa de dilogo Watch Properties que permite modificar as propriedades da expresso selecionada; Add Watch: abre a caixa de dilogo Watch Properties que permite criar um watch; Enable Watch: habilita uma expresso watch desativada; Disable Watch: desabilita uma expresso watch ativa; Delete Watch: remove uma expresso; Enable All Watches: habilita todos os watches; Disable All Watches: desabilita todos os watches; Delete All Watches: remove todos os watches; Stay On Top: mantm a janela Watches List sempre visvel quando outras janelas recebem foco;

1.5

Trabalhando com componentes

Por trata-se de um ambiente visual (padro Windows), a interao entre o aplicativo e o usurio definida atravs de componentes. Basicamente, existem dois tipos de componentes: componentes visuais e componentes no visuais. Os componentes visuais so aqueles que so visveis quando o aplicativo executado (tempo de execuo runtime) e os no visuais so aqueles que aparecem em tempo de projeto (no momento em que se est programando - design) como uma pequena figura, e no so visveis quando o aplicativo executado.

1.5.1 Paleta de componentes (Component palette)


Os componentes so disponibilizados na paleta de componentes (Figura 4) e agrupados por categorias. Para adicionar um componente ao formulrio basta dar um clique sobre o componente e adicion-lo ao formulrio (dando um clique na posio onde o componente dever ser adicionado).

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

16

Figura 4 Paleta de componentes

1.5.2 Propriedades
A propriedade (veja seo 1.3.4.1 Properties (aba)) um atributo (caracterstica) de um componente (objeto) com valores pr definidos (p.e.: Font) ou valores que podem ser definidos pelo programador (p.e.: Caption). As propriedades de um componente podem ser acessadas ou alteradas de duas maneiras: Atravs do Object Inspector: as propriedades que aparecem no Object Inspector so propriedades publicadas (published). O acesso disponibilizado em duas colunas na aba Properties: uma coluna onde so definidos os nomes das propriedades e a outra com os respectivos valores. Para visualizar as propriedades de um componente no Object Inspector, basta selecionar o componente no formulrio. As propriedades tambm podem ser acessadas ou alteradas diretamente no cdigo fonte. Para isso, deve-se digitar o nome do componente (definido na propriedade name) seguido de um ponto (.) e o nome da propriedade Form1.Caption := Menu Principal ShowMessage(Form1.Caption); Alterando o valor da propriedade Consultando o valor de uma propriedade

Dica:

No Object Inspector somente so visveis as propriedades publicadas

(published), portanto, podem existir outras propriedades que no esto visveis no Object Inspector. Estas propriedades no publicadas podem ser acessadas no cdigo.

1.5.3 Eventos (Events)


Os eventos (veja seo 1.3.4.2 Events (aba)) permitem a um determinado componente disparar um determinado procedimento/funo. Por exemplo: botes possuem o evento OnClick (ao clicar) que pode executar uma determinada rotina.

1.5.4 Mtodos
Mtodo um procedimento ou funo associado a uma classe. Componentes possuem mtodos que executam um cdigo que atende a uma determinada finalidade. Por exemplo: o componente Formulrio (Form) possui um mtodo chamado Close. Este mtodo, quando acionado, fecha o formulrio (Form1.Close). Para acessar os mtodos de um componente basta definir o nome do componente seguindo de um ponto (.) mais o nome do mtodo.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

17

Dica: Para visualizar a lista de propriedades do componente no cdigo, basta digitar o


nome do componente (definido na propriedade name) seguindo de um ponto (.) e aps alguns segundos ser possvel ver uma lista das propriedades, mtodos e eventos de um componente.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR 18

2
2.1

BANCO

DE DADOS

INTERBASE

Introduo

A importncia da informao na maioria das organizaes indiscutvel. Armazenar e prover acesso a estas informaes tornou-se uma atividade essencial. Informaes podem ser acondicionadas e organizadas de diversas maneiras: fichas, arquivos, documentos, fichrios, etc. Com o advento da informatizao, aplicaes foram desenvolvidas para desempenhar este papel. Estas aplicaes, os bancos de dados, tornaram-se elementos de fundamental importncia para as organizaes pelos inmeros benefcios proporcionados. Os banco de dados permitem que estas informaes sejam relacionadas, armazenadas e recuperadas com rapidez e segurana. Alm disso, os bancos de dados possibilitam que informaes sejam protegidas de acesso no autorizado; permitem que uma mesma informao seja compartilhada por mltiplos usurios; padroniza a entrada de dados, restringem e consistem o armazenamento dos dados, evitam a redundncia de informaes, etc. 2.2 Banco de dados Interbase

O banco de dados Interbase, como a maioria dos bancos de dados, permite que sejam criadas estruturas de dados onde sero armazenadas e gerenciadas as informaes de uma organizao. Assim, como uma linguagem ou ambiente de programao, a criao de estruturas de dados definida atravs de uma linguagem chamada SQL (Structured Query Language Linguagem de Consulta Estruturada). A linguagem SQL foi padronizada e diversos bancos de dados utilizam este padro. Porm, devido a diversas necessidades, a linguagem SQL foi complementada e, no caso do Interbase, chamada de ISQL. A linguagem SQL pode ser utilizada de duas maneiras: como linguagem de manipulao de dados (DML-Data Manipulation Language) e como linguagem de definio de estruturas de dados (DDL-Data Definition Language). 2.3 SQL DML (Data Manipulation Language)

As informaes de um banco de dados podem ser manipuladas atravs da SQL DML (DML Data Manipulation Language ou Linguagem de Manipulao de Dados). Atravs da DML possvel aplicar as seguintes operaes sobre as informaes armazenadas em um banco de dados: Consultas; Insero de novas informaes; Atualizao e; Excluso de informaes j armazenadas; A estrutura da manipulao de dados consiste basicamente em 3 clusulas: select, from e where.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

19

2.3.1 Clusula Select (selecione)


utilizada para definir quais campos de uma tabela sero listados como resultado de uma consulta. Por exemplo: suponhamos que exista uma tabela com os seguintes campos: Codigo_Cliente 1 2 3 4 Nome Jos Rafaela Saulo Jos Telefone 999999-99 888888-88 777777-77 666666-66 Cidade Cornlio Procpio Cornlio Procpio Londrina Santa Mariana Cpf 999.999.999-99 888.888.888.-88 777.777.777-77 666.666.666-66

Quadro 1 Estrutura de uma tabela de clientes A clusula Select permite que o resultado de uma consulta possa ser visualizado de diversas maneiras: a) Mostrar todos os campos no resultado da consulta:

Select Codigo_Cliente, Nome, Telefone, Cidade, Cpf


b) Mostrar apenas os nomes dos clientes:

Select Nome
c) Mostrar apenas os nomes e telefones de todos os cliente:

Select nome, telefone


Como pode ser observado, ainda seria possvel outras inmeras combinaes. Ento, a definio dos campos resultantes em uma consulta especificado utilizando-se a clusula Select mais o nome do campo. Quando mais de um campo formar o resultado de uma consulta, estes devem ser separados por vrgula observando que aps o ltimo nome do campo listado na clusula Select no deve ser empregada a vrgula

Dica: Em situaes onde todos os campos sero selecionados (como no item a do


exemplo anterior), pode ser empregado o asterisco (*) para substituir todos os nomes de campos Ex. Select * From Cliente

2.3.2 Clusula From (origem)


A clusula From define a origem e relaes existentes nos elementos (campos) apontados na clusula Select. Deste modo, necessrio determinar em uma consulta pelo menos as duas clusulas (Select e From) para que seja proporcionado um resultado para uma consulta. Utilizando o Quadro 1 definido na seo anterior, para que a consulta produza resultados, necessrios apontar quais elementos (campos) do conjunto cliente faro parte do resultado e, qual a origem (conjunto, tabela) destes elementos. Por exemplo: a) Mostrar todos os campos no resultado da consulta:

Select Codigo_Cliente, Nome, Telefone, Rg, Cpf From Cliente


b) Mostrar apenas os nomes dos clientes:

Select Nome From Cliente


Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

20

c) Mostrar apenas os nomes e telefones de todos os clientes:

Select nome, telefone From Cliente d) ...


Ento, atravs destas duas clusulas j possvel produzir resultados em uma consulta.

2.3.3 Clusula Where (onde)


A clusula Where define as condies (predicado) que podero definir (restringir) o resultado de uma consulta. Nos exemplos utilizados nas sees anteriores, os resultados das consultas sempre retornariam todos os elementos de um conjunto, ou seja, todos os clientes cadastrados na tabela ou conjunto Cliente. Entretanto, nem sempre necessrio que as consultas retornem como resultado todos os elementos de um conjunto. Por exemplo, poderia ocorrer a situao onde seria necessrio como resultado somente as informaes de um determinado cliente. Pode-se definir na clusula Where a condio que ir restringir o resultado desta consulta. Para que isso seja possvel, necessrio definir uma condio, por exemplo, selecionar todos os campos de clientes onde o cdigo do cliente seja igual a 1. Esta sentena em SQL poderia ser definida da seguinte maneira: Select * From Cliente Where Codigo_Cliente = 1 Resultado Codigo_Cliente Nome 1 Jos

Telefone 999999-99

Cidade Cornlio Procpio

Cpf 999.999.999-99

importante tomar cuidado no emprego da condio. Determinadas condies podem no restringir o resultado da consulta. Por exemplo, se a sentena SQL definida anteriormente fosse definida da seguinte maneira: Select * From Cliente Where nome = Jos Resultado Codigo_Cliente Nome 1 Jos 4 Jos

Telefone 999999-99 666666-66

Cidade Cornlio Procpio Santa Mariana

Cpf 999.999.999-99 666.666.666-66

Se o objetivo da consulta era somente a visualizao das informaes do primeiro cliente (cdigo 1), este no foi alcanado com preciso. Existem situaes onde este tipo de consulta necessrio. Por exemplo, poderia ocorrer a necessidade de se obter todos os cliente residentes na cidade de Cornlio Procpio, neste caso o elemento que poderia atender a esta condio seria:

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

21

Select * From Cliente Where Cidade = Cornlio Procpio Resultado Codigo_Cliente 1 2

Nome Jos Rafaela

Telefone 999999-99 888888-88

Cidade Cornlio Procpio Cornlio Procpio

Cpf 999.999.999-99 888.888.888.-88

2.3.4 Clusula Order By


Normalmente, o resultado de uma consulta retornado em ordem natural, ou seja, ordenado pela chave primria ou pelo ndice ativo. A clusula Order By organiza o resultado de uma consulta de acordo com a coluna definida na clusula Order By. A coluna utilizada nesta clusula deve aparecer na clusula Select. Naturalmente, os dados so organizados na ordem ascendente (asc), de A a Z ou 1 a 9. Para organizar na ordem descendente pode-se utilizar a palavra chave desc aps o nome da coluna especificada na clusula Order By. Select Codigo_Cliente, Nome, Cpf From Cliente Order by cpf asc Resultado Codigo_Cliente 4 3 2 1

Nome Jos Saulo Rafaela Jos

Telefone 666666-66 777777-77 888888-88 999999-99

Cidade Santa Mariana Londrina Cornlio Procpio Cornlio Procpio

Cpf 666.666.666-66 777.777.777-77 888.888.888.-88 999.999.999-99

2.3.5 Operadores
A necessidade de definio de restries no resultado de uma consulta exige que seja definida uma condio. Os operadores auxiliam na definio da condio que ir restringir o resultado da pesquisa. 2.3.5.1 Operadores de comparao Utilizados para comparar dados de uma coluna com os valores definidos na condio. Operador < > <= >= = <> Between Starting With Significado menor maior menor igual maior igual igual diferente Entre Iniciado com

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

22

Operador Starting With O operador de comparao Starting With retorna os valores iniciados por um determinado caracter ou uma seqncia de caracteres. Select Nome From Cliente Where Nome Starting With J Resultado Codigo_Cliente 1 4

Nome Jos Jos

Telefone 999999-99 666666-66

Cidade Cornlio Procpio Santa Mariana

Cpf 999.999.999-99 666.666.666-66

Aviso: o
2.3.5.2

Interbase diferencia caracteres maisculos de minsculos e vice-versa.

Desta forma, Select Nome From Cliente Where Nome Start With j no retornaria nenhum resultado, pelo fato de no existir nenhum nome iniciado com a letra j (em minsculo). Operadores lgicos Utilizados para combinar ou negar uma condio. Operador Not And Or Significado no e ou

Existem outros operadores que podem ser utilizados no Interbase. Entretanto, o objetivo deste curso apenas proporcionar uma viso geral sobre a aplicao da SQL. 2.4 SQL DDL (Data Definition Language)

A DDL utilizada para definir, alterar e excluir um banco de dados e/ou objetos de um determinado banco de dados. Os objetos definidos atravs da DDL (tabelas, procedures, triggers, etc.) so conhecidos como metadados (dados sobre dados). O Interbase um banco de dados relacional. Um banco de dados relacional uma coleo de tabelas bidimensionais compostas de linhas (tambm chamados registros) e colunas (chamados tambm de campos). O banco de dados Interbase armazenado em arquivos com a extenso .gdb. Para criar um banco de dados necessrio o nome do usurio e senha. Quando o banco instalado, o usurio e a senha de acesso padro so, respectivamente, sysdba e masterkey. Alm do nome do usurio e senha, deve ser definido o nome para o banco.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

23

2.4.1 Criando um banco de dados Interbase


Para criar um banco de dados ser utilizado o aplicativo IBConsole que acompanha o banco. Antes, porm, vamos criar alguns diretrios. Crie uma estrutura de diretrios como sugerido na Figura 5.

Figura 5 Estrutura de diretrios utilizada para o desenvolvimento do aplicativo Agora com a estrutura de diretrios montada, vamos criar o banco. Primeiro devemos verificar se o banco j foi iniciado (start) (boto Iniciar|Programas|Interbase|Interbase Server Manager); 2. Agora, inicialize o aplicativo IBConsole (boto Iniciar|Programas|Interbase| IBConsole) e clique 2 vezes em Local Server, se for pedido usurio e senha use usurio SYSDBA, e digite a senha masterkey (em minsculas); 3. No Local Server, agora conectado, ser exibida uma rvore (Databases, Backup, Certificates, Server Log e Users), clique com o boto direito em Databases e selecione a opo Create Database...; 4. Na caixa de edio Filename digite o caminho (path) e nome do banco: C:\Aplicativo\Banco\Banco.gdb. Certifique-se de que o caminho (diretrio) e nome do banco (incluindo a extenso .GDB) esto como descritos aqui (veja a Figura 6). Lembre-se que o caminho indicado j deve existir; 5. Na caixa de edio Alias digite: Banco. Esse o nome pelo qual o banco criado ser referenciado; 6. Clique no boto Ok. Se tudo correu bem, o IBConsole vai exibir Banco em Databases, e mostrar a rvore de informaes do banco (Domains, Tables, Indexes, etc.). 1.

Figura 6 Janela Create Database

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

24

A partir deste momento voc est conectado ao banco que acabou de criar.

Aviso: toda vez que voc precisar trabalhar com qualquer banco de dados criado no
Interbase, certifique-se de que o banco est inicializado (Started). Normalmente, quando o banco no est ativo (not started) aparece a mensagem Statement failed, SQLCODE = -901. No Interbase, todo banco de dados deve ser registrado (opo do menu suspenso aberto ao clicar com o boto direito em Databases ou em menu Database|Register). No momento da criao, por padro, o banco j automaticamente registrado. Se o objetivo for abrir um banco (arquivo GDB) j existente em um Interbase Server onde esse banco ainda no foi registrado, no necessrio criar o banco novamente, basta registrar o arquivo no servidor. Para isso, faa o seguinte: 1. No Local Server j conectado, clique com o boto direito em Databases e selecione a opo Register...; 2. Na caixa de edio File: digite o caminho (path) e nome do banco, ou escolha diretamente atravs do boto ...; 3. Na caixa de edio Alias digite o nome do banco. Esse o nome pelo qual o banco criado ser referenciado, como padro colocado o nome do arquivo, mude para o nome que for necessrio (veja a Figura 7); 4. Se for necessrio, informe login (User Name) e senha (Password). 5. Clique no boto Ok.

Figura 7 Janela Register Database

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

25

2.4.2 Interbase Interactive SQL


A janela Interbase Interactive SQL (Menu Tools|Interactive SQL) permite que suas sentenas SQL DML ou DDL sejam executadas. Alm disso, existem outros inmeros recursos disponibilizados atravs de seus menus.

2.4.3 Criando tabelas no Interbase


A proposta desta etapa construir um banco de dados simples com 4 tabelas (Figura 8) que contero informaes relacionadas a funcionrios de uma determinada organizao. No objetivo deste curso discutir regras de normalizao ou qualquer conceito relacionado a construo de modelos de estruturas de dados. Entretanto, de fundamental importncia o planejamento do desenvolvimento de software. A aplicao de mtodos, tcnicas e ferramentas constituem-se elementos indispensveis que agregam qualidade ao desenvolvimento de aplicaes.

Figura 8 Modelagem de um sistema para cadastrar funcionrios Com base no modelo apresentado na Figura 8, vamos construir as tabelas de dados utilizando SQL DDL para definir as estruturas de dados do sistema (use o Interactive SQL). A definio de uma tabela em DDL: Definio da tabela Departamento:

CREATE TABLE tb_Departamento ( Dpt_Codigo SMALLINT NOT NULL, Dpt_Descricao VARCHAR(40) NOT NULL, PRIMARY KEY (Dpt_Codigo) );

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

26

Definio da tabela Estado (Unidades da Federao): CREATE TABLE tb_Estado ( Est_Sigla CHAR(2) NOT NULL, Est_Descricao VARCHAR(40) NOT NULL, PRIMARY KEY (Est_Sigla) ); Definio da tabela funcionrio: CREATE TABLE tb_Funcionario ( Fun_codigo INTEGER NOT NULL, Est_Sigla CHAR(2) NOT NULL, Dpt_Codigo SMALLINT NOT NULL, Fun_Nome VARCHAR(40) NOT NULL, Fun_DataNascimento DATE NOT NULL, Fun_dddResidencial CHAR(2) NOT NULL, Fun_FoneResidencial VARCHAR(9) NOT NULL, Fun_Rua VARCHAR(40) NOT NULL, Fun_Complemento VARCHAR(20), Fun_Bairro VARCHAR(40) NOT NULL, Fun_Cidade VARCHAR(40) NOT NULL, Fun_Cep CHAR(8), Fun_Salario DOUBLE PRECISION NOT NULL, PRIMARY KEY (Fun_codigo), FOREIGN KEY (Dpt_Codigo) REFERENCES tb_Departamento, FOREIGN KEY (Est_Sigla) REFERENCES tb_Estado ); Definio da tabela Dependentes: CREATE TABLE tb_Dependentes ( Fun_codigo INTEGER NOT NULL, Dep_Codigo SMALLINT NOT NULL, Dep_Nome VARCHAR(40) NOT NULL, Dep_DataNascimento DATE NOT NULL, Dep_Parentesco VARCHAR(20) NOT NULL, PRIMARY KEY (Fun_codigo, Dep_Codigo), FOREIGN KEY (Fun_codigo) REFERENCES tb_Funcionario );

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase Palavra chave Create table Not null Primary key Foreign key References Integer Smallint Varchar Char Date Double precision Drop Alter

UTFPR Universidade Tecnolgica Federal do PR

27

Significado Sentena de criao de tabelas Define que o campo de preenchimento obrigatrio Define a chave primria de uma tabela Define a chave estrangeira de uma tabela Define o nome da tabela origem da chave estrangeira Tipo de dado inteiro Tipo de dado inteiro curto Tipo de dado string de tamanho dinmico Tipo de dado string de tamanho fixo Tipo de dado que armazena data e hora Tipo de dado real, utilizado para armazenar valores monetrios Utilizado para excluir metadados. Ex.: drop table <nome da tabela> Utilizado para atualizar metadados. Ex.: alter table tb_Departamento drop Dpt_Descricao, add Dpt_Descricao varchar(50) not null

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR 28

DESENVOLVENDO

UM APLICATIVO COM BANCO DE DADOS

(INTERBASE)

A proposta deste captulo desenvolver uma aplicao com acesso ao banco de dados Interbase. A aplicao ter como base a modelagem definida no Captulo 2 (Figura 8). Sero construdos cadastros, relatrios, consultas, instalador e help para a aplicao. 3.1 Iniciando uma nova Aplicao O primeiro passo ser iniciar um novo projeto e salv-lo: Escolha no menu principal a opo File|New|Application; No Object Inspector, modifique as seguintes propriedades do formulrio (Form1): Caption: Menu Principal; Name: FPrincipal; WindowState: wsMaximized; Escolha no Menu Principal, a opo File|Save All; Na janela Save Unit1 As: Encontre o diretrio C:\Aplicativo\Fontes (onde ser salvo o cdigo fonte); Salve a unit1 com o nome UF_Principal; Clique no boto Salvar; Na janela Save Project1 As: Salve o projeto com o nome Funcionarios; Clique no boto Salvar;

O que foi feito?


Propriedades manipuladas: - Name: define o nome do componente formulrio. No pode conter acento, espao, , etc. ou seja, deve ser definido com caracteres puros. Outro detalhe importante que no podem existir dois componentes com o mesmo nome; - Caption: define o nome que aparecer na barra de ttulo do formulrio. Esta propriedade permite a utilizao de acentos, espaos, etc; - WindowState: esta propriedade possui 3 valores pr-definidos: - WsMaximized: o formulrio maximizado quando chamado; - WsMinimized: o formulrio minimizado quando chamado; - WsNormal: a janela ser visualizada conforme chamado. Quando a opo Save All foi acionada foi definido que os fontes deveriam ser salvos no diretrio especificado. Na primeira janela, definiu-se o nome da unit (no do formulrio). Observe que o nome sugerido para salvar a unit foi o nome do formulrio (definido na propriedade name) antecedido da letra U, procure utilizar convenes, regras para nomear arquivos, componentes, etc.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

29

Formulrio Unit FPrincipal UF_Principal Desta maneira, fica mais fcil relacionar o componente formulrio aos arquivos que sero gerados (UF_Principal.pas e UF_Principal.dfm). Na segunda janela (Save Project1 As), foi definido o nome do projeto. Como discutido no captulo anterior (veja a seo 1.2.4), as units e forms so agrupadas por projeto. importante observar que a janela Save Project1 As aparecer uma nica vez. 3.2 Configurando opes do projeto

Todo projeto desenvolvido no ambiente Delphi, basicamente, ir gerar trs grupos de arquivos: arquivos fontes (.pas, .dfm, .dpr, .res, .dof, .cfg etc.); arquivos compilados (.dcu, .exe) e arquivos de backup (.~pa; .~df, enfim, todas as extenses antecedidas do caracter ~). interessante separar os arquivos fontes e arquivos de backup dos arquivos compilados para permitir uma melhor organizao do projeto. Esta separao pode ser feita atravs de diretrios. Como sugerido na seo 2.4.1, os arquivos compilados (.dcu e .exe) podem ser salvos automaticamente no diretrio Exe. Para que isto ocorra necessrio definir esta opo no ambiente Delphi. Selecione a opo Project|Options...; Selecione aba Directories/Conditionals; Na caixa de edio Output Directory digite o caminho do diretrio Exe (C:\Aplicativo\Exe); Na caixa de edio Unit Output Directory digite tambm o caminho do diretrio Exe (C:\Aplicativo\Exe). Clique no Boto OK. Output Directory: define onde ser acondicionado o arquivo .exe quando o projeto for compilado (F9). Unit Output Directory: define onde sero acondicionados os arquivos .dcu quando o projeto for compilado (F9).

Aviso:

antes de definir os caminhos na Opes de Projeto, crie os diretrios

necessrios. Se os diretrios j foram criados, certifique-se de que os caminhos esto digitados corretamente, caso contrrio, o projeto no ser compilado e uma mensagem de erro ser gerada. Se nestas opes, por um erro de digitao por exemplo, fossem definidos os caminhos como sendo (C:\Aplicativo\Exes), poderia ocorrer uma das mensagens de erro abaixo:
[Fatal Error] UF_Principal.pas(40): Could not create output file 'C:\Aplicativo\Exes\UF_Principal.dcu', ou [Fatal Error] Could not create output file 'C:\Aplicativo\Exes\Funcionario.exe'

3.3

Definindo o menu do formulrio Principal O prximo passo definir um menu para o formulrio principal:

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

30

Adicione um componente MainMenu (Paleta Standard); Modifique a propriedade do MainMenu (clique sobre o componente): Name: mmPrincipal. D um duplo clique sobre o componente MainMenu para acionar o Editor de Menu; Modifique as seguintes propriedades: Caption: &Cadastros. Name: imCadastros; Clique sobre o item de menu Cadastros; No item em branco que aparece logo abaixo, modifique as seguintes propriedades: Caption: Funcionrios; Name: imFuncionarios; ShortCut: escolha Ctrl+F. Clique sobre o item de menu em branco logo abaixo de Funcionrios: Modifique as seguintes propriedades: Caption: Estados (UF); Name: imEstados; ShortCut: escolha Ctrl+E. Clique sobre o item de menu em branco logo abaixo de Estados: Modifique as seguintes propriedades: Caption: Departamentos; Name: imDepartamentos; ShortCut: escolha Ctrl+D. Clique sobre o item de menu em branco logo abaixo de Departamentos; Modifique a propriedade: Caption: - (hfen). Clique sobre o item de menu em branco logo abaixo da linha divisria do menu Cadastros; Modifique as propriedades: Caption: Sair; Name: imSair; ShortCut: Ctrl+S. Clique sobre o item de menu em branco do lado direito do item Cadastros; Modifique as seguintes propriedades: Caption: &Relatrios; Name: imRelatorios.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

31

Clique sobre o item de menu Relatrios; Clique sobre o item de menu em branco logo abaixo do item Relatrios; Modifique as seguintes propriedades: Caption: Funcionrios; Name: imRelFuncionarios. Clique sobre o item de menu em branco logo abaixo do item Funcionrios; Modifique as seguintes propriedades: Caption: Estados; Name: imRelEstados. Clique sobre o item de menu em branco do lado direito do item Relatrios; Modifique as seguintes propriedades: Caption: &Ajuda; Name: imAjuda. Clique sobre o item de menu Ajuda; Clique sobre o item de menu em branco logo abaixo do item Ajuda; Modifique as seguintes propriedades: Caption: Ajuda do Sistema; Name: imAjudaSistema. Clique sobre o item de menu em branco logo abaixo do item Ajuda do Sistema; Modifique a propriedade: Caption: - (hfen). Clique sobre o item de menu em branco logo abaixo da linha divisria; Modifique as seguintes propriedades: Caption: Sobre o Sistema; Name: imSobre.

O que foi feito?


O componente MainMenu permite a criao de menus. Os itens na parte superior so os grupos que podem conter subgrupos de menus. Propriedades manipuladas: Name: define o nome do componente. Caption: Define o nome que ser visvel ao usurio. Pode conter acentos, espaos, , etc. O caracter &, quando adicionado na frente de uma letra, cria um atalho que pode ser acionado atravs da combinao de teclas ALT+ letra antecedida pelo &; ShortCut: a propriedade ShortCut lista uma srie de combinaes de teclas que podem ser atribudas ao item de menu, chamadas de teclas de acelerao. Alguns itens de menu foram criados com o caracter hfen (-) na propriedade Caption. Quando somente este caracter adicionado, criado uma linha divisria entre os itens de

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

32

menus. Este recurso particularmente importante principalmente quando necessrio fazer divises internas no menu para agrupar funcionalidades relacionadas. 3.4 Conectando o Aplicativo (Delphi) ao Interbase

A prxima etapa conectar o aplicativo que est sendo desenvolvido ao banco de dados Banco.gdb criado no Interbase. No menu File escolha a opo New | Data Module; Modifique a propriedade: Name: DMFuncionarios. No menu File, selecione a opo Save All; Aponte para o diretrio C:\Aplicativo\Fontes; Nome do arquivo: UDM_Funcionarios; Clique no boto Salvar.

3.4.1 O que so Data Modules?


A utilizao de Data Modules permite a centralizao de componentes no visuais, normalmente componentes relacionados a banco de dados, porm, outros componentes no visuais podem ser adicionados ao Data Module.

Figura 9 Data Module O Data Module, ento, funciona como um continer para componentes no visuais. Neste caso, ser utilizado para acondicionar os componentes que sero necessrios para conectar o aplicativo que est sendo desenvolvido ao banco de dados criado no Interbase. Os componentes no visuais podem ser adicionados diretamente no interior do Data Module. Com o auxlio do Object Inspector, as propriedades dos componentes adicionados ao Data Module podem ser alteradas. 3.5 Conectando a Banco.gdb

Primeiro precisamos conectar o aplicativo que est sendo desenvolvido ao arquivo .GDB que foi criado no Interbase (Banco.gdb). Esta conexo feita atravs do componente IBDatabase que trata especificamente de conexes realizadas com bancos criados no Interbase. Na paleta de componentes, selecione a paleta Interbase; D um clique sobre o componente IBDatabase (4 componente) e adicione-o ao Data Module DMFuncionarios; D um duplo clique sobre o componente IBDatabase;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

33

Na janela Database Component Editor modifique os seguintes campos (Figura 10): Database: aponte para o diretrio onde encontra-se o arquivo Banco.gdb (C:\Aplicativo\Banco\Banco.gdb). Para facilitar a localizao do diretrio, utilize o boto Browse; User Name: SYSDBA; Password: masterkey; Character Set: None; Login Prompt: desmarque esta opo; Clique no boto OK para salvar e fechar a janela.

Figura 10 Janela Database Component Editor Modifique as seguintes propriedades do componente IBDatabase (clique no componente IBDatabase para visualizar suas propriedades no Object Inspector): Name: DBBanco; Para conectar-se ao arquivo Banco.gdb, modifique o valor da propriedade Connected (do componente IBDatabase) para True. Se ocorrer alguma mensagem de erro, verifique se todos os passos descritos anteriormente esto corretos.

O que foi feito?


Campos manipuladas na janela Database Component Editor: DatabaseName: o campo Database aponta o diretrio onde est localizado o arquivo .GDB, ou seja, o arquivo que contm todas as informaes do banco (metadados) que foi criado para a aplicao. Atravs desta propriedade pode-se relacionar o aplicativo em desenvolvimento ao banco de dados onde sero armazenadas as informaes geradas pela aplicao. User Name: Nome do usurio que est autorizado para acessar o banco; Password: senha do usurio;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

34

Login Prompt: quando este campo est marcado, toda vez que houver uma conexo com o banco de dados ser solicitado o nome do usurio e senha (SYSDBA|masterkey). Se no estiver marcado, no ser solicitado o nome do usurio e senha, porm, no ser permitido a conexo com o banco de dados. Neste caso, usurio e senha devem ser definidos no campo Settings. Se o nome do usurio e senha estiverem definidos nos campos User Name e Password, automaticamente, quando for desmarcado esta opo eles sero adicionados no campo Settings. Propriedades manipuladas do componente IBDatabase: Name: define o nome do componente IBDatabase. 3.6 Transaes e acesso concorrente em banco de dados

Um dos conceitos relacionados a banco de dados transao. Toda transao iniciada em um banco de dados deve ser finalizada com Commit ou Rollback. Commit grava efetivamente todas as modificaes (insero, alterao) realizadas no banco desde o incio da transao. Rollback no efetiva nenhuma das modificaes (insero, alterao) realizadas no banco desde o incio da transao.

3.6.1 Controlando transaes atravs do componente IBTransaction


O componente IBTransaction representa a instncia da transao atual e simplifica muito o controle de transaes. Com este objeto, possvel controlar transaes concorrentes originrias da mesma conexo com o banco de dados, ou em Threads independentes. Para que haja o controle de transaes ser necessrio adicionar o componente IBTransaction no Data Module. Na paleta de componentes, selecione a paleta Interbase; Selecione o componente IBTransaction (5 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: DefaultDatabase: selecione DBBanco; Name: DBTBanco; Active: True. 3.7 Adicionado as tabelas do banco de dados

Todo processo de conexo com o banco j foi definido, agora necessrio conectar as tabelas do banco com a aplicao.

3.7.1 Conectando a tabela Departamento


Na paleta de componentes, selecione a paleta Interbase;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

35

Selecione o componente IBTable (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: Database: selecione DBBanco; TableName: selecione TB_DEPARTAMENTO; Name: Tb_Departamento; Active: True; Na paleta de componentes, selecione a paleta Data Access; Selecione o componente DataSource (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: AutoEdit: False; DataSet: Selecione Tb_Departamento; Name: dsDepartamento;

3.7.2 Conectando a tabela Dependentes


Na paleta de componentes, selecione a paleta Interbase; Selecione o componente IBTable (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: Database: selecione DBBanco; TableName: selecione TB_DEPENDENTES; Name: Tb_Dependentes; Active: True; Na paleta de componentes, selecione a paleta Data Access; Selecione o componente DataSource (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: AutoEdit: False; DataSet: Tb_Dependentes; Name: dsDependentes;

3.7.3 Conectando a tabela Estados


Na paleta de componentes, selecione a paleta Interbase; Selecione o componente IBTable (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: Database: selecione DBBanco; TableName: selecione TB_ ESTADO; Name: Tb_ Estado; Active: True;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

36

Na paleta de componentes, selecione a paleta Data Access; Selecione o componente DataSource (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: AutoEdit: False; DataSet: Tb_ Estado; Name: dsEstado;

3.7.4 Conectando a tabela Funcionrios


Na paleta de componentes, selecione a paleta Interbase; Selecione o componente IBTable (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: Database: selecione DBBanco; TableName: selecione TB_FUNCIONARIO; Name: Tb_Funcionario; Active: True; Na paleta de componentes, selecione a paleta Data Access; Selecione o componente DataSource (1 componente) e adicione-o ao Data Module DMFuncionarios; Modifique as seguintes propriedades: AutoEdit: False; DataSet: Tb_Funcionario; Name: dsFuncionario;

Figura 11 Data Module DM_Funcionarios com os componentes

O que foi feito?


Propriedades manipuladas no componente IbTable: Database: identifica o componente Database que representa as tabelas de um banco de dados (.GDB). A propriedade Database deve ser a primeira a ser definida. TableName: utilize esta propriedade para selecionar o nome da tabela a qual o componente IbTable ir representar. Nota: para que a lista das tabelas estejam disponveis, necessrio especificar o componente Database na propriedade Database. Tambm necessrio que a propriedade Active do componente IbTable esteja False.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

37

Name: Define o nome do componente IbTable. Active: quando Active False, a tabela est fechada, ou seja, o componente IbTable no pode ler ou gravar dados na tabela que est representando. Quando Active True, os dados podem ser lidos e gravados na tabela. Propriedades manipuladas no componente DataSource: AutoEdit: no permite insero ou edio automtica dos dados. DataSet: conecta o componente DataSource ao componente IbTable. Name: define o nome do componente.

IbTable BD (.GDB) IBDatabase IbTable

DataSource

Sigla Descrio

DataSource

3.8

Adicionando os campos das tabelas

At o momento foram realizadas as conexes com o banco e tabelas (veja Figura 11) atravs dos componentes IbTable e DataSource. Agora, necessrio adicionar os campos das tabelas que foram definidos ao cri-las no Interbase. Adicionando os campos da tabela Departamento: D um duplo clique na tabela Departamento (Tb_Departamento); Na janela que aparece (Fields Editor), d um clique com o boto direito sobre a rea em branco e selecione a opo Add all fields; D um clique sobre o primeiro campo (DPT_CODIGO); digite na propriedade DisplayLabel: Cdigo; D um clique sobre o segundo campo (DPT_DESCRICAO); digite na propriedade DisplayLabel: Descrio. Feche a janela Fields Editor. Adicionando os campos da tabela Dependentes: D um duplo clique na tabela Dependentes (Tb_Dependentes); Na janela que aparece (Fields Editor), d um clique com o boto direito sobre a rea em branco e selecione a opo Add all fields; D um clique sobre o primeiro campo (FUN_CODIGO); digite na propriedade DisplayLabel: Cd. Func.; D um clique sobre o segundo campo (DEP_CODIGO); digite na propriedade DisplayLabel: Cd. Depend.; D um clique sobre o terceiro campo (DEP_NOME); digite na propriedade DisplayLabel: Nome; D um clique sobre o quarto campo (DEP_DATANASCIMENTO); digite na propriedade DisplayLabel: Data Nasc.; digite na propriedade EditMask: !99/99/9999;1;_

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

38

D um clique sobre o quinto campo (DEP_PARENTESCO); digite na propriedade DisplayLabel: Parentesco; Feche a janela Fields Editor. Adicionando os campos da tabela Estado: D um duplo clique na tabela Estado (Tb_Estado); Na janela que aparece (Fields Editor), d um clique com o boto direito sobre a rea em branco e selecione a opo Add all fields; D um clique sobre o primeiro campo (EST_SIGLA); digite na propriedade DisplayLabel: Sigla; D um clique sobre o segundo campo (EST_DESCRICAO); digite na propriedade DisplayLabel: Descrio; Feche a janela Fields Editor.

Adicionando os campos da tabela Funcionrios: D um duplo clique na tabela Funcionrio (Tb_Funcionario); Na janela que aparece (Fields Editor), d um clique com o boto direito sobre a rea em branco e selecione a opo Add all fields; D um clique sobre o primeiro campo (FUN_CODIGO); digite na propriedade DisplayLabel: Cdigo; D um clique sobre o segundo campo (EST_SIGLA); digite na propriedade DisplayLabel: Estado; D um clique sobre o terceiro campo (DPT_CODIGO); digite na propriedade DisplayLabel: Cd. Depto.; D um clique sobre o quarto campo (FUN_NOME); digite na propriedade DisplayLabel: Nome; D um clique sobre o quinto campo (FUN_DATANASCIMENTO); digite na propriedade DisplayLabel: Data Nasc.; digite na propriedade EditMask: !99/99/9999;1;_ D um clique sobre o sexto campo (FUN_DDDRESIDENCIAL); digite na propriedade DisplayLabel: DDD; digite na propriedade EditMask: !(99);0;_ D um clique sobre o stimo campo (FUN_FONERESIDENCIAL); digite na propriedade DisplayLabel: Tel.; digite na propriedade EditMask: !9999-9999;1;_ D um clique sobre o oitavo campo (FUN_RUA); digite na propriedade DisplayLabel: Logradouro; D um clique sobre o nono campo (FUN_COMPLEMENTO); digite na propriedade DisplayLabel: Complemento; D um clique sobre o dcimo campo (FUN_BAIRRO); digite na propriedade DisplayLabel: Bairro; D um clique sobre o dcimo primeiro campo (FUN_CIDADE); digite na propriedade DisplayLabel: Cidade;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

39

D um clique sobre o dcimo segundo campo (FUN_CEP); digite na propriedade DisplayLabel: CEP; digite na propriedade EditMask: !99.999-999;0;_ D um clique sobre o dcimo terceiro campo (FUN_SALARIO); digite na propriedade DisplayLabel: Salrio; modifique a propriedade Currency para True; Feche a janela Fields Editor.

O que foi feito?


Propriedades manipuladas na janela Fields Editor: DisplayLabel: permite determinar um nome para o campo que seja compreensvel para o usurio. EditMask: quando existe a necessidade de formatar a entrada de dados, mscaras so recursos poderosos que o desenvolvedor deve utilizar. Atravs desta propriedade possvel definir as mscaras de entrada de dados. A mscara !99.999-999;1;_ pode ser utilizada para formatar a entrada de CEP. Seu formato, no momento da entrada de dados seria: __.___-___. Neste exemplo, o nmero 9 (nove) indica que somente um valor numrico aceito nesta posio, porm, no obrigatrio. O nmero 1 (um) no final da mscara indica que a mscara ser gravada juntamente com seu contedo no banco de dados, ou seja, alm dos oito dgitos do CEP, sero gravados ainda mais dois caracteres: o ponto (.) e o hfen (-). Neste caso, quando necessitamos gravar a mscara, importante ficar atento para o tamanho que ser definido para o campo no banco de dados. Caso a mscara seja somente para visualizao (no h a necessidade de grav-la com os dados), basta trocar o nmero 1 que est no final da mscara por 0 (zero), ex.: !99.999-999;0;_. Finalmente, o ltimo caracter da mscara (_) indica que os espaos sero preenchidos por sublinha (_). Se quisssemos que os espaos fossem preenchidos por zeros, por exemplo, bastaria trocar o sublinha por 0 (zero), ex.: !99.999-999;1;0. Existem outros caracteres que so utilizados para definir mscaras de entrada de dados. Para maiores informaes consulte o Help do Delphi. Currency: quando o campo tratar-se de valor monetrio e existir a necessidade de format-lo para moeda, basta passar para True o valor desta propriedade. Esta propriedade somente aparecer para campos do tipo Real (ponto flutuante). 3.9 Adicionando campos Lookup

Freqentemente ocorre a necessidade da utilizao de campos Lookup. Exemplificando, quando um funcionrio cadastrado, necessrio ler uma sigla do Estado (UF) para seu endereo residencial. Os Estados (UF) estaro cadastrados na tabela Estado, portanto, seria coerente adicionar um combobox listando os estados cadastrados para que o usurio selecione um dentre os cadastrados. Este tipo de recurso evita a digitao de uma sigla de estado que no exista, validando a informao e garantindo assim a integridade dos dados. Existem duas maneiras de adicionar campos Lookup: 1. Utilizando o componente DBLookupComboBox presente na paleta Data Controls e; 2. Adicionando diretamente no Fields Editor.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

40

A segunda opo mais interessante pelo fato do campo Lookup aparecer como um componente Grid, o que no ocorreria com a primeira opo. Adicionando campo Lookup na tabela funcionrio para Estado: D um duplo clique sobre a tabela Funcionrio (Tb_Funcionario); Na janela Fields Editor, d um clique com o boto direito e selecione a opo New Field...; Na janela New Field (veja Figura 12), modifique as seguintes propriedades: Name: Estado; Type: selecione String; Size: 40; Marque o boto Lookup; DataSet: selecione Tb_Estado; Result Field: selecione EST_DESCRICAO; Lookup Keys: selecione EST_SIGLA; Key Fields: selecione EST_SIGLA; Clique no boto OK; Selecione o campo Estado no Fields Editor; Digite na propriedade DisplayLabel: Estado.

Figura 12 Definio de campo Lookup na tabela funcionrio Adicionando campo Lookup na tabela funcionrio para Departamento: D um duplo clique sobre a tabela Funcionrio (Tb_Funcionario); Na janela Fields Editor, d um clique com o boto direito e selecione a opo New Field...; Na janela New Field, modifique as seguintes propriedades: Name: Departamento; Type: selecione String; Size: 50; Marque o boto Lookup; DataSet: selecione Tb_Departamento; Result Field: selecione DPT_DESCRICAO; Lookup Keys: selecione DPT_CODIGO; Key Fields: selecione DPT_CODIGO; Clique no boto OK; Selecione o campo Departamento no Fields Editor; Digite na propriedade DisplayLabel: Departamento.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

41

O que foi feito?


Campos manipulados na janela New Field: Name: define o nome do campo Lookup (sem acentos, espaos, etc.); Type: define o tipo do campo Lookup que est sendo criado; Size: define o tamanho do campo Lookup; DataSet: define a origem do campo (qual tabela); Result Field: define qual campo da tabela origem ser visvel para o usurio; Lookup Keys: define qual o campo chave da tabela origem que ser gravado na tabela destino; Key Fields: define o campo de destino que receber o valor do campo de origem; 3.10 Cadastro de Estados A prxima etapa a criao dos cadastros necessrios para o funcionamento do sistema. Nos prximos tpicos ser abordado como criar formulrios em tempo de execuo, mtodos do componente IbTable, tratamento de erros de banco de dados, etc.

Figura 13 Formulrio de Cadastro de Estados Definindo as propriedades do formulrio: No menu File, selecione a opo New | Form; Modifique as seguintes propriedades do formulrio: Caption: Cadastro de Estados (UF); Height: 300; Name: FC_Estados; Position: poScreenCenter; Width: 500. Salvando o formulrio: No menu File, selecione a opo Save; Verifique se o diretrio apontado c:\Aplicativo\Fontes; Nomeie o arquivo para: UFC_Estados; Clique no boto Salvar.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

42

Adicionando os campos de entrada de dados: No Data Module DM_Funcionarios, d um duplo clique sobre a tabela Estado (Tb_Estado) para visualizar o Fields Editor; Arraste a janela Fields Editor para o canto superior direito da tela; Visualize o formulrio FC_Estados (Shift+F12); Clique sobre o campo EST_SIGLA na janela Fields Editor e arraste para o formulrio FC_Estados; Uma caixa de confirmao dever aparecer perguntando se voc quer adicionar a unit do Data Module na clusula uses do formulrio Estados, clique no boto Yes; Clique sobre o campo EST_DESCRICAO no Fields Editor e arraste sobre o formulrio FC_Estados (posicione conforme Figura 13). Adicionando uma grid para visualizar os dados cadastrados: Na paleta de componentes Data Controls, selecione o componente DBGrid e adicione-o ao formulrio; Modifique as seguinte propriedades: Align: alBottom; {alinha a grid na parte inferior do formulrio} Height: 150; {define a altura da grid} Name: grdDados; {define o nome do componente grid} {no permite a edio dos dados atravs da grid} ReadOnly: True; DataSource: selecione DMFuncionarios.dsEstado. {define a tabela origem de dados} Construindo a Barra de botes: Na paleta de componentes Standard, selecione o componente Panel e adicione-o ao formulrio; Modifique as seguintes propriedades: Align: alBottom; {alinha o painel na parte inferior do formulrio} BevelOuter: bvLowered; {deixa o painel em baixo relevo} Caption: deixe em branco; {no mostra o caption do painel} Height: 50; {define a altura do painel} Name: pnlBarraBotao. {define o nome do componente} Definindo os botes da barra: Na paleta de componentes Additional, selecione o componente BitBtn e adicione-o na barra de botes (7 botes BitBtn) (veja Layout final na Figura 14); Modifique as seguintes propriedades dos botes: Primeiro boto: {define o caption e tecla de atalho} Caption: &Novo; Glyph: selecione um cone para o boto; {define uma imagem} *Dica: procure em Arquivos de Programas/Arquivos Comuns/Borland Shared/ Images/Buttons Height: 48; {define a altura do boto} Hint: digite Adiciona um novo registro; {define a mensagem (hint) de ajuda} Layout: blGlyphTop; {coloca a imagem na parte superior} Name: btnNovo; {define o nome do componente} ShowHint: True; {habilita a visualizao do hint} Width: 65. {define a largura do boto}

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

43

Segundo boto: Caption: &Salvar; Enabled: False; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Salva o registro atual; Layout: blGlyphTop; Name: btnSalvar; ShowHint: True; Width: 65. Terceiro boto: Caption: &Alterar; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Altera o registro atual; Layout: blGlyphTop; Name: btnAlterar; ShowHint: True; Width: 65. Quarto boto: Caption: &Cancelar; Enabled: False; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Cancela incluso/alterao; Layout: blGlyphTop; Name: btnCancelar; ShowHint: True; Width: 65. Quinto boto: Caption: &Excluir; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Exclui o registro atual; Layout: blGlyphTop; Name: btnExcluir; ShowHint: True; Width: 65.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

44

Sexto boto: Caption: &Pesquisar; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Pesquisa de dados; Layout: blGlyphTop; Name: btnPesquisar; ShowHint: True; Width: 65. Stimo boto: Caption: &Sair; Glyph: selecione um cone para o boto; Height: 48; Hint: digite Sai do formulrio; Layout: blGlyphTop; Name: btnSair; ShowHint: True; Width: 65.

Figura 14 Barra de botes

3.10.1 Habilitando e Desabilitando os botes da barra


Como pode ser percebido, dois botes da barra ficaram desabilitados (Enabled = False). Os botes Salvar e Cancelar somente podem ficar habilitados se houver uma incluso ou alterao dos dados. Para gerenciar estas mudanas, criaremos um procedimento. Na unit do formulrio Estados (utilize F12 para visualiz-la), encontre a seo Public e logo abaixo da palavra Public, declare o procedimento: procedure HabilitaBotao(Ativar: Boolean); posicione o cursor na procedure que acabou de criar e pressione a combinao de teclas Ctrl+Shift+C para criar o corpo do procedimento; Digite o seguinte cdigo (apenas o indicado pela chave, o resto j foi criado): procedure TFC_Estados.HabilitaBotao(Ativar: Boolean); begin btnNovo.Enabled := Ativar; btnSalvar.Enabled := not Ativar; btnAlterar.Enabled := Ativar; btnCancelar.Enabled := not Ativar; btnExcluir.Enabled := Ativar; btnPesquisar.Enabled := Ativar; btnSair.Enabled := Ativar; grdDados.Enabled := Ativar; end;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

45

3.10.2 Adicionando cdigo aos botes da barra


Cdigo do Boto Novo: D um duplo clique sobre o boto Novo para chamar o evento OnClick; Adicione o seguinte cdigo:
try //inicia bloco protegido DMFuncionarios.Tb_Estado.Insert; //Coloca a tabela em modo de insero ActiveControl := DBEdit1; // coloca o foco no DBEedit1 (sigla do estado) HabilitaBotao(False); //Habilita e desabilita botes da barra except begin //inicio tratamento caso ocorra erros Application.MessageBox('Erro ao inserir. Operao Cancelada.','Erro',mb_IconError+mb_Ok); DMFuncionarios.Tb_Estado.Cancel; //cancela a insero caso ocorra algum erro end; //end do begin do except end; //end do try

Cdigo do boto Salvar: D um duplo clique sobre o boto Salvar para chamar o evento OnClick; Adicione o cdigo abaixo:
try DMFuncionarios.Tb_Estado.Post; //Salva os dados da tabela HabilitaBotao(True); //Habilita e desabilita botes da barra except Application.MessageBox('Erro ao salvar. Operao no concluda.','Erro',mb_IconError+mb_Ok); end; //end do try

Cdigo do boto Alterar D um duplo clique sobre o boto Alterar para chamar o evento OnClick; Adicione o cdigo abaixo:
try DMFuncionarios.Tb_Estado.Edit; //coloca a tabela em modo de alterao HabilitaBotao(False); //Habilita e desabilita botes da barra except begin Application.MessageBox('Erro ao alterar. Operao cancelada.','Erro',mb_IconError+mb_Ok); DMFuncionarios.Tb_Estado.Cancel; //Cancela a alterao end; //end do begin do except end; //end do try

Cdigo do boto Cancelar D um duplo clique sobre o boto Cancelar para chamar o evento OnClick; Adicione o cdigo abaixo:
DMFuncionarios.Tb_Estado.Cancel; //Cancela insero/alterao dos dados HabilitaBotao(True); //Habilita e desabilita botes da barra

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

46

Cdigo do boto Excluir D um duplo clique sobre o boto Excluir para chamar o evento OnClick; Adicione o cdigo abaixo:
{verifica se existem registros na tabela antes de excluir} if DMFuncionarios.Tb_Estado.RecordCount = 0 then {= 0 indica tabela vazia} begin Application.MessageBox('No existem registros para excluir.','Erro',mb_IconError+mb_Ok); exit; //sai do procedimento sem executar as linhas a seguir end;
if Application.MessageBox('Confirma Excluso?', 'Confirmao', mb_IconQuestion+mb_YesNo) = idYes then

begin try DMFuncionarios.Tb_Estado.Delete; //deleta o registro atual da tabela except Application.MessageBox('Erro ao excluir.','Erro',mb_IconError+mb_Ok); end; //end do try end; //end do if

Cdigo do boto Sair D um duplo clique sobre o boto Sair para chamar o evento OnClick; Adicione o cdigo abaixo:
Close; //fecha o formulrio

3.10.3 Adicionando cdigo ao formulrio


Alm dos cdigos adicionados na barra de botes, existem ainda algumas precaues que devem ser tomadas. Por exemplo: se o usurio clicar no boto Alterar, fizer alteraes e clicar no boto Sair sem salvar os dados, as mudanas realizadas no cadastro no sero efetivadas. Devemos tambm garantir que a tabela de Estados esteja ativa quando o formulrio de Estados for chamado. Estes procedimentos podem ser implementados nos eventos existentes no formulrio. Cdigo de abertura do formulrio: Selecione o formulrio (verifique se o nome do formulrio aparece na parte superior (combobox) do Object Inspector); Selecione a aba Events do Object Inspector para visualizar os eventos do formulrio; Localize o evento OnCreate, d um duplo clique sobre a caixa em branco logo a frente do nome do evento para chamar o Editor de Cdigo do evento; Digite o cdigo abaixo:
{verifica se a tabela est fechada (Active = False)} if DMFuncionarios.Tb_Estado.Active = False then DMFuncionarios.Tb_Estado.Active := True;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

47

Cdigo de fechamento do formulrio: Selecione o formulrio; Selecione a aba Events do Object Inspector para visualizar os eventos do formulrio; Localize o evento OnCloseQuery, d um duplo clique sobre a caixa em branco logo a frente do nome do evento para chamar o Editor de Cdigo do evento; Digite o cdigo abaixo:
{Verifica se o estado da tabela est em insero ou edio} if DMFuncionarios.Tb_Estado.State in [dsInsert, dsEdit] then
if Application.MessageBox('Deseja salvar os dados?', 'Confirmao', mb_IconQuestion+mb_YesNo)= idYes then

CanClose := False //No permite o fechamento do formulrio else //Else do "Application.MessageBox('Deseja ..." begin DMFuncionarios.Tb_Estado.Cancel; //Cancela a incluso/Alterao CanClose := True; //permite o fechamento do formulrio end //end do else "Application.MessageBox('Deseja ..." else //Else do "if DMFuncionarios.Tb_Estado.State ..." CanClose := True; //permite o fechamento do formulrio

Aviso: no cdigo de fechamento do formulrio existe uma condio que verifica se o


estado da tabela est em modo de insero ou edio (if DMFuncionarios.Tb_Estado.State in [dsInsert, dsEdit] then). A propriedade Estado (state) armazena o estado da tabela e pode receber diversos valores (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening). Para que esta linha de cdigo execute necessrio adicionar na clusula uses, no incio da Unit, a unit Db, caso contrrio o Delphi ir gerar um erro: Undeclared identifier: 'dsInsert'. Veja o exemplo: ... uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, Mask, DBCtrls, Grids, DBGrids, Db; ...

3.10.4 Validaes de dados


Toda aplicao deve conter validaes que garantam a consistncia dos dados. Verificar se o cdigo j existe (violao de chave primria Key Violation) e se os campos obrigatrios esto preenchidos (campos requeridos) so algumas das validaes necessrias na maioria das aplicaes. 3.10.4.1 Verificando a consistncia de chave primria: Existem vrias maneiras de verificar a repetio do valor da chave primria. Neste exemplo, vamos trabalhar com querys, para explorar os recursos deste componente.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

48

Visualize o Data Module DMFuncionarios (Shift+F12); Na paleta de componentes Interbase, selecione o componente IBQuery e adicione-o ao Data Module DM_Funcionarios; Modifique as seguintes propriedades do componente IBQuery: Database: selecione DBBanco; Name: qryValidaPk; O prximo passo definir o cdigo no formulrio de cadastros de Estados que ir verificar a existncia de Estados j cadastrados: Visualize o formulrio de Estados (Shift+ F12); Na seo public da Unit (UFC_Estados) declare o seguinte procedimento: procedure ValidaChave(Chave: String); Pressione a combinao de teclas (Shift+Ctrl+C) para criar o corpo do procedimento; Digite o seguinte cdigo:
{Verifica se a tabela est em modo de insero ou edio} if DMFuncionarios.Tb_Estado.State in [dsInsert, dsEdit] then begin DMFuncionarios.qryValidaPk.Active:= False; //desativa a query DMFuncionarios.qryValidaPk.SQL.Clear; //Limpa o contedo de clusulas SQL da query {Adiciona uma clusula SQL} DMFuncionarios.qryValidaPk.SQL.Add('Select EST_SIGLA from Tb_Estado where EST_SIGLA= chave+''''); DMFuncionarios.qryValidaPk.Active:= True; //Ativa a query {Verifica se existem registros na query} if DMFuncionarios.qryValidaPk.RecordCount > 0 then begin Application.MessageBox('Este estado j est cadastrado.','Erro',mb_IconError+mb_Ok); DMFuncionarios.Tb_Estado.Cancel; //Cancela a insero/Alterao; HabilitaBotao(True); ////Habilita e desabilita botes da barra DMFuncionarios.Tb_Estado.Locate('EST_SIGLA', chave, []); //posiciona no registro existente end; //end do "if DMFuncionarios.qryValidaPk.RecordCount..." DMFuncionarios.qryValidaPk.Active:= False; //Desativa a query end;

'''+

Agora s chamar o procedimento de validao. Podemos chamar este procedimento ao sair do DBEdit1. Chamada do procedimento atravs do DBEdit1: Clique no componente DBEdit1; Selecione a aba Events do Object Inspector para visualizar os eventos do DBEdit1; Localize o evento OnExit (ao sair), d um duplo clique sobre a caixa em branco logo a frente do nome do evento para chamar o Editor de Cdigo do evento; Digite o seguinte cdigo: if DBEdit1.Text <> '' then
{Chama o procedimento de validao de chave primria} ValidaChave(DBEdit1.Text);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

49

O que foi feito?


Explicao das propriedades e mtodos utilizados nos cdigos. Tabela Estado (Tb_Estado) TTable.Insert: Mtodo que coloca a tabela em modo de insero de dados (incluso). Para que este mtodo execute necessrio que a tabela esteja ativa (Active deve ser igual a True); TTable.Post: mtodo que grava os dados na tabela. Para que este mtodo seja executado necessrio que a tabela esteja no modo de insero ou edio; TTable.Edit: mtodo que coloca a tabela em modo de edio (alterao). A tabela deve estar ativa. TTable.Cancel: mtodo que cancela uma insero ou edio da tabela. TTable.Delete: mtodo que exclui o registro selecionado. TTable.RecordCount: propriedade que retorna a quantidade de registros existentes na tabela. TTable.Active: propriedade que define quando uma tabela est aberta ou no. Tabela aberta = True. Tabela fechada = False; TTable.State: indica o estado da tabela, os mais importantes so: dsInactive: tabela fechada; dsBrowse: tabela est no modo de navegao; dsEdit: tabela est no modo de edio (alterao); dsInsert: tabela est no modo de insero; dsSetKey: tabela est no modo de pesquisa; dsCalcFields: (campos calculados) um clculo est em progresso; dsFilter: processo de filtragem em progresso; TTable.Locate: (usado em DMFuncionarios.Tb_Estado.Locate('EST_SIGLA', chave, []);) pesquisa o contedo de um ou mais registros e posiciona o cursor. 1 Parmetro: nomes dos campos onde ser realizada a pesquisa entre aspas simples; 2 parmetro: valor a ser pesquisado no(s) campo(s) entre aspas simples; 3 parmetro (opcional): define opes de pesquisa sendo duas opes: loCaseInsensitive: no diferencia letras maisculas de minsculas; loPartialKey: efetua busca de valores retornando valores de campos parciais, exemplo: Cam poderia retornar Campos, Campinas etc. Esta funo aplicada tanto para tabelas como para Queryes. Query qryValidaPk: TQuery.Active: determina se a query est fechada (False) ou aberta (True); TQuery.Sql.Clear: limpa as clusulas SQL que esto armazenadas na propriedade SQL. TQuery.Add: adiciona clusulas SQL na propriedade SQL. Mensagem: (Application.MessageBox('Este estado j est cadastrado.','Erro',mb_IconError+mb_Ok);) Application.MessageBox: define uma caixa de mensagem genrica. 1 parmetro: mensagem que ser exibida para o usurio. 2 parmetro: ttulo da caixa de mensagem. 3 parmetro: botes que sero adicionados a caixa de mensagem.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

50

3.10.4.2 Verificando os campos de preenchimento obrigatrio Para verificar os campos que devem ser preenchidos (obrigatrios) ser implementada uma funo que ir verificar, antes de salvar, se existe algum campo requerido que esteja com valor nulo, caso exista, aparece uma mensagem e a operao cancelada. Visualize o formulrio de Estados (Shift+ F12); Na seo public da Unit (UFC_Estados) declare a seguinte funo: function VerificaCampoObrigatorio: Boolean; Pressione a combinao de teclas (Shift+Ctrl+C) para criar o corpo da funo; Digite o seguinte cdigo com exceo das linhas em cinza:
function TFC_Estados.VerificaCampoObrigatorio: Boolean; var i : integer;//declarao de varivel local begin //executa loop at o nmero de registros existentes na tabela for i:= 0 to DMFuncionarios.Tb_Estado.Fields.Count - 1 do begin {Verifica se o campo obrigatrio} if DMFuncionarios.Tb_Estado.Fields[i].Required = true then begin {Verifica se existe valor para o campo} if DMFuncionarios.Tb_Estado.Fields[i].IsNull then begin
Application.MessageBox(PChar('Campo obrigatrio: '+DMFuncionarios.Tb_Estado.Fields[i].DisplayLabel), 'Erro',mb_IconError+mb_Ok);

VerificaCampoObrigatorio := True; //retorna True, existe campo obrigatrio sem preencher Break; //cancela o loop; end else
VerificaCampoObrigatorio:= False; //retorna False, no existe campo obrigatrio sem preencher

end; end;

A prxima etapa chamar a funo. Isto pode ser feito no evento OnClick do boto Salvar (btnSalvar) adicionando uma condio antes de salvar os dados (Post). D um duplo clique no boto salvar (btnSalvar); Antes da palavra reservada try digite o seguinte cdigo (as duas primeiras linhas assinaladas):
if VerificaCampoObrigatorio = True then exit; try DMFuncionarios.Tb_Estado.Post; //Salva os dados da tabela HabilitaBotao(True); //Habilita e desabilita botes da barra

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

51

3.10.5 Pesquisa do Cadastro de Estados

Figura 15 Formulrio de Pesquisa de Estados Definindo as propriedades do formulrio: No menu File, selecione a opo New | Form para criar um novo formulrio; Modifique as seguintes propriedades do novo formulrio: BorderStyle: selecione bsDialog; Caption: Pesquisa de Estados; Height: 300; Name: FP_Estados; Position: selecione poScreenCenter; Width: 500; No menu File, selecione a opo Save; Verifique se o diretrio atual c:\Aplicativo\Fontes; Nomeie o arquivo para: UFP_Estados; Clique no boto Salvar. Definindo as propriedades do componente RadioGroup: Na paleta de componentes Standard, selecione o componente RadioGroup e adicione-o ao formulrio na parte superior esquerda (veja Figura 15); Modifique as seguintes propriedades: Caption: Pesquisa por:; Height: 80; Items: clique no boto com reticncias e adicione duas linhas: Sigla e Descrio; ItemIndex: 0 (zero); Name: rgOpcao; Width: 120. Definindo as propriedades do componente Label: Na paleta de componentes Standard, selecione o componente Label e adicione-o ao formulrio (veja Figura 15); Modifique as seguintes propriedades: Caption: Texto da pesquisa; Font: deixe em negrito; Name: lblTexto;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

52

Definindo as propriedades do componente Edit: Na paleta de componentes Standard, selecione o componente Edit e adicione-o ao formulrio (veja Figura 15); Modifique as seguintes propriedades: CharCase: ecUpperCase; //Transforma todos os caracteres em maisculo Name: edtTexto; Text: deixe em branco. Definindo as propriedades do componente BitBtn de pesquisa: Na paleta de componentes Additional, selecione o componente BitBtn e adicione-o ao formulrio (veja Figura 15); Modifique as seguintes propriedades: Caption: &Pesquisar; Font: deixe em negrito; Glyph: defina uma figura para o boto, de preferncia a mesma utilizada no boto Pesquisar do formulrio Estado; Name: btnPesquisar; Width: 125. Definindo as propriedades do componente BitBtn para sair do formulrio: Na paleta de componentes Additional, selecione o componente BitBtn e adicione-o ao formulrio (veja Figura 15); Modifique as seguintes propriedades: Caption: &Sair; Font: deixe em negrito; Glyph: defina uma figura para o boto, de preferncia a mesma utilizada no boto Sair do formulrio Estado; Name: btnSair; Width: 125. Definindo a Query de pesquisa: Visualize o Data Module DMFuncionarios (Shift+F12); Na paleta de componentes Interbase, selecione o componente IBQuery e adicione-o ao Data Module; Modifique as seguintes propriedades: Database: selecione DBBanco; Name: qryPesquisas. Na paleta de componentes Data Access, selecione o componente DataSource e adicione-o ao Data Module; Modifique as seguintes propriedades: AutoEdit: False; //quando Falso no permite que os dados sejam alterados na grid DataSet: selecione qryPesquisas; Name: dsQryPesquisa.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

53

Definindo a grid de visualizao dos dados da pesquisa: Visualize o formulrio de Pesquisa de Estados (FP_Estado) (Shift+F12); Na paleta de componentes Data Controls, selecione o componente DBGrid e adicione-o ao formulrio de Pesquisa de Estados; No menu File, selecione a opo Use Unit; Na janela Use Unit, selecione UDM_Funcionarios e clique no boto Ok. Isto permitir que o formulrio de Pesquisa de Estados utilize os componentes do Data Module DMFuncionarios; Modifique as seguintes propriedades da DBGrid: Align: alBottom; DataSource: selecione DMFuncionarios.dsQryPesquisa; Height: 180; Name: dbgPesquisa; Options: clique no sinal de + ao lado do nome da propriedade para visualizar as subpropriedades e, na subpropriedade dgTitles, selecione False; ReadOnly: True.

O que foi feito?


Propriedades manipuladas no componente RadioGroup: Items: esta propriedade permite adicionar uma lista de opes de botes de seleo. Para cada linha adicionada no editor, criado uma opo. O primeiro elemento da linha (Sigla) recebe o ndice 0 (zero), o segundo elemento da lista (Descrio) recebe 1 e, se houvessem mais seguiriam esta seqncia. Portanto, os elementos da lista iniciam em 0 (zero.) ItemIndex: utilize esta propriedade para definir um valor inicial para sua lista assinalando um elemento, se definirmos o valor 0 (zero) para esta propriedade, ser marcado o primeiro elemento da lista, valor 1 marca o segundo elemento da lista e assim por diante. Adicionando o cdigo do boto Pesquisar: D um duplo clique sobre o boto Pesquisar para chamar o evento OnClick; Digite o seguinte cdigo:
if edtTexto.Text = '' then //se no houver texto para pesquisa begin Application.MessageBox('Informe o texto da pesquisa.','Erro',mb_IconError+mb_Ok); ActiveControl:= edtTexto; //foco no Edit exit; //sai do procedimento de pesquisa end else //seno existe texto para pesquisa if rgOpcao.ItemIndex = 0 then //se a sigla estiver selecionada como opo de pesquisa begin DMFuncionarios.qryPesquisas.Active:= False; //fecha a query de pesquisa DMFuncionarios.qryPesquisas.Sql.Clear; //limpa o contedo da propriedade SQL DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado'); DMFuncionarios.qryPesquisas.Sql.Add('where EST_SIGLA starting with '''+edtTexto.Text+''''); DMFuncionarios.qryPesquisas.Active:= True; //abre a query if DMFuncionarios.qryPesquisas.RecordCount = 0 then //verifica a qtde de registros da pesquisa Application.MessageBox('Sigla no encontrada.','Erro',mb_IconError+mb_Ok);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

54

end else //seno ItemIndex = 1, ou seja, a opo de pesquisa pela descrio begin DMFuncionarios.qryPesquisas.Active:= False; //fecha a query de pesquisa DMFuncionarios.qryPesquisas.Sql.Clear; //limpa o contedo da propriedade SQL DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado'); DMFuncionarios.qryPesquisas.Sql.Add('where EST_DESCRICAO starting with '''+edtTexto.Text+''''); DMFuncionarios.qryPesquisas.Active:= True; //abre a query if DMFuncionarios.qryPesquisas.RecordCount = 0 then //verifica a qtde de registros da pesquisa Application.MessageBox('Descrio no encontrada.','Erro',mb_IconError+mb_Ok); end;

Cdigo do boto Sair: D um duplo clique no boto Sair; Adicione o seguinte cdigo:
if DMFuncionarios.qryPesquisas.RecordCount <> 0 then //verifica a qtde de registros da pesquisa
DMFuncionarios.Tb_Estado.Locate('EST_SIGLA',DMFuncionarios.qryPesquisas.fieldByName('EST_SIGLA').Value ,[ ]);

DMFuncionarios.qryPesquisas.Active:= False; //fecha a query Close; //fecha o formulrio

O procedimento para fechar o formulrio possui uma condio que verifica se existem registros na query atravs da propriedade RecordCount. Se no houver registro, ou seja, a consulta no foi bem sucedida, a query e o formulrio so fechados, porm, se existir registros, atravs da funo Locate posiciona-se no registro da Tabela Estado que seja igual ao registro selecionado na grid do formulrio. Chamando o formulrio de Pesquisa: O prximo passo chamar o formulrio de Pesquisa atravs do boto Pesquisar. Para isso ser necessrio alguns passos: Visualize o Formulrio de Cadastro de Estados (FC_Estados) (Shift+F12); No menu File, escolha a opo Use Unit...; Selecione o formulrio de pesquisa (UFP_Estados) e clique no boto Ok; D um duplo clique no boto Pesquisar (btnPesquisar); Adicione o seguinte cdigo: try //inicia bloco protegido Application.CreateForm(TFP_Estados,FP_Estados);//aloca memria para o formulrio FP_Estados.ShowModal; //mostra o formulrio finally //executa a linha abaixo se ocorrer algum erro FP_Estados.Release; //libera o formulrio da memria end; //end finally No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Pesquisa de Estado (FP_Estados) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

55

O que foi feito?


Cdigo do boto: Application.CreateForm: usado em Application.CreateForm(TFP_Estados,FP_Estados); permite a criao de formulrio em tempo de execuo, precisa de dois parmetros (separados por vrgula): 1 Nome do formulrio antecedido da letra T (parmetro de classe) e, 2 nome do formulrio (varivel de referncia). Nesta linha apenas alocada memria para o formulrio; ShowModal: mostra o formulrio; Release: libera o formulrio da memria quando o mesmo for fechado atravs do mtodo Close. Project|Options: Toda vez que um formulrio adicionado ao projeto, o Delphi automaticamente assume a responsabilidade de alocar memria para este formulrio e, quando a aplicao executada todos os formulrios so criados na memria (criados, porm no visualizados). Isto pode incorrer em um problema: se uma aplicao contiver n formulrios, quando for executada a aplicao, todos os formulrios sero alocados na memria podendo ocorrer falta de memria. Para resolver esta situao devemos assumir a responsabilidade de criao e destruio de formulrios. Para isso, necessrio criar o formulrio em tempo de execuo, ou seja, somente vamos criar o formulrio (alocar memria) quando o formulrio for necessrio e, isto realizado atravs do cdigo sugerido para o boto Pesquisar. Toda vez que houver a necessidade de criar um formulrio, pode-se utilizar o mesmo cdigo mudando apenas os parmetros de criao. Entretanto, uma vez utilizado este cdigo, necessrio tirar a responsabilidade do Delphi em alocar memria para o formulrio, uma vez que a tomamos atravs do cdigo sugerido no boto Pesquisar. Isto feito atravs da opo Project|Options na aba Forms quando mudamos o formulrio da caixa de listagem Auto-create Forms para listagem Available Forms, com isso assumimos a responsabilidade de criar, mostrar e liberar o formulrio da memria. Um benefcio imediato que a aplicao ficar mais leve, uma vez que no ser alocada memria para diversos formulrios quando a aplicao for executada. Chamando o Cadastro de Estados pelo Menu Principal: Visualize o formulrio Menu Principal (FPrincipal) (Shift+F12); No menu Cadastros, d um clique no subitem Estados; Digite o seguinte cdigo: try Application.CreateForm(TFC_Estados,FC_Estados); //aloca memria para o formulrio FC_Estados.ShowModal; //mostra o formulrio finally FC_Estados.Release; //libera da memria end; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Estado (FC_Estados) que se encontra na caixa de listagem Auto-create forms e mova-o para a caixa de listagem Available forms utilizando o boto com sinal de maior (>);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase Clique no boto Ok.

UTFPR Universidade Tecnolgica Federal do PR

56

3.11 Construindo formulrios modelo (Repositrio) Os prximos formulrios de cadastros seguiro o mesmo padro do formulrio de Cadastro de Estados com algumas modificaes. Para acelerar o processo de desenvolvimento de um aplicativo, o Delphi dispe de recursos que agilizam a programao atravs do reaproveitamento de cdigo. No caso dos formulrios, podemos utilizar um formulrio j construdo para implementar outros formulrios que possuiro as mesmas caractersticas (o mesmo cdigo com algumas modificaes).

3.11.1 Adicionando o formulrio de Cadastro de Estados ao Repositrio


Visualize o Formulrio de Cadastro de Estados (FC_Estados) (Shift+F12); D um clique com o boto direito do mouse sobre o formulrio; No menu suspenso, selecione a opo Add to Repository...; Na janela Add To Repository, modifique os seguintes campos: Title: Modelo de Cadastro; Description: Modelo para cadastro; Page: selecione Forms; Author: digite seu nome; Clique no boto Ok;

3.11.2 Adicionando o formulrio de Pesquisa de Estados ao Repositrio


Visualize o Formulrio de Pesquisa de Estados (FP_Estados) (Shift+F12); D um clique com o boto direito do mouse sobre o formulrio; No menu suspenso, selecione a opo Add to Repository...; Na janela Add To Repository, modifique os seguintes campos: Title: Modelo de Pesquisa; Description: Modelo para pesquisa; Page: selecione Forms; Author: digite seu nome; Clique no boto Ok; 3.12 Cadastro de Departamento Os demais formulrios tero basicamente as mesmas caractersticas. Entretanto, vamos reaproveitar o cdigo definido no Cadastro de Estados e, com algumas alteraes, vamos construir os demais formulrios economizando tempo. Nas sees anteriores, adicionamos o formulrio de Estados ao repositrio do Delphi e, atravs deste recurso, ser reaproveitado o formulrio na construo dos demais.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

57

Figura 16 Formulrio de Cadastro de Departamentos No menu File, escolha New Escolha a opo Other... Na janela New Items, escolha a aba Forms; Localize o cone com o ttulo Modelo de Cadastro; Certifique-se de que o boto de opo Copy (na parte inferior), esteja selecionado; Clique no boto Ok. Neste exato momento, uma cpia do formulrio Modelo de Cadastro deve estar visvel. Agora s efetuar algumas alteraes para que o Cadastro de Departamento esteja pronto em pouco tempo. Propriedades do formulrio que devem ser alteradas: Caption: Cadastro de Departamentos; Name: FC_Departamentos. Salvando o formulrio: No menu File, escolha Save; Certifique-se de estar apontando para o diretrio c:\Aplicativo\Fontes; Nome do arquivo: UFC_Departamentos; Clique no boto Salvar. Modificando os componentes do formulrio: Delete os dois componentes DBEdit e Label; Clique sobre a grid e, no Object Inspector, na propriedade DataSource, escolha: DMFuncionarios.dsDepartamento; Visualize o Data Module DMFuncionarios (Shift+F12); D um duplo clique sobre a tabela Departamento (Tb_Departamento); Arraste a janela Fields Editor para o canto direito superior do vdeo; Visualize o formulrio de Cadastro de Departamentos (FC_Departamentos) (Shift+F12); Na janela Fields Editor, selecione e arraste o primeiro campo (DPT_CODIGO) para o formulrio e solte na posio desejada (veja Figura 16); Na janela Fields Editor, selecione e arraste o segundo campo (DPT_DESCRICAO) para o formulrio e solte na posio desejada (veja Figura 16);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

58

Modificando o cdigo fonte: Pressione a tecla F12 para visualizar o editor de cdigo fonte; Posicione o cursor na primeira linha do cdigo fonte; No menu Search, escolha Replace...; Na caixa de edio Text to find, digite: Tb_Estado; Na caixa de edio Replace with, digite: Tb_Departamento; Clique no boto Replace All; A medida que o texto procurado localizado, uma caixa de mensagem pedir confirmao para a substituio do texto; Localize o corpo da procedure ValidaChave; Substitua a linha:
DMFuncionarios.qryValidaPk.SQL.Add('Select chave+''''); EST_SIGLA from Tb_Estado where EST_SIGLA='''+

Por:
DMFuncionarios.qryValidaPk.SQL.Add('Select DPT_CODIGO from Tb_Departamento where DPT_CODIGO='''+ chave+'''');

Substitua a linha:
Application.MessageBox('Este estado j est cadastrado.','Erro',mb_IconError+mb_Ok);

Por:
Application.MessageBox('Este departamento j est cadastrado.','Erro',mb_IconError+mb_Ok);

Substitua na linha:
DMFuncionarios.Tb_Departamento.Locate('EST_SIGLA', chave, []);

Por:
DMFuncionarios.Tb_Departamento.Locate('DPT_CODIGO', chave, []);

3.12.1 Pesquisa do Cadastro de Departamentos


Tambm vamos reaproveitar o formulrio de Pesquisa de Estados que adicionamos ao repositrio para construir o formulrio de Pesquisa de Departamentos.

Figura 17 Formulrio de Pesquisa de Departamentos No menu File, escolha New | Other... Na janela New Item, escolha a aba Forms; Localize o cone com o ttulo Modelo de Pesquisa; Certifique-se de que o boto de opo Copy (na parte inferior), esteja selecionada; Clique no boto Ok.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

59

Propriedades do formulrio que devem ser alteradas: Caption: Pesquisa de Departamentos; Name: FP_Departamentos. Salvando o formulrio: No menu File, escolha Save; Certifique-se de estar apontando para o diretrio c:\Aplicativo\Fontes; Nome do arquivo: UFP_Departamentos; Clique no boto Salvar. Modificando os componentes do formulrio: Clique sobre o componente RadioGroup (rgOpcao); Modifique a propriedade: Items: substitua a linha Sigla por Cdigo. Modificando o cdigo fonte: D um duplo clique sobre o boto Pesquisar; Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Departamento');

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('where EST_SIGLA starting with '''+edtTexto.Text+'''');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('where DPT_CODIGO starting with '''+edtTexto.Text+'''');

Substitua a linha:
Application.MessageBox('Sigla no encontrada.','Erro',mb_IconError+mb_Ok);

Por:
Application.MessageBox('Cdigo no encontrado.','Erro',mb_IconError+mb_Ok);

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Departamento');

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('where EST_DESCRICAO starting with '''+edtTexto.Text+'''');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('where DPT_DESCRICAO starting with '''+edtTexto.Text+'''');

Visualize o formulrio de Pesquisa de Departamento (F12); D um duplo clique sobre o boto Sair; Substitua a linha:
DMFuncionarios.Tb_Estado.Locate('EST_SIGLA',DMFuncionarios.qryPesquisas.fieldByName('EST_SIGLA').Value,[]);

Por:
DMFuncionarios.Tb_Departamento.Locate('DPT_CODIGO',DMFuncionarios.qryPesquisas.fieldByName('DPT_CODIGO').Value,[]);

Alterando o cdigo do boto pesquisar do formulrio de Cadastro de Departamentos: Visualize o formulrio de Cadastro de Departamentos (FC_Departamentos); D um duplo clique no boto Pesquisar; Substitua as linhas:

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

60

try Application.CreateForm(TFP_Estados,FP_Estados); FP_Estados.ShowModal; Finally FP_Estados.Release; end;

Por:
try Application.CreateForm(TFP_Departamentos, FP_Departamentos); FP_Departamentos.ShowModal; Finally FP_Departamentos.Release; end;

No menu File, escolha Use Unit...; Escolha UFP_Departamentos e clique no boto Ok; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Pesquisa de Departamentos (FP_Departamentos) que se encontra na caixa de listagem Auto-create forms e mova-o para a caixa de listagem Available forms utilizando o boto com sinal de maior (>); Clique no boto Ok. Chamando o Cadastro de Departamentos pelo Menu Principal: Visualize o formulrio Menu Principal (FPrincipal) (Shift+F12); No menu Cadastros, d um clique no subitem Departamentos; Digite o seguinte cdigo:
try Application.CreateForm(TFC_Departamentos, FC_Departamentos); //aloca memria para o formulrio FC_Departamentos.ShowModal; //mostra o formulrio finally FC_Departamentos.Release; //libera da memria end;

No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Cadastro de Departamentos (FC_Departamentos) que se encontra na caixa de listagem Auto-create forms e mova-o para a caixa de listagem Available forms utilizando o boto com sinal de maior (>); Clique no boto Ok. No menu File, escolha Use Unit...; Escolha UFC_Departamentos e clique no boto Ok; 3.13 Cadastro de Funcionrios A prxima etapa a construo do Cadastro de Funcionrios que ser elaborado atravs do modelo adicionado ao repositrio do Delphi.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

61

Figura 18 Formulrio de Cadastro de Funcionrios No menu File, escolha New | Other... Na janela New Item, escolha a aba Forms; Localize o cone com o ttulo Modelo de Cadastro; Certifique-se de que o boto de opo Copy (na parte inferior), esteja selecionado; Clique no boto Ok. Propriedades do formulrio que devem ser alteradas: Caption: Cadastro de Funcionrios; Name: FC_Funcionarios. Salvando o formulrio: No menu File, escolha Save; Certifique-se de estar apontando para o diretrio c:\Aplicativo\Fontes; Nome do arquivo: UFC_Funcionarios; Clique no boto Salvar. Modificando os componentes do formulrio: Delete os dois componentes DBEdit e Label; Clique sobre a grid e, no Object Inspector, na propriedade DataSource, escolha: DMFuncionarios.dsFuncionario; Visualize o Data Module DMFuncionarios (Shift+F12); D um duplo clique sobre a Tabela Funcionrio (Tb_Funcionario); Arraste a janela Fields Editor para o canto direito superior do vdeo; Visualize o formulrio de Cadastro de Funcionrios (FC_Funcionarios) (Shift+F12); Aumente o formulrio na altura e comprimento pois sero adicionados vrios campos e precisamos de maior espao (veja Figura 18); Na janela Fields Editor, selecione e arraste o primeiro campo (FUN_CODIGO) para o formulrio e solte na posio desejada; Faa este mesmo procedimento para os outros campos, na ordem apresentada a seguir (oriente-se pela Figura 18):

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

62

FUN_NOME; FUN_DDDRESIDENCIAL; FUN_FONERESIDENCIAL; FUN_DATANASCIMENTO; Departamento (Campo Lookup) e no DPT_CODIGO; FUN_SALARIO; FUN_RUA; FUN_COMPLEMENTO; FUN_BAIRRO; FUN_CEP; FUN_CIDADE e; Estado (Campo Lookup) e no EST_SIGLA; Clique sobre o painel de botes (pnlBarraBotao), e no sobre os botes; Modifique a propriedade Align de alBottom para alNone; Clique sobre o componente grid (grdDados) e pressione a combinao de teclas Ctrl+X para recortar a grid; Selecione a paleta de componentes Win32, adicione o componente PageControl (segundo componente) no local onde estava posicionado a grid; Modifique as seguintes propriedades do componente PageControl: Align: alBottom; Name: pcFuncionario. Clique com o boto direito do mouse sobre o componente PageControl e selecione a opo New Page do menu suspenso; Modifique as seguintes propriedades: Caption: Funcionrios; Name: tsFuncionarios. Clique com o boto direito do mouse sobre o componente PageControl e selecione a opo New Page do menu suspenso; Modifique as seguintes propriedades: Caption: Dependentes; Name: tsDependentes. Clique sobre o painel de botes (pnlBarraBoto), e no sobre os botes; Modifique a propriedade Align de alNone para alBottom; Clique no centro da aba Funcionrios do componente Page Control para selecionar o componente TabSheet Funcionrios (tsFuncionarios); Se voc no copiou nada na memria, pressione a combinao de teclas Ctrl+V para colar a grid; Clique sobre o componente grid e modifique a propriedade Align para alClient; Clique na aba Dependentes do componente PageControl; Clique no centro da aba Dependentes para selecionar o componente TabSheet Dependentes (tsDependentes); Se voc no copiou nada na memria, pressione a combinao de teclas Ctrl+V para colar a grid; Clique sobre o componente grid e modifique as propriedades: Align: alClient; DataSource: DMFuncionarios.dsDependentes;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase Name: grdDependentes.

UTFPR Universidade Tecnolgica Federal do PR

63

Modificando o cdigo fonte: Pressione a tecla F12 para visualizar o editor de cdigo fonte; Posicione o cursor na primeira linha do cdigo fonte; No menu Search, escolha Replace...; Na caixa de edio Text to find, digite: Tb_Estado; Na caixa de edio Replace with, digite: Tb_Funcionario; Clique no boto Replace All; A medida que o texto procurado localizado, uma caixa de mensagem pedir confirmao para a substituio do texto; Localize o corpo da procedure ValidaChave; Substitua a linha:
DMFuncionarios.qryValidaPk.SQL.Add('Select EST_SIGLA chave+''''); from Tb_Funcionario where EST_SIGLA = '''+

Por:
DMFuncionarios.qryValidaPk.SQL.Add('Select FUN_CODIGO from Tb_Funcionario where FUN_CODIGO = '''+ chave+'''');

Substitua a linha:
Application.MessageBox('Este estado j est cadastrado.','Erro',mb_IconError+mb_Ok);

Por:
Application.MessageBox('Este Funcionrio j est cadastrado.','Erro',mb_IconError+mb_Ok);

Substitua na linha:
DMFuncionarios.Tb_Funcionario.Locate('EST_SIGLA', chave, []);

Por:
DMFuncionarios.Tb_Funcionario.Locate('FUN_CODIGO', chave, []);

3.13.1 Pesquisa do Cadastro de Funcionrios

Figura 19 Formulrio de Pesquisa de Funcionrios No menu File, escolha New | Other... Na janela New Item, escolha a aba Forms; Localize o cone com o ttulo Modelo de Pesquisa; Certifique-se de que o boto de opo Copy (na parte inferior), esteja selecionado;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase Clique no boto Ok.

UTFPR Universidade Tecnolgica Federal do PR

64

Propriedades do formulrio que devem ser alteradas: Caption: Pesquisa de Funcionrios; Name: FP_Funcionarios. Salvando o formulrio: No menu File, escolha Save; Certifique-se de estar apontando para o diretrio c:\Aplicativo\Fontes; Nome do arquivo: UFP_Funcionarios; Clique no boto Salvar. Modificando componentes do formulrio: Clique sobre o componente RadioGroup (rgOpcao); Modifique a propriedade: Items: substitua a linha Sigla por Cdigo. Items: substitua a linha Descrio por Nome. Modificando o cdigo fonte: D um duplo clique sobre o boto Pesquisar; Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Funcionario');

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('where EST_SIGLA starting with '''+edtTexto.Text+'''');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('where FUN_CODIGO starting with '''+edtTexto.Text+'''');

Substitua a linha:
Application.MessageBox('Sigla no encontrada.','Erro',mb_IconError+mb_Ok);

Por:
Application.MessageBox('Cdigo no encontrado.','Erro',mb_IconError+mb_Ok);

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Estado');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('Select * from Tb_Funcionario');

Substitua a linha:
DMFuncionarios.qryPesquisas.Sql.Add('where EST_DESCRICAO starting with '''+edtTexto.Text+'''');

Por:
DMFuncionarios.qryPesquisas.Sql.Add('where FUN_NOME starting with '''+edtTexto.Text+'''');

Substitua a linha:
Application.MessageBox('Descrio no encontrada.','Erro',mb_IconError+mb_Ok);

Por:
Application.MessageBox('Nome no encontrado.','Erro',mb_IconError+mb_Ok);

Visualize o formulrio de Pesquisa de Funcionrios (F12); D um duplo clique sobre o boto Sair;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

65

Apague as linhas de cdigo e adicione as linhas abaixo:


if DMFuncionarios.qryPesquisas.RecordCount <> 0 then //verifica a qtde de registros da pesquisa {posiciona no registro da tabela estado que seja igual ao registro selecionado no gride} DMFuncionarios.Tb_Funcionario.Locate('FUN_NOME',DMFuncionarios.qryPesquisas.fieldByName('FUN_NOME').Value,[]); DMFuncionarios.qryPesquisas.Active:= False; //fecha a query Close; //fecha o formulrio

Alterando o cdigo do boto pesquisar do formulrio de Cadastro de Funcionrios: Visualize o formulrio de Cadastro de Funcionrios (FC_Funcionarios) (Shift+F12); D um duplo clique no boto Pesquisar; Substitua as linhas:
try Application.CreateForm(TFP_Estados,FP_Estados); FP_Estados.ShowModal; Finally FP_Estados.Release; end;

Por:
try Application.CreateForm(TFP_Funcionarios, FP_Funcionarios); FP_Funcionarios.ShowModal; Finally FP_Funcionarios.Release; end;

No menu File, escolha Use unit...; Escolha UFP_Funcionarios e clique no boto Ok; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Pesquisa de Funcionrios (FP_Funcionarios) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok. Chamando o Cadastro de Funcionrios pelo Menu Principal: Visualize o formulrio Menu Principal (FPrincipal) (Shift+F12); No menu Cadastros, d um clique no subitem Departamentos; Digite o seguinte cdigo:
try Application.CreateForm(TFC_Funcionarios, FC_Funcionarios); //aloca memria para o formulrio FC_Funcionarios.ShowModal; //mostra o formulrio finally FC_Funcionarios.Release; //libera da memria end;

No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Cadastro de Funcionrios (FC_Funcionarios) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

66

No menu File, escolha Use unit...; Escolha UFC_Funcionarios e clique no boto Ok; 3.14 Cadastro de Dependentes Finalmente vamos construir o Cadastro de Dependentes.

Figura 20 Cadastro de Dependentes No menu File, escolha New | Other... Na janela New Item, escolha a aba Forms; Localize o cone com o ttulo Modelo de Cadastro; Certifique-se de que o boto de opo Copy (na parte inferior), esteja selecionado; Clique no boto Ok. Propriedades do formulrio que devem ser alteradas: Caption: Cadastro de Dependentes; Name: FC_Dependentes. Salvando o formulrio: No menu File, escolha Save; Certifique-se de estar apontando para o diretrio c:\Aplicativo\Fontes; Nome do arquivo: UFC_Dependentes; Clique no boto Salvar. Modificando os componentes do formulrio: Delete os dois componentes DBEdit e Label; Clique sobre a grid e, no Object Inspector, na propriedade DataSource, escolha: DMFuncionarios.dsDependentes; Visualize o Data Module DMFuncionarios (Shift+F12); D um duplo clique sobre a tabela Dependentes (Tb_Dependentes); Arraste a janela Fields Editor para o canto direito superior do vdeo; Visualize o formulrio de Cadastro de Dependentes (FC_Dependentes) (Shift+F12); Na janela Fields Editor, selecione e arraste o terceiro campo (DEP_NOME) para o formulrio e solte na posio desejada (veja Figura 20);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

67

Na janela Fields Editor, selecione e arraste o quarto campo (DEP_DATANASCIMENTO) para o formulrio e solte na posio desejada; No adicione os campos: FUN_CODIGO, DEP_CODIGO e DEP_PARENTESCO; Escolha na paleta de componentes Data Controls, o componente DBRadioGroup e adicione-o ao formulrio. Ajuste o tamanho do formulrio se for preciso (veja Figura 20); Modifique as seguintes propriedades: Caption: Parentesco: Columns: 2; DataSource: selecione DMFuncionarios.dsDependentes; DataField: selecione DEP_PARENTESCO; Items: adicione a lista abaixo, para cada item uma linha:
Pai Me Esposa Filho(a) Irmo()

Values: adicione a lista abaixo, para cada item uma linha:


Pai Me Esposa Filho(a) Irmo()

Modificando o cdigo fonte: Pressione a tecla F12 para visualizar o editor de cdigo fonte; Posicione o cursor na primeira linha do cdigo fonte; No menu Search, escolha Replace...; Na caixa de edio Text to find, digite: Tb_Estado; Na caixa de edio Replace with, digite: Tb_Dependentes; Clique no boto Replace All; A medida que o texto procurado localizado, uma caixa de mensagem pedir confirmao para a substituio do texto; Localize o corpo da procedure ValidaChave; Apague todas as linhas (cabealho e corpo); Na seo public, apague o cabealho da procedure; Adicionando cdigo auto incremental para dependentes: D um duplo clique sobre o boto Novo (btnNovo); Faa a insero das linhas em destaque abaixo procedure Novo (no se esquea de declarar a varivel ultimo):
procedure TFC_Dependentes.btnNovoClick(Sender: TObject); var ultimo : integer; begin try //inicia bloco protegido DMFuncionarios.Tb_Dependentes.Last; //vai para o ltimo registro {Atribui o valor do campo dep_codigo do ltimo registro da tabela dependentes para a varivel ltimo} ultimo := DMFuncionarios.Tb_Dependentes.FieldByName('DEP_CODIGO').AsInteger; DMFuncionarios.Tb_Dependentes.Insert; //Coloca a tabela em modo de insero

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

68

{soma 1 a varivel ltimo e atribui ao campo dep_codigo que est sendo inserido} DMFuncionarios.Tb_Dependentes.FieldByName('DEP_CODIGO').AsInteger:= ultimo + 1; ActiveControl := DBEdit1; // coloca o foco no DBEedit1 HabilitaBotao(False); //Habilita e desabilita botes da barra except begin //inicio tratamento caso ocorra erros Application.MessageBox('Erro ao inserir. Operao Cancelada.','Erro',mb_IconError+mb_Ok); //mensagem DMFuncionarios.Tb_Dependentes.Cancel; //cancela a insero caso ocorra algum erro end; //end do begin do except end; //end do try end;

Visualize o formulrio de Dependentes e d um duplo clique sobre o boto Pesquisar; Exclua as linhas entre o begin e end da procedure; Visualize o formulrio de Dependentes e delete o boto Pesquisar; Localize a procedure HabilitaBotao e exclua a linha onde consta uma referncia ao boto Pesquisar; Ajuste o boto Sair na barra de botes.

3.14.1 Definindo a tabela Dependente como detalhe da tabela Funcionrio


Certamente seria interessante que somente os dependentes do funcionrio atualmente selecionado fossem visualizados. Assim, quando os dados do funcionrio X estiverem visveis, ao clicarmos na aba onde est presente a grid de dependentes, somente apareceriam os dependentes do funcionrio X. Este tipo de viso de dados chamado de mestre-detalhe, onde mestre a tabela Funcionrio (cardinalidade do lado 1) e detalhe a tabela Dependentes (cardinalidade do lado n).

3.14.2 Quando posso aplicar o recurso mestre-detalhe ?


O recurso mestre-detalhe somente pode ser aplicado para tabelas que possuam relacionamento entre si. Analise a cardinalidade abaixo: Funcionrio
1 N

Dependente

Um funcionrio possui n dependentes. Quem a tabela mestre? A tabela mestre sempre ser o lado da cardinalidade igual a 1, portanto, neste relacionamento, mestre funcionrio. Logo, detalhe a tabela do relacionamento onde a cardinalidade igual a n. As tabelas detalhe (Dependente) sempre recebero a chave primria (FUN_CODIGO) da tabela mestre (Funcionrio). Na tabela detalhe, essa chave ser chamada de chave estrangeira (lembre-se: chave estrangeira sempre do lado n). Relacionamentos mestre-detalhe nem sempre so aplicados, mesmo que as condies expostas acima sejam satisfeitas. Por exemplo: O relacionamento entre Estados e Funcionrios caracteriza uma relao onde pode-se aplicar o recurso mestre-detalhe, onde mestre seria

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

69

Estado e detalhe seria Funcionrio (1 estado est contido em n funcionrios). Entretanto, se aplicssemos este recurso neste relacionamento, s veramos funcionrios por estado, ou seja, quando posicionarmos no Estado X, somente veramos os funcionrios daquele estado. Neste caso, no seria muito interessante aplicar este recurso, porm, cada caso um caso. Definindo relaes mestre-detalhe: Visualize o Data Module DMFuncionarios (Shift+F12); D um clique sobre a tabela detalhe (Tb_Dependentes); No Object Inspector, localize a propriedade MasterSource (Fonte mestre); Selecione o Data Source mestre (dsFuncionario); Localize a propriedade MasterFields e clique no boto com reticncias; Na janela Field Link Designer faa o seguinte: Selecione a chave estrangeira (FUN_CODIGO) presente na tabela Dependentes na caixa de seleo Detail Fields; Selecione a chave primria (FUN_CODIGO) presente na tabela Funcionrios na caixa de seleo Master Fields; D um clique no boto Add; D um clique no boto Ok para finalizar. Pronto, agora somente sero visveis os dependentes por funcionrios. Chamando o cadastro de Dependentes atravs do Formulrio de Funcionrios: Visualize o cadastro de Funcionrios; Adicione um novo boto na barra de botes; Modifique as seguintes propriedades: Caption: &Dependentes; Glyph: escolha uma nova figura para o boto; Hint: Cadastro de Dependentes; Name: btnDependente; Width: 100. D um duplo clique sobre o boto btnDependente; Adicione as seguintes linhas de cdigo entre o begin e end da procedure:
try //inicia bloco protegido Application.CreateForm(TFC_Dependentes,FC_Dependentes);//aloca memria para o formulrio FC_Dependentes.ShowModal; //mostra o formulrio Finally //executa a linha abaixo se ocorrer algum erro FC_Dependentes.Release; //libera o formulrio da memria end; //end finally

No menu File, escolha Use Unit...; Selecione o formulrio UFC_Dependentes e clique no boto OK. No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Cadastro de Dependentes (FC_Dependentes) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR 70

RELATRIOS

O objetivo deste captulo a construo de relatrios contendo os dados das tabelas definidas neste curso. Para tanto, sero abordados diversos tipos de relatrios com a finalidade de mostrar alguns dos recursos possveis. Para tanto, ser utilizado os componentes da paleta QReport (Quick Report) que um conjunto de componentes destinados para a elaborao de relatrios. Vale lembrar ainda que existem diversos gerados de relatrios que podem ser utilizados para esta tarefa. Para habilitar o Quick Report no Delphi 7 faa o seguinte: - No menu Component... selecione Install Packages. - Na janela Design Packages, clique no boto Add... - V at a pasta Delphi7\Bin e selecione o arquivo dclqrt70.bpl e clique em abrir. 4.1 Elaborando relatrio simples (Relatrio de Estados)

Elaborar relatrios pode se tornar uma atividade muito complexa, dependendo do tipo de viso que se quer dos dados. Para relatrios simples, ou seja, relatrios que mostram apenas os dados j cadastrados esta tarefa fcil. Para ilustrar esta situao vamos construir um relatrio que vai listar todos os Estados cadastrados.

Figura 21 Relatrio de Estados No menu File, escolha New Form; Modifique as seguintes propriedades do formulrio: Caption: Relatrio de Estados; Name: FR_Estados; No menu File, escolha Save; Certifique-se de estar apontando para o diretrio C:\Aplicativo\Fontes; Nome do arquivo: UFR_Estados; Clique no boto Salvar; Adicionando os componentes de relatrio: Na paleta de componentes QReport, selecione o componente QuickRep e adicione-o ao formulrio; No menu File, escolha a opo Use Unit;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

71

Na janela Use Unit, escolha o Data Module UDM_Funcionarios; Modifique as seguintes propriedades: DataSet: escolha DMFuncionarios.Tb_Estado; Name: QREstados; ReportTitle: Relatrio de Estados; D um clique no sinal de + (mais) da propriedade Bands para visualizar as sub propriedades, modifique as seguintes sub propriedades: HasColumnHeader: True; HasDetail: True; HasPageFooter: True; HasTitle: True. Modificando as bandas Title (Ttulo): D um clique na primeira banda (Title); Propriedade Height: 50; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2. D um clique na segunda banda (Column Header); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2. D um clique na terceira banda (Detail); Propriedade Height: 20. D um clique na ltima banda (PageFooter); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawTop: True; Width: 2. Definindo o ttulo do relatrio de Estados: Na paleta de componentes QReport, selecione o componente QRLabel e adicione-o em cima da prima banda (Title); Modifique as seguintes propriedades do componente QRLabel: Alignment: taCenter; AlignToBand: True; Caption: Relatrio de Estados; Font: tamanho 20, em negrito, Fonte: Comic Sans MS; Top: 5.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

72

Definindo os cabealhos das colunas: Na paleta de componentes QReport, selecione o dois (2) componentes QRLabel e adicioneos em cima da banda Column Header (segunda banda); Modifique as seguintes propriedades da primeira QRLabel: Caption: Sigla; Font: tamanho 12 em negrito; Left: 15; Top: 4. Modifique as seguintes propriedades da segunda QRLabel: Caption: Descrio; Font: tamanho 12 em negrito; Left: 100; Top: 4. Definindo os dados que sero listados no relatrio: Na paleta de componentes QReport, selecione o dois (2) componentes QRDBText e adicione-os em cima da banda Detail (terceira banda); Modifique as seguintes propriedades da primeira QRDBText: DataSet: selecione DMFuncionarios.Tb_Estado; DataField: selecione EST_SIGLA; Left: 15; Top: 2. Modifique as seguintes propriedades da segunda QRDBText: DataSet: selecione DMFuncionarios.Tb_Estado; DataField: selecione EST_DESCRICAO; Left: 100; Top: 2. Definindo o Rodap: Na paleta de componentes QReport, selecione o dois (2) componentes QRSysData e adicione-os em cima da banda Page Footer (ltima banda); Modifique as seguintes propriedades da primeira QRSysData: Data: qrsDateTime; Left: 15; Text: Data/Hora: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Modifique as seguintes propriedades da segunda QRSysData: Data: qrsPageNumber; Left: 600; Text: Pgina: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Visualizando o relatrio: possvel visualizar o relatrio de Estados em tempo de projeto. D um clique com o boto direito do mouse sobre o componente QuickRep (no pode ser em cima de nenhuma banda) e selecione a opo Preview do menu suspenso.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

73

Se tudo ocorreu bem, os dados do relatrio sero listados. Executando o relatrio pelo formulrio Menu Principal: Visualize o formulrio Principal (FPrincipal) (Shift+F12); D um clique no menu Relatrios e selecione o item de menu Estados para chamar o evento OnClick; Digite o seguinte cdigo:
try Application.CreateForm(TFR_Estados,FR_Estados); //aloca memria para o formulrio FR_Estados.QREstados.Preview; //mostra o relatrio finally FR_Estados.Release; //libera da memria end;

No menu File, escolha Use unit...; Na janela Use Unit, escolha UFR_Estados e clique no boto Ok; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Relatrio de Estados (FR_Estados) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok. 4.2 Elaborando relatrio mestre-detalhe (Funcionrio e seus Dependentes)

Elaborar relatrios onde so listados mais de uma tabela so freqentes no desenvolvimento de software. Exemplo seria um relatrio que listaria todos os funcionrios e, para cada funcionrio, os seus dependentes. Estes tipos de relatrios so chamados de relatrios mestre-detalhe.

Figura 22 Relatrio de Funcionrios e Dependentes No menu File, escolha New Form; Modifique as seguintes propriedades do formulrio: Caption: Relatrio de Funcionrios e Dependentes;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

74

Name: FR_FuncionarioDependente; No menu File, escolha Save; Certifique-se de estar apontando para o diretrio C:\Aplicativo\Fontes; Nome do arquivo: UFR_FuncionarioDependente; Clique no boto Salvar; Adicionando os componentes de relatrio: Na paleta de componentes QReport, selecione o componente QuickRep e adicione-o ao formulrio; No menu File, escolha a opo Use Unit; Na janela Use Unit, escolha o Data Module UDM_Funcionarios; Modifique as seguintes propriedades do componente QuickRep: DataSet: escolha DMFuncionarios.Tb_Funcionario; Name: QRFuncDependente; ReportTitle: Relatrio de Funcionrios e Dependentes; D um clique no sinal de + (mais) da propriedade Bands para visualizar as sub propriedades, modifique as seguintes sub propriedades: HasColumnHeader: True; HasDetail: True; HasPageFooter: True; HasTitle: True. Adicionando a banda detalhe (onde aparecero os dependentes): Na paleta de componentes QReport, selecione o componente QRSubDetail e adicione-o em cima do componente QuickRep (QRFuncDependente); Se tudo ocorreu bem, a banda QRSubDetail ficou abaixo da banda Detail. Modifique as seguintes propriedades da banda QRSubDetail: DataSet: DMFuncionarios.Tb_Dependentes; Verifique se a propriedade Master est apontando para o componente QRFuncDependente, seno, selecione-o; Height: 20. Modificando as bandas Title (Ttulo): D um clique na primeira banda (Title); Propriedade Height: 50; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2. D um clique na segunda banda (Column Header); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

75

D um clique na terceira banda (Detail); Color: clSilver; Height: 20; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True. D um clique na ltima banda (PageFooter); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawTop: True; Width: 2. Definindo o ttulo do relatrio de Estados: Na paleta de componentes QReport, selecione o componente QRLabel e adicione-o em cima da prima banda (Title); Modifique as seguintes propriedades do componente QRLabel: Alignment: taCenter; AlignToBand: True; Caption: Relatrio de Funcionrio e Dependentes; Font: tamanho 20, em negrito, Fonte: Comic Sans MS; Top: 5. Definindo os cabealhos das colunas: Na paleta de componentes QReport, selecione o dois (2) componentes QRLabel e adicioneos em cima da banda Column Header (segunda banda); Modifique as seguintes propriedades da primeira QRLabel: Caption: Cdigo; Font: tamanho 12 em negrito; Left: 15; Top: 4. Modifique as seguintes propriedades da segunda QRLabel: Caption: Nome do funcionrio; Font: tamanho 12 em negrito; Left: 100; Top: 4. Definindo os dados que sero listados dos funcionrios no relatrio: Na paleta de componentes QReport, selecione o dois (2) componentes QRDBText e adicione-os em cima da banda Detail (terceira banda); Modifique as seguintes propriedades da primeira QRDBText: Color: selecione clSilver; DataSet: selecione DMFuncionarios.Tb_Funcionario; DataField: selecione FUN_CODIGO;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

76

Left: 15; Top: 2. Modifique as seguintes propriedades da segunda QRDBText: Color: selecione clSilver; DataSet: selecione DMFuncionarios.Tb_Funcionario; DataField: selecione FUN_NOME; Left: 100; Top: 2. Definindo os dados que sero listados dos dependentes no relatrio: Na paleta de componentes QReport, selecione o trs (3) componentes QRDBText e adicione-os em cima da banda SubDetail (terceira banda); Modifique as seguintes propriedades da primeira QRDBText: DataSet: selecione DMFuncionarios.Tb_Dependentes; DataField: selecione DEP_NOME; Left: 15; Top: 2. Modifique as seguintes propriedades da segunda QRDBText: DataSet: selecione DMFuncionarios.Tb_Dependentes; DataField: selecione DEP_PARENTESCO; Left: 300; Top: 2. Modifique as seguintes propriedades da terceira QRDBText: DataSet: selecione DMFuncionarios.Tb_Dependentes; DataField: selecione DEP_DATANASCIMENTO; Left: 500; Top: 2. Definindo o Rodap: Na paleta de componentes QReport, selecione o dois (2) componentes QRSysData e adicione-os em cima da banda Page Footer (ltima banda); Modifique as seguintes propriedades da primeira QRSysData: Data: qrsDateTime; Left: 15; Text: Data/Hora: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Modifique as seguintes propriedades da segunda QRSysData: Data: qrsPageNumber; Left: 600; Text: Pgina: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Visualizando o relatrio: possvel visualizar o relatrio de Estados em tempo de projeto. D um clique com o boto direito do mouse sobre o componente QuickRep (no pode ser em cima de nenhuma banda) e selecione a opo Preview do menu suspenso.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

77

Se tudo ocorreu bem, os dados do relatrio sero listados. Executando o relatrio pelo formulrio Menu Principal: Visualize o formulrio Principal (FPrincipal) (Shift+F12); D um duplo clique no componente MainMenu para abrir o editor de menus; D um clique no menu Relatrios; D um clique no submenu funcionrios; D um clique com o boto direito do mouse sobre o menu Funcionrios e selecione a opo Create Submenu; No submenu que aparece direita do submenu Funcionrios, modifique as seguintes propriedades: Caption: Dependentes; Name: imRelDependentes. D um duplo clique sobre o submenu Dependentes para chamar o evento OnClick; Digite o seguinte cdigo:
try Application.CreateForm(TFR_FuncionarioDependente,FR_FuncionarioDependente); FR_FuncionarioDependente.QRFuncDependente. Preview; //mostra o relatrio finally FR_FuncionarioDependente.Release; //libera da memria end;

No menu File, escolha Use unit...; Na janela Use Unit, escolha UFR_FuncionarioDependente e clique no boto Ok; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Relatrio de funcionrios e Dependentes (FR_FuncionarioDependente) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok. 4.3 Utilizando Query para elaborar relatrio de Soma de Salrios por Departamento

Existem situaes onde necessrio gerar relatrios onde necessrio somar valores, por exemplo. Esta situao ser exemplificada atravs de um relatrio onde sero listados todos os departamentos e a soma de salrios deste departamento.

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

78

Figura 23 Relatrio da soma de Salrios por Departamento No menu File, escolha New Form; Modifique as seguintes propriedades do formulrio: Caption: Relatrio de salrios por departamento; Name: FR_SalariosDepto; No menu File, escolha Save; Certifique-se de estar apontando para o diretrio C:\Aplicativo\Fontes; Nome do arquivo: UFR_SalariosDepto; Clique no boto Salvar; Adicionando os componentes de relatrio: No menu File, escolha a opo Use Unit; Na janela Use Unit, escolha o Data Module UDM_Funcionarios; Na paleta de componentes Interbase, selecione o componente IBQuery e adicione-o ao formulrio; Modifique as seguintes propriedades do componente IBQuery: DataBase: selecione DMFuncionarios.DBBanco; Name: qrySomaSalarioDepto; Sql: d um clique no boto com reticncias e digite a seguinte sentena sql no editor: select Tb_Departamento.DPT_DESCRICAO, sum(Tb_Funcionario.FUN_SALARIO) from Tb_Departamento, Tb_Funcionario where Tb_Departamento.DPT_CODIGO = Tb_Funcionario.DPT_CODIGO group by Tb_Departamento.DPT_DESCRICAO D um clique no boto Ok; Na paleta de componentes QReport, selecione o componente QuickRep e adicione-o ao formulrio; Modifique as seguintes propriedades do componente QuickRep: DataSet: escolha qrySomaSalarioDpto; Name: QRSomaSalario; ReportTitle: Relatrio de Salrios por Departamento; D um clique no sinal de + (mais) da propriedade Bands para visualizar as sub propriedades, modifique as seguintes sub propriedades: HasColumnHeader: True;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase HasDetail: True; HasPageFooter: True; HasTitle: True.

UTFPR Universidade Tecnolgica Federal do PR

79

Modificando as bandas Title (Ttulo): D um clique na primeira banda (Title); Propriedade Height: 50; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2. D um clique na segunda banda (Column Header); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawBottom: True; Width: 2. D um clique na terceira banda (Detail); Height: 20; D um clique na ltima banda (PageFooter); Propriedade Height: 30; D um clique no sinal de + (mais) da propriedade Frame e modifique as seguintes sub propriedades: DrawTop: True; Width: 2. Definindo o ttulo do relatrio de Estados: Na paleta de componentes QReport, selecione o componente QRLabel e adicione-o em cima da prima banda (Title); Modifique as seguintes propriedades do componente QRLabel: Alignment: taCenter; AlignToBand: True; Caption: Relatrio de Salrios por Departamento; Font: tamanho 20, em negrito, Fonte: Comic Sans MS; Top: 5. Definindo os cabealhos das colunas: Na paleta de componentes QReport, selecione o dois (2) componentes QRLabel e adicioneos em cima da banda Column Header (segunda banda); Modifique as seguintes propriedades da primeira QRLabel: Caption: Departamento; Font: tamanho 12 em negrito; Left: 15;

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

80

Top: 4. Modifique as seguintes propriedades da segunda QRLabel: Caption: Soma dos salrios; Font: tamanho 12 em negrito; Left: 300; Top: 4. Definindo os dados que sero listados no relatrio: Na paleta de componentes QReport, selecione o dois (2) componentes QRDBText e adicione-os em cima da banda Detail (terceira banda); Modifique as seguintes propriedades da primeira QRDBText: DataSet: selecione qrySomaSalarioDpto; DataField: selecione DPT_DESCRICAO; Left: 15; Top: 2. Modifique as seguintes propriedades da segunda QRDBText: DataSet: selecione qrySomaSalarioDpto; DataField: selecione SUM; Left: 300; Mask: R$ #.00 Top: 2. Definindo o Rodap: Na paleta de componentes QReport, selecione o dois (2) componentes QRSysData e adicione-os em cima da banda Page Footer (ltima banda); Modifique as seguintes propriedades da primeira QRSysData: Data: qrsDateTime; Left: 15; Text: Data/Hora: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Modifique as seguintes propriedades da segunda QRSysData: Data: qrsPageNumber; Left: 600; Text: Pgina: ; (deixe um espao em branco aps os dois pontos :) Top: 8. Visualizando o relatrio: possvel visualizar o relatrio de Estados em tempo de projeto. Verifique se a propriedade active da Query est true; D um clique com o boto direito do mouse sobre o componente QuickRep (no pode ser em cima de nenhuma banda) e selecione a opo Preview do menu suspenso. Se tudo ocorreu bem, os dados do relatrio sero listados. Executando o relatrio pelo formulrio Menu Principal: Visualize o formulrio Principal (FPrincipal) (Shift+F12);

Prof. Eduardo Cotrin Teixeira

Curso de Delphi 7 & Interbase

UTFPR Universidade Tecnolgica Federal do PR

81

D um duplo clique no componente MainMenu para abrir o editor de menus; D um clique no menu Relatrios; D um clique na linha em branco logo aps o submenu Estados; Modifique as seguintes propriedades: Caption: Departamentos; Name: imDepartamento. D um clique com o boto direito do mouse sobre o menu Departamento e selecione a opo Create Submenu; No submenu que aparece direita do submenu Departamento, modifique as seguintes propriedades: Caption: Soma dos Salrios por Departamento; Name: imSomaSalario. D um duplo clique sobre o submenu Soma dos Salrios por Departamento para chamar o evento OnClick; Digite o seguinte cdigo:
try Application.CreateForm(TFR_SalariosDepto,FR_SalariosDepto); //aloca memria para o formulrio FR_SalariosDepto.qrySomaSalarioDepto.Active:= False; //fecha a query FR_SalariosDepto.qrySomaSalarioDepto.Active:= True; //abre a query para que seja atualizada FR_SalariosDepto.QRSomaSalario.Preview; //mostra o relatrio finally FR_SalariosDepto.Release; //libera da memria end;

No menu File, escolha Use unit...; Na janela Use Unit, escolha UFR_SalariosDpto e clique no boto Ok; No menu Project, selecione Options...; Na aba Forms, localize o formulrio de Relatrio de Salrios por Departamento (FR_SalariosDpto) que se encontra na caixa de listagem Auto-create Forms e mova-o para a caixa de listagem Available Forms utilizando o boto com sinal de maior (>); Clique no boto Ok.

Exerccios sugeridos:
Construa dois relatrios simples: Um contendo todos os dados dos funcionrios e, Outro contendo todos os dados de Departamentos.

Prof. Eduardo Cotrin Teixeira