Você está na página 1de 238

Ao Grande Pai Celest e, por colocar em

meu caminho minha esposa e eterna


companheira, Thais Sabbag Mut o, e por ter
confiado e entregue a ns, numa linda noit e
de quint a-feira, dia 1 de fevereiro de 2001,
um anjinho dotado de beleza, amor e pureza
inigualveis: Lucas Sabbag Mut o nosso
amado filho
Agradecimentos
Ao casal Fernando e Marlene Zanatt a, que sempre foram uma segunda famlia para
mim. Obrigado por me at urar durant e t oda a adolescncia e juvent ude.
edit ora Brasport , pela nova e valiosa chance.
equipe da BufferOverflow.org, Ant nio Marcelo, Felipe Cerqueira, Felipe Sarai-
va e Thiago, pela et erna fora que me do no mundo LINUX.
A TODOS os meus amigos de infncia, com quem convivo h pelo menos 20 anos.
Eu, porm, vos digo que no
resistais ao mal; mas, se
qualquer um te bater na face
direita, oferece-lhe tambm a
outra
Mateus 5:39
1
Introduo
Em funo do sucesso do livro anterior, Criando Aplicaes em Delphi com Banco
de Dados Oracle, e do lanament o da verso 6 do Delphi, est e livro procura mos-
t rar ao desenvolvedor Delphi, de uma forma simples e prt ica, todas as abas e res-
pect ivos component es referent es conexo com o banco de dados Oracle: ADO e
BDE, present es na verso ant erior e a novssima aba dbExpress, que permit e um
acesso mais veloz e 100% de compat ibilidade com programas desenvolvidos em
Kylix.
O objet ivo desse livro, conforme o ant erior, abordar os principais tpicos relacio-
nados a essa int egrao e permit ir ao desenvolvedor Delphi que possa escolher qual
t ipo de component e ir ut ilizar para se conect ar ao banco de dados de forma que
at enda suas necessidades, garant indo dessa forma, aplicaes mais est veis e com
ganho de performance.
O livro est dividido em cinco part es.
Na primeira part e ser most rado de forma sucint a o conceito da arquit et ura clien-
t e/servidor.
A segunda parte dedicada configurao dos servios da mquina onde est ins-
t alado o Delphi 6 e que ir acessar o banco de dados Oracle.
A t erceira parte aborda, atravs de exemplos, a poderosa linguagem SQL, respon-
svel pela criao, manut eno e acesso aos dados do banco de dados Oracle e o
ut ilit rio SQL Plus 8.
A quart a part e do livro most ra a int egrao do Delphi 6 com o banco de dados Ora-
cle, at ravs das 3 abas referent es a essa conexo: BDE, ADO e dbExpress. So
coment ados os principais component es e as diferenas entre Tables e Queries alm
de analisado o conceit o de t ransao.
2 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Na quint a part e do livro so apresent ados os Apndices com dicas sobre o Delphi e
o Oracle.
Port anto, o cont edo dest e livro est baseado nas principais caract erst icas relacio-
nadas ent re o Delphi 6 e o Oracle, alm de apresent ar de forma resumida os princi-
pais comandos da linguagem SQL.
Cont at os com o aut or at ravs dos e-mails
cadonai @rpadvogados.com.br
e
lsminfo@uol.com.br
ou pela home-page http://www.lsminformat ica.cjb.net
3
PARTE 1.
Arquitetura Cliente/Servidor
5
1. Conceitos Bsicos
A t ecnologia client e/servidor uma arquit et ura na qual o processament o da infor-
mao dividido em mdulos ou processos dist int os. Um processo responsvel
pela manuteno da informao (servidores) e out ros responsveis pela obt eno
dos dados (os client es).
Os processos client e enviam pedidos para o processo servidor, e est e por sua vez
processa e envia os result ados dos pedidos.
Nos sist emas client e/servidor o processamento t anto do servidor como o do client e
so equilibrados.
Geralment e, os servios oferecidos pelos servidores dependem de processamento
especfico, s realizados por eles. O processo client e, por sua vez, fica livre para
realizar outros t rabalhos. A int erao ent re os processos client e e servidor uma
t roca cooperat iva, em que o client e o at ivo e o servidor reat ivo, ou seja, o client e
requisit a uma operao, e nest e pont o o servidor processa e responde ao client e.
C!iontos
O processo de client e at ivo, ou seja, so eles que solicit am servios a out ros pro-
gramas, os servidores. Normalment e o client e dedicado sesso do usurio, co-
meando e t erminando com a sesso. Um cliente pode int eragir com um ou mais
servidores, mas pelo menos um processo servidor necessrio. A nvel de aplica-
o, o primeiro pont o a residir no client e a int erface com o usurio. Algumas
t arefas a serem realizadas pelo Client e:


Manipulao de t ela


Int erpret ao de menus ou comandos


Ent rada e validao dos dados


Processament o de Ajuda


Recuperao de erro


Manipulao de janelas
6 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Gerenciamento de som e vdeo (em aplicaes mult imdia)
Gerenciando a int erao com o usurio, o client e esconde o servidor e a rede, caso
houver. Para o usurio a impresso de que a aplicao est sendo rodada com-
plet ament e local. Se, por acaso, o programa que int erage com o usurio fizer sim-
plesment e chamada de rot ina, e ficar por cont a do servidor todo o processamento,
est e cert ament e no um sistema client e/servidor.
Sorvidoros
Servidores so programas que respondem s solicit aes por servios compart ilha-
dos. Ele um processo reat ivo, disparado pela chegada de pedidos de seus client es.
Geralment e, o processo servidor roda o t empo todo, oferecendo servios a muit os
client es. Em alguns sist emas, o processo servidor em vez de responder diret ament e,
cria um processo escravo exclusivament e para cada pedido de cliente. O servidor
banco de dados Oracle trabalha desta forma: quando chega um pedido, ele cria um
processo escravo dedicado a trabalhar nest e pedido, deixando assim o processo
mestre livre para receber outros pedidos imediat ament e.
Para que o servidor possa manipular os dados e prover segurana, so combinadas
rot inas de gerenciamento de dados com as funes de controle encont radas nos sis-
t emas operacionais. Um servidor processa a informao sem interagir com out ros
servidores. Os client es que int eragem com mais de um servidor t m a responsabili-
dade de at iv-los quando necessrio. O processament o do servidor geralmente inclui:


acessar,


armazenar,


organizar os dados compart ilhados,


at ualizar dados previamente armazenados,


gerenciament o dos recursos compart ilhados.
Recursos compart ilhados podem ser: dados, CPU, armazenament o em disco ou
fit a, capacidade de impresso, comunicao e at gerenciament o de vdeo e mem-
ria. Um bom exemplo de servidor o servidor de backup, que pode fornecer recur-
sos de backup e recuperao em fit a para vrias mquinas numa rede.
As aplicaes em banco de dados client e/servidor em sua maioria so mont ados em
cima de banco de dados SQL pront os, como o Oracle. Por exemplo, uma aplicao
desenvolvida com uma linguagem de 4 gerao (4GL) Delphi int eragindo com dis-
posit ivo de banco de dados Oracle uma aplicao client e/servidor, onde o Delphi
const it ui o processo client e e o disposit ivo Oracle o processo servidor, ambos ro-
dando em nvel de aplicao, caracterizando assim uma aplicao client e/servidor.
Conceitos Bsicos 7
Comunicao
A comunicao ent re o client e e o servidor do est ilo t ransacional e cooperat ivo. A
nat ureza t ransacional significa que o servidor envia de volt a para o client e soment e
os dados relevant es. A nat ureza cooperat iva significa que ocorre um processamento
significat ivo nos dois ext remos, client es e servidor.
As primeiras aplicaes em rede foram elaboradas ut ilizando a t ecnologia de com-
part ilhamento de arquivos. Por exemplo, quando um usurio iniciava uma aplica-
o, o cdigo execut vel da aplicao t inha que ser t ransmit ido. Numa aplicao de
banco de dados era transmit ido todo o cdigo executvel do banco de dados e a
cada at ualizao, todo o banco de dados t ambm t inha que ser t ransmit ido, alm
disso os arquivos de ndice t ambm eram necessrios para at ualizao. Quando
t rocada por uma aplicao client e/servidor, o execut vel do banco de dados perma-
nece no servidor, junt o com ele todos os arquivos de ndices de bancos de dados,
t rafegando pela rede apenas os dados do pedido de gravao do client e.
Agora vamos considerar uma aplicao baseada em host e acessada por uma rede
com soft ware de emulao de terminal. Assim, t odos os t oques de t eclas e a maior
part e das inst rues de controle de tela so transmit idas at ravs da rede. A rede
t ransport a todos os dados informados pelo usurio, como a escolha de um menu. Se
um usurio pedir ajuda, trafegam pela rede t odas as mensagens de ajuda, sendo a
responsabilidade pelo cont role da t ela do host .
No caso de um sist ema cliente/servidor, cit amos, por exemplo, uma companhia
area ut ilizando um sist ema de reservas de passagens, onde t emos um banco de
dados compart ilhado com os dados dos vos, dados dos passageiros, t ripulao,
et c. O soft ware client e passa para o servidor soment e os dados da operao como
reserva, nome do passageiro, vo, data, todos eles j validados. O servidor rece-
bendo est es dados, processa e armazena no banco de dados e envia o result ado de
volt a. Nest e caso, o client e responsvel pelo controle da t ela e nenhuma informa-
o dest e t ipo t rafega pela rede.
A diferena especialment e not ada em aplicaes baseadas em regist ros, onde a
incidncia de informaes muito alt a.
Com est es exemplos podemos ver como o sistema client e/servidor diminui o t rfe-
go na rede em relao s arquit et uras ant eriores. Logicament e com isto no pode-
mos dizer que uma aplicao client e/servidor no gera t rfego de rede, mas o im-
pact o de uma aplicao client e/servidor bem elaborada mnimo.
Uma caract erst ica dos sistemas client e/servidor a ut ilizao de plataformas de
hardware e soft wares diferent es de um para out ro. Dent ro dest e mix de recursos,
8 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
as aplicaes devem se comunicar de forma transparent e. A ent ra o chamado mi-
ddleware, que todo o soft ware exist ent e ent re os dois processos, para que eles se
comuniquem. O ncleo do middleware o sist ema operacional da rede.
Vantagons
Escal abili dade Um sist ema client e/servidor pode ser expandido vert icalment e
pela adio de mais recursos mquina servidora ou aumento
do nmero de servidores ou horizont alment e, pelo aument o
do nmero de mquinas servidoras.
Independncia
de Plataformas
Os sist emas client e/servidor no ficam presos a um ambient e
de soft ware ou hardware.
Melhor
Performance
Com a fora de processament o dist ribuda, o t empo de proces-
sament o menor, e conseqent ement e o tempo de respost a
t ambm menor.
Fcil Acesso aos
Dados
Como o processo client e que gerencia a int erface, deixando
o servidor livre para manipular os dados. Est e, por sua vez,
fica mais disponvel.
Reduo de
Custos
Operacionais
Troca dos sist emas grandes por sist emas com redes int egradas
pode ser feit a com um baixo cust o.
9
Parte II.
Configuraes do Cliente do Banco de
Dados Oracle
11
2. Servio
Para que o Delphi possa acessar o banco de dados Oracle, at ravs de uma conexo,
deveremos configurar na est ao (client e) um servio at ravs do Net Easy Config.
Um servio pode ser definido como uma configurao criada no arquivo tnsnames. ora
que possibilit a uma conexo com o banco de dados.
Uti!izando o Not 8 Fasy Conlig
A configurao realizada at ravs do Net8 Easy Config
1
, que nos guia passo a
passo para gerao do servio. A figura 2.1 nos most ra como execut -lo:
Figura 2.1

1

O Net8 Easy Config vem junto com o CD do Oracle, e dever estar instalado na mquina que ir acessar o
banco de dados.
12 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Uma vez execut ado o Net8 Easy Config, a seguint e t ela dever ser mostrada:
Figura 2.2
Onde as opes que aparecem na janela so:


Adicionar novo servio ut ilizada para adicionar um novo servio de
um banco j exist ent e;


Modificar ut ilizada para modificar um servio j exist ent e;


Deletar ut ilizada para apagar um servio;


Testar Test a o servio criado, efet uando uma conexo contra o banco.
Criando um Novo Sorvio
Para criarmos um novo servio as et apas devem ser seguidas dent ro do Net8 Easy
Config conforme segue:
Ftapa 1 - Dolinindo o nomo do sorvio
Devemos escolher a opo Adicionar novo servio, preenchermos o campo Novo
Nome de Servio com ORA_DEL e logo aps clicar no bot o Prximo.
Servio 13

Figura 2.8
Ftapa 2 - Dolinindo o tipo do protoco!o do comunicao
Ao escolhermos o nome do servio, devemos det erminar o t ipo de protocolo de
comunicao que ser ut ilizado para realizarmos as conexes cont ra o banco de
dados. O prprio Net8 Easy Config det ect a os protocolos da rede inst alados, e con-
figura cada um para o Oracle.
Para realizar est a escolha ser apresent ada a t ela da figura 2.4.
Figura 2.4
14 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Aps t er sido definido o t ipo de protocolo de rede, deveremos clicar no bot o Pr-
ximo.
Caso haja alguma dvida em relao ao t ipo de prot ocolo de rede a ser ut ilizado,
consult e o administrador da rede ou o administ rador do banco de dados.
Ftapa 8 - Dolinindo o nomo do host o o nmoro da porta
Devemos agora especificar o nome do host, ident ificado por um nmero de IP onde
o banco de dados est localizado, assim como o nmero da port a.
Figura 2.
O nmero da port a que o Oracle usa como default 1521. Dvidas em relao ao
nome do host , assim como ao nmero da port a a serem ut ilizados, devem ser t ira-
das com o administ rador da rede ou com o administrador do banco de dados.
Ftapa 4 - Dolinindo om qua! instnciaso conoctar
Aps a escolha do nome do host e o nmero da port a, devemos especificar a ins-
t ncia do banco em que queremos nos conect ar, ident ificada pelo SID (syst em
ident ificator).
Geralment e o SID para o banco de dados t em o valor ORCL como default . Dvidas
em relao ao SID devem ser t iradas com o administ rador do banco de dados.
Servio 15
Figura 2.0
Ftapa - Tostando o sorvio insta!ado
Aps t udo informado, o Net8 Easy Config nos d a possibilidade de fazermos um
t est e do servio inst alado. Para isso, devemos clicar no bot o Testar Servio, con-
forme t ela apresent ada na figura 2.7:
Figura 2.7
Em seguida, devemos digit ar o nome do usurio e sua respect iva senha (o Oracle
t em como default um usurio chamado scott, cuja senha tiger). Aps t er sido
digit ado usurio/senha, deve-se clicar no bot o Testar, onde uma conexo cont ra o
banco de dados ser feit a, e ent o, aguardar a validao ou no do novo servio
criado. Em caso posit ivo, a seguint e t ela ser apresent ada:
16 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Figura 2.8
Em seguida, deve-se clicar no bot o Ok, onde ser finalizada a criao do novo
servio.
Ftapa 0 - Fina!izando a insta!ao do novo sorvio
Aps o preenchiment o de todas as informaes, o Net8 Easy Config apresent ar
uma t ela confirmando a criao do novo servio, como apresent ado na figura 2.9:
Figura 2.0
Ent o o bot o Terminar dever ser clicado, e o novo servio est ar inst alado.
17
Parte III.
SQL
19
3. Conceito
O SQL uma linguagem est rut urada para manipulao de dados. padronizada
para os bancos de dados relacionais, mas cada gerenciador pode possuir uma ex-
t enso prpria dessa linguagem.
A Linguagem SQL t em como grandes virt udes sua capacidade de gerenciar ndices,
sem a necessidade de cont role individualizado de ndice corrent e, algo muito co-
mum nas linguagens de manipulao de dados do t ipo regist ro a regist ro.
Out ra caract erst ica int eressante na linguagem SQL a capacidade que dispomos
de cancelarmos ou gravarmos, depois de inicializadas, uma seqncia de at ualiza-
es.
20
4. Utilizando o SQl 8 Plus
Para que possamos manipular dados, criar t abelas, ndices e todas as operaes
envolvendo o banco de dados Oracle de uma forma diret a e interat iva, devemos
ut ilizar o SQL8 Plus. A figura 4.1 mostra como execut -lo:
Figura 4.1
Uma vez execut ado, o SQL8 Plus exibir uma t ela de LOGIN para conexo com o
banco de dados Oracle, conforme mostra a figura 4.2:
Figura 4.2
Utilizando o SQL 8 Plus 21
Os campos Nome_de_usurio, Senha devero ser preenchidos, respect ivament e,
com o nome do usurio e senha de quem ir fazer o acesso
1
. O campo
String_do_host dever ser preenchido com o servio criado ant eriorment e,
ORA_DEL. Uma vez preenchidos os dados corret ament e, a seguint e t ela ser
apresent ada:
Figura 4.8
No prompt do SQL8 Plus podemos digit ar qualquer comando SQL para t ermos
respost as s nossas solicit aes. Quando o comando ultrapassar mais de uma linha,
aparecer no edit or o nmero das linhas digit adas. O SQL8 Plus ident ifica o
;
(pont o-e-vrgula) como finalizador de um comando SQL, execut ando-o ent o,
como nos mostra o exemplo a seguir:
SQL > SELECT *
2 FROM EMPREGADOS;
Nmero de linhas digitadas Finalizador de um comando SQL.
Os capt ulos 6 e 7 most raro os principais comandos SQL.

1
Caso voc no possua um login de acesso ao banco de dados, digite como usurio scott e senha tiger, ou entre em
contato com o administrador do banco de dados e solicite um.
22
5. Integridade de Dados
Antes de ent rarmos nos conceit os da criao e manut eno de t abelas e ndices,
devemos primeiro ent ender o conceit o de int egridade dos dados.
Int egridade de dados pode ser definida como regras criadas pelo desenvolvedor,
analist a ou DBA, para assegurar a consist ncia das informaes mant idas nas ta-
belas. Dessa forma, pode-se garant ir que um campo numrico s receba valores
numricos, ou que ao incluirmos um funcionrio na t abela de EMPREGADOS,
soment e ser aceito um cargo para esse funcionrio desde que esse cargo est eja
previament e cadastrado na t abela de CARGOS, conforme figura 5.1:

Tabel a de funcionri os Tabel a de cargos
Figura .1
Dessa forma, esse capt ulo ir abordar os principais t ipos de int egridade de dados,
criados at ravs de constraints, ut ilizados pelo banco de dados Oracle e que ut iliza-
remos para criao de nossas t abelas nos capt ulos seguint es.
NOT NUII
Como padro, o banco de dados Oracle permit e que todas as colunas aceit em valo-
res nulos. Assim, a const raint NOT NULL obriga que as colunas da t abela com
essa rest rio possuam um valor diferent e de nulo. Como exemplo podemos definir
que a t abela EMPREGADOS no permit a valores nulos para a coluna endereos.

Coluna com a restrio NOT NULL
NOME CARGO
Andr Muto 01
Thais Sabbag Mut o 02
CARGO DESCRICAO
01 Vet erinrio
02 Advogado
EMPREGADO ENDERECO
Alice Sabbag Rua A, 1024
Ronald Muto
Integridade de Dados 23
Exemplo:
CREATE TABLE EMPREGADOS
(EMPREGADO VARCHAR2(5) NOT NULL,
ENDERECO VARCHAR2(5) NOT NULL)
UNIQUF KFY
A restrio UNIQUE KEY obriga que o valor de uma linha de coluna ou de um
conjunto de colunas que formam a chave sejam nicos. Por exemplo, em uma ta-
bela de cargos, pode-se definir que a descrio dos cargos seja unvoca, pois no
pode haver mais de uma cargo com a mesma descrio.

Coluna com a restrio UNIQUE KEY
Exemplo:
CREATE TABLE CARGOS
(CODCARGO VARCHAR2(3) NOT NULL,
DESCRICAO VARCHAR2(25) NULL,
CONSTRAINT UK_DESCRICAO UNIQUE KEY (DESCRICAO));
PRIMARY KFY
Esse t ipo de restrio define que uma coluna ou grupo de colunas faro part e da
chave primria da tabela. convenient e que cada t abela possua ao menos uma
chave primria. PRIMARY KEYs, por definio, no aceit am valores nulos ou
duplicados. Por exemplo, em uma t abela de empregados no devemos aceit ar valo-
res nulos ou duplicados na coluna matrcula.

Coluna com a restrio PRIMARY KEY
CARGO DESCRICAO
01 Vet erinrio
02 Advogado
03 Vet erinrio
MATRCULA EMPREGADO
00001 Sergio Dusek
00001 Cesar Calil
24 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo:
CREATE TABLE EMPREGADOS
(MATRICULA VARCHAR2(5) NOT NULL,
EMPREGADO VARCHAR2(55) NULL,
CONSTRAINT PK_MATRICULA PRIMARY KEY (MATRICULA));
FORFIGN KFY
Essa restrio permit e que seja estabelecido um relacionamento ent re tabelas por
meio de colunas com o mesmo cont edo. Assim, para cada linha da t abela-filha
deve sempre exist ir uma linha correspondent e na t abela-me. Como exemplo po-
demos definir que s sero cadast rados funcionrios na t abela EMPREGADOS se
exist irem depart ament os cadast rados na t abela DEPTO.

Colunas com a restrio FOREIGN KEY
?
Exemplo:
CREATE TABLE EMPREGADO
(EMPREGADO VARCHAR2(5) NOT NULL,
DEPTO VARCHAR2(3) NOT NULL,
CONSTRAINT FK_DEPTO FOREIGN KEY (DEPTO)
REFERENCES DEPARTAMENTO(DEPTO);
C!usu!a DFIFTF CASCADF
Essa clusula indica que quando uma linha cont endo as chaves especificadas pela
rest rio FOREIGN KEY for excluda, todas as linhas da t abela-filha que se relaci-
onarem com ela t ambm o sero.
EMPREGADO DEPTO
Thais Sabbag 02
Celia Calil 05
DEPTO DESCRICAO
01 Vet erinrio
02 Advogado
EMPREGADO DEPTO
Thais Sabbag 02
Andr Muto 01
DEPTO DESCRICAO
01 Vet erinrio
02 Advogado
Integridade de Dados 25

Linha excluda na tabela-me

Linha excluda na tabela-filha
Exemplo:
CREATE TABLE EMPREGADO
(EMPREGADO VARCHAR2(5) NOT NULL,
DEPTO VARCHAR2(3) NOT NULL,
CONSTRAINT FK_DEPTO FOREIGN KEY (DEPTO)
REFERENCES DEPARTAMENTO(DEPTO) ON DELETE CASCADE;
26
6. Data Definition Language (DDL)
O SQL apresent a uma srie de comandos que permitem a definio dos dados,
chamada de DDL (Dat a Definit ion Language), que so dest inados criao do
banco de dados, das t abelas que o compem, alm das relaes exist ent es entre as
t abelas. Os prximos capt ulos sero dest inados, soment e, criao de t abelas e
ndices, visando sua ut ilizao com o Delphi.
Tabo!as
Tabelas so a unidade bsica de armazenament o num banco de dados
1
, possuindo,
cada uma, um nome que as ident ifica, t al como as colunas que as compem. Os
dados so armazenados em linhas e colunas, que armazenam cada uma, um t ipo
diferent e de dado (data type). A figura 6.1 nos most ra um exemplo de t abela:
EMPREGADOS

Nome da tabela

Nome das colunas

Tipo de dado (varchar2) Linhas
Figura 0.1

1
O Oracle permite que sej am criados os seguintes tipos de tabelas: Normais, Particionadas, Indexed-organized e
Clustered. Como o livro se baseia na utilizao do banco de dados com o Delphi atravs de tabelas normais, no
irei abordar os demais tipos.
MATRICULA NOME ENDERECO
00001 Thais Sabbag Rua A
00002 Pat ricia Dusek Rua B
Data Definition Language (DDL) 27
Tipos do Dados
Sero apresent ados a seguir os principais t ipos de dados para armazenamento nas
colunas que compem uma t abela:
TIPO DE DADO DESCRIO
CHAR(N) Armazena dados com t amanho fixo
VARCHAR2(N) Armazena dados com t amanho varivel
NUMBER(N,D) Armazena nmeros, com t amanho e preciso
DATE Dat a e hora
LONG Cadeia de caract eres at 2GB
RAW(N), LONG RAW Dados binrios
CLOB Objet os de caract eres grandes
ROWID Posio de um regist ro
BLOB Objet os binrios at 4GB
BFILE Pont eiro a um arquivo binrio ext erno base de dados
Os t ipos de dados que sero ut ilizados para criao das nossas t abelas sero os
quat ro primeiros.
Por recomendao da Oracle, a part ir da verso 8, deveremos sempre ut ilizar o t ipo
VARCHAR2(N), pois, em fut uras verses, podem variar as sint axes e comparaes
de cadeia de caract eres, visando a compat ibilizar o padro SQL-3.
Criao
Antes de comearmos est e capt ulo, sugiro que seja feit a uma leit ura prvia do
Apndice B Dicas para o Oracle, it em 4 Perigo na const ruo de t abelas.
Para criarmos tabelas no banco de dados, devemos ut ilizar o comando CREATE
TABLE, que t em a seguint e sint axe:
CREATE TABLE [ esquema ].t abela
(coluna t ipo de dado [, coluna t ipo de dado] ...
[CONSTRAINT nome da const raint t ipo de const raint (coluna(s))
[REFERENCES [ esquema ].tabela (coluna(s)) ] ] )
[ TABLESPACE t ablespace ]
[ PCTFREE inteiro ]
[PCTUSED int eiro ]
[INITRANS int eiro ]
[MAXTRANS int eiro ]
28 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
[ STORAGE clusula de armazenamento ]
[ LOGGING | NOLOGGING ]
[ CACHE | NOCACHE ]
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
coluna ident ifica o nome da coluna;
tipo de dado t ipo de dado da coluna;
nome da constraint nome que ident ifica a const raint ;
tipo de constraint t ipo de int egridade de dados;
coluna(s) colunas da t abela que iro fazer part e da const raint .
As demais clusulas so coment adas no Apndice B Dicas para o Oracle.
Exemplo:
Nome da tabela
CREATE TABLE EMPREGADOS
(MATRICULA VARCHAR2(5)
Tamanho
NOME VARCHAR2(50)
Tipo de dado
(
data type
)
CONSTRAINT PK_MATRICULA PRIMARY KEY (MATRICULA));
Nome da coluna Nome da constraint Coluna da tabela
Tipo de constraint
A!torao
Para alt erarmos uma t abela, devemos usar a seguint e sint axe:
ALTER TABLE [ esquema ].t abela
instruo (coluna t ipo de dado [, coluna t ipo de dado] ...
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
comando ident ifica o t ipo de comando a ser execut ado, que pode ser:
-

MODIFY modifica o t ipo de dado de uma coluna;
-

DROP remove uma coluna;
-

ADD inclui uma coluna nova.
coluna ident ifica o nome da coluna;
tipo de dado t ipo de dado da coluna;
Data Definition Language (DDL) 29
Exemplo (alt erando o t ipo de dado e o t amanho):

Nome da tabela
ALTER TABLE CARGOS
Tamanho
MODIFY("CODCARGO" CHAR(15));

Comando

Coluna

Tipo de dado
Exemplo (incluindo uma coluna):
Nome da tabela
ALTER TABLE CARGOS
Tamanho
ADD("TESTE" VARCHAR2(10));
Comando Coluna Tipo de dado
Romoo
Para removermos uma t abela criada, devemos obedecer a seguint e sint axe:
DROP TABLE [ esquema ].t abela
[CASCADE CONSTRAINTS];
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
cascade constraints est a opo necessria se for uma t abela-me num relacio-
nament o FOREIGN KEY.
Exemplo:
DROP TABLE EMPREGADOS;

Nome da tabela
30 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Criao do constraints
Para adicionarmos uma const raint em uma t abela j criada, devemos usar a sintaxe:
ALTER TABLE [ esquema ].t abela
ADD CONSTRAINT nome da const raint t ipo de const raint (coluna(s))
[REFERENCES [ esquema ].tabela (coluna(s)) ];
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
nome da constraint nome que ident ifica a const raint ;
tipo de constraint t ipo de int egridade de dados;
coluna(s) colunas da t abela que iro fazer part e da const raint .
Exemplo:

Nome da tabela

Tipo de constraint

Coluna da tabela
ALTER TABLE EMPXCARGO
ADD CONSTRAINT FK_CODCARGO FOREIGN KEY (CODCARGO)
REFERENCES CARGOS2(CODCARGO) ON DELETE CASCADE,

Nome da constraint

Tabela que a constraint referencia

Clusula

Coluna da tabela
Romoo do constraints
Para removermos uma const raint , devemos usar a sint axe:
ALTER TABLE [ esquema ].t abela
DROP CONSTRAINT nome da constraint ;
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
nome da constraint nome que ident ifica a const raint .
Data Definition Language (DDL) 31
Exemplo:

Nome da tabela
ALTER TABLE EMPXCARGO
DROP CONSTRAINT FK_CODCARGO;

Nome da constraint
ndicos
ndices so est rut uras de dados que contm pont eiros ordenados para os dados,
permit indo dessa forma, um acesso direto s linhas de uma t abela.
ndices no apenas ot imizam a recuperao de dados em uma t abela, aument am a
velocidade de at ualizaes e excluses, em funo do banco de dados Oracle en-
cont rar a linha ant es de at ualiz-la ou exclu-la.
Podemos criar um nmero ilimit ado de ndices, s que, ant es de cri-los, devemos
considerar os reais benefcios e vant agens obt idos, uma vez que, at ualizada ou inse-
rida uma linha na t abela, t odos os ndices definidos sero at ualizados dinami-
cament e, consumindo t empo e reduzindo a perfomance do banco de dados.
As sit uaes descrit as a seguir nos levariam a criar ndices:


Tabelas grandes que ret ornam, na consult a, menos de 25% das linhas;


A coluna cont m uma ext ensa cadeia de valores;


Colunas usadas freqent ement e numa clusula WHERE e JOIN.
Em cont rapart ida, nas sit uaes a seguir, no haveria a necessidade da criao de
ndices:


A t abela alt erada freqentement e;


Colunas que possuam muitos valores NULL;


Tabelas com pequeno nmero de linhas.
O banco de dados Oracle cria automat icament e ndices onde houverem const raint s
do t ipo UNIQUE KEY e PRIMARY KEY.
Criao
Para criarmos ndices no banco de dados, devemos ut ilizar o comando CREATE
INDEX, que possui a seguint e sint axe:
CREATE [UNIQUE] INDEX [ esquema ].ndice
ON [ esquema ].t abela
32 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
(coluna [ASC | DESC], [coluna [ASC | DESC] ],...)
[ TABLESPACE t ablespace ]
[ PCTFREE int eiro ]
[PCTUSED int eiro ]
[INITRANS int eiro ]
[MAXTRANS int eiro ]
[ STORAGE clusula de armazenamento ]
[ LOGGING | NOLOGGING ]
[ NOSORT ]
Onde:
esquema ident ifica o dono da t abela/ndice;
ndice ident ifica o nome do ndice;
tabela ident ifica o nome da t abela;
coluna ident ifica o nome da coluna.
As demais clusulas so coment adas no Apndice B Dicas para o Oracle.
Exemplo:

Nome do ndice
CREATE INDEX I_EMPREGAD
ON EMPREGADOS (MATRICULA);

Coluna da tabela

Tabela
A!torao
Em ndices s os parmet ros de armazenamento podem ser modificados. Para alte-
rar as colunas que formam um ndice, necessrio remov-lo, e ento, recri-lo.
Exemplo:

Nome do ndice
ALTER INDEX I_EMPREGAD
STORAGE (NEXT 400K MAXEXTENTS 110);
Romoo
Para removermos um ndice, devemos ut ilizar a sint axe:
Data Definition Language (DDL) 33
DROP INDEX [ esquema ].ndice;
Onde:
esquema ident ifica o dono da t abela;
ndice ident ifica o nome do ndice.
Exemplo:
DROP INDEX I_EMPREGAD;

Nome do ndic
e
Rocriando um ndico
Para recriarmos um ndice, devemos ut ilizar a sintaxe:
ALTER INDEX [ esquema ].ndice REBUILD;
Onde:
esquema ident ifica o dono da t abela;
ndice ident ifica o nome do ndice.
Exemplo:
ALTER INDEX I_EMPREGAD REBUILD;

Nome do ndice
34
7. Data Manipulation Language (DML) e
Data Control Language (DCL)
DMI
A DML, linguagem de manipulao de dados, ut ilizada para recuperar ou mani-
pular dados em uma ou mais t abelas.
A seguir est o relacionados os principais comandos da classe DML:
COMANDO FUNO
SELECT Responsvel por recuperar os dados de uma ou mais t abelas.
Principal comando da linguagem.
INSERT Responsvel por inserir uma linha na t abela.
DELETE Responsvel por delet ar uma os mais linhas na t abela.
UPDATE Responsvel por at ualizar uma os mais linhas na t abela.
DCI
A DCL, linguagem de cont role de dados, ut ilizada para confirmar ou desfazer
t ransaes pendent es no banco de dados Oracle.
A seguir est o relacionados os principais comandos da classe DCL:
COMANDO FUNO
COMMIT Responsvel por confirmar as t ransaes pendent es no banco.
ROLLBACK Responsvel por cancelar as t ransaes pendent es no banco.
Data Manipulation Language (DML) e Data Control Language (DCL) 35
Insorindo, Apagando o A!torando Dados om
uma Tabo!a
Para que possamos ilust rar a ut ilizao dos comandos DML, iremos trabalhar,
como exemplo, com as t abelas a seguir:
FUNCIONRIOS DEPARTAMENTO
CAMPO TIPO TAMANHO CAMPO TIPO TAMANHO
MATRICULA VARCHAR2 03 DEPTO VARCHAR2 03
NOME VARCHAR2 50 DESCRICAO VARCHAR2 50
SALARIO NUMBER 6,2
DEPTO VARCHAR2 03
Insorindo Dados
O comando que insere dados em uma t abela o INSERT, sendo sua sint axe:
INSERT INTO [esquema].t abela [(coluna(s))]
VALUES (valor(es)).
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
coluna ident ifica as colunas da t abela;
valor ident ifica os valores a serem inseridos na t abela.
Tomando como exemplo a t abela de funcionrios, para inserirmos uma nova linha,
devemos digit ar a seguint e linha de comando:
INSERT INTO FUNCIONARIOS
VALUES (001,THAIS MARTINS SABBAG, 5000.25,001);
1 linha processada.
As colunas da t abela no foram discriminadas, uma vez que est amos inserindo t odos
os dados referent es a elas. Se desejarmos inserir dados em uma s coluna e ut ilizar-
mos o comando a seguir, o banco de dados Oracle nos ret orna um cdigo de erro.
INSERT INTO FUNCIONARIOS
VALUES (001);

ORA-00947: nao ha valores suficientes
36 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Para que a incluso seja feit a corret ament e, devemos ut ilizar:
INSERT INTO FUNCIONARIOS (MATRICULA)
VALUES (001);
1 linha processada.
Os dados a serem includos devem ser do mesmo t ipo que o das colunas da tabela.
INSERT INTO FUNCIONARIOS
VALUES (001,THAIS MARTINS SABBAG, 5000.12,001);

String String Numrico String
Apagando Dados
O comando responsvel por apagar linhas de uma t abela o DELETE, sendo sua
sint axe:
DELETE FROM [esquema].t abela
WHERE condio
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
condio ident ifica a linha ou linhas a serem excludas.
Tomando como exemplo a t abela DEPARTAMENTOS, para apagar um departa-
mento cujo cdigo 002:
Exemplo1:
DELETE FROM DEPARTAMENTOS
WHERE DEPTO=002
ou
DELETE FROM DEPARTAMENTOS
WHERE DEPTO=002
1 linha processada.
Data Manipulation Language (DML) e Data Control Language (DCL) 37
Exemplo2:
DELETE FROM FUNCIONARIOS
WHERE DEPTO=002 AND SALARIO > 1500
ou
DELETE FROM FUNCIONARIOS
WHERE DEPTO=002 AND SALARIO > 1500
A!torando Dados
O comando responsvel por alt erar linhas de uma tabela o UPDATE, sendo sua
sint axe:
UPDATE [esquema].t abela
SET coluna = valor
WHERE condio
Onde:
esquema ident ifica o dono da t abela;
tabela ident ifica o nome da t abela;
coluna o nome da coluna a ser at ualizado;
valor novo valor para a coluna;
condio ident ifica a condio para at ualizao.
Tomando como exemplo a t abela FUNCIONARIOS, para alt erar o nome do funci-
onrio para ANDRE ANEXAMANDRO onde a mat rcula for igual a 005:
UPDATE FUNCIONARIOS
SET NOME=PLINIO ALVISE MUTO
WHERE MATRICULA=005
1 linha processada.
O novo valor deve ser do mesmo t ipo que o da coluna da t abela a ser at ualizada.
Exemplo 1:
UPDATE FUNCIONARIOS
SET NOME=PLINIO ALVISE MUTO
WHERE MATRICULA=005
String
ou
UPDATE FUNCIONARIOS
SET NOME=PLINIO ALVISE MUTO
WHERE MATRICULA=005
String
38 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo 2:
UPDATE FUNCIONARIOS
SET NOME=PLINIO ALVISE MUTO, DEPTO = 001
WHERE MATRICULA=005
String
ou
UPDATE FUNCIONARIOS
SET NOME=PLINIO ALVISE MUTO, DEPTO = 001
WHERE MATRICULA=005
String
Fstado dos Dados
Nos exemplos criados ant eriorment e os dados no foram t ransferidos
diret ament e e as manipulaes feit as nas t abelas afet am primeirament e o
buffer do banco de dados Oracl e. Soment e o usurio que real izou t ais ope-
raes pode visualiz-las, os demais cont inuam a enxergar a imagem ant iga das
t abelas, no conseguindo alt erar as linhas afet adas, que est o t ravadas. Obser-
vemos o exemplo seguint e:
O usurio Srgio Dusek resolve at ualizar os dados da t abela FUNCIONARIOS.
Fstado inicia! antos do UPDATF
MATRCULA NOME SALARIO DEPTO
001 ANDRE ANEXAMANDRO 1500 001
002 MARILEA DUSEK 1300 001
003 FABIO MUTO 1900 001
COMANDO SQL:
UPDATE FUNCIONARIOS
SET NOME=RONALD MUTO
WHERE MATRICULA=003
Fstado lina! aps o UPDATF
MATRCULA NOME SALARIO DEPTO
001 ANDRE ANEXAMANDRO 1500 001
002 MARILEA DUSEK 1300 001
003 RONALD MUTO 1900 001
Data Manipulation Language (DML) e Data Control Language (DCL) 39
Ao mesmo t empo, o usurio Rafael Zanatt a resolve fazer uma consult a na mesma
t abela. O result ado visualizado o mostrado a seguir, uma vez que s Srgio Dusek
enxerga os novos dados da t abela, pois as mudanas, como j foi dit o, esto pen-
dent es no banco e s so acessveis ao usurio que as efet uou.
MATRCULA NOME SALARIO DEPTO
001 ANDRE ANEXAMANDRO 1500 001
002 MARILEA DUSEK 1300 001
003 FABIO MUTO 1900 001
Translormando as Mudanas Pondontos om
Pormanontos
Para que todas as mudanas efet uadas nas linhas de uma t abela possam ser perma-
nent es e dessa forma serem consult adas e/ou at ualizadas por todos os usurios,
espelhando a realidade do banco de dados, ut ilizaremos o comando COMMIT.
O comando COMMIT transfere t odas as informaes pendent es da inst ncia do
banco em memria para os discos fsicos.
No exemplo ant erior, para que as alt eraes reflit am em t odo o banco de dados, o
usurio Srgio Dusek deve digit ar o comando COMMIT.
Canco!ando as Mudanas Pondontos
Para cancelarmos at ualizaes realizadas em linhas de uma t abela que est ejam
pendent es no banco de dados, ret ornando ao estado inicial ant es da modificao,
ut ilizaremos o comando ROLLBACK.
O comando ROLLBACK desfaz todas as alteraes pendent es na inst ncia do ban-
co em memria.
Ut ilizando ainda o exemplo ant erior, se o usurio Srgio Dusek quisesse cancelar
as alt eraes efet uadas, o comando ROLLBACK deveria ser digitado.
So!ocionando Dados do uma Tabo!a
Para extrairmos informaes de nossas t abelas do banco de dados, ut ilizaremos o
SELECT, que o principal comando da linguagem DML.
Ut ilizando o comando SELECT, poderemos efet uar as seguint es operaes:
40 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Selees permit e ret ornar linhas de uma t abela;


Projees permit e retornar as colunas de uma t abela;


Joins permit e concat enar diferentes tabelas atravs de uma coluna co-
mum entre elas.
Para ut ilizarmos o comando SELECT, devemos ut ilizar a sint axe bsica:
SELECT [DISTINCT] {* | coluna, [alias da coluna], ...}
FROM [esquema].tabela [alias da t abela];
[WHERE condio]
[GROUP BY expresso1 [,expresso] ... ]
[ORDER BY {expresso2 | posio} [ASC,DESC] [,{expresso | posio} [ASC,DESC]];
Onde:
DISTINCT ident ifica que os dados da t abela no sero duplicados;
* exibe t odas as colunas da t abela;
Coluna ident ifica a coluna da tabela que ser exibida;
Alias da coluna ident ifica um alias para coluna;
Esquema ident ifica o dono da t abela;
Tabela ident ifica o nome da t abela:
Condio ident ifica a condio de join;
Expresso1 ident ifica um alias para coluna;
Expresso2 ident ifica o ordenamento pelo nmero da coluna;
Posio ident ifica o ordenamento pelo nmero da coluna;
ASC,DESC ident ifica se os dados sero exibidos em ordem ASCendent e ou
DESCendent e, sendo o padro ASCendent e;
Exemplo:

Colunas que sero exibidas
SELECT matricula, salario, depto
FROM FUNCIONARIOS
Tabela
WHERE salario >= 1500
Condio
ORDER BY 3;

Posio (ordenado pela 3 coluna)
A seguir sero mostrados exemplos da ut ilizao do comando SQL, ut ilizando as
t abelas criadas no it em Inserindo, Apagando e Alt erando Dados em uma Tabela,
que t ero o seguint e cont edo:
Data Manipulation Language (DML) e Data Control Language (DCL) 41
FUNCIONRIOS

MATRICULA NOME SALARIO CARGOS DEPTO
001 RONALD MUTO 1500 002 001
002 THAIS SABBAG MUTO 3000 001 002
003 SERGIO DUSEK 2000 004 001
004 ANDRE MUTO 2350 003 002
005 RAFAEL ZANATTA 1930 002 001
006 PATRICIA DUSEK 2450 001 002
007 ARLETTE DUSEK 3900 005 001
DEPARTAMENTO
DEPTO DESCRICAO
001 INFORMATICA
002 JURIDICO
CARGOS
DEPTO DESCRICAO
001 ADVOGADO
002 SUPERVI SOR
003 VETERINARIO
004 GERENTE
005 GERENTE GERAL
Exemplo 1 Selecionando t odos os dados da t abela DEPTO
SELECT *
FROM DEPTO;
DEP DESCRICAO
--- ------------------------------------------------
001 INFORMATICA
002 JURIDICO
Exemplo 2 Selecionando o funcionrio cuja mat rcula igual a 002
SELECT *
FROM FUNCIONARIO
WHERE MATRICULA=002;
MAT NOME SALARIO DEP
--- --------------------------------- ---------- ---
002 THAIS SABBAG MUTO 3000 002
42 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo 3 Selecionando o nome e o salrio dos funcionrios que trabalham no
depart ament o 001, ordenados por nome.
SELECT NOME, SALARIO
FROM FUNCIONARIO
WHERE DEPTO=001
ORDER BY NOME;
NOME SALARIO
----------------------------------------- ----------
ARLETTE DUSEK 2900
RAFAEL ZANATTA 1930
RONALD MUTO 1500
SERGIO DUSEK 2000
Exemplo 4 Selecionando o nome e o salrio dos funcionrios, cujo cargo o
007.
SELECT NOME, SALARIO
FROM FUNCIONARIO
WHERE CARGO=007;
NOME SALARIO
----------------------------------------- ----------
ARLETTE DUSEK 3900
Oporadoros
O banco de dados Oracle compat vel com a maioria dos operadores encontrados
nas diversas linguagens de programao. At uam sobre os element os que sero ana-
lisados pelo operador, os operandos.
Quando mais de um t ipo de operador est iver present e em uma linha, eles sero
avaliados segundo a ordem de precedncia descrit a a seguir:
1.

Operadores unrios
2.

Diviso e mult iplicao: /, *
3.

Adio e subt rao: +,
4.

Operadores de comparao
5.

Operador NOT
6.

Operador AND
7.

Operador OR
A seguir sero mostrados os t ipos de operadores suportados pelo banco de dados Oracle:
Data Manipulation Language (DML) e Data Control Language (DCL) 43
Aritmticos
Operam sobre os operandos numricos.


Mult iplicao
*


Diviso
/


Subt rao
-


Adio
+
Caractoros
Manipulam strings.


Concat enao ||
Comparao


Igualdade =


Desigual dade !=


Maior que >


Menor que <


Maior ou igual >=


Menor ou igual <=


Nulo IS NULL


Limit es BETWEEN ... AND ..


List a de valores IN


Mscara LIKE
Igicos
Manipulam expresses de comparao.


NOT


AND


OR
SFT
Combinam o result ado de duas consult as em uma nica.


UNION Retorna as linhas selecionadas por qualquer das consult as


INTERSECT Retorna as linhas selecionadas pelas duas consult as


MINUS Retorna as linhas selecionadas pela primeira, mas no pela
segunda coluna
44 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo 1 Selecionando o nome, salrio e o departament o dos funcionrios que
t rabalham no depart amento 001 com salrio maior ou igual a 1930, ordenados por
nome.
SELECT NOME, SALARIO, DEPTO
FROM FUNCIONARIO
WHERE SALARIO >= 1930 AND DEPTO = 001
ORDER BY 1;
NOME SALARIO DEP
------------------------------------- ---------- ---
ARLETTE DUSEK 3900 001
RAFAEL ZANATTA 1930 001
SERGIO DUSEK 2000 001
Exemplo 2 Selecionando o nome, salrio e salrio aument ado de 10%, para t odos
os funcionrios cujo salrio seja menor que 2100, ordenados por nome.
SELECT NOME, SALARIO, SALARIO*1.10
FROM FUNCIONARIO
WHERE SALARIO < 2100
ORDER BY 1;
NOME SALARIO SALARIO*1.
--------------------------------- ---------- ----------
RAFAEL ZANATTA 1930 212,30
RONALD MUTO 1500 1650
SERGIO DUSEK 2000 2200
Funos
Uma funo SQL uma rot ina que realiza uma operao especfica e retorna um
result ado, podendo receber argument os que sero ut ilizados no processament o.
As funes SQL so divididas em funes de linha simples ou escalares e funes
de grupo ou agregadas.
Funos do Iinha
Uma funo de linha ou escalar ret orna o result ado para cada linha de uma ta-
bela. Est o relacionadas a seguir as principai s funes de linha do banco de
dados Oracle.
Data Manipulation Language (DML) e Data Control Language (DCL) 45
Caractoro
LOWER(coluna/expresso)
UPPER(coluna/expresso)
INITCAP(coluna/expresso)
CONCAT(coluna1/expresso1,
coluna2/expresso2)
SUBSTR(coluna/expresso,m,[n])
LENGTH(coluna/expresso)
INSTR(coluna/expresso,m)
Convert e caract eres para minsculo.
Convert e caract eres para maisculo.
Convert e para maiscula a primeira
let ra de uma st ring.
Concat ena duas st rings.
Ret orna uma substring de uma st ring,
iniciando da posio m, com n posies.
Ret orna o t amanho de uma string.
Ret orna a posio de um caract ere den-
t ro de uma st ring.
Numricas
ROUND(coluna/expresso,m)
MOD(m,n)
TRUNC(coluna/expresso,m)
Arredonda uma coluna/expresso para
n casas decimais.
Ret orna o result a de m dividido por n.
Trunca uma coluna/expresso para m
decimais.
Data
MONTHS_BETWEEN(data1,dat a2)
ADD_MONTHS(dat a,m)
NEXT_DAY(dat e,char)
LAST_DAY(dat e,char)
ROUND(dat e[,formato])
TRUNC(dat e[,formato])
Nmero de meses ent re duas dat as.
Adiciona m meses para uma dat a.
Encont ra o prximo dia de uma det er-
minada data.
Encont ra o dia ant erior de uma det er-
minada data.
Arredonda uma dat a.
Trunca uma dat a.
Convorso
TO_CHAR(number/dat e[,fmt]
TO_NUMBER(char)
TO_DATE(char[,fmt])
Convert e uma dat a/nmero para VAR-
CHAR2.
Convert e uma st ring para um nmero.
Convert e uma st ring represent ado dat a
para uma data.
46 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo 1 Selecionando o nome, exibido em let ras minsculas, e o salrio di-
minudo de 20%, sem casas decimais, para todos os funcionrios que t rabalham no
depart ament o 001 e que iniciam com a letra R.
SELECT UPPER(NOME), ROUND(SALARIO-(SALARIO*0.20),0)
FROM FUNCIONARIO
WHERE DEPTO = '001' AND NOME LIKE R%;
LOWER(NOME) ROUND(SALA
----------------------------------------- ----------
ronald muto 1200
rafael zanatta 1540
Exemplo 2 Exibir as t rs primeiras let ras dos fucionrios que possuem o cargo
ident ificado por 001.
SELECT SUBSTR(NOME,1,3)
FROM FUNCIONARIO
WHERE CARGO= '001';
SUB
---
THA
PAT
Funos do Grupo
Uma funo de grupo ou agregada ret orna um nico result ado para um grupo de
linhas de uma t abela. Est o relacionadas a seguir as principais funes de grupo do
banco de dados Oracle.
AVG([DISTINCT/ALL],n)
COUNT({* | [DISTINC|ALL] expresso})
MAX([DISTINCT/ALL],expresso)
MIN([DISTINCT/ALL],expresso)
SUM([DISTINCT/ALL],m)
Mdia.
Cont a o nmero de linhas de
uma t abela atravs da expres-
so.
Obt m o valor mximo de uma
t abela at ravs da expresso.
Obt m o valor mnimo de uma
t abela at ravs da expresso.
Soma valores de uma t abela.
Data Manipulation Language (DML) e Data Control Language (DCL) 47
Exemplo 1 Selecionando o nmero de funcionrios cujo cargo ident ificado pelo
cdigo 001.
SELECT COUNT(*)
FROM FUNCIONARIO
WHERE CARGO = '001';
COUNT(*)
----------
2
Exemplo 2 Selecionando a mdia salarial, sem casas decimais, o maior e o menor
salrio e a soma dos salrios do depart amento 001.
SELECT ROUND(AVG(SALARIO),0),MAX(SALARIO),MIN(SALARIO),
SUM(SALARIO)
FROM FUNC
WHERE DEPTO = '001';
ROUND(AVG( MAX(SALARI MIN(SALARI SUM(SALARI
---------- ---------- ---------- ----------
2080 2900 1500 8330
Todas as funes ant eriores foram trat adas na t abela como um nico grupo de in-
formaes. Para dividirmos a t abela em pequenos grupos de informaes devemos
ut ilizar a clusula GROUP BY.
Exemplo 1 Selecionando a mdia salarial dos depart ament os, sem casas deci-
mais.
SELECT DEPTO, ROUND(AVG(SALARIO),0)
FROM FUNCIONARIO
GROUP BY DEPTO;
DEP ROUND(AVG(
--- ----------
001 2080
002 2600
NOTA:
Podemos ut ilizar funes de linha e de grupo simult aneament e em nosso
comando SELECT como nos mostra o exemplo ant erior. No podemos ut ilizar a
clusula WHERE para rest ringir grupos.
48 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo 2 Selecionando a mdia salarial maior que 1800 dos depart amentos.
SELECT DEPTO, AVG(SALARIO)
FROM FUNCIONARIO
WHERE AVG(SALARIO) > 1800
GROUP BY DEPTO;
ORA-00934: a funo de grupo no permitida aqui.
So!ocionando Dados do M!tip!as Tabo!as
Nos exemplos mostrados ant eriormente, as operaes foram feit as soment e em
uma t abela. O comando SELECT permit e que faamos concat enaes em diversas
t abelas, bast ando para isso que a clusula WHERE seja sat isfeit a.
Caso a clusula WHERE no seja, ou seja mal especificada, t eremos o produt o
cart esiano das t abelas como result ado.
Dolinindo A!iasos para Tabo!as
Para facilit ar o uso e evit ar referncias ambguas a colunas com mesmo nome nas
diversas t abelas ut ilizadas no SELECT, usaremos o recurso de alias, que um
apelido criado para t abela que lhe serve de referncia.
Exemplo:

Colunas de diferentes tabelas referenciadas pelos
seus respectivos alias
SELECT F.NOME, D.DESCRICAO

Tabelas
FROM FUNCIONARIO F, DEPTO D

Alias criados para as tabelas
WHERE F.DEPTO = D.DEPTO;

Condio de unio das tabelas
Exemplo 1 Selecionando o nome do departamento e sua respect iva mdia salarial.
SELECT D.DESCRICAO,AVG(F.SALARIO)
FROM FUNCIONARIO F, DEPTO D
WHERE F.DEPTO = D.DEPTO
GROUP BY D.DESCRICAO;
Data Manipulation Language (DML) e Data Control Language (DCL) 49
DESCRICAO AVG(F.SALA
------------------------- ----------
INFORMATICA 2080,25
JURIDICO 2600
NOTA:
A ausncia da descrio do depart ament o ou a escolha de outra coluna
para a clusula GROUP BY, far com que o banco de dados Oracle retorne uma
mensagem de erro, no execut ando o comando SELECT.
SELECT D.DESCRICAO,AVG(F.SALARIO)
FROM FUNCIONARIO F, DEPTO D
WHERE F.DEPTO = D.DEPTO;
ausncia da clusula GROUP BY
SELECT D.DESCRICAO,AVG(F.SALARIO)
*
ORA-00937: no e uma funco de grupo de grupo simples
SELECT D.DESCRICAO,AVG(F.SALARIO)
FROM FUNCIONARIO F, DEPTO D
WHERE F.DEPTO = D.DEPTO
escolha de outra coluna
GROUP BY D.DEPTO;
SELECT D.DESCRICAO,AVG(F.SALARIO)
*
ORA-00979: no e uma expresso GROUP BY
Exemplo 2 Selecionando o nome do funcionrio, seus respect ivos cargo e depar-
t amento, ordenados pelo nome do depart amento e cargo.
SELECT F.NOME,D.DESCRICAO, C.DESCRICAO
FROM FUNC F, DEPTO D, CARGOS C
WHERE F.DEPTO = D.DEPTO and
F.CARGO = C.CARGO
ORDER BY D.DESCRICAO, C.DESCRICAO;
NOME DESCRICAO DESCRICAO
---------------------- ------------------ -------------
SERGIO DUSEK INFORMATICA GERENTE
ARLETTE DUSEK INFORMATICA GERENTE GERAL
RONALD MUTO INFORMATICA SUPERVISOR
RAFAEL ZANATTA INFORMATICA SUPERVISOR
50 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
THAIS SABBAG MUTO JURIDICO ADVOGADO
PATRICIA DUSEK JURIDICO ADVOGADO
ANDRE MUTO JURIDICO VETERINARIO
Exemplo 3 Selecionando o nome do funcionrio e depart amento, cujo salrio
est eja compreendido ent re 1500 e 2500, por depart amento e nome.
SELECT F.NOME, F.SALARIO, D.DESCRICAO
FROM FUNCIONARIO F, DEPTO D
WHERE F.DEPTO = D.DEPTO AND
F.SALARIO BETWEEN 1000 AND 2500
ORDER BY 3,1;
NOME SALARIO DESCRICAO
-------------------------------- ---------- -----------
RAFAEL ZANATTA 1930 INFORMATICA
RONALD MUTO 1500 INFORMATICA
SERGIO DUSEK 2000 INFORMATICA
ANDRE MUTO 2350 JURIDICO
PATRICIA DUSEK 2450 JURIDICO
Tomemos o exemplo 3, s que sem a clusula WHERE, e o resultado ser o pro-
dut o cart esiano das duas t abelas.
SELECT F.NOME, F.SALARIO, D.DESCRICAO
FROM FUNCIONARIO F, DEPTO D;
NOME SALARIO DESCRICAO
-------------------------------- ---------- -----------
RONALD MUTO 1500 INFORMATICA
THAIS SABBAG MUTO 3000 INFORMATICA
SERGIO DUSEK 2000 INFORMATICA
ANDRE MUTO 2350 INFORMATICA
RAFAEL ZANATTA 1930 INFORMATICA
PATRICIA DUSEK 2450 INFORMATICA
ARLETTE DUSEK 3900 INFORMATICA
RONALD MUTO 1500 JURIDICO
THAIS SABBAG MUTO 3000 JURIDICO
SERGIO DUSEK 2000 JURIDICO
ANDRE MUTO 2350 JURIDICO
RAFAEL ZANATTA 1930 JURIDICO
PATRICIA DUSEK 2450 JURIDICO
ARLETTE DUSEK 3900 JURIDICO

51
Parte IV.
Integrando Delphi com Oracle
53
8. Transaes
Uma t ransao uma seqncia de operaes que so trat adas como um bloco
nico e indivisvel no que se refere sua recuperabilidade.
Os comandos recebidos para processamento pelo banco de dados Oracle compem
as t ransaes. A t ransao a unidade lgica de t rabalho, possuindo propriedades
bem definidas, que so garant idas pelos gerenciadores do banco de dados mesmo
no caso de falhas durant e o processament o ou mesmo aps o t rmino do processa-
mento, como no caso de falha do meio de armazenamento dos dados.
Uma t ransao represent ada por um bloco de comandos DML, onde os dados
devem ser tornados permanent es (COMMIT) ou desfeitos (ROLLBACK), como no
exemplo a seguir:
In ci o

...
UPDATE FUNCIONARIO
SET NOME=PLINIO MUTO
Comandos DML
WHERE MATRICULA=001

...
INSERT INTO FUNCIONARIO
VALUES (010,ARLETTE DUSEK,1430,002);
COMMIT;
Tornando permanente as alteraes
...
Trmino
Quando os resultados de uma t ransao so efet ivados, as modificaes que even-
t ualment e t enham sido realizadas no banco de dados Oracle so tornadas visveis
para outras t ransaes. Nest e caso, o banco de dados mudou de est ado, passou para
um est ado diferent e do inicial. Caso a transao t enha os seus result ados desfeit os,
dizemos que o banco de dados permanece no est ado inicial.
54
9. Conexo com o Banco de Dados Oracle via
BDE
BDF Administrator
O BDE administ rator funciona com uma int erface para o BDE, onde at ravs dele
sero configuradas as propriedades para acesso ao banco de dados Oracle.
Uti!izando o BDF Administrator
Ao ser carregado no painel de cont role do Windows, a seguint e t ela dever ser
apresent ada:
Figura 0.1
Conexo com o Banco de Dados Oracle via BDE 55
Na aba Databases est o listados todos os aliases para os banco de dados dispon-
veis, que est o exibidos em uma rvore hierrquica ao lado esquerdo da janela. Ao
selecionarmos qualquer um, as definies sero exibidas na part e direit a da janela.
A aba Configuration exibe e permit e que sejam configurados os drivers para acesso
aos bancos de dados ut ilizados pelo Delphi, sendo divididos em Nat ive e ODBC.
Ao selecionarmos cada driver, suas configuraes sero exibidas na part e direit a da
janela.
Conligurando o BDF Administrator
Devemos, agora, criar um novo alias no BDE Administrat or para acessarmos o
banco de dados Oracle.
As et apas para criao de um novo alias sero demonst radas a seguir:
Ftapa 1 - Criando um novo a!ias
Devemos escolher a opo New, no menu Object e, logo aps, selecionarmos o
driver ORACLE para acesso ao banco. A seguint e tela ser exibida:
Figura 0.2
56 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Ftapa 2 - Dolinindo o nomo do a!ias o o tipo do sorvio
na aba Databasos
Devemos escolher o nome para o alias criado no BDE, assim como o t ipo de servi-
o que ser ut ilizado.
Na janela apresent ada a seguir, o nome do alias que ut ilizaremos para nossos
exemplos com o Delphi ser ORACLE, e o nome do servio ser o criado
ORA_DEL, criado ant eriormente.
Figura 0.8
Ftapa 8 - Dolinindo o tipo do sorvio na aba
Conliguration
Uma vez selecionada a aba Configuration, devemos clicar Configuration-
>Drivers->Native->ORACLE para em seguida ut ilizarmos o t ipo de servio cria-
do no tpico 2.2 ,ORA_DEL, conforme t ela most rada na figura 9.4:
Conexo com o Banco de Dados Oracle via BDE 57
Figura 0.4
A verso do Oracle que est sendo ut ilizada a 8.0.5, logo em DLL32 e VENDOR
INIT os campos devem ser preenchidos com SQLORA8.DLL e OCI.DLL, respect i-
vament e.
Verses ant eriores do Oracle ut ilizam DLLs diferent es, que podem ser consultadas
at ravs do HELP do prprio Delphi.
Ftapa 4 - Fina!izando a criao do a!ias no BDF
Administrator
Uma vez preenchidas t odas as informaes descrit as ant es, um novo alias t er sido
criado, devendo ent o ser confirmado atravs da opo Apply, no menu Objects.
58 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Componontos Rolorontos a Conoxo
A figura 9.5 nos mostra, ut ilizando os principais component es, como o Delphi
t rat a o acesso ao banco de dados.
TDatabase TUpDateSql TDataSource
Tquery
Figura 0.
TDatabaso
O componente TDat abase nos permit e estabelecer uma conexo com o banco de
dados Oracle. Se nenhum component e TDat abase for criado explicit ament e, o Del-
phi ir cri-lo em t empo de execuo.
A criao do component e no seu aplicat ivo ir fornecer um grande poder de con-
t role do banco de dados Oracle, permit indo a criao de logins personalizados,
cont rolar transaes e criar aliases BDE locais.
A seguir est o list adas as principais propriedades para est abelecermos uma cone-
xo com o banco de dados Oracle.
Nome: AliasName
Tipo: TSymbolSt ring
Descrio: Nome de um alias BDE exist ent e.
Conexo com o Banco de Dados Oracle via BDE 59
Nome: Connected
Tipo: Boolean
Descrio: Indica se foi est abelecida uma conexo com o banco de dados Oracle.
Nome:

DataBaseName
Tipo: TFileName
Descrio: Define um alias local, especfico de um aplicat ivo.
Nome: LoginPrompt
Tipo: Boolean
Descrio: Especifica se a caixa de login ser exibida quando o aplicat ivo t ent ar
uma conexo no banco de dados Oracle.
Nome: Params
Tipo: TSt rings
Descrio: Especifica os parmet ros necessrios para a conexo como o banco de
dados Oracle.
TQuory
O componente TQuery est abelece uma conexo entre um DataSource e um banco
de dados ou BDE. Permit e que o aplicat ivo submeta declaraes SQL para o banco
de dados Oracle. Os dados result ant es so ent o direcionados para o Dat aSource a
fim de fazer a int erface com os cont roles de dados at ualizados.
O TQuery pode t ant o ret ornar um conjunto de result ados edit veis como de so-
ment e para leit ura. A execuo de uma declarao SQL at ravs de um component e
TQuery dada at ravs da propriedade SQL. A seguir as principais propriedades
dest e component e.
Nome: DatabaseName
Tipo: String
Descrio: Especifica o nome do banco de dados a ser ut ilizado.
Nome: DataSource
Tipo: TDat aSource
Descrio: Especifica o component e TDataSource a ser ut ilizado.
Nome: RequestLi ve
Tipo: Boolean
Descrio: Se a propriedade for true e a sint axe SQL permit ir, ele det ermina que
um conjunto de dados edit veis ser retornado. Para comandos INSERT,
UPDATE, DELETE, COMMIT e ROLLBACK, ut ilizados na propriedade SQL,
60 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
seu valor deve ser alt erado para true. Para o comando SELECT e ut ilizao com
component e TUpDat eSQL, seu valor deve ser alt erado para false.
Nome: SQL
Tipo: String
Descrio: Armazena uma declarao SQL.
A seguir, os principais mt odos dest e component e.
Nome: Close
Descrio: Alt era o valor da propriedade Act ive para false.
Nome: ExecSql
Descrio: Execut a uma declarao SQL que no retorna um conjunto de resulta-
dos.
Nome: Open
Descrio: Alt era o valor da propriedade Act ive para true, executando uma decla-
rao SQL que no retorne um conjunt o de result ados.
TUpdatoSq!
Permit e acesso a um component e TQuery associado a uma declarao SQL espec-
fica. A seguir as principais propriedades dest e component e.
Nome: DeleteSQL
Tipo: TSt rings
Descrio: Codifica um comando DELETE associado a uma string SQL criada
num component e TQuery.
Nome: InsertSQL
Tipo: TSt rings
Descrio: Codifica um comando INSERT associado a uma string SQL criada
num component e TQuery.
Nome: Modi fySQL
Tipo:TStrings
Descrio: Codifica um comando UPDATE associado a uma st ring SQL criada
num component e TQuery.
Para ut ilizarmos o TUpDat eSQL devemos alt erar os valores das seguint es proprie-
dades do component e TQuery:
Conexo com o Banco de Dados Oracle via BDE 61


Updat eObject deve est ar apont ando para o component e TUpDat eSql;


Request Live seu valor deve ser false;


SQL a string cont endo o comando SQL deve est ar preenchida.
Component es dat a cont rols devem ser criados para referenciar os campos das ins-
t rues criadas no TUpDat eSql.
Mais adiant e mostraremos a ut ilizao exat a desse component e.
TDatasourco
Permit e est abelecer uma conexo ent re uma ou mais component es Dat a Cont rols
(dbgrids, dbedit , et c.) e em cada component e TTable ou TQuery. A seguir mos-
t rada a propriedade mais important e desse component e.
Nome: DataSet
Tipo: TDat aSet
Descrio: Especifica o dat aset (TTable ou TQuery) do qual o componente obt m
seus dados.
Tab!os X Quorys
Como j foi visto, o Delphi possui dois component es que permit em o acesso e mani-
pulao das t abelas, via BDE, cont idas no banco de dados Oracle: TTable e TQuery.
O primeiro baseia-se no acesso a uma det erminada t abela do banco de dados e o
segundo baseado numa seqncia SQL, permit indo dessa forma que trabalhemos
com mais de uma t abela ao mesmo t empo. Ambos ut ilizam a linguagem SQL para
acessar a base de dados. Quando se trabalha com TTable, o Delphi gera automat ica-
mente uma sentena SQL de acordo com os parmet ros definidos para o componen-
t e. Sero analisados no prximo t pico as principais vant agens e desvantagens
quanto ao uso desses componentes. Por preferncia prpria, cost umo ut ilizar o com-
ponent e Tquery que, alt erando suas propriedades de forma corret a, funciona com
muito mais eficincia na abert ura das t abelas, assim como na filt ragem das colunas,
alm de se comport ar como um component e TTable em alguns casos.
Vantagons/Dosvantagons
Ao usar o component e TTable, o BDE solicit a ao servidor primeiro a est rut ura da
t abela e depois os dados dela. Esses passos so necessrios para se configurarem as
est rut uras int ernas corret as do BDE e eles no so execut ados pelo component e
TQuery. Se for at ivado o Schema Caching do BDE, a est rutra lgica da t abela
mant ida localmente, onde esse passo economizado. Isso pode gerar problemas,
caso a est rut ura lgica da t abela mude no servidor.
62 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
No component e TTable, o BDE imit a um cursor bidirecional colocando os dados
localment e em cache. No component e TQuery, o cache pode ser opcional, bast ando
para isso alterar a propriedade Unidirect ional.
Ao t ent ar minimizar os dados t ransferidos ent re o client e e o servidor, o t amanho
de cada regist ro precisa ser considerado, bem como o nmero t otal deles. Quando
apenas alguns campos so selecionados para uma consult a, apenas part e dos dados
considerada. No component e TQuery, quando se envia uma clusula WHERE no
comando SQL, o prprio servidor se encarrega de selecionar os regist ros que com-
pem a pesquisa realizada, j observando as melhores alt ernat ivas de acesso, ten-
t ando ut ilizar o mximo de ndices est abelecidos no banco de dados Oracle. O
component e TTable, a propriedade filter e as funes de seleo Set Range agem de
forma diferent e, t ent ando t raduzir as especificaes feit as at ravs desses dois m-
t odos e coloc-las diret amente na clusula WHERE do SELECT realizado, obt endo
dessa forma o mesmo desempenho do component e Query. Exist e uma cert a limita-
o dessas especificaes e se no conseguirem ser t raduzidas, o filtro ser feito na
prpria mquina cliente. Dessa forma, no que diz respeito a filt ros, o component e
mais abrangent e, suport ando de forma mais complexa a sintaxe fornecida pelo
banco de dados Oracle.
O componente TQuery no est limit ado soment e s inst rues select de SQL,
podendo ser ut ilizado para inserir, at ualizar ou excluir linhas de uma t abela, onde a
propriedade Request Live deve ser alt erada para t rue. Quando o component e
TQuery ut ilizado para realizar comandos que incluem, alt eram ou apagam dados
em uma t abela de banco de dados, o mt odo ExecSql deve ser chamado.
Fxomp!os Do!phi-BDF X Orac!o
Sero most rados a seguir exemplos de aplicat ivos Delphi acessando uma base de
dados Oracle, via BDE, ut ilizando componentes TQuery e component es TUpda-
t eSql.
Aplicaes que envolvem o uso nico e exclusivo de TQuerys permit em que vri-
as t ransaes sejam efet uadas diret ament e contra o banco de dados e confirmadas
de uma s vez, gerando, dessa forma, um fluxo const ant e de dados na rede ent re o
client e e o servidor.
Em cont rapart ida, aplicaes que ut ilizam TUpdat eSqls no geram fluxo const ant e
de dados na rede, pois as transaes so efet uadas na memria da mquina da estao
client e, sendo transport adas para o banco de dados soment e ao serem confirmadas.
A aplicabilidade de cada um depende diret ament e do t ipo de sist ema que ser cria-
do e da preferncia de cada desenvolvedor/analist a.
Conexo com o Banco de Dados Oracle via BDE 63
Construindo uma Ap!icao com TQuory
Ant es de criarmos nossa aplicao Delphi, devemos primeiro criar as t abelas no banco
de dados, ut ilizando o SQL 8 Plus. Note que em nenhuma das tabelas que sero criadas
existe a constraint FOREIGN KEY com a clusula DELETE CASCADE, fazendo
com que toda a int egridade de dados tenha que ser controlada pela nossa aplicao.


Criando a Tabela de Empregados
SQL > CREATE TABLE EMPREGADOS
2 (MATRICULA VARCHAR(5) NOT NULL,
3 NOME VARCHAR2(30) NOT NULL,
4 NASCIM DATE NOT NULL,
5 SALARIO NUMBER NULL,
6 ENDERECO VARCHAR2(50) NULL,
7 CONSTRAINT PK_MATRIC PRIMARY KEY (MATRICULA));


Criando a Tabela de Departament os
SQL > CREATE TABLE DEPTO
2 (CODDEP VARCHAR2(3) NOT NULL,
3 DESCRICAO VARCHAR2(25) NULL,
4 CONSTRAINT PK_CODDEP PRIMARY KEY (CODDEP));


Criando a Tabela de Relacionamentos de Empregados com Departament os:
SQL > CREATE TABLE EMPXDEP
(MATRICULA VARCHAR2(5) NOT NULL,
CODDEP VARCHAR2(3) NOT NULL);


Criando a Tabela de Cargos
SQL > CREATE TABLE CARGOS
(CODCARGO VARCHAR2(3) NOT NULL,
DESCRICAO VARCHAR2(25) NULL,
CONSTRAINT PK_CODCARGO PRIMARY KEY (CODCARGO));


Criando a Tabela de Relacionamentos de Empregados com Cargos
SQL > CREATE TABLE EMPXCARGO
(MATRICULA VARCHAR2(5) NOT NULL,
CODCARGO VARCHAR2(3) NOT NULL);
Aps criarmos as t abelas no banco de dados, devemos ent o executar o Delphi para
que possamos const ruir nossa aplicao. A aplicao ser desenvolvida, basica-
ment e, em duas partes, sendo cada uma composta de vrias et apas:
Part e 1 Criao dos component es necessrios.
Part e 2 Explicao do cdigo gerado para cada component e criado.
64 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Parto 1 - Criao dos Componontos Nocossrios
Ftapa 1 - Criao do um novo Datamodu!o
Um novo Datamodule deve ser adicionado ao projet o, v em File->New-
>DataModule;
Os seguint es valores devero ser modificados:
Figura 0.0
O DataModule dever ser salvo como udmexemplo1.pas
Conexo com o Banco de Dados Oracle via BDE 65
Ftapa 2 - Adio do componontos da aba BDF ao
Datamodu!o
Conforme figura 9.7, 5 component es devero ser adicionados:

2

3

1
4

5
Figura 0.7
Os seguint es valores devero ser modificados:
1
TDat aBase
Figura 0.8
66 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
2
TQuery
3
TDataSource
Figura 0.0 Figura 0.10
4
TQuery
5
TDat aSource
Figura 0.11 Fi gura 0.12
Conexo com o Banco de Dados Oracle via BDE 67
Ftapa 8 - Criao no lormu!rio principa! do
pagocontro! o sous componontos
Deveremos criar o pagecontrol que far part e do projeto, assim como 4 t absheet s
que devero t er sua propriedade caption set adas para Empregados, Cargos, De-
partamentos e Consulta, conforme most ra a figura 9.13:
Figura 0.18
Tabsheet 1
Tabsheet 2
Tabsheet 3
Tabsheet 4
Pagecontrol
68 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Ftapa 8.1 - Criao do componontos na tabshoot1

Tabsheet1
9
Figura 0.14
No coment arei os labels criados em nenhuma das et apas, pois a nica propriedade
que iremos setar de cada um o caption, que deve ser a mesma das figuras most ra-
das.
Os seguint es valores devero ser modificados:
1
2
3
4
5
6
7
8
Conexo com o Banco de Dados Oracle via BDE 69
1
TDBGrid
3
TEdit
Fi gura 0.17

4
TMaskEdit
Figura 0.1
Figura 0.18
2
TEdit
5
TEdit
Figura 0.10 Figura 0.10
70 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
6
TEdit
8
TEdit
Figura 0.20 Fi gura 0.22
7
TEdit
Figura 0.21
9
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button1, Button2,...,Button7, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 9.14.
Conexo com o Banco de Dados Oracle via BDE 71
Ftapa 8.2 - Criao do componontos na tabshoot2

Tabsheet2 1

4
Figura 0.28
Os seguint es valores devero ser modificados:
1
TDBGrid
2
TEdit
Figura 0.2
Figura 0.24
2
3
72 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
3
TEdit
Fi gura 0.20
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button8, Button9,...,Button14, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 9.23.
Ftapa 8.8 - Criao do componontos na tabshoot8

Tabsheet3 1

4
Figura 0.27
3
2
Conexo com o Banco de Dados Oracle via BDE 73
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Figura 0.80
Fi gura 0.28
2
TEdit
Fi gura 0.20
74 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button15, Button16,...,Button21, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.27.
Ftapa 8.4 - Criao do componontos na tabshoot4

Tabsheet4
Figura 0.81
20
1
2
3
4
5
6
7
8
9
10 11
12
15
14
13
16
17
18
19
Conexo com o Banco de Dados Oracle via BDE 75
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TRadioButton
Figura 0.82 Figura 0.84
2
TRadioButt on
4
TRadioButt on
Figura 0.88 Fi gura 0.8
76 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
5
TMaskEdit
7
TRadioButt on
Figura 0.88 Figura 0.8
6
TEdit
8
TRadioButt on
Figura 0.87 Figura 0.80
Conexo com o Banco de Dados Oracle via BDE 77
9
TRadioButt on
11
TRadioButt on
Figura 0.40 Fi gura 0.42
10
TRadioButton
12
TEdit
Figura 0.41 Figura 0.48
78 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
13
TRadioButton
15
TEdit
Fi gura 0.44 Figura 0.40
14
TRadioButton
16
TGroupBox
Figura 0.4 Figura 0.47
Conexo com o Banco de Dados Oracle via BDE 79
17
TGroupBox
19
TGroupBox
Fi gura 0.48 Figura 0.0
18
TGroupBox
Figura 0.40
80 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
20
TButtons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button22, Button23 e Button24, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.31.
Parto 2 - Fxp!icao do Cdigo Gorado para Cada
Compononto Criado
Antes de iniciarmos a explicao sobre o funcionament o de cada tabsheet, algumas
procedures e funes de uso geral do projeto devem ser criadas.
As quat ro procedures a seguir so responsveis por limpar o contedo da proprie-
dade text de cada component e cont ido em sua respect iva tabsheet.
procedure TForm1.limpa_var_deptos;
begin
edtcoddep.text:= '';
edtdescdep.text:= '';
end;
procedure TForm1.limpa_var_empregados;
begin
edtmatric.text:= '';
edtnome.text:= '';
mskdata.text:= ' / / ';
edtender.text:= '';
edtsalario.text:= '';
edtcargo.text:= '';
edtdepto.text:= '';
end;
procedure TForm1.limpa_var_cargos;
begin
edtcodcargo.text:= '';
edtdesccargo.text:= '';
end;
procedure TForm1.limpa_var_consulta;
begin
mskdata2.text:= ' / / ';
mskdata2.enabled:= false;
edtcargos2.text:= '';
edtcargos2.enabled:= false;
edtdepto2.text:= '';
edtdepto2.enabled:= false;
edtmatric2.text:= '';
edtmatric2.enabled:= false;
rbtdfunci.checked:= true;
rbslfunci.checked:= false;
rbdtcontrat.checked:= false;
rbtdcargos.checked:= true;
Conexo com o Banco de Dados Oracle via BDE 81
rbslcargos.checked:= false;
rbtddepto.checked:= true;
rbsldepto.checked:= false;
rbmaisal.checked:= false;
rbmensal.checked:= false;
rbmedsal.checked:= false;
end;
Para que toda incluso, alt erao e excluso de registros efet uada no banco de da-
dos reflit a nos dbgrids do projeto, necessrio fechar e abrir, logo em seguida, a
query associada a ele. A procedure seguint e ser a responsvel por essa t arefa.
procedure TForm1.executa_refresh;
begin
datamodule1.query1.close;
datamodule1.query1.open;
end;
Uma vez que todas as instrues SQL de incluso, excluso e alt erao sero exe-
cut adas na query2, a procedure seguint e evit a a replicao de cdigo em nosso
projeto, bast ando para isso que passemos como parmet ro a instruo SQL deseja-
da.
procedure TForm1.sql_generico(stringsql: string);
begin
with datamodule1.query2 do begin
sql.clear;
sql.add(stringsql);
execsql;
end;
end;
Da mesma forma, as consult as efet uadas em nosso projeto, realizadas at ravs da
query1. Devemos, ento, ut ilizar a procedure a seguir, passando como parmet ro a
inst ruo SQL e o objet o TQuery desejado.
procedure Tform1.consulta_generica(stringsql: string; pquery: TObject);
begin
with (pquery as tquery) do begin
sql.clear;
sql.add(stringsql);
open;
end;
end;
Para evit armos que cdigos de depart amentos e cargos no cadast rados sejam in-
cludos em um funcionrio, uma vez que o recurso de constraints no foi ut ilizado,
necessrio cont rolar a int egridade dos dados atravs da funo a seguir.
function TForm1.verifica_integridade: boolean;
var
encontrou: boolean;
82 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
begin
encontrou:= false;
consulta_generica('select * from CARGOS where CODCARGO = '+chr(39)+
edtcargo.text+chr(39)+'',datamodule1.query2);
if not ((datamodule1.query2.eof) and (datamodule1.query2.eof)) then begin
consulta_generica('select * from DEPTO where CODDEP = '+chr(39)+
edtdepto.text+chr(39)+'',datamodule1.query2);
if not ((datamodule1.query2.eof) and (datamodule1.query2.eof)) then
encontrou:= true
else
showmessage('Cdigo de departamento no cadastro/encontrado !');
end
else
showmessage('Cdigo de cargo no cadastro/encontrado !');
if encontrou then
result:= true
else
result:= false;
end;
Todo o cont role das t ransaes efet uadas cont ra o banco de dados so, basicamen-
t e, realizadas at ravs dos bot es cont idos em cada tabsheet. A seguir, sero expli-
cados, at ravs de etapas, o funcionamento de cada tabsheet assim como os even-
t os referent es a cada bot o.
Ftapa 1 - Tabshoot2 [Cadastro do Cargos)
O cdigo de cada event o ser coment ado aps a descrio de cada component e (A
numerao ser a mesma ut ilizada na Part e 1).
TabSheet2
Responsvel por incluir, alt erar e excluir um cargo.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
consulta_generica('select * from CARGOS',datamodule1.query1);
limpa_var_cargos;
panel2.enabled:= false;
end;
Conexo com o Banco de Dados Oracle via BDE 83
Objetivo: Exibir todas as colunas da t abelas CARGOS e seu respect ivo contedo
at ravs da query1, limpar a propriedade text dos component es e alterar o valor da
propriedade enabled para false no panel2, evit ando que informaes sejam inseri-
das sem que ant es um dos botes de Incluir ou Alterar seja pressionado.
1

DbGri d2
Exibir informaes da tabela CARGOS, at ravs da query1.
Evento: No exist e.
2

EdtCodCargo
Armazenar em memria, at ser transferido para o banco de dados, o cdigo do
cargo a ser inserido ou alt erado.
Evento: No exist e.
3

EdtDescCargo
Armazenar em memria, at ser transferido para o banco de dados, a descrio do
cargo a ser inserido ou alt erado.
Evento: No exist e.
4

Button8
A rot ina de incluso deve ser capaz de colocar a tabsheet2 em condies de inserir
informaes nos component es edtcodcargo e edtdesccargo, onde ser t ransferido
post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:

procedure TForm1.Button8Click(Sender: TObject);
begin
pinclui:= true;
panel2.enabled:= true;
limpa_var_cargos;
edtcodcargo.enabled:= true;
edtcodcargo.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando ao projet o que um
novo regist ro ser inserido na t abela CARGOS e alt erar o valor da propriedade
enabled para true no panel2, permit indo que informaes sejam inseridas nos com-
ponent es.
4 Button9
A rot ina de excluso deve permit ir que um cargo e seu respect ivo relacionament o
sejam apagados.
84 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Evento: OnClick
Cdigo:

procedure TForm1.Button9Click(Sender: TObject);
begin
sql_generico('delete from cargos where codcargo = '+chr(39)+
datamodu-
le1.query1.fieldbyname('codcargo').asstring+chr(39));
sql_generico('delete from empxcargo where codcargo = '+chr(39)+
datamodu-
le1.query1.fieldbyname('codcargo').asstring+chr(39));
executa_refresh;
end;
Objetivo: Excluir os regist ros nas t abelas CARGOS e EMPXCARGO, ut ilizando o
regist ro corrent e da query1, execut ando logo em seguida um refresh para que a
excluso reflita no dbgrid.
4 Button10
A rot ina de alt erao deve ser capaz de colocar a tabsheet2 em condies de alt erar
as informaes cont idas nos component es edtcodcargo e edtdesccargo.
Evento: OnClick
Cdigo:

procedure TForm1.Button10Click(Sender: TObject);
begin
with datamodule1.query1 do begin
edtcodcargo.text:= fieldbyname('CODCARGO').asstring;
edtdesccargo.text:= fieldbyname('DESCRICAO').asstring;
end;
pinclui:= false;
panel2.enabled:= true;
edtcodcargo.enabled:= false;
edtdesccargo.setfocus;
end;
Objetivo: Transferir os valores dos campos CODCARGO e DESCRICAO, conti-
dos no regist ro corrent e da query1, para a propriedade text dos component es edtco-
dcargo e edtdesccargo. Alt erar o valor da varivel global pinclui, informando ao
projeto que o regist ro ser alterado na t abela CARGOS, alt erar o valor da proprie-
dade enabled para true no panel2, permit indo que as informaes sejam modifica-
das nos component es e, por fim, alt erar o valor da propriedade enabled para false
no component e edtcodcargo, pois no devemos alt erar o valor da chave primria.
4 Button11
A rot ina cont ida no bot o Ok responsvel por transferir as informaes cont idas
nos component es da tabsheet2 para o banco de dados Oracle, alt erando ou inserin-
do um regist ro.
Conexo com o Banco de Dados Oracle via BDE 85
Evento: OnClick
Cdigo:
procedure TForm1.Button11Click(Sender: TObject);
begin
if pinclui then
sql_generico('insert into cargos
values('+chr(39)+edtcodcargo.text+chr(39)+','+
chr(39)+edtdesccargo.text+chr(39)+')')
else
sql_generico('update cargos set descricao = +
chr(39)+edtdesccargo.text+chr(39)+
' where codcargo = +chr(39)+
edtcodcargo.text+chr(39));
limpa_var_cargos;
panel2.Enabled:= false;
executa_refresh;
end;
Objetivo: Verificar at ravs da varivel global pinclui se um comando SQL de incluso
ou alterao deve ser execut ado, transferindo a informao cont ida na propriedade text
de cada componente para a tabela CARGOS
1
. Alt erar o valor da propriedade enabled
para false no panel2 e execut ar um refresh para que a at ualizao reflit a no dbgrid.
4 Button12
Fica a cargo dessa rot ina transformar em permanent es as at ualizaes pendent es
em t odas as t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Execut ar o comando COMMIT no banco de dados e execut ar um refresh
para que a at ualizao reflita no dbgrid.
4 Button13
Essa rot ina, ao cont rrio da ant erior, cancela as at ualizaes pendent es em todas as
t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o comando ROLLBACK no banco de dados e execut ar um re-
fresh para que a at ualizao reflit a no dbgrid.

1
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
86 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Ftapa 2 - Tabshoot8 [Cadastro do Dopartamontos)
TabSheet3
Responsvel por incluir, alt erar e excluir um depart amento.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
consulta_generica('select * from DEPTO',datamodule1.query1);
limpa_var_deptos;
panel3.enabled:= false;
end;
Objetivo: Exibir todas as colunas da t abela DEPTO e seu cont edo at ravs da
query1, limpar a propriedade text dos component es e alt erar o valor da propriedade
enabled para false no panel3, evit ando que, ant es de ser pressionado um dos botes
de Incluir ou Alterar, informaes sejam inseridas.
1

DbGri d2
Exibir informaes da tabela DEPTO, at ravs da query1.
Evento: No exist e.
2

EdtCodDep
Armazenar em memria, o cdigo do cargo a ser inserido ou alt erado at que possa
ser transferido para o banco de dados.
Evento: No exist e.
3

EdtDescDep
Armazenar em memria a descrio do cargo a ser inserido ou alt erado at que
possa ser transferido para o banco de dados.
Evento: No exist e.
4

Button15
Est a rot ina deve colocar a tabsheet3 em condies de inserir informaes nos com-
ponent es, para post erior t ransferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button15Click(Sender: TObject);
begin
pinclui:= true;
panel3.enabled:= true;
Conexo com o Banco de Dados Oracle via BDE 87
limpa_var_deptos;
edtcoddep.enabled:= true;
edtcoddep.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando que um novo re-
gist ro ser inserido na t abela DEPTO e alt erar o valor da propriedade enabled para
true no panel3.
4

Button16
Est a rot ina permit e que um depart ament o e seu respect ivo relacionamento sejam
apagados.
Evento: OnClick
Cdigo:
procedure TForm1.Button16Click(Sender: TObject);
begin
sql_generico('delete from depto where coddep = '+chr(39)+
datamodule1.query1.fieldbyname('coddep').asstring+chr(39));
sql_generico('delete from empxdep where coddep = '+chr(39)+
datamodule1.query1.fieldbyname('coddep').asstring+chr(39));
executa_refresh;
end;
Objetivo: Excluir os regist ros nas t abelas DEPTO e EMPXDEP, ut ilizando o re-
gist ro corrent e da query1 e execut ar em seguida um refresh para que a excluso
reflit a no dbgrid.
4 Button17
A rot ina de alt erao de um depart amento deve ser capaz de colocar a tabsheet3 em
condies de alt erar as informaes cont idas em seus component es.
Evento: OnClick
Cdigo:
procedure TForm1.Button17Click(Sender: TObject);
begin
with datamodule1.query1 do begin
edtcoddep.text:= fieldbyname('CODDEP').asstring;
edtdescdep.text:= fieldbyname('DESCRICAO').asstring;
end;
pinclui:= false;
panel3.enabled:= true;
edtcoddep.enabled:= false;
edtdescdep.setfocus;
end;
Objetivo: Os valores dos campos CODDEP e DESCRICAO, cont idos no registro
corrent e da query1, devem ser transferidos para a propriedade text dos componen-
88 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
t es edtcoddep e edtdescdep. O valor da varivel global pinclui ser alt erado, infor-
mando que o regist ro ser alt erado na t abela DEPTO. Alt erar o valor da proprieda-
de enabled para true no panel3, permit indo que as informaes sejam modificadas
nos component es e, como no devemos alt erar o valor da chave primria, a propri-
edade enabled ser modificada para false no component e edtcoddep.
4 Button18
A rot ina cont ida no bot o Ok responsvel por transferir as informaes cont idas
nos component es da tabsheet3 para o banco de dados Oracle, alt erando ou inserin-
do um regist ro.
Evento: OnClick
Cdigo:
procedure TForm1.Button18Click(Sender: TObject);
begin
if pinclui then
sql_generico('insert into depto values('+chr(39)+edtcoddep.text+
chr(39)+','+chr(39)+edtdescdep.text+chr(39)+')')
else
sql_generico('update depto set descricao = '+chr(39)+edtcoddep.text+
chr(39)+' where coddep = '+chr(39)+edtdescdep.text+chr(39));
limpa_var_deptos;
panel3.Enabled:= false;
executa_refresh;
end;
Objetivo: Em funo do valor da varivel global pinclui, um comando SQL de
incluso ou alt erao deve ser execut ado, onde a informao cont ida na proprieda-
de text de cada component e ser transferida para a t abela DEPTO
2
. Modificar o
valor da propriedade enabled para false no panel2, execut ando logo em seguida um
refresh para que a at ualizao reflit a no dbgrid.
4 Button19
Est a rot ina t ransforma em permanent e as at ualizaes pendent es em t odas as t abe-
las do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Execut ar o comando COMMIT no banco de dados e um refresh para que
a at ualizao reflit a no dbgrid.

2
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
Conexo com o Banco de Dados Oracle via BDE 89
4 Button20
Ao cont rrio da ant erior, cancela as at ualizaes pendent es em todas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o comando ROLLBACK no banco de dados e um refresh para
que a at ualizao reflit a no dbgrid.
Ftapa 8 - Tabshoot1 [Cadastro do Funcionrios)
TabSheet1
Responsvel por incluir, alt erar e excluir um funcionrio.
Evento: OnShow
Cdigo:
procedure TForm1.tabsheet1Show(Sender: TObject);
begin
consulta_generica('select * from EMPREGADOS',datamodule1.query1);
limpa_var_empregados;
panel1.enabled:= false;
end;
Objetivo: Exibir da t abela EMPREGADOS, as colunas e seu cont edo at ravs da
query1, limpar a propriedade text dos component es e alt erar o valor da propriedade
enabled para false no panel1, evit ando que, ant es de ser pressionado um dos bot es
de Incluir ou Alterar, informaes sejam inseridas.
1

DbGri d1
Exibir informaes da tabela EMPREGADOS, at ravs da query1.
Evento: No exist e.
2

EdtMatri c
Armazenar em memria o nmero da mat rcula do funcionrio a ser inserida ou
alt erada at que possa ser transferido para o banco de dados.
Evento: No exist e.
3

EdtNome
Armazenar em memria o nome do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
90 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4 MskData
Armazenar em memria a dat a de cont rat ao do funcionrio a ser inserido ou alte-
rado.
Evento: No exist e.
5

EdtEnder
Armazenar em memria o endereo do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
6

EdtSal ario
Armazenar em memria o salrio do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
7

EdtCargos
Armazenar em memria o cargo do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
8

EdtDepto
Armazenar em memria o depart ament o do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
9

Button1
A rot ina de incluso deve colocar a tabsheet1 em condies de inserir informaes
em seus component es, para t ransferi-las post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
begin
pinclui:= true;
panel1.enabled:= true;
limpa_var_empregados;
edtmatric.enabled:= true;
edtmatric.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando que na t abela EM-
PREGADOS um novo registro ser inserido e alt erar o valor da propriedade ena-
bled para t rue no panel1.
Conexo com o Banco de Dados Oracle via BDE 91
9

Button2
Permit e que um funcionrio seja apagado, assim como seus relacionamentos entre
depart ament o e cargo.
Evento: OnClick
Cdigo:
procedure TForm1.Button2Click(Sender: TObject);
begin
sql_generico('delete from empregados where matricula = '+chr(39)+
datamodule1.query1.fieldbyname('MATRICULA').asstring+chr(39));
sql_generico('delete from empxdep where matricula = '+chr(39)+
datamodule1.query1.fieldbyname('MATRICULA').asstring+chr(39));
sql_generico('delete from empxcargo where matricula = '+chr(39)+
datamodule1.query1.fieldbyname('MATRICULA').asstring+chr(39));
executa_refresh;
end;
Objetivo: Excluir o regist ro nas t abelas EMPREGADOS, EMPXCARGO, EM-
PXDEP ut ilizando o regist ro corrent e da query1, onde logo em seguida um refresh
execut ado para que a excluso reflita no dbgrid.
9

Button3
A alt erao deve ser capaz de modificar as informaes cont idas nos component es
pert encent es a tabsheet1.
Evento: OnClick
Cdigo:
procedure TForm1.Button3Click(Sender: TObject);
var
pmatric, stringsql: string;
begin
pinclui:= false;
panel1.enabled:= true;
limpa_var_empregados;
edtmatric.enabled:= false;
edtnome.setfocus;
datamodule1.query2.requestlive:= false;
pmatric:= datamodule1.query1.fieldbyname('matricula').asstring;
stringsql:= 'select emp.matricula, emp.nome, emp.nascim,'+
'emp.salario, emp.endereco, emxde.coddep, '+
'emxca.codcargo '+
'from empregados emp, empxdep emxde, '+
' empxcargo emxca '+
'where emp.matricula = '+chr(39)+pmatric+chr(39)+' and '+
' emxde.matricula = '+chr(39)+pmatric+chr(39)+' and '+
' emxca.matricula = '+chr(39)+pmatric+chr(39);
with datamodule1.query2 do begin
92 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
sql.clear;
sql.add(stringsql);
open;
edtmatric.text:= fieldbyname('matricula').asstring;
edtnome.text:= fieldbyname('nome').asstring;
mskdata.text:= fieldbyname('nascim').asstring;
edtsalario.text:= fieldbyname('salario').asstring;
edtender.text:= fieldbyname('endereco').asstring;
edtcargo.text:= fieldbyname('codcargo').asstring;
edtdepto.text:= fieldbyname('coddep').asstring;
end;
datamodule1.query2.requestlive:= true;
end;
Objetivo: Transferir os valores dos campos da t abela EMPREGADOS, cont idos no
regist ro corrent e da query1, para a propriedade text dos component es da tabsheet1.
Alt erar o valor da varivel global pinclui, informando que o regist ro ser alt erado,
modificar o valor da propriedade enabled para true no panel2, permit indo que as
informaes sejam modificadas e mudar o valor da propriedade enabled para false
no component e edtcodcargo, pois o valor da chave primria no pode ser alt erado.
9

Button4
O bot o Ok responsvel por t ransferir as informaes cont idas nos componentes
da tabsheet1 para o banco de dados Oracle, alt erando ou inserindo um registro.
Evento: OnClick
Cdigo:
procedure TForm1.Button4Click(Sender: TObject);
begin
if verifica_integridade then begin
if pinclui then begin
sql_generico('insert into empregados values('+
chr(39)+edtmatric.text+chr(39)+','+
chr(39)+edtnome.text+chr(39)+','+
chr(39)+mskdata.text+chr(39)+','+
floattostr(strtofloat(edtsalario.text))+','+
chr(39)+edtender.text+chr(39)+')');
sql_generico('insert into empxdep values('+
chr(39)+edtmatric.text+chr(39)+','+
chr(39)+edtdepto.text+chr(39)+')');
sql_generico('insert into empxcargo values('+
chr(39)+edtmatric.text+chr(39)+','+
chr(39)+edtcargo.text+chr(39)+')');
end
else begin
sql_generico('update empregados '+
'set nome = '+chr(39)+edtnome.text+chr(39)+
' ,nascim = '+chr(39)+mskdata.text+chr(39)+
' ,salario = '+chr(39)+
floattostr(strtofloat(edtsalario.text))+chr(39)+
' ,endereco = '+chr(39)+edtender.text+chr(39)+
Conexo com o Banco de Dados Oracle via BDE 93
' where matricula = '+chr(39)+edtmatric.text+chr(39));
sql_generico('update empxdep '+
'set coddep = '+chr(39)+edtdepto.text+chr(39)+
'where matricula = '+chr(39)+edtmatric.text+chr(39));
sql_generico('update empxcargo '+
'set codcargo = '+chr(39)+edtcargo.text+chr(39)+
'where matricula = '+chr(39)+edtmatric.text+chr(39));
end;
end;
limpa_var_empregados;
panel1.enabled:= false;
executa_refresh;
end;
Objetivo: Em funo do valor da varivel global pinclui, um comando SQL de
incluso ou alt erao deve ser execut ado, transferindo o cont edo da propriedade
text de cada componente para a tabela EMPREGADOS
3
. import ant e observar
que no foram criadas constraints para nossas t abelas; dessa forma, ant es de inclu-
irmos um funcionrio, necessrio chamar a funo verifica_integridade que che-
ca se os valores cont idos nas propriedades text dos component es edtcargo e
edtdepto exist em, respect ivament e, nas t abelas CARGOS e DEPTO, evit ando dessa
forma que se cadast re para um funcionrio um cargo ou depart ament o inexist ent e.
preciso modificar o valor da propriedade enabled para false no panel1, execut an-
do logo em seguida um refresh para que a at ualizao reflit a no dbgrid.
9

Button5
Est a rot ina alt era para permanent e as at ualizaes pendent es em t odas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button5Click(Sender: TObject);
begin
sql_generico('commit');
executa_refresh;
end;
Objetivo: Execut ar o comando COMMIT no banco de dados e um refresh para que
a at ualizao reflit a no dbgrid.
9

Button6
Cancelar as at ualizaes pendent es em t odas as t abelas do banco de dados.

3
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
94 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Evento: OnClick
Cdigo:
procedure TForm1.Button6Click(Sender: TObject);
begin
sql_generico('rollback');
executa_refresh;
end;
Objetivo: Execut ar o comando ROLLBACK no banco de dados e um refresh para
que a at ualizao reflit a no dbgrid.
Ftapa 4 - Tabshoot4 [Consu!ta dos luncionrios
cadastrados)
Antes de iniciar a explicao do cdigo gerado para esse formulrio de consult a,
quero deixar claro que, por fugir ao escopo do que ser exposto, no irei coment ar
o cdigo criado em component e TRadioButton, pois sua finalidade , nica e ex-
clusivament e, a de cont rolar a entrada em cada um deles.
TabSheet4
Responsvel por consult ar um funcionrio, seu respect ivos cargo e departa-
mento.
Evento: OnShow
Cdigo:
procedure TForm1.tabsheet4Show(Sender: TObject);
begin
limpa_var_consulta;
end;
Objetivo: Limpar a propriedade text de t odos os component es da tabsheet4.
20

Button22
Gerar a consult a para um funcionrio, em funo dos valores informados nos com-
ponent es cont idos na tabsheet4.
Evento: OnClick
Cdigo:
procedure TForm1.Button19Click(Sender: TObject);
var
stringsql: string;
lescolheu_sal: boolean;
ind: integer;
Conexo com o Banco de Dados Oracle via BDE 95
begin
ind:= 0;
lescolheu_sal:= false;
pselect:= 'SELECT Empregados.MATRICULA, Empregados.Nome, '+
' Empregados.SALARIO,'+
' Empregados.NASCIM, Cargos.DESCRICAO, '+
' Depto.DESCRICAO ';
pfrom:= ' FROM EMPREGADOS Empregados, EMPXCARGO Empxcargo,'+
' EMPXDEP Empxdep,'+
' CARGOS Cargos, DEPTO2 Depto ';
pwhere:= ' WHERE (Empregados.MATRICULA = Empxcargo.MATRICULA) '+
' AND (Cargos.CODCARGO = Empxcargo.CODCARGO) '+
' AND (Empregados.MATRICULA = Empxdep.MATRICULA) '+
' AND (Depto.CODDEP = Empxdep.CODDEP) ';
pgroup:= '';
if rbmaisal.checked then begin
pselect:= 'SELECT MAX(Empregados.SALARIO)';
lescolheu_sal:= true;
end;
if rbmensal.checked then begin
pselect:= 'SELECT MIN(Empregados.SALARIO)';
lescolheu_sal:= true;
end;
if rbmedsal.checked then begin
pselect:= 'SELECT AVG(Empregados.SALARIO)';
lescolheu_sal:= true;
end;
if lescolheu_sal then begin
pselect:= pselect + ',Depto.DESCRICAO ';
pgroup:= 'GROUP BY Depto.DESCRICAO';
end;
with datamodule1.query1 do begin
sql.clear;
if rbsldepto.checked then begin
pwhere:= pwhere+' AND (Depto.CODDEP = '+#39+
edtdepto.text+#39+')';
end;
if rbslcargos.checked then begin
pwhere:= pwhere+' AND (Cargos.CODCARGO ='+#39+
edtcargos.text+#39+')';
end;
if not lescolheu_sal then begin
if rbslfunci.checked then begin
pwhere:= pwhere+' AND (Empregados.MATRICULA = '+#39+;
edtdmatric.text+#39+')';
end;
96 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
if rbdtcontrat.checked then begin
pwhere:= pwhere+' AND (Empregados.NASCIM = '+#39+;
mskdata.text+#39+')';
end;
end;
stringsql:= pselect+pfrom+pwhere+pgroup;
sql.add(stringsql);
open;
end;
end;
Objetivo: Criar uma consult a, ut ilizando as t abelas FUNCIONARIOS, DEPTO,
CARGOS, EMPXDEP, EMPXCARGO, at ravs de 4 variveis, que iro compor o
comando SELECT. Sendo elas:


pselect Escolhe os campos que sero exibidos pela consult a;


pfrom Seleciona as t abelas da consult a;


pwhere Seleciona a condio da consult a;


pgroup Agrupa os dados, se necessrio, da consult a.
Cada varivel recebe um valor inicial, podendo ser int eirament e modificado ou
concat enado com out ro, variando conforme a escolha de al guma opo da t ela
de consult a. Ao final, seus valores sero somados em uma nica varivel:
stringsql.
Exemplo 1:
Selecionar t odos os funcionrios que trabalham no depart ament o cujo cdigo
ident ificado pelo valor 01.
Nesse t ipo de escolha no ser alt erado o valor das variveis pselect, pfrom e
pgroup. O nico valor alterado ser o de pwhere, sendo adicionado ao final da
varivel o cdigo que ir incluir a condio para que s os funcionrios do
depart ament o 01 sejam exibidos.
Exemplo 2:
Selecionar a mdia salarial de t odos os funcionrios que trabalham em cada depar-
t amento da empresa.
A consult a a ser gerada modificar o valor das variveis pselect, que exibir so-
ment e a coluna que cont er a mdia salarial, atravs de uma funo de grupo
(AVG), e pgroup, necessria para agruparmos a mdia por depart amento. As de-
mais variveis permanecem com seus valores iniciais.
Conexo com o Banco de Dados Oracle via BDE 97
Observao:
A consult a gerada atravs de um join realizado nas cinco tabelas
criadas, onde obt eremos de cada uma a informao necessria. A figura 9.51 nos
most ra o relacionament o de cada tabela:
Obtm o nome do departamento em Obtm o nome do cargo de
que cada funcionrio trabalha. cada funcionrio da empresa.
Figura 0.1
Construindo uma ap!icao com TUpdatoSq!
Ao criarmos nossas t abelas no banco de dados para o prximo exemplo, ut ilizare-
mos a const raint FOREIGN KEY com a clusula DELETE CASCADE, o que faz
com que t oda a int egridade de dados passe a ser cont rolada pelo banco de dados
Oracle.


Criando a t abela de empregados:
SQL > CREATE TABLE EMPREGADOS2
2 (MATRICULA VARCHAR2(5) NOT NULL,
3 NOME VARCHAR2(30) NOT NULL,
4 NASCIM DATE NULL,
5 SALARIO NUMBER NULL,
6 ENDERECO VARCHAR2(50) NULL,
7 CONSTRAINT PK_MATRIC PRIMARY KEY (MATRICULA));


Criando a t abela de cargos:
SQL > CREATE TABLE CARGOS2
2 (CODCARGO VARCHAR2(3) NOT NULL,
3 DESCRICAO VARCHAR2(25) NULL,
4 CONSTRAINT PK_CODCARGO2 PRIMARY KEY (CODCARGO));
98 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Criando a t abela de relacionament os de empregados com cargos:
SQL > CREATE TABLE EMPXCARGO2
2 (MATRICULA VARCHAR2(5) NOT NULL,
3 CODCARGO VARCHAR2(3) NOT NULL,
4 CONSTRAINT FK_CODCARGO FOREIGN KEY (CODCARGO)
5 REFERENCES CARGOS2(CODCARGO) ON DELETE CASCADE,
6 CONSTRAINT FK_MATRIC FOREIGN KEY (MATRICULA)
7 REFERENCES EMPREGADOS2(MATRICULA) ON DELETE CASCADE);


Criando a t abela de depart ament os:
SQL > CREATE TABLE DEPTO2
2 (CODDEP VARCHAR2(3) NOT NULL,
3 DESCRICAO VARCHAR2(30) NULL,
4 CONSTRAINT PK_CODDEP2 PRIMARY KEY (CODDEP));


Criando a t abela de relacionament os de empregados com departamentos:
SQL > CREATE TABLE EMPXDEP2
2 (MATRICULA CHAR(5) NOT NULL,
3 CODDEP CHAR(3) NOT NULL,
4 CONSTRAINT FK_MATRI FOREIGN KEY (MATRICULA)
5 REFERENCES EMPREGADOS2(MATRICULA) ON DELETE CASCADE,
6 CONSTRAINT FK_CODDEP FOREIGN KEY (CODDEP)
7 REFERENCES DEPTO2(CODDEP) ON DELETE CASCADE);
Aps criarmos as t abelas da nossa aplicao, devemos ent o execut ar o Delphi.
A aplicao ser desenvolvida, conforme o exemplo 1, em duas part es:
Part e 1 Criao dos component es necessrios;
Part e 2 Explicao do cdigo gerado para cada component e criado.
Parto 1 - Criao dos componontos nocossrios
Ftapa 1 - Criao do um novo Datamodu!o
Um novo Dat amodule deve ser adicionado ao projet o.
V em File->New->DataModule;
Conexo com o Banco de Dados Oracle via BDE 99
Os seguint es valores devero ser modificados:
Figura 0.2
O DataModule dever ser salvo como udmexemplo1.pas
Ftapa 2 - Adio do 18 componontos da aba BDF ao
Datamodu!o
Conforme figura 9.53, 18 component es devero ser adicionados:
Figura 0.8
1
3
2
4
6
5
7
8
11
14
9
12
15
10
13
16
18
17
100 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
O nmero bem superior de componentes criados para essa aplicao se deve ao
fato de t ermos uma t ransao em separado para cada tabsheet, o que nos leva a
criar um componente TUpdateSql para cada uma.
Os seguint es valores devero ser modificados:

1
TDat aBase
Figura 0.4
Ser explicada a seguir a ut ilizao det alhada do component e TUpdateSql em
conjunto com o TQuery.


Criar um comando SELECT, ut ilizando a propriedade SQL do query1, seleci-
onando os campos da t abela EMPREGADOS2;
Conexo com o Banco de Dados Oracle via BDE 101
2
TQuery
Figura 0.


Criar os comandos SQL, ut ilizando o UpdateSql Editor, para inserir, alt erar e
apagar dados na t abela EMPREGADOS2, ut ilizando o component e
TUpdateSql;
3
TUpdat eSql
Figura 0.0
102 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Executar o UpdateSql Editor at ravs do bot o direit o do mouse;
Figura 0.7


Selecionar, at ravs da aba Options, os campos que sero at ualizados, os cam-
pos-chave, gerar e, logo aps, verificar o comando SQL criado;

Campos-chave
Tabela
selecionada
atravs do Campos a
componente serem atualizados
Query1

Boto que cria o comando SQL para
incluir, alterar e apagar linhas na tabela EMPREGADOS2
Figura 0.8
Conexo com o Banco de Dados Oracle via BDE 103


Verificando o comando SQL criado para alt erar, inserir e apagar linhas na ta-
bela EMPREGADOS2;
Figura 0.0
4
TDat aSource
Figura 0.00
104 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Criar um comando SELECT, ut ilizando a propriedade SQL do query2, seleci-
onando os campos da t abela CARGOS2:
5
TQuery
Figura 0.01


Criar os comandos SQL, ut ilizando o UpdateSql Editor, para inserir, alt erar e
apagar dados na t abela CARGOS2, ut ilizando o component e TUpdateSql.
NOTA:
Como a criao desses comandos idnt ica a t odos os component es TU-
pdateSql, no irei explicar as et apas novament e, onde soment e as figuras sero
most radas.
Conexo com o Banco de Dados Oracle via BDE 105
6
TUpdat eSql

UpdateSql Edi tor
Figura 0.02
106 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
7
TDat aSource
Fi gura 0.08


Criar um comando SELECT, ut ilizando a propriedade SQL do query3, seleci-
onando os campos da t abela DEPTO2;
8
TQuery
Figura 0.04
Conexo com o Banco de Dados Oracle via BDE 107


Criar os comandos SQL, ut ilizando o UpdateSql Editor, para inserir, alt erar e
apagar dados na t abela DEPTO2, ut ilizando o component e TUpdateSql.
9
TUpdat eSql

UpdateSql Edi tor
Figura 0.0
108 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
10
TDataSource
Fi gura 0.00


Criar um comando SELECT, ut ilizando a propriedade SQL do query4, seleci-
onando os campos da t abela EMPXDEP2;
11
TQuery
Figura 0.07
Conexo com o Banco de Dados Oracle via BDE 109


Criar os comandos SQL, ut ilizando o UpdateSql Editor, para inserir, alt erar e
apagar dados na t abela EMPXDEP2, ut ilizando o component e TUpdateSql.
12
TUpdateSql

UpdateSql Edi tor
Figura 0.08
110 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
13
TDataSource
Fi gura 0.00


Criar um comando SELECT, ut ilizando a propriedade SQL do query5, seleci-
onando os campos da t abela EMPXCARGO2;
14
TQuery
Figura 0.70
Conexo com o Banco de Dados Oracle via BDE 111


Criar os comandos SQL, ut ilizando o UpdateSql Editor, para inserir, alt erar e
apagar dados na t abela EMPXCARGO2, ut ilizando o componente TUpdateSql.
15
TUpdateSql
Figura 0.71
112 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
16
TDataSource
18
TDat aSource
Figura 0.72 Figura 0.74
17
TQuery
Figura 0.78
Conexo com o Banco de Dados Oracle via BDE 113
Ftapa 8 - Criao no lormu!rio principa! do
pagocontro! o sous componontos
Uma vez criados os component es no Tdat aModule, deveremos, ent o, criar o page-
cont rol, assim como 6 t absheet s que devero t er sua propriedade Capt ion set adas
para Empregados, Cargos, Depart amentos e Consult a, Empregados X Cargos, Em-
pregados X Depart amentos conforme mostra a figura 9.75:
Figura 0.7
Ftapa 8.1 - Criao do componontos na tabshoot1

Tabsheet1
Figura 0.70
Tabsheet 1
Tabsheet 2
Tabsheet 3
Tabsheet 4
Pagecontrol
Tabsheet 5
Tabsheet 6
1
2
3
4
5
6
7
114 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
2
TDBEdit
Figura 0.77 Fi gura. 0.78
3
TDBEdit
4
TDBEdit
Figura 0.70 Figura 0.80
Conexo com o Banco de Dados Oracle via BDE 115
5
TDBEdit
6
TDBEdit
Figura 0.81 Fi gura 0.82
7
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button1, Button2,...,Button6, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 9.76.
Ftapa 8.2 - Criao do componontos na tabshoot2

Tabsheet2
4
Fi gura 0.88
1
2
3
116 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TDBEdit
Figura 0.84 Figura 0.80
2
TDBEdit
Figura 0.8
Conexo com o Banco de Dados Oracle via BDE 117
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button7, Button8,...,Button12, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 9.83.
Ftapa 8.8 - Criao do componontos na tabshoot8

Tabsheet3
Figura 0.87
1
2
3
4
118 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TDBEdit
Figura 0.88 Figura 0.00
2
TDBEdit
Figura 0.80
Conexo com o Banco de Dados Oracle via BDE 119
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button13, Button14,...,Button18, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.87.
Ftapa 8.4 - Criao do componontos na tabshoot4

Tabsheet4
Figura 0.01
20
1
2
3
4
5
6
7
8
9
10
11
12
15
14
13
16
17
18
19
120 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TRadioButton
Figura 0.02 Figura 0.04
2
TRadioButt on
4
TRadioButton
Figura 0.08 Figura 0.0
Conexo com o Banco de Dados Oracle via BDE 121
5
TMaskEdit
7
TRadioButton
Figura 0.00 Figura 0.08
6
TEdit
8
TRadioButton
Figura 0.07 Figura 0.00
122 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
9
TRadioButt on
11
TRadioButton
Figura 0.100 Figura 0.102
10
TRadioButton
12
TEdit
Figura 0.101 Figura 0.108
Conexo com o Banco de Dados Oracle via BDE 123
13
TRadioButton
15
TEdit
Figura 0.104 Figura 0.100
14
TRadioButton
16
TGroupBox
Figura 0.10 Figura 0.107
124 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
17
TGroupBox
19
TGroupBox
Figura 0.108 Figura 0.110
18
TGroupBox
Figura 0.100
Conexo com o Banco de Dados Oracle via BDE 125
20
TButtons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button19, Button20 e Button33, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.91.
Ftapa 8. - Criao do componontos na tabshoot

Tabsheet5
Figura 0.111
1
2
3
4
126 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TDBEdit
Figura 0.112 Figura 0.114
2
TDBEdit
Figura 0.118
Conexo com o Banco de Dados Oracle via BDE 127
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button21, Button22,...,Button26, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.111.
Ftapa 8.0 - Criao do componontos na tabshoot0

Tabsheet6
Figura 0.11
1
2
3
4
128 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TDBEdit
Figura 0.110 Fi gura 0.118
2
TDBEdit
Figura 0.117
Conexo com o Banco de Dados Oracle via BDE 129
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button27, Button28,...,Button31, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 9.115.
Parto 2 - Fxp!icao do cdigo gorado para cada
compononto criado
Antes de iniciarmos a explicao do cdigo gerado, convm lembrar que, ao con-
t rrio do exemplo1, onde as operaes de insero, deleo, alt erao e mudana
de est ado dos dados se processavam diret ament e no banco de dados Oracle, onde
era necessrio gerar uma st ring para cada uma dessas operaes em nosso projet o,
isso no ocorrer nesse exemplo.
As operaes se processam na memria da mquina da est ao, onde fica todo o
cont role das t ransaes. Soment e aps a confirmao, via evento applyupdates nos
component es TQuery criados, que os dados so t ransport ados para o banco de
dados Oracle. Perceba que component es TDBEdit foram criados, ou seja, no es-
t amos mais trabalhando com variveis de memria (TEdit) e sim, acessando os
dados diret o do banco, via TQuery. Dessa forma, nossos comandos para inserir,
alt erar, delet ar, confirmar ou cancelar dados sero execut ados diret ament e sobre os
component es TQuery a que os component es TDBEdit est iverem apontando.
No ser necessrio, como no exemplo1, criar procedures para verificar a int egri-
dade dos dados, pois as constraints foram definidas na criao das tabelas do pro-
jeto, efet uando assim, essas operaes aut omat icament e.
Ent o, iniciaremos a explicao sobre o funcionamento de cada tabsheet, onde
algumas procedures e funes de uso geral do projet o devem ser criadas.
As t rs procedures a seguir so responsveis por limpar o cont edo da propriedade
text de cada componente cont ido em sua respect iva tabsheet.
procedure TForm1.limpa_var_generico(pdbedit1, pdbedit2: tobject);
begin
(pdbedit1 as tdbedit).text:= '';
(pdbedit2 as tdbedit).text:= '';
end;
procedure TForm1.limpa_var_empregados;
begin
dbmatric.text:= '';
dbnome.text:= '';
dbdata.text:= ' / / ';
dbender.text:= '';
dbsalario.text:= '';
end;
130 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
procedure TForm1.limpa_var_consulta;
begin
mskdata2.text:= ' / / ';
mskdata2.enabled:= false;
edtcargos2.text:= '';
edtcargos2.enabled:= false;
edtdepto2.text:= '';
edtdepto2.enabled:= false;
edtmatric2.text:= '';
edtmatric2.enabled:= false;
rbtdfunci.checked:= true;
rbslfunci.checked:= false;
rbdtcontrat.checked:= false;
rbtdcargos.checked:= true;
rbslcargos.checked:= false;
rbtddepto.checked:= true;
rbsldepto.checked:= false;
rbmaisal.checked:= false;
rbmensal.checked:= false;
rbmedsal.checked:= false;
end;
Conforme o exemplo1, ant es de iniciarmos a explicao sobre o funcionamento de
cada tabsheet, algumas procedures e funes de uso geral do projet o devem ser
criadas.
procedure Tform1.consulta_generica(stringsql: string; pquery: TObject);
begin
with (pquery as tquery) do begin
sql.clear;
sql.add(stringsql);
prepare;
open;
end;
end;
Para que t oda incluso, alt erao e excluso de regist ros efet uada no banco de
dados reflit a nos dbgrids do projet o, necessrio fechar e abrir, logo em segui -
da, a query associada a ele. A procedure seguint e ser a responsvel por essa
t arefa.
:
procedure Tform1.executa_refresh(pquery: TObject);
begin
(pquery as tquery).active:= false;
(pquery as tquery).active:= true;
end;
Not e que, por uma economia de cdi go em nosso projet o, passado como pa-
rmet ro o component e TQuery em que efet uaremos o ref resh, pois, ao cont r-
rio, seramos obri gados a ut ilizar essa procedure em t odos os TQuery de nossa
aplicao.
Conexo com o Banco de Dados Oracle via BDE 131
As procedures a seguir so responsveis por colocar o component e TQuery, a que o
component e TBDEdit se refere, em modo de inserir ou alt erar dados, efet uando
t ambm o cont role em alguns component es da tabsheet correspondente:
procedure TForm1.insert_generico(ppanel, pquery, pdbedit: TObject);
begin
(Ppanel as Tpanel).enabled:= true;
(Pquery as Tquery).insert;
(Pdbedit as tdbedit).enabled:= true;
end;
procedure TForm1.edit_generico(ppanel, pquery, pdbedit1, pdbedit2: TObject);
begin
(ppanel as tpanel).enabled:= true;
(pdbedit1 as tdbedit).enabled:= false;
(pdbedit2 as tdbedit).setfocus;
(pquery as tquery).edit;
end;
A necessidade de parmetros nessas procedures segue a mesma linha de raciocnio
das procedures criadas ant eriormente.
Conforme explicado no incio da Part e 2 desse exemplo, a confirmao para t rans-
ferncia dos dados para o banco de dados Oracle, assim como o cancelament o,
deve se processar no component e TQuery. Sendo assim, a procedure seguint e
responsvel por realizar essa operao:
procedure tform1.conf_canc_generico(pquery: tobject; confirma: boolean);
begin
if confirma then
(pquery as tquery).applyupdates
else
(pquery as tquery).cancelupdates;
executa_refresh(pquery);
end;
Ftapa 1 - Tabshoot2 [Cadastro do Cargos)
O cdigo de cada event o ser coment ado aps a descrio de cada component e (A
numerao ser a mesma ut ilizada na Part e 1).
TabSheet2
Responsvel por incluir, alt erar e excluir um cargo.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
panel2.enabled:= false;
limpa_var_generico(dbcodcargo,dbdesccargo);
end;
132 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Objetivo: Exibir todas as colunas da t abelas CARGOS2 e seu respect ivo cont edo,
limpar a propriedade text dos component es e alt erar o valor da propriedade enabled
para false no panel2, evit ando que informaes sejam inseridas sem que antes um
dos bot es de Incluir ou Alterar seja pressionado.
Como o DBGrid2 est ligado diret ament e ao component e DataSource2, no preci-
saremos criar uma string SQL com o comando SELECT ..., conforme o exem-
plo1, pois meu comando SQL j foi criado no component e TQuery2.
1

DbGri d2
Exibir informaes da tabela CARGOS2, at ravs da query2.
Evento: No exist e.
2

DbCodCargo
Armazenar em memria, at ser transferido para o banco de dados, a coluna do
cdigo do cargo a ser inserido ou alt erado.
Evento: No exist e.
3

EdtDescCargo
Armazenar em memria, at ser transferida para o banco de dados, a coluna da
descrio do cargo a ser inserido ou alt erado.
Evento: No exist e.
4

Button7
A rot ina de incluso deve ser capaz de colocar a tabsheet2 em condies de inserir
informaes nos component es dbcodcargo e dbdesccargo objet ivando a post erior
t ransferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button7Click(Sender: TObject);
begin
insert_generico(panel2,datamodule1.query2,dbcodcargo);
limpa_var_generico(dbcodcargo,dbdesccargo);
dbcodcargo.setFocus;
end;
Objetivo: Alt erar o valor da propriedade enabled para true no panel2, permit indo
que informaes sejam inseridas nos component es, colocar a query2 no modo de
insero, at ravs da funo insert_generico.
4

Button8
A rot ina de excluso deve permit ir que um cargo e seu respect ivo relacionament o,
at ravs da constraint criada, sejam apagados.
Conexo com o Banco de Dados Oracle via BDE 133
Evento: OnClick
Cdigo:
procedure TForm1.Button8Click(Sender: TObject);
begin
datamodule1.query2.delete;
end;
Objetivo: Excluir os regist ros nas t abelas CARGOS2 e EMPXCARGO2, ut ilizando
diret ament e o evento delete da query2.
Diferent e do exemplo1, onde era necessrio apagar todos os relacionament os en-
volvendo a t abela CARGOS2 (EMPXCARGO2), a constraint criada no banco de
dados Oracle realiza essa t arefa.
4

Button9
A rot ina de alt erao deve ser capaz de colocar a tabsheet2 em condies de alt erar
as informaes cont idas nos component es dbcodcargo e dbdesccargo.
Evento: OnClick
Cdigo:
procedure TForm1.Button9Click(Sender: TObject);
begin
limpa_var_generico(dbcodcargo,dbdesccargo);
edit_generico(panel2,datamodule1.query2,dbcodcargo,dbdesccargo);
end;
Objetivo: Colocar a query2 em modo de alt erao, at ravs da funo edit_generico,
para que o cont edo do registro corrent e possa ser modificado, uma vez que, com
a ut ilizao de component es DBEdit, est amos trabalhando diretament e com o re-
gist ro da t abela.
4

Button10
Est a rot ina deve tornar permanent e a at ualizao pendent e na query2, t ransferindo
ent o o regist ro para a tabela CARGOS2.
Evento: OnClick
Cdigo:
procedure TForm1.Button10Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query2,true);
end;
Objetivo: Executar o comando applyupdates na query2, atravs da funo
conf_canc_generico, onde a transao pendente ser t ransportada para o banco de da-
dos, sendo o regist ro, ento, inserido ou alterado efetivamente na t abela CARGOS2.
134 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
No exemplo1, o COMMIT gerado no bot o Confirma t ransformava em permanent e
TODAS as t ransaes pendent es no banco de dados Oracle, pois o comando era
disparado diret amente cont ra ele. Nesse exemplo apenas a transao realizada na
t abela CARGOS2, atravs da query2, t ransformada em permanent e, ficando as
demais, realizadas at ravs de out ras querys, pendent es.
4

Button11
Est a rot ina, ao cont rrio da ant erior, deve cancelar a at ualizao pendent e na
query2, retornando ao est ado inicial.
Evento: OnClick
Cdigo:
procedure TForm1.Button11Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query2,false);
end;
Objetivo: Execut ar o comando cancelupdates na query2, at ravs da funo
conf_canc_generico, onde a transao pendente ser cancelada, ret ornando a
query2 ao est ado inicial.
No exemplo1 execut aramos o comando ROLLBACK, s que conforme explicado
no cdigo para o Button10, apenas a transao pendente da query2 ser cancelada,
e no t odas as do banco de dados Oracle.
NOTA
: Uma vez expost as as principais diferenas entre o exemplo1 e o corrent e,
nas prximas et apas, ser abordada soment e a funcionalidade de cada evento ge-
rado para seu respect ivo component e.
Ftapa 2 - Tabshoot8 [Cadastro do Dopartamontos)
TabSheet3
Responsvel por incluir, alt erar e excluir um depart amento.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
panel2.enabled:= false;
limpa_var_generico(dbcodcargo,dbdesccargo);
end;
Objetivo: Exibir todas as colunas da t abela DEPTO2 e seu respect ivo contedo,
limpar a propriedade text dos component es, alterar o valor da propriedade enabled
Conexo com o Banco de Dados Oracle via BDE 135
para false no panel3, evit ando que, ant es de ser pressionado um dos botes de In-
cluir ou Alterar, informaes sejam inseridas.
1

DbGri d3
Exibir informaes da tabela DEPTO2, at ravs da query3.
Evento: No exist e.
2

DbCodDep
Armazenar em memria, at ser transferida para o banco de dados, a coluna do
cdigo do depart amento a ser inserido ou alt erado.
Evento: No exist e.
3

EdtDescDep
Armazenar em memria, at ser transferida para o banco de dados, a coluna da
descrio do departament o a ser inserido ou alt erado.
Evento: No exist e.
4

Button13
A rot ina incluso deve possibilit ar que a tabsheet3 fique em condies de inserir
informaes nos component es dbcoddep e dbdescdep permit indo a t ransferncia
post erior para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button13Click(Sender: TObject);
begin
insert_generico(panel3,datamodule1.query3,dbmatric);
limpa_var_generico(dbcoddep, dbdescdep);
dbcoddep.setfocus;
end;
Objetivo: Alt erar o valor da propriedade enabled para true no panel3, onde pode-
ro ser inseridas informaes nos component es, e colocar a query2 no modo de
insero, at ravs da funo insert_generico.
4

Button14
At ravs da rot ina de excluso, ser permit ido apagar um depart amento e seu res-
pect ivo relacionament o atravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button14Click(Sender: TObject);
begin
datamodule1.query3.delete;
end;
136 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Objetivo: Excluir os regist ros nas t abelas DEPTO2 e EMPXDEP2, ut ilizando di-
retament e o event o delete da query3.
4

Button15
Na rot ina de alt erao, devemos colocar a tabsheet3 em condies de alt erar as
informaes cont idas nos component es dbcoddep e dbdescdep.
Evento: OnClick
Cdigo:
procedure TForm1.Button15Click(Sender: TObject);
begin
limpa_var_generico(dbcoddep,dbdescdep);
edit_generico(panel3,datamodule1.query3,dbcoddep,dbdescdep);
end;
Objetivo: Colocar a query3 em modo de alt erao, at ravs da funo edit_generico,
para que o cont edo do registro at ual possa ser modificado, j que est amos ut ili-
zando o registro corrent e da tabela.
4

Button16
Est a rot ina deve tornar permanent e a at ualizao pendent e na query3, t ransferindo
ent o o regist ro para a tabela DEPTO2.
Evento: OnClick
Cdigo:
procedure TForm1.Button16Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query3,true);
end;
Objetivo: Execut ar o comando applyupdates na query3, at ravs da funo
conf_canc_generico, tornando permanent e no banco de dados a transao pendent e
na query3, inserido ou alt erado, efet ivament e na t abela CARGOS2, um regist ro.
4

Button17
Est a rot ina, ao cont rrio da ant erior, deve cancelar a at ualizao pendent e na
query3, retornando ao est ado inicial.
Evento: OnClick
Cdigo:
procedure TForm1.Button17Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query3,false);
end;
Conexo com o Banco de Dados Oracle via BDE 137
Objetivo: Execut ar o comando cancelupdates na query3, at ravs da funo
conf_canc_generico, onde a transao pendente ser cancelada, ret ornando a
query3 ao est ado inicial.
Ftapa 8 - Tabshoot1 [Cadastro do Funcionrios)
TabSheet1
Responsvel por incluir, alt erar e excluir um funcionrio.
Evento: OnShow
Cdigo:
procedure TForm1.tabsheet1Show(Sender: TObject);
begin
panel1.enabled:= false;
limpa_var_empregados;
end;
Objetivo: Exibir todas as linhas da t abela EMPREGADOS2, suas colunas e seu res-
pect ivo cont edo, limpar a propriedade text dos component es, o valor da propriedade
enabled devendo ser alt erado para false no panel1, evitando que informaes sejam
inseridas sem que ant es um dos botes de Incluir ou Alterar seja pressionado.
1

DbGri d1
Exibir informaes da tabela EMPREGADOS2, at ravs da query1.
Evento: No exist e.
2

DBMatri c
Armazenar em memria a coluna do nmero da mat rcula do funcionrio a ser in-
serida ou alt erada at que possa ser t ransferida para o banco de dados.
Evento: No exist e.
3

DBNome
Armazenar em memria a coluna do nome do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
4

DBData
Armazenar em memria a coluna da dat a de aniversrio do funcionrio a ser inse-
rido ou alt erado.
Evento: No exist e.
5

DBEnder
Armazenar em memria a coluna do endereo do funcionrio a ser inserido ou
alt erado.
Evento: No exist e.
138 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
6

DBSal ario
Armazenar em memria a coluna do salrio do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
7

Button1
A rot ina a seguir deve ser capaz de colocar a tabsheet1 em condies de inserir
informaes em seus component es, para posterior t ransferncia para o banco de
dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button7Click(Sender: TObject);
begin
insert_generico(panel1,datamodule1.query1,dbmatric);
limpa_var_empregados;
dbmatric.setfocus;
end;
Objetivo: O valor da propriedade enabled deve ser modificado para true no panel1,
permit indo que informaes sejam inseridas nos component es, e colocar a query1,
at ravs da funo insert_generico, no modo de insero.
7

Button2
A rot ina de excluso permit e que um funcionrio e seus respect ivos relacionamen-
t os sejam apagados, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button2Click(Sender: TObject);
begin
datamodule1.query1.delete;
end;
Objetivo: Apagar os regist ros nas t abelas EMPREGADOS2, EMPXCARGO2 e
EMPXDEP2, at ravs do evento delete da query2.
7

Button3
A rot ina de alt erao permit e a tabsheet1 alterar as informaes cont idas em seus
component es.
Evento: OnClick
Cdigo:
procedure TForm1.Button3Click(Sender: TObject);
begin
limpa_var_empregados;
Conexo com o Banco de Dados Oracle via BDE 139
edit_generico(panel1,datamodule1.query1,dbmatric,dbnome);
end;
Objetivo: Alt erar o est ado da query1, para que o cont edo do regist ro corrent e pos-
sa ser modificado.
7

Button4
Est a rot ina deve tornar permanent e a at ualizao pendent e na query1, onde o re-
gist ro deve ser t ransferido para a t abela EMPREGADOS2.
Evento: OnClick
Cdigo:
procedure TForm1.Button10Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query1,true);
end;
Objetivo: Execut ar o comando applyupdates na query1, at ravs da funo
conf_canc_generico, onde ser t ransport ada para a t abela EMPREGADOS2 no
banco de dados a t ransao pendent e na query1.
7

Button6
A rot ina de cancelament o deve retornar a query1 ao seu est ado inicial.
Evento: OnClick
Cdigo:
procedure TForm1.Button11Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query1,false);
end;
Objetivo: Execut ar a funo conf_canc_generico, onde a t ransao pendent e ser
cancelada.
Ftapa 4 - Tabshoot [Cadastro do ro!acionamontos ontro
Fmprogados o Cargos)
TabSheet5
Responsvel por incluir, alt erar e excluir um relacionamento entre um funcionrio
e um depart amento.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet5Show(Sender: TObject);
begin
140 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
limpa_var_generico(dbmatric2,dbcodcargo2);
panel5.enabled:= false;
executa_refresh(datamodule1.query5);
end;
Objetivo: Exibir todas as colunas da t abela EMPXCARGO2 e seu respect ivo con-
t edo, limpar a propriedade text dos component es, modificar o valor da proprieda-
de enabled para false no panel5, assegurando que, ant es de ser pressionado um dos
bot es de Incluir ou Alterar, informaes sejam inseridas.
1

DbGri d5
Exibir informaes da tabela EMPXCARGO2, atravs da query5.
Evento: No exist e.
2

DbMatri c2
Armazenar em memria, at ser transferida para o banco de dados, a coluna da
mat rcula do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
3

DbCodcargo2
Armazenar em memria, at ser transferida para o banco de dados, a coluna do
cdigo do cargo a ser inserido ou alt erado.
Evento: No exist e.
4

Button21
A rot ina incluso deve possibilit ar a tabsheet5 ficar em condies de inserir infor-
maes nos component es dbmatric2 e dbcodcargo2 permit indo a transferncia
post erior para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button21Click(Sender: TObject);
begin
insert_generico(panel5,datamodule1.query5,dbmatric2);
limpa_var_generico(dbmatric2,dbcodcargo2);
dbmatric2.setfocus;
end;
Objetivo: O valor da propriedade enabled deve ser modificado para true no panel3,
onde podero ser inseridas informaes nos component es, e colocar a query5 no
modo de insero, at ravs da funo insert_generico.
Conexo com o Banco de Dados Oracle via BDE 141
4

Button22
A seguir, at ravs da rot ina de excluso, ser permit ido apagar um relacionamento
ent re um funcionrio e seu respect ivo cargo, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button14Click(Sender: TObject);
begin
datamodule1.query5.delete;
end;
Objetivo: Apagar os regist ros na t abela EMPXCARGO2, atravs do event o delete
da query5.
4

Button23
Na rot ina de alt erao ser possvel a tabsheet5 alt erar as informaes cont idas nos
component es dbmatric2 e dbcargo2.
Evento: OnClick
Cdigo:
procedure TForm1.Button23Click(Sender: TObject);
begin
limpa_var_generico(dbmatric2,dbcodcargo2);
edit_generico(panel5,datamodule1.query5,dbmatric2,dbcodcargo2);
end;
Objetivo: Colocar a query5 em modo de alt erao, at ravs da funo edit_generico,
para que o cont edo do registro corrent e possa ser modificado.
4

Button24
A rot ina deve tornar permanent e a at ualizao pendent e na query5, t ransferindo
ent o o regist ro para a tabela EMPXCARGO2.
Evento: OnClick
Cdigo:
procedure TForm1.Button16Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query5,true);
end;
Objetivo: Execut ar o comando applyupdates na query5, at ravs da funo
conf_canc_generico, tornando permanent e no banco de dados a transao pendent e
na query5.
142 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4

Button25
Ao cont rrio da ant erior, est a rot ina deve ser capaz de cancelar a at ualizao pen-
dent e na query5.
Evento: OnClick
Cdigo:
procedure TForm1.Button17Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query5,false);
end;
Objetivo: O comando cancelupdates ser execut ado na query5, atravs da funo
conf_canc_generico, onde a transao pendente ser cancelada, ret ornando a
query5 ao est ado inicial.
Ftapa - Tabshoot0 [Cadastro do ro!acionamontos ontro
Fmprogados o Dopartamontos)
TabSheet6
Responsvel por incluir, alt erar e excluir um relacionamento entre um funcionrio
e um depart amento.
Evento: OnShow
Cdigo:
procedure TForm1.TabSheet6Show(Sender: TObject);
begin
limpa_var_generico(dbmatric3,dbcoddep2);
panel6.enabled:= false;
executa_refresh(datamodule1.query4);
end;
Objetivo: Todas as colunas da t abela EMPXDEPTO2 e seu respect ivo contedo
sero exibidos, limpar a propriedade text dos component es, alt erar o valor da pro-
priedade enabled para false no panel6, evit ando que, ant es de ser pressionado um
dos bot es de Incluir ou Alterar, informaes sejam inseridas.
1

DbGri d6
Exibir informaes da tabela EMPXDEPTO2, at ravs da query4.
Evento: No exist e.
2

DbMatri c3
Armazenar em memria a coluna da mat rcula do funcionrio a ser inserido ou
alt erado, at ser t ransferida para o banco de dados.
Evento: No exist e.
Conexo com o Banco de Dados Oracle via BDE 143
3

EdtCodDep2
Armazenar em memria, at ser transferida para o banco de dados, a coluna do
cdigo do depart amento a ser inserido ou alt erado.
Evento: No exist e.
4

Button27
A incluso, atravs da rot ina a seguir, deve possibilit ar que a tabsheet6 fique em
condies de inserir informaes em seus componentes, permit indo, post erior-
ment e, a transferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button27Click(Sender: TObject);
begin
insert_generico(panel6,datamodule1.query4,dbmatric3);
limpa_var_generico(dbmatric3,dbcoddep2);
dbmatric3.setfocus;
end;
Objetivo: At ravs da funo insert_generico, ser permit ido colocar a query4 no
modo de insero, onde podero ser inseridas informaes nos component es
dbmatric3 e dbcoddep2. Alt erar o valor da propriedade enabled para true no pa-
nel6.
4

Button28
A rot ina de excluso permit e apagar um relacionamento entre um funcionrio e um
depart ament o, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button14Click(Sender: TObject);
begin
datamodule1.query4.delete;
end;
Objetivo: Excluir o regist ro na t abela EMPXDEP2, ut ilizando diret ament e o evento
delete da query4.
4

Button29
Devemos colocar a tabsheet6, atravs da rot ina a seguir, em condies de alt erar as
informaes cont idas nos component es dbmatric3 e dbcoddep2.
Evento: OnClick
Cdigo:
144 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
procedure TForm1.Button29Click(Sender: TObject);
begin
limpa_var_generico(dbmatric3,dbcoddep2);
edit_generico(panel6,datamodule1.query4,dbmatric3,dbcoddep2);
end;
Objetivo: Colocar a query4 em modo de alt erao, at ravs da funo edit_generico,
onde o cont edo do registro corrent e ser modificado.
4

Button30
Est a rot ina deve tornar permanent e a at ualizao pendent e na query4, t ransferindo
ent o o regist ro para a tabela EMPXDEPTO2.
Evento: OnClick
Cdigo:
procedure TForm1.Button30Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query4,true);
end;
Objetivo: At ravs da funo conf_canc_generico, execut ar o comando applyupda-
tes na query6, t ornando permanent e no banco de dados a t ransao pendent e na
query4.
4

Button31
Est a rot ina, ao cont rrio da ant erior, deve cancelar a at ualizao pendent e na
query6.
Evento: OnClick
Cdigo:
procedure TForm1.Button17Click(Sender: TObject);
begin
conf_canc_generico(datamodule1.query4,false);
end;
Objetivo: Execut ar a funo conf_canc_generico, onde a t ransao pendent e ser
cancelada, ret ornando a query6 ao estado inicial.
Ftapa 0 - Tabshoot4 [Consu!ta dos luncionrios
cadastrados)
Antes de iniciar a explicao do cdigo gerado para esse formulrio de consult a,
quero deixar claro que, por fugir ao escopo do que ser exposto, no irei coment ar
o cdigo criado em component e TRadioButton, pois sua finalidade , nica e ex-
clusivament e, a de cont rolar a entrada em cada um deles.
Conexo com o Banco de Dados Oracle via BDE 145
TabSheet4
Responsvel por consultar um funcionrio, seu respect ivo cargo e departament o.
Evento: OnShow
Cdigo:
procedure TForm1.tabsheet4Show(Sender: TObject);
begin
limpa_var_consulta;
end;
Objetivo: Limpar a propriedade text de t odos os component es da tabsheet4.
20

Button22
Gerar a consult a para um funcionrio, em funo dos valores informados nos com-
ponent es cont idos na tabsheet4.
Evento: OnClick
Cdigo:
procedure TForm1.Button19Click(Sender: TObject);
var
stringsql: string;
lescolheu_sal: boolean;
ind: integer;
begin
ind:= 0;
lescolheu_sal:= false;
pselect:= 'SELECT Empregados2.MATRICULA, Empregados2.Nome, '+
' Empregados2.SALARIO,'+
' Empregados2.NASCIM, Cargos2.DESCRICAO, '+
' Depto2.DESCRICAO ';
pfrom:= ' FROM EMPREGADOS2 Empregados2, EMPXCARGO2 Empxcargo2, '+
' EMPXDEP2 Empxdep2,'+
' CARGOS2 Cargos2, DEPTO2 Depto2 ';
pwhere:= ' WHERE (Empregados2.MATRICULA = Empxcargo2.MATRICULA) '+
' AND (Cargos2.CODCARGO = Empxcargo2.CODCARGO) '+
' AND (Empregados2.MATRICULA = Empxdep2.MATRICULA) '+
' AND (Depto2.CODDEP = Empxdep2.CODDEP) ';
pgroup:= '';
if rbmaisal.checked then begin
pselect:= 'SELECT MAX(Empregados2.SALARIO)';
lescolheu_sal:= true;
end;
if rbmensal.checked then begin
pselect:= 'SELECT MIN(Empregados2.SALARIO)';
lescolheu_sal:= true;
146 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
end;
if rbmedsal.checked then begin
pselect:= 'SELECT AVG(Empregados2.SALARIO)';
lescolheu_sal:= true;
end;
if lescolheu_sal then begin
pselect:= pselect + ',Depto2.DESCRICAO ';
pgroup:= 'GROUP BY Depto2.DESCRICAO';
end;
with datamodule1.query6 do begin
params.clear;
sql.clear;
if rbsldepto.checked then begin
pwhere:= pwhere+' AND (Depto2.CODDEP =:departamento) ';
params.add;
params[ind].name:= 'departamento';
params[ind].asstring:= edtdepto2.text;
ind:= ind+1;
end;
if rbslcargos.checked then begin
pwhere:= pwhere+' AND (Cargos2.CODCARGO =:cargo) ';
params.add;
params[ind].name:= 'cargo';
params[ind].asstring:= edtcargos2.text;
ind:=ind+1;
end;
if not lescolheu_sal then begin
if rbslfunci.checked then begin
pwhere:= pwhere+' AND (Empregados2.MATRICULA =:matricula) ';
params.add;
params[ind].name:= 'matricula';
params[ind].asstring:= edtmatric2.text;
ind:=ind+1;
end;
if rbdtcontrat.checked then begin
pwhere:= pwhere+' AND (Empregados2.NASCIM =:nascimento) ';
params.add;
params[ind].name:= 'nascimento';
params[ind].asstring:= mskdata2.text;
end;
end;
stringsql:= pselect+pfrom+pwhere+pgroup;
sql.add(stringsql);
open;
end;
end;
Conexo com o Banco de Dados Oracle via BDE 147
Objetivo: Criar uma consult a, ut ilizando as t abelas FUNCIONARIOS, DEPTO,
CARGOS, EMPXDEP, EMPXCARGO, at ravs de 4 variveis, que iro compor o
comando SELECT. Sendo elas:


pselect Escolhe os campos que sero exibidos pela consult a;


pfrom Seleciona as t abelas da consult a;


pwhere Seleciona a condio da consult a;


pgroup Agrupa os dados, se necessrio, da consult a.
Cada varivel recebe um valor inicial, podendo ser int eirament e modificado ou
concat enado com out ro, variando conforme a escolha de alguma opo da t ela de
consult a. Ao final, seus valores sero somados em uma nica varivel: stringsql.
Observao:
A consult a gerada atravs de um join realizado nas cinco tabelas
criadas, onde obt eremos de cada uma a informao necessria. A figura 9.119 nos
most ra o relacionament o de cada tabela:
Obtm o nome do departamento em Obtm o nome do cargo de
que cada funcionrio trabalha. cada funcionrio da empresa.
Figura 0.110
148
10. Conexo com o Banco de Dados Oracle
via dbExpress
Componontos Rolorontos a Conoxo
O Delphi incluiu na verso 6 a aba dbExpress, que t raz component es responsveis
pela conexo com o banco de dados Oracle de uma forma mais rpida.
Ao ut ilizarmos os component es localizados nessa aba, nossas aplicaes se t orna-
ro portveis para o Kylix, o que no acont ece ao ut ilizarmos o ADO, que um
padro propriet rio do Windows.
A figura 10.1 nos most ra, ut ilizando os principais component es, como o Delphi
t rat a o acesso ao banco de dados.
TSQIConnoction
O componente TSQLConnect ion nos permit e est abelecer uma conexo com o ban-
co de dados Oracle atravs do driver dbExpress e de dois arquivos .ini
(dbxdrivers.ini e dbxconnect ions.ini).
O primeiro, dbxdrivers.ini, cont m os t ipos de drivers inst alados (Oracle, DB2,
MySql, et c.) e, para cada driver, as bibliot ecas (DLLs) com as configuraes pa-
dro com os parmet ros de conexo.
O segundo, dbxconnect ions.ini, cont m um conjunto de configuraes (nome e
senha do usurio, inst ncia do banco, et c.) para conexo com os diversos t ipos de
bancos de dados.
Conexo com o Banco de Dados Oracle via dbExpress 149


SQLConnection
DataSource
SQLClientDataSet
SQLDataSet SQLQuery
Figura 10.1
Adiant e est o list adas as principais propriedades para est abelecermos uma conexo
com o banco de dados Oracle.
Nome: Connected
Tipo: Boolean
Descrio: Indica se foi est abelecida uma conexo com o banco de dados Oracle.
Nome: Connecti onName
Tipo: String
Descrio: Especifica qual a configurao, cont ida no arquivo dbconnections.ini,
a ser ut ilizada para conexo com o banco de dados.
Ao alt er-la, aut omat icament e as propriedades drivername e params sero modifi-
cadas conforme configurao do arquivo dbconnections.ini.
Nome: Dri verName
Tipo: String
Descrio: Especifica qual o driver, cont ido no arquivo dbxdriver.ini, a ser ut iliza-
do para conexo com o banco de dados.
150 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Essa propriedade aut omat icament e alt erada quando modificamos a proprieda-
de Connect ionName.
Nome: LoginPrompt
Tipo: Boolean
Descrio: Especifica se a caixa de login ser exibida quando o aplicat ivo t ent ar
um conexo no banco de dados Oracle.
Nome: Params
Tipo: TSt rings
Descrio: Especifica os parmet ros necessrios para a conexo como o banco de
dados.
TSQIDataSot
O TSQLDat aSet um component e de uso geral, ou seja, t ant o pode ser ut ilizado
para execut ar uma query, uma storage procedure ou uma t able.
Diferent e de out ros datasets, TSQLDataSet um componente unidirecional, ou
seja, no bufferiza diversos regist ros na memria. Em funo disso, soment e os
mt odos First e Next podero ser ut ilizados.
A seguir as principais propriedades dest e component e.
Nome: CommandText
Tipo: String
Descrio: Depende do valor da propriedade CommandType:
ct Query CommandText ser o comando SQL a ser execut ado;
ct St oredProc CommandText ser o nome da St orage Procedure a ser execut ada;
ctTable CommandText ser o nome da t abela no servidor.
Nome: CommandType
Tipo: TSQLCommandType
Descrio: indicar o t ipo de comando que est ar cont ido na propriedade Com-
mandText.
Nome: DataSource
Tipo: TDat aSource
Descrio: Especifica o component e TDataSource a ser ut ilizado.
Conexo com o Banco de Dados Oracle via dbExpress 151
Nome: SQLConnecti on
Tipo: TSQLConnect ion
Descrio: Especifica o component e TSQLConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados.
A seguir os principais mt odos dest e component e.
Nome: Close
Descrio: Alt era o valor da propriedade Act ive para false.
Nome: ExecSql
Descrio: Execut a uma declarao SQL que no retorna um conjunto de resulta-
dos.
Nome: Open
Descrio: Alt era o valor da propriedade Act ive para true, executando uma decla-
rao SQL que ret orne um conjunt o de result ados.
TSQIQuory
O componente permit e que o aplicat ivo submet a declaraes SQL para o banco de
dados Oracle, at ravs do component e TSQLConnect ion.
Assim como o TSQLDat aSet, TSQLQuery um component e unidirecional, ou
seja, no bufferiza o result ado dos comandos SQL (at ravs do comando SELECT)
na memria. Em funo disso, soment e os mtodos First e Next podero ser ut ili-
zados. Dessa forma, os regist ros jamais podero ser visualizados atravs de
DBGrids, et c. A seguir as principais propriedades dest e component e.
Nome: DataSource
Tipo: TDat aSource
Descrio: Especifica o component e TDataSource a ser ut ilizado.
Nome: SQL
Tipo: String
Descrio: Armazena uma declarao SQL.
Nome: SQLConnecti on
Tipo: TSQLConnect ion
Descrio: Especifica o component e TSQLConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados.
152 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
A seguir os principais mt odos dest e component e.
Nome: Close
Descrio: Alt era o valor da propriedade Act ive para false.
Nome: ExecSql
Descrio: Execut a uma declarao SQL que no retorna um conjunto de resulta-
dos.
Nome: Open
Descrio: Alt era o valor da propriedade Act ive para true, executando uma decla-
rao SQL que ret orne um conjunt o de result ados.
TSQIC!iontDataSot
O componente TSQLClient Dat aSet t alvez seja o component e mais verst il da aba
dbExpress. Ele incorpora as propriedades do component e TSQLConnect ion, (no
precisa do mesmo para se conect ar ao banco de dados) e do component e
TSQLDat aSet ( capaz de execut ar comandos SQL, st orage procedures e t ables),
alm de bufferizar result ados de clusulas SQL (regist ros) na memria. At ravs
desse component e o result ado de nossas querys poder, agora, ser visualizado
at ravs de um DBGrid, et c.
Tal versat ilidade, porm, t em um cust o: em funo da bufferizao, esse compo-
nent e torna a mquina cliente mais lent a, perdendo em performance para o compo-
nent e TSQLDat aSet .
Principais propriedades:
Nome: CommandText
Tipo: String
Descrio: Depende do valor da propriedade CommandType:
ct Query CommandText ser o comando SQL a ser execut ado;
ct St oredProc CommandText ser o nome da St orage Procedure a ser execut ada;
ctTable CommandText ser o nome da t abela no servidor.
Nome: CommandType
Tipo: TSQLCommandType
Descrio: Indicar o t ipo de comando que estar cont ido na propriedade
CommandText .
Conexo com o Banco de Dados Oracle via dbExpress 153
Nome: Connecti onName
Tipo: String
Descrio: Especifica qual a configurao, cont ida no arquivo dbconnections.ini,
a ser ut ilizada para conexo com o banco de dados.
Nome: DBConnecti on
Tipo: TSQLConnect ion
Descrio: Especifica o component e TSQLConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados.
Ao alt er-la, aut omat icament e a propriedade connectionName ser modificada,
onde seu valor ficar em branco, pois j est amos ut ilizando as configuraes do
component e SQLConnect ion.
TDatasourco
Permit e est abelecer uma conexo ent re um ou mais component es Dat a Cont rols
(dbgrids, dbedit , et c.) e em cada component e TSQLQuery, TSQLDat aSet ou
TSQLClient Dat aSet . A seguir, mostrada a propriedade mais import ant e desse
component e.
Nome: DataSet
Tipo:TDat aSet
Descrio: Especifica o dat aset do qual o component e obt m seus dados.
Fxomp!o Do!phi-dbFxpross com Orac!o
As t abelas a serem criadas no banco de dados, conforme exemplos ant eriores, ut ili-
zaro a const raint FOREIGN KEY com a clusula DELETE CASCADE. Dessa
forma, toda a int egridade de dados ser cont rolada pelo banco de dados Oracle.


Criando a t abela de empregados:
SQL > CREATE TABLE EMPREGADOS4
2 (MATRICULA VARCHAR2(5) NOT NULL,
3 NOME VARCHAR2(30) NOT NULL,
4 SALARIO NUMBER NULL,
5 ENDERECO VARCHAR2(50) NULL,
6 CONSTRAINT PK_MATRIC PRIMARY KEY (MATRICULA));
154 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE


Criando a t abela de cargos:
SQL > CREATE TABLE CARGOS4
2 (CODCARGO VARCHAR2(3) NOT NULL,
3 DESCRICAO VARCHAR2(25) NULL,
4 CONSTRAINT PK_CODCARGO4 PRIMARY KEY (CODCARGO));


Criando a t abela de relacionament os de empregados com cargos:
SQL > CREATE TABLE EMPXCARGO4
2 (MATRICULA VARCHAR2(5) NOT NULL,
3 CODCARGO VARCHAR2(3) NOT NULL,
4 CONSTRAINT FK_CODCARGO4 FOREIGN KEY (CODCARGO)
5 REFERENCES CARGOS4(CODCARGO) ON DELETE CASCADE,
6 CONSTRAINT FK_MATRIC FOREIGN KEY (MATRICULA)
7 REFERENCES EMPREGADOS4(MATRICULA) ON DELETE
CASCADE);


Criando a t abela de depart ament os:
SQL > CREATE TABLE DEPTO4
2 (CODDEP VARCHAR2(3) NOT NULL,
3 DESCRICAO VARCHAR2(30) NULL,
4 CONSTRAINT PK_CODDEP4 PRIMARY KEY (CODDEP));


Criando a t abela de relacionament os de empregados com depart amentos:
SQL > CREATE TABLE EMPXDEP4
2 (MATRICULA VARCHAR2(5) NOT NULL,
3 CODDEP VARCHAR2(3) NOT NULL,
4 CONSTRAINT FK_MATRI4 FOREIGN KEY (MATRICULA)
5 REFERENCES EMPREGADOS4(MATRICULA) ON DELETE
CASCADE,
6 CONSTRAINT FK_CODDEP4 FOREIGN KEY (CODDEP)
7 REFERENCES DEPTO4(CODDEP) ON DELETE CASCADE);
Aps criarmos as t abelas da nossa aplicao, devemos ent o execut ar o Delphi. A
aplicao ser desenvolvida, conforme os exemplo ant eriores, em duas part es:
Part e 1 Criao dos component es necessrios;
Part e 2 Explicao do cdigo gerado para cada component e criado.
Conexo com o Banco de Dados Oracle via dbExpress 155
Parto 1 - Criao dos componontos nocossrios
Ftapa 1 - Criao do um novo Datamodu!o
Um novo Datamodule deve ser adicionado ao projet o. V em File->New-
>DataModule. Os seguint es valores devero ser modificados:
Figura 10.2
O DataModule dever ser salvo como udmexemplo4.pas
Ftapa 2 - Adio do 4 componontos da aba dbFxpross ao
Datamodu!o
Conforme Figura 10.3, 4 component es devero ser adicionados:
Figura 10.8
1
2
3
4
156 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TSQLConnect ion
Figura 10.4
2
TClient Dat aSet
3
TSQLQuery
Fi gura 10. Figura 10.0
Conexo com o Banco de Dados Oracle via dbExpress 157
4
TDat aSource
Figura 10.7
Ftapa 8 - Criao, no lormu!rio principa!, do
pagocontro! o sous componontos
Uma vez criados os component es no TDataModule, deveremos, ento, criar o pa-
gecontrol, assim como 6 tabsheets que devero t er sua propriedade Caption modi-
ficadas para Empregados, Cargos, Departamentos, Empregados X Cargos, Empre-
gados X Departamentos e Consulta conforme most ra a figura 10.8.
Figura 10.8
Pagecontrol
Tabsheet1
Tabsheet2
Tabsheet3
Tabsheet4
Tabsheet5
Tabsheet6
158 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Ftapa 8.1 - Criao do componontos na tabshoot1
Figura 10.0
No coment arei os labels criados em nenhuma das et apas, pois a nica proprieda-
de que iremos set ar de cada um o caption, que deve ser a mesma das figuras
most radas. Os seguint es valores devero ser modificados:
Tabsheet1
1
2
3
4
5
6
Conexo com o Banco de Dados Oracle via dbExpress 159
1
TDBGrid
3
TEdit
Figura 10.10 Figura 10.12
2
TEdit


4
TEdit
Figura 10.11 Figura 10.18
160 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
5
TEdit
Figura 10.14
6
TButt ons
Nos component es TButtons criados, deveremos modificar a propriedade name para
Button1, Button2,...,Button7, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 10.9.
Ftapa 8.2 - Criao do componontos na tabshoot2
4
Figura 10.1
Tabsheet2
1
2
3
Conexo com o Banco de Dados Oracle via dbExpress 161
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Figura 10.10 Figura 10.18
2
TEdit
Figura 10.17
162 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4
TButt ons
Nos component es TButtons criados, deveremos alt erar a propriedade name para
Button7, Button8,...,Button14, seguindo a ordem da esquerda para a direit a. A pro-
priedade caption de cada um deve ser alt erada conforme a figura 10.15.
Ftapa 8.8 - Criao do componontos na tabshoot8
Figura 10.10
3
2
1
Tabsheet3
4
Conexo com o Banco de Dados Oracle via dbExpress 163
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Figura 10.20 Fi gura 10.22
2
TEdit
Figura 10.21
164 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4
TButt ons
Nos component es TButtons criados deveremos alt erar a propriedade name para
Button15, Button16,...,Button21, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 10.19.
Ftapa 8.4 - Criao do componontos na tabshoot4
Figura 10.28
3
2
1
Tabsheet4
4
Conexo com o Banco de Dados Oracle via dbExpress 165
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Figura 10.24 Figura 10.20
2
TEdit
Fi gura 10.2
166 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4
TButt ons
Nos component es TButtons criados, deveremos alt erar a propriedade name para
Button22, Button23,...,Button28, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 10.23.
Ftapa 8. - Criao do componontos na tabshoot
Figura 10.27
4
3
2
1
Tabsheet5
Conexo com o Banco de Dados Oracle via dbExpress 167
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Figura 10.28 Figura 10.80
2
TEdit
Figura 10.20
168 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4
TButt ons
Nos component es TButtons criados, deveremos alt erar a propriedade name para
Button29, Button30,...,Button35, seguindo a ordem da esquerda para a direit a. A
propriedade caption de cada um deve ser alt erada conforme a figura 10.27.
Ftapa 8.0 - Criao do componontos na tabshoot0
Figura 10.81
Tabsheet6
1
2 3
4
5
6
7
8
9
10
11
12
13
14
15
16 17 18
19
Conexo com o Banco de Dados Oracle via dbExpress 169
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TRadioButt on
Fi gura 10.82 Fi gura 10.84
2
TGroupBox
4
TRadioButton
Figura 10.88 Figura 10.8
170 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
5
TEdit
7
TRadioButton
Figura 10.80 Figura 10.88
6
TGroupBox
8
TRadioButt on
Figura 10.87 Figura 10.80
Conexo com o Banco de Dados Oracle via dbExpress 171
9
TRadioButt on
11
TGroupBox
Figura 10.40 Fi gura 10.42
10
TButton
12
TRadioButton
Fi gura 10.41 Figura 10.48
172 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
13
TRadioButton
15
TGroupBox
Figura 10.44 Figura 10.40
14
TEdit
16
TRadioButton
Figura 10.4 Fi gura 10.47
Conexo com o Banco de Dados Oracle via dbExpress 173
17
TRadioButton
18
TEdit
Fi gura 10.48 Figura 10.40
19
TButtons
Nos component es TButtons criados, deveremos alt erar a propriedade name para
Button36 e Button37, seguindo a ordem da esquerda para a direit a. A propriedade
caption de cada um deve ser alt erada conforme a figura 10.31.
Parto 2 - Fxp!icao do cdigo gorado para cada
compononto criado
Antes de iniciarmos a explicao sobre o funcionament o de cada tabsheet, deve-
mos criar uma varivel global do t ipo TTransactiondesc, que ser responsvel por
ident ificar a transao corrent e em nossa aplicao:
...
var
Form1: TForm1;
pinclui: boolean;
td: ttransactiondesc;
implementation
....
Vari vel global
174 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Se essa varivel no for criada, todo comando INSERT, UPDATE ou DELETE
que for execut ado na propriedade SQL do component e TSQLQuery, automat ica-
ment e ser confirmada no bando de dados Oracle, no permit indo dessa forma o
cancelamento de qualquer t ransao.
Em seguida, algumas procedures e funes de uso geral do projet o devem ser cria-
das. A procedure a seguir responsvel por limpar os component es cont idos em
cada Tabsheet :
procedure TForm1.limpacomponentes;
var
ind: integer;
begin
for ind:= 0 to ComponentCount-1 do begin
if components[ind] is tedit then
(components[ind] as tedit).clear;
end;
end;
Ser necessrio criarmos uma procedure que inicie uma t ransao em nossa aplica-
o.
procedure TForm1.iniciatransacao;
begin
with datamodule2.sqlconnection1 do begin
if not InTransaction then begin
td.transactionid:= 1;
td.isolationlevel:= xilREADCOMMITTED;
starttransaction(td);
end;
end;
end;
A procedure ant erior verifica se exist e alguma t ransao em aberto; caso no exis-
t a, inicia uma nova com a varivel global td criada anteriorment e.
Uma vez que todas as instrues SQL de incluso, excluso e alt erao sero exe-
cut adas na SQLQuery1, a procedure a seguir evit a a replicao de cdigo em nosso
projeto, bast ando para isso que passemos como parmet ro a instruo SQL deseja-
da.
procedure TForm1.executasql(stringsql: string);
begin
with datamodule2.SQLQuery1 do begin
close;
sql.clear;
sql.add(stringsql);
execsql;
end;
end;
Conexo com o Banco de Dados Oracle via dbExpress 175
Para que toda incluso, alt erao e excluso de registros efet uada no banco de da-
dos reflit a nos dbgrids do projeto, necessrio fechar e abrir, logo em seguida, a
SQLquery associada a ele. As procedures executasql2 e executarefresh list adas
logo adiant e sero responsveis por essa t arefa.
procedure TForm1.executasql2(stringsql: string);
begin
with datamodule2.SQLClientDataSet1 do begin
close;
commandtext:= stringsql;
open;
end;
end;
procedure TForm1.executarefresh;
begin
with pagecontrol1 do begin
if activepage = tabsheet1 then
executasql2('select * from empregados4 order by 1')
else if activepage = tabsheet2 then
executasql2('select * from cargos4 order by 1')
else if activepage = tabsheet3 then
executasql2('select * from depto4 order by 1')
else if activepage = tabsheet4 then
executasql2('select empregados4.matricula, empregados4.nome, '+
' cargos4.codcargo, cargos4.descricao '+
'from empregados4 empregados4, cargos4 cargos4, empxcargo4 empxcargo4 '+
'where empregados4.matricula = empxcargo4.matricula and '+
' cargos4.codcargo = empxcargo4.codcargo ')
else if activepage = tabsheet5 then
executasql2('select empregados4.matricula, empregados4.nome, '+
'depto4.coddep, depto4.descricao '+
'from empregados4 empregados4, depto4 depto4, empxdep4 empxdep4 '+
'where empregados4.matricula = empxdep4.matricula and '+
' depto4.coddep = empxdep4.coddep ')
else if activepage = tabsheet6 then
datamodule2.SQLClientDataSet1.Close;
end;
end;
A seguir, sero explicados, atravs de etapas, o funcionamento de cada tabsheet,
assim como os event os referent es ao formulrio, pagecontrol e a cada bot o.
Ftapa 1 - Formu!rio principa! [Form1)
o formulrio do nosso projeto, onde est o cont idos t odos os component es.
176 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Evento: OnAct ivat e
Cdigo:
procedure TForm1.FormActivate(Sender: TObject);
var
stringsql: string;
begin
pagecontrol1.activepage:= tabsheet1;
stringsql:= 'select * from empregados4';
executasql2(stringsql);
limpacomponentes;
pinclui:= false;
end;
Objetivo: Inicializar nosso projet o, definindo a tabsheet1 como at iva, limpando os
component es e execut ando o comando SQL para exibir os dados da t abela EM-
PREGADOS4.
Ftapa 2 - PagoContro!
o componente que cont m t odas as tabsheets de nosso projet o.
Evento: OnChange
Cdigo:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
executarefresh;
limpacomponentes;
end;
Objetivo: Verifica qual a tabsheet que est at iva, at ualizando os dados no dbgrid
corrent e, at ravs da procedure executarefresh, e em seguida limpa os component es
da t ela.
Ftapa 8 - Tabshoot1 [Cadastro do Funcionrios)
1

DbGri d1
Exibir informaes da tabela EMPREGADOS4, at ravs da SQLClientDataSet1.
Evento: No exist e.
2

EdtMatri c
Armazenar em memria o nmero da mat rcula do funcionrio a ser inserida ou
alt erada at que possa ser transferido para o banco de dados.
Evento: No exist e.
3

EdtNome
Armazenar em memria o nome do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
Conexo com o Banco de Dados Oracle via dbExpress 177
4

EdtEnder
Armazenar em memria o endereo do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
5

EdtSal ario
Armazenar em memria o salrio do funcionrio a ser inserido ou alt erado.
Evento: No exist e.
6

Button1
A rot ina de incluso deve colocar a tabsheet1 em condies de inserir informaes
em seus component es, para t ransferi-las post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
begin
iniciatransacao;
panel2.enabled:= true;
pinclui:= true;
edtmatric.setfocus;
end;
Objetivo: Iniciar uma t ransao, caso nenhuma est eja at iva, alt erar o valor da vari-
vel global pinclui, informando que na t abela EMPREGADOS4 um novo regist ro
ser inserido e alt erar o valor da propriedade enabled para t rue no panel2.
NOTA:
Em t odos os bot es cont idos nas t absheet s de nosso projeto, a procedure
iniciat ransao est present e, execut ando a mesma funo. Dessa forma, no ser
mais explicada a funo da mesma.
6

Button2
A rot ina de excluso permit e que um funcionrio e seus respect ivos relacionamen-
t os sejam apagados, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button2Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from empregados4 '+
'where matricula = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['MATRICULA']+#39;
executasql(stringsql);
178 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
except
showmessage('No foi possvel excluir o registro !');
end;
executarefresh;
end;
Objetivo: Exclui o regist ro nas t abelas EMPREGADOS4, EMPXCARGO4 e EM-
PXDEP4 ut ilizando o registro corrente do SQLClientDataSet1, onde logo em se-
gui da um refresh execut ado para que a excluso reflit a no dbgrid.
6

Button3
A alt erao deve ser capaz de modificar as informaes cont idas nos component es
pert encent es a tabsheet1.
Evento: OnClick
Cdigo:
procedure TForm1.Button3Click(Sender: TObject);
begin
iniciatransacao;
panel2.enabled:= true;
pinclui:= false;
with datamodule2.SQLClientDataSet1 do begin
edtmatric.text:= FieldValues['MATRICULA'];
edtnome.text:= FieldValues['NOME'];
edtsalario.text:= FieldValues['SALARIO'];
edtender.text:= FieldValues['ENDERECO'];
end;
edtmatric.enabled:= false;
edtnome.setfocus;
end;
Objetivo: Transfere os valores dos campos da tabela EMPREGADOS4, contidos no
regist ro corrent e do SQLClientDataSet1, para a propriedade text dos componentes da
tabsheet1. Alt erar o valor da varivel global pinclui, informando que o registro ser
alt erado, modificar o valor da propriedade enabled para true no panel2, permitindo que
as informaes sejam modificadas e mudar o valor da propriedade enabled para false
no component e edtmatric, pois o valor da chave primria no pode ser alt erado.
6

Button4
O bot o Ok responsvel por t ransferir as informaes cont idas nos componentes
da tabsheet1 para o banco de dados Oracle, alt erando ou inserindo um registro.
Evento: OnClick
Cdigo:
procedure TForm1.Button4Click(Sender: TObject);
var
stringsql: string;
Conexo com o Banco de Dados Oracle via dbExpress 179
begin
if pinclui then begin
try
stringsql:= 'insert into empregados4 values ('+#39;
stringsql:= stringsql + edtmatric.text+#39+', '+#39;
stringsql:= stringsql + edtnome.text+#39+', ';
stringsql:= stringsql + edtsalario.text+', '+#39;
stringsql:= stringsql + edtender.text+#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir o registro !');
end;
end
else begin
try
stringsql:= 'update empregados4 set ';
stringsql:= stringsql + 'matricula = '+#39+edtmatric.text+#39+', ';
stringsql:= stringsql + 'nome = '+#39+edtnome.text+#39+', ';
stringsql:= stringsql + 'salario = '+edtsalario.text+', ';
stringsql:= stringsql + 'endereco = '+#39+edtender.text+#39+' ';
stringsql:= stringsql + 'where matricula = '+#39+edtmatric.text+#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar o registro !');
end;
end;
edtmatric.enabled:= true;
panel2.enabled:= false;
executarefresh;
limpacomponentes;
end;
Objetivo: Em funo do valor da varivel global pinclui, um comando SQL de
incluso ou alt erao deve ser execut ado, transferindo o cont edo da propriedade
text de cada componente para a tabela EMPREGADOS4
1
. preciso modificar o
valor da propriedade enabled para false no panel2, execut ando logo em seguida um
refresh para que a at ualizao reflit a no dbgrid.
6

Button5
Essa rot ina alt era para permanente as at ualizaes pendent es em todas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button5Click(Sender: TObject);
begin
try

1
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
180 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
datamodule2.sqlconnection1.commit(td);
executarefresh;
except
showmessage('No foi possvel confirmar a transao !');
end;
end;
Objetivo: Execut ar o comando COMMIT no banco de dados, finalizando a t ransa-
o, e um refresh para que a at ualizao reflit a no dbgrid.
6

Button6
Cancelar as at ualizaes pendent es em t odas as t abelas do banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button6Click(Sender: TObject);
begin
try
datamodule2.sqlconnection1.rollback(td);
executarefresh;
except
showmessage('No foi possvel desfazer a transao !');
end;
end;
Objetivo: Execut ar o comando ROLLBACK, finalizando a t ransao no banco de
dados e um refresh para que a at ualizao reflit a no dbgrid.
Ftapa 4 - Tabshoot2 [Cadastro do Cargos)
1

DbGri d2
Exibir informaes da tabela CARGOS4, at ravs do SQLClientDataSet1.
Evento: No exist e.
2

EdtCodCargo
Armazenar em memria, at ser transferido para o banco de dados, o cdigo do
cargo a ser inserido ou alt erado.
Evento: No exist e.
3

EdtDescCargo
Armazenar em memria, at ser transferido para o banco de dados, a descrio do
cargo a ser inserido ou alt erado.
Evento: No exist e.
Conexo com o Banco de Dados Oracle via dbExpress 181
4

Button8
A rot ina de incluso deve ser capaz de colocar a tabsheet2 em condies de inserir
informaes nos component es edtcodcargo e edtdesccargo, de onde ser t ransferi-
da post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button8Click(Sender: TObject);
begin
iniciatransacao;
panel4.enabled:= true;
pinclui:= true;
edtcodcargo.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando ao projet o que um
novo regist ro ser inserido na t abela CARGOS4 e alt erar o valor da propriedade
enabled para true no panel4, permit indo que informaes sejam inseridas nos com-
ponent es.
4

Button9
A rot ina de excluso deve permit ir que um cargo e seus respect ivos relacionamen-
t os, at ravs da constraint criada, sejam apagados.
Evento: OnClick
Cdigo:
procedure TForm1.Button9Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from cargos4 '+
'where codcargo = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODCARGO']+#39;
executasql(stringsql);
except
showmessage('No foi possvel excluir o registro !');
end;
executarefresh;
end;
Objetivo: Excluir os regist ros nas t abelas CARGOS4 e EMPXCARGO4, ut ilizando
o registro corrent e da SQLQuery1, execut ando logo em seguida um refresh para
que a excluso reflit a no dbgrid.
182 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4

Button10
A rot ina de alt erao deve ser capaz de colocar a tabsheet2 em condies de alt erar
as informaes cont idas nos component es edtcodcargo e edtdesccargo.
Evento: OnClick
Cdigo:
procedure TForm1.Button10Click(Sender: TObject);
begin
iniciatransacao;
panel4.enabled:= true;
pinclui:= false;
with datamodule2.SQLClientDataSet1 do begin
edtcodcargo.text:= FieldValues['CODCARGO'];
edtdesccargo.text:= FieldValues['DESCRICAO'];
end;
edtcodcargo.enabled:= false;
edtdesccargo.setfocus;
end;
Objetivo: Transferir para a propriedade text dos component es edtcodcargo e
edtdesccargo, os valores dos campos CODCARGO e DESCRICAO, cont idos no
registro corrent e do SQLClientDataSet1. Alterar o valor da varivel global pinclui,
informando ao projeto que o regist ro ser alt erado na tabela CARGOS, alt erar o valor
da propriedade enabled para true no panel4, permit indo que as informaes sejam
modificadas nos component es e, por fim, alterar o valor da propriedade enabled para
false no component e edtcodcargo, pois no devemos alterar o valor da chave prim-
ria.
4

Button11
A rot ina cont ida no bot o Ok responsvel por transferir as informaes cont idas
nos component es da tabsheet2 para o banco de dados Oracle, alt erando ou inserin-
do um regist ro.
Evento: OnClick
Cdigo:
procedure TForm1.Button11Click(Sender: TObject);
var
stringsql: string;
begin
if pinclui then begin
try
stringsql:= 'insert into cargos4 values ('+#39;
stringsql:= stringsql + edtcodcargo.text+#39+', '+#39;
stringsql:= stringsql + edtdesccargo.text+#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir o registro !');
end;
Conexo com o Banco de Dados Oracle via dbExpress 183
end
else begin
try
stringsql:= 'update cargos4 set ';
stringsql:=stringsql+'codcargo='+#39+edtcodcargo.text+#39+', ';
stringsql:=stringsql+'descricao='+#39+edtdesccargo.text+#39+' ';
stringsql:=stringsql+'where codcargo='+#39+edtcodcargo.text+#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar o registro !');
end;
end;
edtcodcargo.enabled:= true;
panel2.enabled:= false;
executarefresh;
limpacomponentes;
end;
Objetivo: Verificar, at ravs da varivel global pinclui, se um comando SQL de
incluso ou alt erao deve ser execut ado, transferindo a informao cont ida na
propriedade text de cada component e para a t abela CARGOS4
2
. Alt erar o valor da
propriedade enabled para false no panel4 e execut ar um refresh para que a at uali-
zao reflit a no dbgrid.
4

Button12
Fica a cargo dessa rot ina tornar permanent es as at ualizaes pendent es em t odas as
t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Execut ar o comando COMMIT, finalizando a t ransao no banco de da-
dos, e execut ar um refresh para que a at ualizao reflit a no dbgrid.
4

Button13
Est a rot ina, ao cont rrio da ant erior, cancela as at ualizaes pendent es em t odas as
t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.

2
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
184 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Objetivo: Execut ar o comando ROLLBACK, finalizando a t ransao no banco de
dados, e execut ar um refresh para que a at ualizao reflit a no dbgrid.
Ftapa - Tabshoot8 [Cadastro do Dopartamontos)
1

DbGri d3
Exibir informaes da tabela DEPTO4, at ravs do SQLClienteDataSet1.
Evento: No exist e.
2

EdtCodDep
Armazenar em memria o cdigo do depart amento a ser inserido ou alt erado at
que possa ser t ransferido para o banco de dados.
Evento: No exist e.
3

EdtDescDep
Armazenar em memria a descrio do depart amento a ser inserido ou alt erado at
que possa ser t ransferido para o banco de dados.
Evento: No exist e.
4

Button15
Est a rot ina deve colocar a tabsheet3 em condies de inserir informaes nos com-
ponent es, para post erior t ransferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button15Click(Sender: TObject);
begin
iniciatransacao;
panel6.enabled:= true;
pinclui:= true;
edtcoddepto.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando que um novo re-
gist ro ser inserido na t abela DEPTO4 e alt erar o valor da propriedade enabled
para true no panel6.
4

Button16
Est a rot ina permit e que um depart ament o e seu respect ivo relacionamento sejam
apagados, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button16Click(Sender: TObject);
Conexo com o Banco de Dados Oracle via dbExpress 185
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from depto4 '+
'where coddep = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODDEP']+#39;
executasql(stringsql);
except
showmessage('No foi possvel excluir o registro !');
end;
executarefresh;
end;
Objetivo: Excluir os regist ros nas t abelas DEPTO4 e EMPXDEP4, ut ilizando o
regist ro corrent e do SQLCLientDataSet1 e execut ar em seguida um refresh para
que a excluso reflit a no dbgrid.
4

Button17
A rot ina de alt erao de um depart amento deve ser capaz de colocar a tabsheet3 em
condies de alt erar as informaes cont idas em seus component es.
Evento: OnClick
Cdigo:
procedure TForm1.Button17Click(Sender: TObject);
begin
iniciatransacao;
panel6.enabled:= true;
pinclui:= false;
with datamodule2.SQLClientDataSet1 do begin
edtcoddepto.text:= FieldValues['CODDEP'];
edtdescdepto.text:= FieldValues['DESCRICAO'];
end;
edtcoddepto.enabled:= false;
edtdescdepto.setfocus;
end;
Objetivo: Os valores dos campos CODDEP e DESCRICAO, cont idos no registro
corrent e do SQLClientDataSet1, devem ser t ransferidos para a propriedade text dos
component es edtcoddepto e edtdescdepto. O valor da varivel global pinclui ser
alt erado, informando que o regist ro ser alt erado na t abela DEPTO4. Alt erar o
valor da propriedade enabled para true no panel6, permit indo que as informaes
sejam modificadas nos component es e, como no devemos alterar o valor da chave
primria, a propriedade enabled ser modificada para false no component e edtco-
ddepto.
4

Button18
186 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
A rot ina cont ida no bot o Ok responsvel por transferir as informaes cont idas
nos component es da tabsheet3 para o banco de dados Oracle, alt erando ou inserin-
do um regist ro.
Evento: OnClick
Cdigo:
procedure TForm1.Button18Click(Sender: TObject);
var
stringsql: string;
begin
if pinclui then begin
try
stringsql:= 'insert into depto4 values ('+#39;
stringsql:= stringsql + edtcoddepto.text+#39+', '+#39;
stringsql:= stringsql + edtdescdepto.text+#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir o registro !');
end;
end
else begin
try
stringsql:= 'update depto4 set ';
stringsql:= stringsql + 'coddep = '+#39+edtcoddepto.text+#39+', ';
stringsql:= stringsql +'descricao = '+#39+edtdescdepto.text+#39+' ';
stringsql:= stringsql +'where coddep = '+#39+edtcoddepto.text+#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar o registro !');
end;
end;
edtcoddepto.enabled:= true;
panel4.enabled:= false;
executarefresh;
limpacomponentes;
end;
Objetivo: Em funo do valor da varivel global pinclui, um comando SQL de
incluso ou alt erao deve ser execut ado, onde a informao cont ida na proprieda-
de text de cada component e ser transferida para a t abela DEPTO4
3
. Modificar o
valor da propriedade enabled para false no panel6, execut ando logo em seguida um
refresh para que a at ualizao reflit a no dbgrid.
4

Button19
Essa rot ina t ransforma em permanent e as at ualizaes pendent es em t odas as t abe-
las do banco de dados.

3
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
Conexo com o Banco de Dados Oracle via dbExpress 187
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Execut ar o comando COMMIT no banco de dados, finalizando a transa-
o, e um refresh para que a at ualizao reflit a no dbgrid.
4

Button20
Ao cont rrio da ant erior, cancela as at ualizaes pendent es em todas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o comando ROLLBACK no banco de dados, finalizando a t ran-
sao, e um refresh para que a at ualizao reflit a no dbgrid.
Ftapa 0 - Tabshoot4 [Cadastro do ro!acionamontos ontro
Fmprogados o Cargos)
1

DbGri d4
Exibir informaes da tabela EMPXCARGO4, atravs do SQLClientDataSet.
Evento: No exist e.
2

EdtMatri c2
Armazenar em memria a matrcula do funcionrio a ser inserida ou alt erada at
que possa ser t ransferida para o banco de dados.
Evento: No exist e.
3

EdtCodCargo2
Armazenar em memria o cdigo do cargo a ser inserido ou alt erado at que possa
ser transferido para o banco de dados.
Evento: No exist e.
4

Button22
Essa rot ina deve colocar a tabsheet4 em condies de inserir informaes nos
component es, para post erior t ransferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button22Click(Sender: TObject);
188 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
begin
iniciatransacao;
panel8.enabled:= true;
pinclui:= true;
edtmatric2.setfocus;
end;
Objetivo: Alt erar o valor da varivel global pinclui, informando que um novo re-
gist ro ser inserido na t abela EMPXCARGO4 e alterar o valor da propriedade ena-
bled para true no panel8.
4

Button23
Essa rot ina permit e que um funcionrio e seu respect ivo cargo sejam apagados.
Evento: OnClick
Cdigo:
procedure TForm1.Button23Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from empxcargo4 '+
'where matricula = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['MATRICULA']+#39+' and '+
'codcargo = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODCARGO']+#39;
executasql(stringsql);
except
showmessage('No foi possvel excluir o registro !');
end;
executarefresh;
end;
Objetivo: Excluir o regist ro do relacionament o entre empregado e cargo, na t abela
EMPXCARGO4, ut ilizando o regist ro corrente do SQLCLientDataSet1 e execut ar
em seguida um refresh para que a excluso reflit a no dbgrid.
4

Button24
A rot ina de alt erao de um empregado e seu cargo deve ser capaz de colocar a
tabsheet4 em condies de alt erar as informaes cont idas em seus component es.
Evento: OnClick
Cdigo:
procedure TForm1.Button24Click(Sender: TObject);
begin
iniciatransacao;
panel8.enabled:= true;
pinclui:= false;
with datamodule2.SQLClientDataSet1 do begin
edtmatric2.text:= FieldValues['MATRICULA'];
Conexo com o Banco de Dados Oracle via dbExpress 189
edtcodcargo2.text:= FieldValues['CODCARGO'];
end;
edtmatric2.enabled:= false;
edtcodcargo2.setfocus;
end;
Objetivo: Os valores dos campos MATRICULA E CODCARGO, cont idos no re-
gist ro corrent e do SQLClientDataSet1, devem ser t ransferidos para a propriedade
text dos componentes edtmatric2 e edtcodcargo2. O valor da varivel global pin-
clui ser alt erado, informando que o regist ro t ambm ser alterado na t abela
EMPXCARGO4. Alt erar o valor da propriedade enabled para true no panel8, per-
mit indo que as informaes sejam modificadas nos component es e, como no de-
vemos alt erar o valor da chave primria, a propriedade enabled ser modificada
para false no component e edtmatric2.
4

Button25
A rot ina cont ida no bot o Ok responsvel por transferir as informaes cont idas
nos component es da tabsheet4 para o banco de dados Oracle, alt erando ou inserin-
do um regist ro.
Evento: OnClick
Cdigo:
procedure TForm1.Button25Click(Sender: TObject);
var
stringsql: string;
begin
if pinclui then begin
try
stringsql:= 'insert into empxcargo4 values ('+#39;
stringsql:= stringsql + edtmatric2.text+#39+', '+#39;
stringsql:= stringsql + edtcodcargo2.text+#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir o registro !');
end;
end
else begin
try
stringsql:= 'update empxcargo4 set ';
stringsql:=stringsql+'matricula = '+#39+edtmatric2.text+#39+', ';
stringsql:=stringsql+'codcargo = '+#39+edtcodcargo2.text+#39+' ';
stringsql:= stringsql+'where matricula ='+#39+
edtmatric2.text+#39+' and ';
stringsql:= stringsql + ' codcargo = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODCARGO']+#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar o registro !');
end;
end;
190 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
edtmatric2.enabled:= true;
panel8.enabled:= false;
executarefresh;
limpacomponentes;
end;
Objetivo: Em funo do valor da varivel global pinclui, um comando SQL de
incluso ou alt erao deve ser execut ado. As informaes cont idas na propriedade
text de cada componente sero t ransferidas para a tabela EMPXCARGO4
4
. O valor
da propriedade enabled ser alt erado para false no panel6, execut ando logo em
segui da um refresh para que a at ualizao reflita no dbgrid.
4

Button26
Essa rot ina t ransforma em permanent e as at ualizaes pendent es em t odas as t abe-
las do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Finaliza a t ransao, execut ando o comando COMMIT no banco de da-
dos, e um refresh para que a at ualizao reflit a no dbgrid.
4

Button27
Ao cont rrio da ant erior, cancela as at ualizaes pendent es em todas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o comando ROLLBACK no banco de dados, finalizando a t ran-
sao, e um refresh para que a at ualizao reflit a no dbgrid.
Ftapa 7 - Tabshoot [Cadastro do ro!acionamontos ontro
Fmprogados o Dopartamontos)
1

DbGri d5
Exibir informaes da tabela EMPXDEP4, atravs do SQLClientDataSet.

4
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
Conexo com o Banco de Dados Oracle via dbExpress 191
Evento: No exist e.
2

EdtMatri c3
Armazenar em memria a matrcula do funcionrio a ser inserida ou alt erada at
que possa ser t ransferida para o banco de dados.
Evento: No exist e.
3

EdtCodDepto2
Armazenar em memria o cdigo do depart amento a ser inserido ou alt erado at
que possa ser t ransferido para o banco de dados.
Evento: No exist e.
4

Button29
Essa rot ina deve colocar a tabsheet5 em condies de inserir informaes nos
component es, para post erior t ransferncia para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button29Click(Sender: TObject);
begin
iniciatransacao;
panel10.enabled:= true;
pinclui:= true;
edtmatric3.setfocus;
end;
Objetivo: Informar que um novo registro ser inserido na tabela EMPXDEP4, mo-
dificar o valor da varivel global pinclui, e alt erar o valor da propriedade enabled
para true no panel10.
4

Button30
Est a rotina permite que um funcionrio e seu respect ivo depart amento sejam apagados.
Evento: OnClick
Cdigo:
procedure TForm1.Button30Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from empxdep4 '+
'where matricula = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['MATRICULA']+#39+' and '+
'coddep = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODDEP']+#39;
executasql(stringsql);
except
192 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
showmessage('No foi possvel excluir o registro !');
end;
executarefresh;
end;
Objetivo: Na t abela EMPXCARGO4, excluir o relacionamento ent re empregado e
depart ament o, ut ilizando o registro corrent e do SQLCLientDataSet1 e executar em
segui da um refresh para que a excluso reflit a no dbgrid.
4

Button31
Colocar a tabsheet4 em condies de modificar as informaes cont idas em seus
component es, at ravs da rot ina de alt erao de um empregado e seu depart amento.
Evento: OnClick
Cdigo:
procedure TForm1.Button31Click(Sender: TObject);
begin
iniciatransacao;
panel10.enabled:= true;
pinclui:= false;
with datamodule2.SQLClientDataSet1 do begin
edtmatric3.text:= FieldValues['MATRICULA'];
edtcoddepto2.text:= FieldValues['CODDEP'];
end;
edtmatric3.enabled:= false;
edtcoddepto2.setfocus;
end;
Objetivo: At ravs do regist ro corrent e do SQLClientDataSet1, os valores dos cam-
pos MATRICULA E CODDEP devem ser t ransferidos para a propriedade text dos
component es edtmatric3 e edtcoddepto2. Informar que o registro ser alt erado na
t abela EMPXDEP4, at ravs da alt erao do valor da varivel global pinclui. Modi-
ficar o valor da propriedade enabled para true no panel10, permit indo que as in-
formaes sejam modificadas nos component es e, como no devemos alt erar o
valor da chave primria, a propriedade enabled ser modificada para false no com-
ponent e edtmatric3.
4

Button32
Transferir as informaes cont idas nos component es da tabsheet5 para o banco de
dados Oracle, alt erando ou inserindo um registro, at ravs da rot ina cont ida no bo-
t o Ok.
Evento: OnClick
Cdigo:
procedure TForm1.Button32Click(Sender: TObject);
var
stringsql: string;
begin
Conexo com o Banco de Dados Oracle via dbExpress 193
if pinclui then begin
try
stringsql:= 'insert into empxdep4 values ('+#39;
stringsql:= stringsql + edtmatric3.text+#39+', '+#39;
stringsql:= stringsql + edtcoddepto2.text+#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir o registro !');
end;
end
else begin
try
stringsql:= 'update empxdep4 set ';
stringsql:=stringsql+'matricula = '+#39+edtmatric3.text+#39+', ';
stringsql:=stringsql + 'coddep = '+#39+edtcoddepto2.text+#39+' ';
stringsql:= stringsql + 'where matricula ='+#39+
edtmatric3.text+#39+' and ';
stringsql:= stringsql + ' coddep = '+#39+
datamodule2.SQLClientDataSet1.FieldValues['CODDEP']+#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar o registro !');
end;
end;
edtmatric2.enabled:= true;
panel10.enabled:= false;
executarefresh;
limpacomponentes;
end;
Objetivo: Execut ar um comando SQL de incluso ou excluso, em funo do valor
da varivel global pinclui. As informaes cont idas na propriedade text de cada
component e sero transferidas para a t abela EMPXDEP4
5
. O valor da propriedade
enabled ser alt erado para false no panel10, execut ando logo em seguida um re-
fresh para que a at ualizao reflit a no dbgrid.
4

Button33
Est a rot ina t ransforma em permanent e as at ualizaes pendent es em t odas as t abe-
las do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Finaliza a t ransao, execut ando o comando COMMIT no banco de da-
dos, e um refresh para que a at ualizao reflit a no dbgrid.

5
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
194 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
4

Button34
Ao cont rrio da ant erior, cancela as at ualizaes pendent es em todas as t abelas do
banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o comando ROLLBACK no banco de dados, finalizando a t ran-
sao, e um refresh para que a at ualizao reflit a no dbgrid.
Ftapa 8 - Tabshoot4 [Consu!ta dos luncionrios
cadastrados)
20

Button36
Gerar a consult a para um funcionrio, em funo dos valores informados nos com-
ponent es cont idos na tabsheet6.
Evento: OnClick
Cdigo:
procedure TForm1.Button36Click(Sender: TObject);
var
pselect, pfrom, pwhere, pgroup, stringsql: string;
lescolheu_sal: boolean;
ind: integer;
begin
ind:= 0;
lescolheu_sal:= false;
pselect:= 'SELECT Empregados4.MATRICULA, Empregados4.Nome, '+
' Empregados4.SALARIO,'+
' Cargos4.DESCRICAO, '+
' Depto4.DESCRICAO ';
pfrom:= ' FROM EMPREGADOS4 Empregados4, EMPXCARGO4 Empxcargo4,'+
' EMPXDEP4 Empxdep4,'+
' CARGOS4 Cargos4, DEPTO4 Depto4 ';
pwhere:= ' WHERE (Empregados4.MATRICULA = Empxcargo4.MATRICULA) '+
' AND (Cargos4.CODCARGO = Empxcargo4.CODCARGO) '+
' AND (Empregados4.MATRICULA = Empxdep4.MATRICULA) '+
' AND (Depto4.CODDEP = Empxdep4.CODDEP) ';
pgroup:= '';
if rbmaisal.checked then begin
pselect:= 'SELECT MAX(Empregados4.SALARIO)';
lescolheu_sal:= true;
end;
Conexo com o Banco de Dados Oracle via dbExpress 195
if rbmensal.checked then begin
pselect:= 'SELECT MIN(Empregados4.SALARIO)';
lescolheu_sal:= true;
end;
if rbmedsal.checked then begin
pselect:= 'SELECT AVG(Empregados4.SALARIO)';
lescolheu_sal:= true;
end;
if lescolheu_sal then begin
pselect:= pselect + ',Depto4.DESCRICAO ';
pgroup:= 'GROUP BY Depto4.DESCRICAO';
end;
with datamodule2.sqlclientdataset1 do begin
close;
if rbsldepto.checked then begin
pwhere:= pwhere+' AND (Depto4.CODDEP = '+#39+
edtcoddepto3.text+#39+')';
end;
if rbslcargo.checked then begin
pwhere:= pwhere+' AND (Cargos4.CODCARGO ='+#39+
edtcodcargo3.text+#39+')';
end;
if not lescolheu_sal then begin
if rbslfunci.checked then begin
pwhere:= pwhere+' AND (Empregados4.MATRICULA = '+#39+
edtmatric4.text+#39+')';
end;
end;
stringsql:= pselect+pfrom+pwhere+pgroup;
commandtext:= stringsql;
open;
end;
end;
Objetivo: Criar uma consult a, ut ilizando as t abelas FUNCIONARIOS4, DEPTO4,
CARGOS4, EMPXDEP4, EMPXCARGO4, at ravs de 4 variveis, que iro com-
por o comando SELECT. Sendo elas:


pselect Escolhe os campos que sero exibidos pela consult a;


pfrom Seleciona as t abelas da consult a;


pwhere Seleciona a condio da consult a;


pgroup Agrupa os dados, se necessrio, da consult a.
Cada varivel recebe um valor inicial, podendo ser int eirament e modificado ou
concat enado com out ro, variando conforme a escolha de alguma opo da t ela de
consult a. Ao final, seus valores sero somados em uma nica varivel: stringsql.
196 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Exemplo1
Selecionar t odos os funcionrios que trabalham no depart ament o cujo cdigo
ident ificado pelo valor 03.
O valor das variveis pselect, pfrom e pgroup no ser alt erado. Somente o valor de
pwhere ser modificado, sendo adicionado ao final da varivel o cdigo que ir in-
cluir a condio para que s os funcionrios do depart ament o 03 sejam exibidos.
Exemplo2
Selecionar a mdia salarial de t odos os funcionrios que trabalham em cada depar-
t amento da empresa.
O valor da varivel pselect ser modificado, exibindo soment e a coluna que ir
cont er a mdia salarial, atravs de uma funo de grupo (AVG), e pgroup, neces-
sria para agruparmos a mdia por depart amento. As demais variveis permanecem
com seus valores iniciais.
Observao:
A consult a gerada atravs de um join realizado nas cinco tabelas
criadas, onde obt eremos de cada uma a informao necessria. A figura 10.50 nos
most ra o relacionament o de cada tabela:
Obtm o nome do departamento em Obtm o nome do cargo de
que cada funcionrio trabalha. cada funcionrio da empresa.
Figura 10.0
197
11. Conexo com o Banco de Dados
Oracle via ADO
Componontos Rolorontos a Conoxo
O Delphi, at sua verso 4, s acessava o banco de dados Oracle at ravs da BDE.
A Inprise viu a necessidade de est ender o acesso ao banco, em funo do cresci-
mento da programao volt ada para int ernet , disseminao do desenvolvimento em
mlt iplas camadas e o fato de nem todos os provedores t erem o BDE inst alado.
A camada ADO (Act iveX Dat a Object s) um padro Microsoft para acesso a ban-
co de dados, at ravs da OLE DB, que, alm de possuir drivers nat ivos para o co-
nexo aos bancos, alt ament e int egrado int ernet .
A figura 11.1 nos most ra, ut ilizando os principais component es, como o Delphi
t rat a o acesso ao banco de dados via ADO.
TADOConnoction
O componente TADOConnect ion responsvel por est abelecer uma conexo com
o banco de dados Oracle, atravs da camada ADO. A seguir est o list adas as prin-
cipais propriedades dest e component e.
Nome: Connected
Tipo: Boolean
Descrio: Indica se foi est abelecida uma conexo com o banco de dados Oracle.
198 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE

TADOConnection TDataSource
TADODataSet
TADOCommand TADOQuery
Figura 11.1
Nome: Connecti onStri ng
Tipo: WideSt ring
Descrio: Responsvel por definir a string de conexo ent re a camada ADO e o
banco de dados que ser ut ilizado, no nosso caso, o Oracle.
Nome: Connecti onTimeOut
Tipo: Int eger
Descrio: Det ermina um t empo limit e para ser feit a a conexo com o banco de
dados Oracle.
Nome: CursorLocati on
Tipo: TCursorLocat ion
Descrio: Define onde est ar o cursor para as t abelas.
Nome: LoginPrompt
Tipo: Boolean
Descrio: Especifica se a caixa de login ser exibida quando o aplicat ivo t ent ar
um conexo no banco de dados Oracle.
Nome: Mode
Tipo: TConnect Mode
Descrio: Define o modo de conexo, se ser somente leit ura ou leit ura e gravao.
Conexo com o Banco de Dados Oracle via ADO 199
TADOQuory
O componente TADOQuery similar ao component e TQuery da aba BDE, sendo
indicado para conexes client e/servidor. A seguir est o list adas as principais propri-
edades dest e component e.
Nome: Connecti on
Tipo: TADOConnect ion
Descrio: Especifica o component e TADOConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados Oracle.
Nome: CursorLocati on
Tipo: TCursorLocat ion
Descrio: Informa se o component e ir t rabalhar em CachedUpdat es.


clUseClient : dados sero armazenados no client e e comandos SQL (insert,
updat e e delet e);


clUseServer: as alt eraes sero enviadas automat icament e para o servidor.
Nome: CursorType
Tipo: TCursorType
Descrio: Define qual t ipo de cursor ser ut ilizado:


ct Unspecified: Tipo de cursor no predefinido pelo component e;


ct OpenForwardOnly: Cursor unidirecional, no bufferiza os regist ros na me-
mria;


ct KeySet : Cursor bidirecional, no concorrente. Os regist ros so bufferizados
no result set . Alt eraes feit as por t ransaes concorrent es no est aro dispon-
veis;


ct Dynamic: Bidirecional e concorrent e. Ut iliza mais recursos do sist ema e apre-
sent a a pior performance quando comparado com os outros;


ct St at ic: Cpia dos regist ros, onde qualquer t ipo de transao concorrent e no
ser visualizada.
Nome: MarshalOpti ons
Tipo: TMarshalOpt ion
Descrio: Define quais regist ros sero devolvidos para o servidor:


moMarshalAll t odos os registros sero enviados;


moMarshalModifiedOnly soment e os regist ros modificados sero envia-
dos.
200 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Nome: SQL
Tipo: String
Descrio: Armazena uma declarao SQL.
A seguir est o list ados os principais mt odos do component e TADOQuery.
Nome: Close
Descrio: Alt era o valor da propriedade Active para false.
Nome: ExecSql
Descrio: Execut a uma declarao SQL que no retorna um conjunto de resulta-
dos (insert , updat e e delet e).
Nome: Open
Descrio: Alt era o valor da propriedade Active para true, execut ando uma decla-
rao SQL que ret orne um conjunt o de result ados.
TADODataSot
Esse component e a classe-pai da qual descendem os objetos TADOTabel,
TADOQuery e TADOSt oredProc. Port ant o, t em os mesmos atribut os que seus
descendent es. Abaixo est o list adas as principais propriedades dest e componente.
Nome: CommandText
Tipo: String
Descrio: Cont er o comando SQL a ser execut ado, dependendo do valor da pro-
priedade CommandType.
Nome: CommandType
Tipo: TSQLCommandType
Descrio: indicar o t ipo de comando que est ar cont ido na propriedade
CommandText .
Nome: Connecti on
Tipo: TADOConnect ion
Descrio: Especifica o component e TADOConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados Oracle.
Nome: CursorLocati on
Tipo: TCursorLocat ion
Descrio: Informa se o component e ir t rabalhar em CachedUpdat es.
Conexo com o Banco de Dados Oracle via ADO 201


clUseClient : dados sero armazenados no client e e comandos SQL
(insert , updat e e delet e);


clUseServer: as alt eraes sero enviadas automat icament e para o servidor.
Nome: CursorType
Tipo: TCursorType
Descrio: Define qual t ipo de cursor ser ut ilizado:


ct Unspecified: Tipo de cursor no predefinido pelo component e;


ct OpenForwardOnly: Cursor unidirecional, no bufferiza os regist ros na me-
mria;


ct KeySet : Cursor bidirecional, no concorrente. Os regist ros so bufferizados
no result set . Alt eraes feit as por t ransaes concorrent es no est aro dispon-
veis;


ct Dynamic: Bidirecional e concorrent e. Ut iliza mais recursos do sist ema e apre-
sent a a pior performance quando comparado com os outros;


ct St at ic: Cpia dos regist ros, onde qualquer t ipo de transao concorrent e no
ser visualizada.
Nome: MarshalOpti ons
Tipo: TMarshalOpt ion
Descrio: Define quais regist ros sero devolvidos para o servidor:


moMarshalAll t odos os registros sero enviados;


moMarshalModifiedOnly soment e os regist ros modificados sero enviados.
A seguir est o list ados os principais mt odos do component e TADODat aSet .
Nome: Close
Descrio: Alt era o valor da propriedade Active para false.
Nome: Open
Descrio: Alt era o valor da propriedade Active para true, execut ando uma decla-
rao SQL que ret orne um conjunt o de result ados.
TADOCommand
Est e componente serve para enviar comandos SQL para o servidor, no permit indo
a ligao com objetos Dat aControl. Operaes de updat e, delet e e insert so mais
rpidas quando execut adas atravs desse component e, pois possui uma performan-
ce ot imizada para inst rues que no retornem um conjunt o de dados. A seguir
est o list adas as principais propriedades dest e component e:
202 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Nome: CommandText
Tipo: String
Descrio: Cont er o comando SQL a ser execut ado.
Nome: CommandType
Tipo: TSQLCommandType
Descrio: Indicar o t ipo de comando que estar cont ido na propriedade
CommandText .
Nome: Connecti on
Tipo: TADOConnect ion
Descrio: Especifica o component e TADOConnect ion a ser ut ilizado, permit indo
assim a conexo com o banco de dados Oracle.
A seguir, o principal mtodo do componente TADOCommand:
Nome: Execute
Descrio: Execut a o comando SQL.
TDatasourco
Permit e est abelecer uma conexo ent re um ou mais componentes Dat a Cont rols
(dbgrids, dbedit , et c.) e cada componente TADOQuery, TADODat aSet , TADOTable.
Abaixo most rada a propriedade mais important e dest e component e.
Nome: DataSet
Tipo:TDat aSet
Descrio: Especifica o dat aset do qual o component e obt m seus dados.
Fxomp!o Do!phi-ADO com Orac!o
As t abelas que sero criadas so bem simples, j que o objet ivo maior desse exem-
plo mostrar a conexo com o banco de dados Oracle at ravs da aba ADO.
Conforme exemplos ant eriores, ser ut ilizada a const raint FOREIGN KEY com a
clusula DELETE CASCADE. Dessa forma, toda a int egridade de dados ser con-
t rolada pelo banco de dados Oracle.
Conexo com o Banco de Dados Oracle via ADO 203


Criando a t abela de pais:
SQL > CREATE TABLE PAIS
2 (MATRICULA_P VARCHAR2(3) NOT NULL,
3 NOME VARCHAR2(50) NOT NULL,
4 CONSTRAINT PK_PAI PRIMARY KEY (MATRICULA_P));


Criando a t abela de filhos:
SQL > CREATE TABLE FILHO
2 (MATRICULA_P VARCHAR2(3) NOT NULL,
3 MATRICULA_F VARCHAR2(3) NOT NULL,
4 NOME VARCHAR2(50) NOT NULL,
5 CONSTRAINT PK_FILHO PRIMARY KEY (MATRICULA_P,
MATRICULA_F),
6 CONSTRAINT PK_FILHO2 FOREIGN KEY (MATRICULA_P)
7 REFERENCES "PAIS"(MATRICULA_P) ON DELETE CASCADE);
Aps criarmos as t abelas da nossa aplicao, devemos ent o execut ar o Delphi.
A aplicao ser desenvolvida em duas part es:
Part e 1 Criao dos component es necessrios;
Part e 2 Explicao do cdigo gerado para cada component e criado.
Parto 1 - Criao dos componontos nocossrios
Ftapa 1 - Criao do um novo Datamodu!o
Um novo Datamodule deve ser adicionado ao projet o. V em File->New-
>DataModule.
Os seguint es valores devero ser modificados:
204 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Figura 11.2
O DataModule dever ser salvo como udmexemplo5.pas.
Ftapa 2 - Adio do quatro componontos da aba ADO ao
Datamodu!o
Conforme figura 11.3, quat ro component es devero ser adicionados:
Figura 11.8
1
3
2
4
Conexo com o Banco de Dados Oracle via ADO 205
Os seguint es valores devero ser modificados:
1
TADOConnect ion
Figura 11.4
206 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
2
TADODat aSet
4
TADOCommand
Figura 11. Figura 11.7
3
TDat aSource
Figura 11.0
Conexo com o Banco de Dados Oracle via ADO 207
Ftapa 8 - Criao no lormu!rio principa! do
pugeconIrol o sous componontos
Uma vez criados os component es no TDataModule, deveremos, ento, criar o pa-
gecontrol, assim como 3 tabsheets que devero t er sua propriedade caption modifi-
cada para Pais, Filhos e Consulta conforme most ra a figura 11.8.
Figura 11.8
Ftapa 8.1 - Criao do componontos na tabshoot1
Figura 11.0
PageControl
Tabsheet1 Tabsheet2
Tabsheet3
Tabsheet1
2
3
1
4
208 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Fi gura 11.10 Figura 11.12
2
TEdit
Figura 11.11
Conexo com o Banco de Dados Oracle via ADO 209
4
TButt ons
Nos component es TButtons criados, deveremos modificar a propriedade name para
Button1, Button2,...,Button7, seguindo a ordem da esquerda para a direit a.
A propriedade caption de cada um deve ser alt erada conforme a figura 11.9.
Ftapa 8.2 - Criao do componontos na tabshoot2
Figura 11.18
Tabsheet2
1
2
3
4
5
210 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TEdit
Fi gura 11.14 Figura 11.10
2
TEdit
4
TEdit
Figura 11.1 Figura 11.17
Conexo com o Banco de Dados Oracle via ADO 211
5
TButt ons
Nos component es TButtons criados, deveremos modificar a propriedade name para
Button8, Button9,...,Button14, seguindo a ordem da esquerda para a direit a.
A propriedade caption de cada um deve ser alt erada conforme a figura 11.13.
Ftapa 8.8 - Criao do componontos na tabshoot8
Figura 11.18
Tabsheet3
1
2
3
4
5
6
7
8
9
10
212 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Os seguint es valores devero ser modificados:
1
TDBGrid
3
TRadioButton
Figura 11.10 Figura 11.21
2
TGroupBox
4
TRadioButt on
Figura 11.20 Figura 11.22
Conexo com o Banco de Dados Oracle via ADO 213
5
TEdit
7
TRadioButton
Figura 11.28 Figura 11.2
6
TGroupBox
8
TRadioButton
Figura 11.24 Figura 11.20
214 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
9
TEdit
Figura 11.27
10
TButtons
Nos component es TButtons criados, deveremos modificar a propriedade name para
Button15 e Button16, seguindo a ordem da esquerda para a direit a. A propriedade
caption de cada um deve ser alt erada conforme a figura 11.18.
Parto 2 - Fxp!icao do cdigo gorado para cada
compononto criado
Antes de iniciarmos a explicao sobre o funcionament o de cada tabsheet, algumas
procedures e funes de uso geral do projeto devem ser criadas.
A procedure a seguir responsvel por limpar os component es cont idos em cada
tabsheet:
procedure TForm1.limpacomponentes;
var
ind: integer;
begin
for ind:= 0 to ComponentCount-1 do begin
if components[ind] is tedit then
(components[ind] as tedit).clear;
end;
end;
Conexo com o Banco de Dados Oracle via ADO 215
Conforme o exemplo com os component es da aba dbExpress, precisaremos de uma
procedure que inicie uma t ransao. Caso cont rrio, t odas as alt eraes feit as com
comandos SQL (INSERT, UPDATE e DELETE) sero automat icament e at ualiza-
das no banco de dados Oracle.
A procedure a seguir verifica se exist e alguma transao em aberto e, caso no
exist a, inicia uma nova.
procedure TForm1.iniciatransacao;
begin
with datamodule2.adoconnection1 do begin
if not InTransaction then
begintrans;
end;
end;
As inst rues SQL de incluso, excluso e alt erao sero execut adas no ADO-
Command1, a procedure a seguir evit a a replicao de cdigo em nosso projet o,
bast ando para isso que passemos como parmetro a inst ruo SQL desejada.
procedure TForm1.executasql(stringsql: string);
begin
with datamodule2.adocommand1 do begin
commandtype:= cmdtext;
commandtext:= stringsql;
execute;
end;
end;
Para que todas as modificaes realizadas nas t abelas em nosso banco de dados
reflit am nos dbgrids do projet o, necessrio fechar e abrir, logo em seguida, o
ADODataSet associada a ele. A procedure listada logo adiant e ser responsvel por
essa t arefa.
procedure TForm1.executarefresh;
begin
with datamodule2.adodataset1 do begin
limpacomponentes;
close;
commandtype:= cmdtext;
if pagecontrol1.ActivePage = tabsheet1 then begin
commandtext:= 'select * from pais order by 2';
open;
end
else if pagecontrol1.ActivePage = tabsheet2 then
commandtext:= 'select b.matricula_f, b.nome, a.matricula_p, a.nome '+
'from filho b, pais a '+
'where a.matricula_p = b.matricula_p ';
open;
end
else if pagecontrol1.ActivePage = tabsheet2 then
datamodule2.ADODataSet1.Close;
end;
end;
216 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
As et apas a seguir most raro o funcionamento de cada tabsheet, assim como os
eventos referentes ao formulrio, pagecontrol e a cada bot o.
Ftapa 1 - Formu!rio principa! [Form1)
o formulrio do nosso projeto, onde est o cont idos t odos os component es.
Evento: OnAct ivat e
Cdigo:
procedure TForm1.FormActivate(Sender: TObject);
var
stringsql: string;
begin
pagecontrol1.activepage:= tabsheet1;
stringsql:= 'select * from pais';
executasql(stringsql);
limpacomponentes;
pinclui:= false;
end;
Objetivo: Inicializar nosso projet o, definindo a tabsheet1 como at iva, limpando
os component es e execut ando o comando SQL para exibir os dados da t abela
PAIS.
Ftapa 2 - PagoContro!
o componente que cont m t odas as tabsheets de nosso projet o.
Evento: OnChange
Cdigo:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
executarefresh;
limpacomponentes;
end;
Objetivo: Verifica qual a tabsheet que est at iva, at ualizando os dados no dbgrid
corrent e, at ravs da procedure executarefresh e, em seguida, limpa os component es
da t ela.
Ftapa 8 - Tabshoot1 [Cadastro do Funcionrios)
1

DbGri d1
Exibir informaes da tabela PAIS, atravs da ADODataSet1.
Evento: No exist e.
Conexo com o Banco de Dados Oracle via ADO 217
2

EdtMatri cp
Armazenar em memria o nmero da mat rcula do pai a ser inserida ou alt erada at
que possa ser t ransferida para o banco de dados.
Evento: No exist e.
3

EdtNomep
Armazenar em memria o nome do pai a ser inserido ou alt erado.
Evento: No exist e.
6

Button1
Colocar a tabsheet1 em condies de inserir informaes em seus component es,
para transferi-las post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
begin
iniciatransacao;
pinclui:= true;
edtmatricp.enabled:= true;
edtmatricp.SetFocus;
end;
Objetivo: Caso no exist a nenhuma t ransao at iva, a procedure inciatransacao
iniciar uma. Alt erar o valor da varivel global pinclui, informando que na t abelas
PAIS um novo registro ser inserido.
NOTA:
Em t odos os bot es cont idos nas tabsheets de nosso projeto a procedure
iniciatransao est present e, executando a mesma funo, conforme o exemplo
com os component es da aba dbExpress. Dessa forma, no ser mais explicada a
funo da mesma.
4

Button2
A excluso deve permit ir que um pai e seus respect ivos relacionamentos sejam
apagados, at ravs da constraint criada.
Evento: OnClick
Cdigo:
procedure TForm1.Button2Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from PAIS where MATRICULA_P = '+#39;
stringsql:= stringsql +datamodule2.ADODataSet1['MATRICULA_P']+#39;
218 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
executasql(stringsql);
except
showmessage('No foi possvel excluir esse pai !');
end;
executarefresh;
end;
Objetivo: Ut ilizando o regist ro corrent e do ADODataSet1, excluir o registro na
t abela PAIS e seu relacionamento na t abela FILHO. Em seguida, um refresh exe-
cut ado para que a excluso reflit a no dbgrid.
4

Button3
Deve ser capaz de modificar as informaes cont idas nos component es pert encen-
t es a tabsheet1.
Evento: OnClick
Cdigo:
procedure TForm1.Button3Click(Sender: TObject);
begin
iniciatransacao;
pinclui:= false;
edtmatricp.Text:= datamodule2.ADODataSet1['MATRICULA_P'];
edtnomep.Text:= datamodule2.ADODataSet1['NOME'];
edtmatricp.enabled:= false;
edtnomep.SetFocus;
end;
Objetivo: Os valores dos campos da t abela PAIS, cont idos no regist ro corrent e da
ADODataSet1 sero t ransferidos para a propriedade text dos component es da
tabsheet1. Alt erar o valor da varivel global pinclui, informando que o regist ro ser
alt erado. Mudar o valor da propriedade enabled para false no component e edtma-
tricp, pois o valor da chave primria no pode ser alt erado.
4

Button4
Responsvel por transferir as informaes cont idas nos component es da tabsheet1
para o banco de dados Oracle, alt erando ou inserindo um registro.
Evento: OnClick
Cdigo:
procedure TForm1.Button4Click(Sender: TObject);
var
stringsql: string;
begin
if pinclui then begin
try
stringsql:= 'insert into pais values ('+#39;
stringsql:= stringsql + edtmatricp.text +#39+', '+#39;
stringsql:= stringsql + edtnomep.text +#39+')';
executasql(stringsql);
Conexo com o Banco de Dados Oracle via ADO 219
except
showmessage('No foi possvel incluir esse pai !');
end;
end
else begin
try
stringsql:= 'update pais set NOME = '+#39;
stringsql:= stringsql + edtnomep.text +#39+' where ';
stringsql:= stringsql + 'MATRICULA_P = '+#39+edtmatricp.text +#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar esse pai !');
end;
end;
executarefresh;
panel1.Enabled:= false;
end;
Objetivo: At ravs do valor da varivel global pinclui, um comando SQL de inclu-
so ou alt erao deve ser execut ado, transferindo o cont edo da propriedade text de
cada component e para a t abela PAIS
1
. Em seguida um refresh para que a at ualiza-
o reflit a no dbgrid.
4

Button5
Alt era para permanent e as at ualizaes pendent es em t odas as t abelas do banco de
dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button5Click(Sender: TObject);
begin
datamodule2.ADOConnection1.commitTrans;
executarefresh;
end;
Objetivo: Execut ar o mtodo COMMITTRANS do component e TADOConnecti-
on1 no banco de dados, finalizando a t ransao, e um refresh para que a at ualiza-
o reflit a no dbgrid.
4

Button6
Cancelar as at ualizaes pendent es em t odas as t abelas do banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button6Click(Sender: TObject);
begin

1
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
220 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
datamodule2.ADOConnection1.RollbackTrans;
executarefresh;
end;
Objetivo: Execut ar o mtodo ROLLBACKTRANS do component e TADOConnec-
tion1, finalizando a t ransao, no banco de dados e um refresh para que a at ualiza-
o reflit a no dbgrid.
Ftapa 2 - Tabshoot2 [Cadastro do Fi!hos)
1

DbGri d2
Exibir informaes da tabela FILHO, at ravs do ADODataSet1.
Evento: No exist e.
2

EdtMatri cf
Armazenar em memria, at ser transferida para o banco de dados, a matrcula do
filho a ser inserida ou alt erada.
Evento: No exist e.
3

EdtNomef
Armazenar em memria, at ser transferido para o banco de dados, o nome do filho
a ser inserido ou alt erado.
Evento: No exist e.
4

EdtMatri cp2
Armazenar em memria o nmero da mat rcula do pai a ser inserida ou alt erada at
que possa ser t ransferida para o banco de dados.
Evento: No exist e.
5

Button8
A rot ina de incluso deve ser capaz de colocar a tabsheet2 em condies de inserir
informaes nos component es edtmatricf, edtnomef e edtmatricp2, que sero trans-
feridas post eriorment e para o banco de dados.
Evento: OnClick
Cdigo:
procedure TForm1.Button8Click(Sender: TObject);
begin
iniciatransacao;
pinclui:= true;
edtmatricf.enabled:= true;
edtmatricf.SetFocus;
end;
Conexo com o Banco de Dados Oracle via ADO 221
Objetivo: Alt erar o valor da varivel global pinclui, informando ao projet o que um
novo regist ro ser inserido na t abela FILHO.
5

Button9
Deve ser permit ido que um filho seja excludo da t abela FILHO.
Evento: OnClick
Cdigo:
procedure TForm1.Button9Click(Sender: TObject);
var
stringsql: string;
begin
try
iniciatransacao;
stringsql:= 'delete from FILHO where MATRICULA_F = '+#39;
stringsql:=stringsql+datamodule2.ADODataSet1['MATRICULA_F']+#39+' AND ';
stringsql:= stringsql +' MATRICULA_P = '+#39;
stringsql:= stringsql +datamodule2.ADODataSet1['MATRICULA_F']+#39;
executasql(stringsql);
except
showmessage('No foi possvel excluir esse filho !');
end;
executarefresh;
end;
Objetivo: Excluir o regist ro na t abela FILHO, ut ilizando o regist ro corrente do
ADODataSet1, execut ando logo em seguida um refresh para que a excluso reflit a
no dbgrid.
5

Button10
A rot ina de alt erao deve ser capaz de colocar a tabsheet2 em condies de modi-
ficar a informao cont ida no component e edtnomef.
Evento: OnClick
Cdigo:
procedure TForm1.Button10Click(Sender: TObject);
begin
iniciatransacao;
pinclui:= false;
edtmatricf.Text:= datamodule2.ADODataSet1['MATRICULA_F'];
edtmatricp2.Text:= datamodule2.ADODataSet1['MATRICULA_P'];
edtnomef.Text:= datamodule2.ADODataSet1['NOME'];
edtmatricf.enabled:= false;
edtmatricp2.enabled:= false;
edtnomef.SetFocus;
end;
Objetivo: Transferir para a propriedade text dos component es edtmatricf, edtnomef
e edtmatricp2 os valores dos campos MATRIC_F, NOME e MATRIC_P, cont idos
no regist ro corrent e do ADODataSet1. Em seguida, alt erar o valor da varivel glo-
222 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
bal pinclui, informando ao projet o que o registro ser alt erado na t abela FILHO.
Por fim, alt erar o valor da propriedade enabled para false nos component es edtma-
tricp2 e edtmatricf, pois no devemos alt erar o valor da chave primria.
5

Button11
A rot ina do bot o Ok responsvel por t ransferir as informaes cont idas nos
component es da tabsheet2 para o banco de dados Oracle, alt erando ou inserindo
um regist ro na t abela FILHO.
Evento: OnClick
Cdigo:
procedure TForm1.Button11Click(Sender: TObject);
var
stringsql: string;
begin
if pinclui then begin
try
stringsql:= 'insert into filho values ('+#39;
stringsql:= stringsql + edtmatricf.text +#39+', '+#39;
stringsql:= stringsql + edtmatricp2.text +#39+', '+#39;
stringsql:= stringsql + edtnomef.text +#39+')';
executasql(stringsql);
except
showmessage('No foi possvel incluir esse filho !');
end;
end
else begin
try
stringsql:= 'update filho set NOME = '+#39;
stringsql:= stringsql + edtnomef.text +#39+' where ';
stringsql:= stringsql+'MATRICULA_F = '+#39+edtmatricf.text +#39+
' AND ';
stringsql:= stringsql + 'MATRICULA_P = '+#39+edtmatricp2.text +#39;
executasql(stringsql);
except
showmessage('No foi possvel alterar esse filho !');
end;
end;
executarefresh;
panel2.Enabled:= false;
end;
Objetivo: At ravs da varivel global pinclui, verificar se um comando SQL de
incluso ou alt erao deve ser execut ado, transferindo a informao cont ida na
propriedade text de cada component e para a t abela FILHO
2
. Em seguida, execut ar
um refresh para que a at ualizao reflit a no dbgrid.

2
importante lembrar que as atualizaes efetuadas esto pendentes, como j foi explicado.
Conexo com o Banco de Dados Oracle via ADO 223
5

Button12
Fica a cargo dessa rot ina tornar permanent es as at ualizaes pendent es em t odas as
t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button5.
Objetivo: Execut ar o mtodo COMMITTRANS do component e TADOConnecti-
on1 no banco de dados, finalizando a t ransao, e um refresh para que a at ualiza-
o reflit a no dbgrid.
4

Button13
Est a rot ina, ao cont rrio da ant erior, cancela as at ualizaes pendent es em t odas as
t abelas do banco de dados.
Evento: OnClick
Cdigo:
Deve apontar para o evento Onclick do Button6.
Objetivo: Execut ar o mtodo ROLLBACKTRANS do component e TADOConnec-
tion1, finalizando a t ransao, no banco de dados e um refresh para que a at ualiza-
o reflit a no dbgrid.
Ftapa 8 - Tabshoot8 [Consu!ta dos pais o rospoctivos
li!hos cadastrados)
20

Button36
Gerar a consult a para um funcionrio e seus respect ivos filhos, em funo dos valo-
res informados nos component es cont idos na tabsheet3.
Evento: OnClick
Cdigo:
procedure TForm1.Button15Click(Sender: TObject);
var
pselect, pfrom, pwhere, stringsql: string;
begin
pselect:= 'select b.matricula_f, b.nome, a.matricula_p, a.nome ';
pfrom:= 'from filho b, pais a ';
pwhere:= 'where a.matricula_p = b.matricula_p ';
if rbpaisel.checked then
pwhere:= pwhere + 'and a.matricula_p = '+#39+edtmatricp3.Text+#39;
if rbfilhosel.checked then
pwhere:= pwhere + 'and b.matricula_f = '+#39+edtmatricf2.Text+#39;
224 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
stringsql:= pselect+pfrom+pwhere;
with datamodule2.ADODataSet1 do begin
try
close;
commandtype:= cmdtext;
commandtext:= stringsql;
open;
except
showmessage('No foi possvel realizar a consulta !');
end;
end;
end;
Objetivo: Criar uma consult a, ut ilizando as t abelas PAIS e FILHOS, atravs de 3
variveis, que iro compor o comando SELECT. Sendo elas:


pselect Escolhe os campos que sero exibidos pela consult a;


pfrom Seleciona as t abelas da consult a;


pwhere Seleciona a condio da consult a.
A consult a gerada seguindo os exemplos ant eriores, ou seja, cada varivel recebe
um valor inicial, que pode ser concat enado com out ro, variando conforme a escolha
de alguma opo da t ela de consult a. Ao final, seus valores sero somados em uma
nica varivel: stringsql.
225
Parte V.
Apndices
227
Apndice A.
Dicas para o Delphi
Proparo o Unproparo
O banco de dados Oracle, ao realizar um comando SELECT, realiza uma estrat gia
para execut ar essa consulta, verificando sua sint axe e det erminando como ut ilizar
os ndices e out ras t cnicas de acesso.
A preparao inicial da est rat gia de acesso da consult a pode ser forada ut ilizando
o mtodo Prepare de um componente Query. Se a consult a for execut ada vrias
vezes, ela est ar mais rpida, pois todas as operaes iniciais j foram execut adas
de uma s vez. Note que o mtodo Prepare deve ser chamado novamente caso o
t ext o SQL da consult a mude. O mtodo Unprepare deve ser chamado ao final, para
liberar alguns recursos do BDE.
SQI Bui!dor
Conforme vist o no capt ulo 7, a linguagem SQL possui muitos comandos em rela-
o s instrues SELECT
.
Para facilit ar o desenvolviment o de instrues SQL
corret as, o Delphi Client /Server possui uma ferrament a chamada SQL Builder, que
facilment e at ivada at ravs de um clique com o bot o direit o do mouse em um
component e Query, conforme nos mostra a figura A.1.
Em seguida, sero solicit ados o nome e a senha do usurio que ir se conect ar ao
banco de dados Oracle.
A ut ilizao do SQL Builder muit o simples, onde, aps a conexo, devemos sele-
cionar uma ou mais t abelas com que iremos trabalhar e que sero colocadas na rea
de t rabalho.
228 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Figura A.1
Ao selecionar os parmet ros corret os, conforme ser explicado a seguir, o comando
Query -
>
Run Query (ou F9) permit e ver o result ado da consult a ou o comando
Query ->

Show SQL (F7) para ver o cdigo-font e da instruo select que foi gera-
da.
A figura A.2 nos most ra os principais bot es, assim como os recursos do Query
Notebook.
A seguir sero coment adas as pginas do Query Not ebook:

Crit eria indica os crit rios de seleo da clusula where. Ao selecionar um


dos campos da tabela de result ados, voc pode indicar uma comparao com
relao a um valor fixo ou outro campo, podendo usar LIKE, IS NULL,
BETWEEN, et c. Essa pgina permit e combinar vrias condies com os
operadores AND, OR e NOT.

Select ion list a todos os campos do conjunto de result ado e permit e que voc
lhes fornea um alias. Funes agregadas podem ser adicionadas (SUM, AVG,
et c.). A caixa de seleo no canto superior esquerdo indica a condio
DISTINCT.

Grouping corresponde clusula GROUP BY.

Group Crit eria corresponde clusula HAVING.

Sort ing corresponde clusula ORDER BY.

Joins a lt ima, porm a mais poderosa, pois permite que voc defina condi-
es de juno, alm do simples arrast amento de um campo de uma t abela para
out ra na rea de trabalho.
Ao fecharmos a janela, o SQL Builder pergunt a se o SQL gerado ser transport ado
para o cont edo da propriedade STRINGS do component e QUERY.
Apndice A: Dicas para o Delphi 229
Mostra o t exto SQL gerado
Execut a o comando SQL Seleciona as t abelas
Seleciona o banco de dados
Campos que
sero
exibidos
rea de t rabalho
Query Not ebook
Critrio de seleo
Figura A.2
Dbgrids
O banco de dados Oracle t rabalha com conjunt os de dados lgicos, que no est o
relacionados a uma ordem fsica. Os dados so manipulados conforme um modelo
mat emt ico baseado na t eoria dos conjunt os, o modelo relacional.
As linhas de uma t abela, nesse modelo, so i dent ificadas at ravs de uma chave
primria e no pela sua posio. Quando um conjunt o de linhas for obt ido, o
banco de dados Oracle incl ui em cada uma del as uma referncia seguint e,
t ornando rpida a mudana de uma linha a out ra, mas t errivelment e lent a a
volt a linha ant erior. comum dizer que o banco de dados Oracl e ut iliza um
cursor unidirecional.
230 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Ao navegarmos para trs num dbgrid, a performance do banco cair sensivelment e.
O BDE, nessa hora, ajuda muito, pois mant m em um cache local as linhas j car-
regadas da t abela. Assim, quando nos movemos para as linhas seguint es do nosso
dbgrid, elas so solicit adas ao banco de dados Oracle, mas quando voltamos, o
BDE ent ra em ao e fornece as linhas, tornando os cursores bidirecionais, embora
isso possa ut ilizar muit a memria da est ao client e.
Dessa forma, melhor filt rarmos parte dos registros a serem exibidos ou ut ilizar-
mos t abelas pequenas num dbgrid em aplicaes client e/servidor.
RocordCount
Se volt ar linhas num dbgrid pode acarret ar em perda de performance do banco de
dados Oracle, pular para a lt ima linha de uma t abela ainda pior; pois essa opera-
o, normalment e, busca t odas as linhas.
Podemos ilust rar essa sit uao com a ut ilizao da propriedade RecordCount, onde
calcular o nmero t ot al de linhas de uma t abela de regist ros freqent ement e implica
em mov-las t odas para a est ao cliente. Ent o, como soluo para obt er o nmero
t otal de linhas de uma t abela, ut ilize a funo count(*), como nos most ra o exemplo
a seguir:
SELECT COUNT(*)
FROM EMPREGADOS;
Criando um !ogin porsona!izado
Ao desenvolvermos uma aplicao, cont endo um component e Database, t oda vez
que vamos nos conect ar no banco de dados Oracle, sempre solicit ado o nome do
usurio e a sua senha. Essa t arefa de informar t oda vez o nome do usurio e res-
pect iva senha pode se t ornar cansat iva e, principalmente, improdut iva.
Esse problema pode ser resolvido de duas formas.
Na primeira forma pode-se:


alt erar a propriedade Loginprompt para false;


alt erar a string de parmet ros da propriedade Params, como most ra a figu-
ra A.3:
Apndice A: Dicas para o Delphi 231
Figura A.8
Na segunda, podemos:


Criar para nossa aplicao uma caixa de login personalizada, onde ser ne-
cessrio informar apenas uma vez o nome do usurio e a senha, como nos
most ra a figura A.4:
edt usurio
edt senha
Figura A.4
Devemos colocar no evento OnLogin do component e Database o seguint e cdigo:
Procedure TForm1.Database1Login(Database: TDatabase;
LoginParams: TStrings);
Begin
Form1:= TForm1.create(app1ication);
232 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
with Form1 do begin
try
if ShowModal = mrOK then begin
LoginParams.Values[USER NAME]:= edtusario.text;
LoginParams.Values[PASSWORD]:= edtSenha.text;
end
else begin
Application.Terminate;
end;
finally
free;
end;
End;
Ao clicarmos no boto Ok, os valores cont idos nas propriedades text dos edits so
passados para os parmet ros de login do Database.
Criando um a!ias no BDF om tompo do
oxocuo
A funo DBIAddAlias, permit e adicionar um alias permanent e configurao do
BDE. Para podermos ut ilizar essa funo, devemos adicionar a unit BDE clusula
USES. A funo a seguir adiciona um alias ao BDE, bast ando que seja passado
como parmetro apenas o nome do alias.
procedure crianovoalias(nomealias: string);
begin
dbiinit(nil);
dbiaddalias(nil,pchar(nomelias),pchar('ORACLE'),nil, true);
dbiexit;
end;
Em cont rapart ida, para removermos um alias em t empo de execuo do BDE, de-
vemos ut ilizar a funo DBIDeleteAlias, como most ra a funo a seguir:
procedure apagaalias(nomealias: string);
begin
dbiinit(nil);
dbideletealias(nil,pchar(nomelias));
dbiexit;
end;
233
Apndice B.
Dicas para o Oracle
Tamanho do B!ocos
Os blocos de dados so a menor unidade de ent rada e sada. Seu t amanho defini-
do, at ravs do parmetro DB_BLOCK_SIZE, ao criarmos um banco de dados, e
no pode ser alt erado aps sua criao.
Como padro, o Oracle define que o tamanho de bloco para o banco ser de 2K.
Esse t amanho muit o eficient e em bancos de dados do t ipo transacional, mas ine-
ficaz quando t rat amos de bancos de dados do t ipo datawarehousing, que devem t er
t amanhos de blocos de 8K.
Em funo do expost o, as caract erst icas de cada banco de dados (t ransacional,
hbridos ou datawarehousing) devem ser analisadas com muito cuidado para que
seja definido o tamanho do bloco de dados a ser ut ilizado, pois uma escolha infeliz,
blocos de 2K para bancos do t ipo datawarehousing, far com que o banco de dados
t enha perda de performance.
Nmoro do Sogmontos do Ro!!back
O header de um segment o de rollback cont m uma t abela de transaes que define o
est ado de cada t ransao. Toda t ransao que usa um segment o de rollback necessita
at ualizar freqentement e essa t abela, podendo ocasionar cont eno no header, espe-
cialment e em bancos do t ipo transacionais, que ut ilizam pequenas transaes.
Ent o, para bancos de dados do t ipo t ransacional so recomendados muit os, porm
pequenos, segmentos de rollback e, se possvel, criar um segmento de rollback
para 4 t ransaes concorrentes.
Para banco de dados do t ipo batch, crie poucos segment os, porm grandes.
234 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Mu!tip!oxao do Contro! Fi!o o Iog Fi!o
Ao criarmos nosso banco de dados Oracle, atravs da instalao default , os arqui-
vos de control file (necessrio para o banco iniciar e funcionar corret amente) e log
file (responsvel, basicament e, por reduzir a perda de dados) est o duplicados, s
que no mesmo disco fsico, o que represent a perigo em caso de falha da mdia.
Por uma quest o de segurana, mant enha-os em discos separados, pois caso haja
algum problema em um dos discos, os arquivos est aro seguros no outro.
Problema fsico no disco
Cpia de segurana
Figura B.1
Porigo na Construo do Tabo!as
O banco de dados Oracle ut iliza, fisicament e, os datafiles e, logicament e, as
tablespaces para armazenar os dados do banco e as tabelas. Ao criarmos nosso
banco, por padro, todas as tabelas que forem sendo adicionadas post eriormente
por fut uras aplicaes sero armazenadas, logicament e, na tablespace SYSTEM e
fisicament e num datafile criado pelo banco na ocasio da inst alao.
Permanecendo o banco com essa configurao padro, CERTAMENTE t eremos
problemas fut uros, pois ao criarmos e apagarmos const ant ement e t abelas, que esta-
ro sendo criadas na tablespace SYSTEM, t eremos uma perda enorme a nvel de
performance, alm de gerarmos fragment ao de espao livre, e, num possvel
descui do, o banco precisar ser reinst alado.
Ent o, ao criarmos nosso banco, a primeira t arefa a ser realizada adicionar uma
tablespace para armazenar os dados da aplicao e definir que os usurios do ban-
co devem ut iliz-la.
235
ndice Remissivo
A
ActiveX Data Objects, 197
ADO, 197
alias, 55, 232
Aritmticos, 43
B
BDE, 232
BDE Administrator, 54
BFILE, 27
BLOB, 27
blocos de dados, 233
C
Caract ere, 45
Caract eres, 43
CHAR(N), 27
cliente, 5
cliente/servidor, 5
CLOB, 27
Close, 200, 201
CommandText, 200
CommandType, 200
COMMIT, 39
Comparao, 43
comunicao, 7
Configuration, 56
Connected, 197
Connection, 199, 200
ConnectionString, 198
ConnectionTimeOut, 198
constraints, 22
Constraints
criao, 30
remoo, 30
control file, 234
CursorLocation, 198, 199, 200
CursorType, 199, 201
D
Dados
alterando, 37
apagando, 36
inserindo, 35
Databases, 56
Datamodule, 64, 98
DATE, 27
dbExpress, 153
Dbgrids, 229
DCL, 34
DDL (Data Definition Language), 26
DELETE CASCADE, 25
Delphi-ADO, 202
Delphi-BDE, 62
DML, 34
236 Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
F
ExecSql, 200
F
FOREIGN KEY, 24, 153
H
host, 14
I
ndices, 31
alterao, 32
criao, 31
recriando, 33
remoo, 33
instncia, 14
IP, 14
I
log file, 234
Lgicos, 43
login, 230
LoginPrompt, 198
LONG, 27
M
MarshalOptions, 199, 201
Mode, 198
N
Net8 Easy Config, 11
NOT NULL, 22
NUMBER(N,D), 27
O
OLE DB, 197
Open, 200, 201
Operadores, 42
Oracl e, 14, 62, 202
P
pagecontrol, 67
PageControl, 176, 216
pfrom, 195
pgroup, 195
Prepare, 227
PRIMARY KEY, 24
procedures, 80
protocolo de comunicao, 13
pselect, 195
pwhere, 195
Q
Querys, 61
R
RAW(N), LONG RAW, 27
RecordCount, 230
rollback, 233
ROWID, 27
S
Servidores, 6
SET, 43
SID, 14
SQL, 19, 200
SQL Builder, 227
SQL8 Plus, 20
ndice Remissivo 237
T
Tabelas, 26
alterao, 28
criao, 27
remoo, 29
Tables, 61
tablespace, 234
TADOCommand, 201
TADOConnection, 197
TADODataSet, 200
TADOQuery, 199
TDatabase, 58
TDatasource, 61, 153, 202
TQuery, 59
transao, 53
TSQLClientDataSet, 152
TSQLConnection, 148
TSQLDataSet, 150
TSQLQuery, 151
TUpdateSql, 60, 97
U
UNIQUE KEY, 23
Unprepare, 227
UPDATE, 38
V
VARCHAR2(N), 27
Introduo ................................ ................................ ................................ ... 1
PARTF 1. ARQUITFTURA CIIFNTF/SFRVIDOR ................................ 8
1. Concoitos Bsicos ................................ ................................ ..................
Clientes......................................................................................................... 5
Servidores...................................................................................................... 6
Comunicao.................................................................................................. 7
Vantagens ...................................................................................................... 8
PARTF II. CONFIGURAFS DO CIIFNTF DO BANCO DF
PARTF II. DADOS ORACIF ................................ ................................ ..... 0
2. Sorvio ................................ ................................ ................................ ... 11
Utilizando o Net 8 Easy Config.........................................................................11
Criando um Novo Servio................................................................................12
PARTF III. SQI ................................ ................................ ......................... 17
8. Concoito ................................ ................................ ................................ .10
4. Uti!izando o SQI 8 P!us ................................ ................................ ..... 20
. Intogridado do Dados ................................ ................................ .......... 22
NOT NULL ..................................................................................................22
UNIQUE KEY...............................................................................................23
PRIMARY KEY............................................................................................23
FOREIGN KEY.............................................................................................24
Clusula DELETE CASCADE.....................................................................24
0. Data Dolinition Ianguago [DDI) ................................ ...................... 20
Tabelas.........................................................................................................26
Tipos de Dados..........................................................................................27
X Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Criao.....................................................................................................27
Alterao..................................................................................................28
Remoo ..................................................................................................29
Criao de constraints .................................................................................30
Remoo de constraints...............................................................................30
ndices..........................................................................................................31
Criao.....................................................................................................31
Alterao..................................................................................................32
Remoo ..................................................................................................32
Recriando um ndice...................................................................................33
7. Data Manipu!ation Ianguago [DMI) o Data Contro! Ianguago
[DCI) ................................ ................................ ................................ ....... 84
DML............................................................................................................34
DCL ............................................................................................................34
Inserindo, Apagando e Alterando Dados em uma Tabela........................................35
Inserindo Dados.........................................................................................35
Apagando Dados........................................................................................36
Alterando Dados ........................................................................................37
Estado dos Dados...........................................................................................38
Transformando as Mudanas Pendentes em Permanent es ...................................39
Cancelando as Mudanas Pendentes...............................................................39
Selecionando Dados de uma Tabela ...................................................................39
Operadores....................................................................................................42
Aritmticos...............................................................................................43
Caract eres.................................................................................................43
Comparao..............................................................................................43
Lgicos....................................................................................................43
SET ........................................................................................................43
Funes........................................................................................................44
Funes de Linha.......................................................................................44
Funes de Grupo ......................................................................................46
Selecionando Dados de Mltiplas Tabelas ...........................................................48
Definindo Aliases para Tabelas .....................................................................48
PARTF IV. INTFGRANDO DFIPHI COM ORACIF .......................... 1
8. Transaos ................................ ................................ ............................ 8
0. Conoxo com o Banco do Dados Orac!o via BDF ......................... 4
BDE Administrator.........................................................................................54
Utilizando o BDE Administrator...................................................................54
Configurando o BDE Administrator...............................................................55
Componentes Referentes a Conexo...................................................................58
TDatabase.................................................................................................58
TQuery ....................................................................................................59
Sumrio XI
TUpdateSql ..............................................................................................60
TDatasource..............................................................................................61
Tables X Querys ............................................................................................61
Vantagens/Desvantagens .............................................................................61
Exemplos Delphi-BDE X Oracle .......................................................................62
Construindo uma Aplicao com TQuery........................................................63
Parte 1 Criao dos Componentes Necessrios ..............................................64
Parte 2 Explicao do Cdigo Gerado para Cada Componente Criado................80
Construindo uma aplicao com TUpdateSql ..................................................97
Parte 1 Criao dos componentes necessrios ................................................98
Parte 2 Explicao do cdigo gerado para cada componente criado.................. 129
10. Conoxo com o Banco do Dados Orac!o via dbFxpross .......... 148
Componentes Referentes a Conexo................................................................. 148
TSQLConnection..................................................................................... 148
TSQLDataSet.......................................................................................... 150
TSQLQuery............................................................................................ 151
TSQLClientDataSet.................................................................................. 152
TDatasource............................................................................................ 153
Exemplo Delphi-dbExpress com Oracl e............................................................ 153
Parte 1 Criao dos componentes necessrios .............................................. 155
Parte 2 Explicao do cdigo gerado para cada componente criado.................. 173
11. Conoxo com o Banco do Dados Orac!o via ADO .................... 107
Componentes Referentes a Conexo................................................................. 197
TADOConnection.................................................................................... 197
TADOQuery ........................................................................................... 199
TADODataSet ......................................................................................... 200
TADOCommand ..................................................................................... 201
TDatasource............................................................................................ 202
Exemplo Delphi-ADO com Oracl e................................................................... 202
Parte 1 Criao dos componentes necessrios .............................................. 203
Parte 2 Explicao do cdigo gerado para cada componente criado.................. 214
PARTF V. APNDICFS ................................ ................................ .......... 22
Apndico A. Dicas para o Do!phi ................................ ........................ 227
Prepare e Unprepare...................................................................................... 227
SQL Builder................................................................................................ 227
Dbgrids ...................................................................................................... 229
RecordCount ............................................................................................... 230
Criando um login personalizado ...................................................................... 230
Criando um alias no BDE em tempo de execuo................................................ 232
Apndico B. Dicas para o Orac!o ................................ ........................ 288
Tamanho de Blocos...................................................................................... 233
XII Criando Aplicaes em DELPHI 6 com Banco de Dados ORACLE
Nmero de Segmentos de Rollback.................................................................. 233
Multiplexao de Control File e Log File.......................................................... 234
Perigo na Construo de Tabelas ..................................................................... 234
ndico Romissivo ................................ ................................ .................... 28