Departamento de Engenharia Electrotécnica e de Computadores
Licenciatura em Engenharia Electrotécnica e de Computadores
5.º ANO – 1.º SEMESTRE
SISTEMAS DE INFORMAÇÃO – 2001/2002
TRABALHO PRÁTICO
Implementação de uma base de dados na
Companhia de Seguros
PAGA & CALA
Trabalho elaborado por:
Joel Pedro Peixoto de Carvalho
Jorge Miguel Lopes Correia
Turma: 5EEC12(T)
Eng.ª Ana Paiva
Dezembro 2001
PAGA & CALA - Companhia de Seguros
Sistemas de Informação 2001/2002
INDÍCE :
I
Descrição do Problema
II
Modelo Entidade-Associação
III
Modelo Relacional
IV
Restrições de Integridade
V
Criação da Instância Exemplo
VI
Os Forms criados
VII
Os Webforms criados
VII
Os Reports criados
IX
Elaboração das Perguntas à Base de Dados
X
Estudo da Normalização
XI
Conclusões
Joel Carvalho e Jorge Correia
2 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
I
DESCRIÇÃO DO PROBLEMA
A companhia de seguros Paga & Cala dedica-se única e exclusivamente à elaboração de
seguros no ramo automóvel.
O tipo de apólices celebradas entre a seguradora Paga & Cala e o segurado do seguinte
tipo:
Jota Bartolomeu, cliente do sexo Masculino, portador do B.I. nº 11439999 e do numero
de contribuinte 255366114, morador na Praceta Aqui do Lado n.º100, 4465 S. Mamede de
Infesta, telefone 229060505 segurou nesta companhia uma viatura automóvel de marca
Porsche modelo Carrera 4 em 11 de Dezembro de 2001. Esta apólice fica registada com nº
4473193.
O seguro é do tipo A, para um montante máximo de 100.000.000$00, a que corresponde
uma anuidade de 35.000$00.
Os 4 tipos de seguros praticados pela companhia, respectivo montante coberto e
anuidades a pagar encontram-se referidos na seguinte tabela:
Categoria
A
B
C
D
Montante Máximo
100.000.000$00
50.000.000$00
20.000.000$00
10.000.000$00
Anuidade
35.000$00
20.000$00
10.000$00
7.000$00
A Paga & Cala mantêm um registo actualizado dos acidentes que envolvem quaisquer
viaturas seguradas por si.
Esse registo assume a forma seguinte:
A data do acidente; o nome, a data de nascimento, a morada, o numero do BI, o código
postal, o número de contribuinte e o telefone do condutor da viatura na altura do acidente e o
montante pago pela companhia para compensar os estragos causados. É também registada
a matrícula da viatura.
Joel Carvalho e Jorge Correia
3 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
II
MODELO ENTIDADE-ASSOCIAÇÃO
O primeiro passo da elaboração da base de dados da companhia de seguros Paga &
Cala
passa como é obvio pela criação do diagrama entidade associação no
Oracle
Designer 6i utilizando a ferramenta Entity Relationship Diagrammer.
Os tipos de dados de cada atributo foram especificados tendo sido também também
escolhidas as chaves de cada uma das entidades.
As entidades geradas e a sua função na base de dados são as seguintes:
TIPO1 - Entidade que especifica o tipo de apólice negociado pela companhia cujo
conteúdo foi já referido acima, a chave desta entidade é obviamente à categoria da apólice
(A,B,C ou D).
APOLICE1 - Entidade onde estão registadas todos as apólices de seguro automóvel
celebradas entre a Paga & Cala
e determinado cliente. O
numero de matricula
(MATRICULA) é portanto a chave desta entidade vez que é uma forma de identificação única
para um veiculo. È salientar o facto de uma apólice se referir apenas a um veículo, podendo
no entanto o mesmo segurado possuir várias apólices. Os campos adicionais especificam os
dados pessoais (NOME, MORADA, CODIGOPOSTAL, DATANASC,BI, NUMCONTRIB,
SEXO, TELEFONE), alguns dados adicionais do veiculo (MARCA, MODELO) bem como a
data de celebração de contrato (DATAINICIO).
REGISTO1 - Esta entidade contem o registo de acidentes que envolveram quaisquer
veículos segurados pela Paga & Cala. A data do acidente (DATA) é a chave, uma vez que
através dela juntamente com a matricula do veículo, campo da entidade APOLICE1, fica
especificado de forma única um acidente que tenha envolvido um veículo segurado.
NOTA: De referir aqui uma das limitações da nossa base de dados, uma vez que assumimos que um veículo automóvel não sofre dois
acidentes no mesmo dia e hora (o que na verdade também é extremamente improvável).
Esta entidade contem uma outra série de campos que especificamos dados pessoais do
condutor do veículo segurado (NOME, MORADA, CODPOSTAL, DATANASC, SEXO,
TELEFONE, NUMCONTRIB, BI). Note-se que não necessariamente tem de ser o possuidor
da apólice o condutor do automóvel segurado. Como era de esperar é também esta entidade
que
conterá
o
valor
de
compensação
a
atribuir
ao/s
veiculo/s
danificado/s
(MONTANTECOMP).
PAGAMENTO1 – Esta última entidade aqui referida refere-se aos pagamentos por parte
dos segurados das respectivas apólices. A data (DATA) do saldar da divida para com a Paga
& Cala, juntamente com a matrícula do veículo, campo da entidade APOLICE1, especificam
univocamente o pagamento de uma apólice, daí que este campo seja a chave desta
entidade.
Para facilitar a compreensão das relações entre entidades é apresentado desde já o
modelo entidade-associação que caracteriza a base de dados:
Joel Carvalho e Jorge Correia
4 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
TIPO1
# CATEGORIA
* ANUIDADE
* MONTMAX
a que pertence a
do
APOLICE1
REGISTO1
#
*
*
*
*
*
*
*
*
*
DATA
BI
CODIGOPOSTAL
DATANASC
MONTANTECOMP
MORADA
NOME
NUMCONTRIB
SEXO
TELEFONE
que se refere a
onde fica o
#
*
*
*
*
*
*
*
*
*
*
o
o
MATRICULA
BI
CODIGOPOSTAL
DATAINICIO
DATANASC
MARCA
MODELO
MORADA
NOME
NUMCONTRIB
SEXO
NUMACID
TELEFONE
a que se refere o
da
PAGAMENTO1
# DATA
o PERCENTAGEMDESC
o VALOR
Os diversos tipos de atributos de cada instancia encontram-se referidos na tabela abaixo
TIPO1
ATRIBUTOS
TIPO
CATEGORIA
CHAR
ANUIDADE
NUMBER
MONTMAX
NUMBER
APOLICE1
ATRIBUTOS
TIPO
MATRICULA
CHAR
BI
NUMBER
CODIGOPOSTAL
NUMBER
DATAINICIO
DATE
DATANASC
DATE
MARCA
CHAR
MODELO
CHAR
MORADA
CHAR
NOME
CHAR
NUMCONTRIB
NUMBER
SEXO
CHAR
NUMACID
NUMBER
TELEFONE
NUMBER
REGISTO1
ATRIBUTOS
TIPO
DATA
DATE
BI
NUMBER
CODIGOPOSTAL
NUMBER
DATANASC
DATE
MONTANTECOMP NUMBER
MORADA
CHAR
NOME
CHAR
NUMCONTRIB
NUMBER
SEXO
CHAR
TELEFONE
NUMBER
PAGAMENTO1
ATRIBUTOS
TIPO
DATA
DATE
PERCENTAGEMDESC CHAR
VALOR
NUMBER
Note-se que a designação not null à frente de cada atributo define o carácter de
obrigatoriedade do atributo, isto é, todos os atributos distinguidos com not null devem ser
obrigatoriamente preenchidos antes de serem inseridos na base de dados.
Através do esquema entidade associação facilmente se verifica que todas as nossas
relações entre entidades são de 1 para M (um para muitos). Um exemplo rápido explicita isto
claramente:
-
Existem muitas apólices, mas apenas um tipo* é especificada por cada apólice**.
-
Existem muitos registos de acidentes*** mas cada registo só diz respeito a uma só
apólice.
-
Os pagamentos**** também são inúmeros no entanto cada pagamento diz respeito a
apenas uma apólice.
Joel Carvalho e Jorge Correia
5 / 21
PAGA & CALA - Companhia de Seguros
-
Sistemas de Informação 2001/2002
O facto de alguns campos serem iguais deve-se a servirem para trabalharem com os
triggers e serem de informação, com excepção da PERCENTAGEMDESC que foi
introduzido mas não chegou a ser utilizado.
Notas:
*Tipo:
Um tipo pode ter várias apólices, porém não é obrigatório que isso aconteça.
**Apólice:
Uma apólice tem muitos pagamentos e refere-se a vários tipos. Porém esta relação é obrigatória, ou seja, uma apólice não tem
que ter obrigatoriamente registos assim como não tem que ter obrigatoriamente pagamentos.
***Registo:
Um registo tem que ter obrigatoriamente uma apólice. A relação entre a associação “registo” e a entidade “apólice” é M para 1.
****Pagamento:
Um pagamento é feito obrigatoriamente para uma apólice. A relação de M to 1 de “pagamento” para “apólice” representa isso
mesmo.
Joel Carvalho e Jorge Correia
6 / 21
PAGA & CALA - Companhia de Seguros
III
Sistemas de Informação 2001/2002
MODELO RELACIONAL
Este modelo relacional é gerado através do Design Editor do Oracle Designer 6i.
Pela análise do esquema relacional podemos verificar que a transformação do modelo
entidade-associação num modelo relacional resulta na “herança” de
atributos por parte
algumas entidades. Este fenómeno resulta das relações que existem entre as entidades.
A base de dados referente á companhia de seguros Paga & Cala é então composta
pelas seguintes tabelas:
-
TIPOS1 (CATEGORIA, ANUIDADE, MONTMAX)
-
APOLICES1 (MATRICULA, TIP1_CATEGORIA, BI, CODIGOPOSTAL, DATAINICIO, DATANASC,
MARCA, MODELO, NUMCONTRIB, SEXO, NUMACID, TELEFONE)
-
REGISTOS1 (APO1_MATRICULA, DATA, BI, CODIGOPOSTAL, DATANASC, MONTANTECOMP,
MORADA, NOME, NUMCONTRIB, SEXO, TELEFONE)
-
PAGAMENTOS1 (DATA, AP01_MATRICULA, VALOR, PERCENTAGEMDESC)
Torna-se então bem evidente, através do modelo relacional criado, o facto dos atributos
chave de uma entidade serem nalguns casos parcialmente herdados doutra entidade. No
nosso caso:
-
a chave de APOLICES1 é (MATRICULA, TIP1_CATEGORIA) é parcialmente
herdada de TIPOS1
-
a chave de REGISTOS1 é (APO1_MATRICULA, DATA) é parcialmente herdada de
APOLICES1
Joel Carvalho e Jorge Correia
7 / 21
PAGA & CALA - Companhia de Seguros
-
Sistemas de Informação 2001/2002
a chave de PAGAMENTOS1 (DATA, AP01_MATRICULA) é parcialmente herdada de
APOLICES1
Com este modelo todas as entidades se encontram relacionadas, ou seja, através de
alguns dos seus atributos podemos alcançar a informação contida noutras as tabelas.
Joel Carvalho e Jorge Correia
8 / 21
PAGA & CALA - Companhia de Seguros
IV
Sistemas de Informação 2001/2002
RESTRIÇÕES DE INTEGRIDADE
As restrições de integridade podem ser obtidas de várias formas, como por exemplo
através de triggers ou através da implementação de chaves primárias ou chaves
estrangeiras.
Todas as restrições de integridade foram obtidas recorrendo a triggers. De seguida são
apresentados os códigos fonte dos 5 triggers que foram implementados: trigger 10, trigger
12, trigger 13, trigger 14, trigger 15, trigger 19, trigger 23, trigger 25.
EVITA A INSERÇÃO DE MONTANTES COMPENSADOS COM VALORES NEGATIVOS
CREATE or replace TRIGGER trigger10 BEFORE INSERT or UPDATE ON registos1
for each row
BEGIN
IF (:new.montantecomp <= 0) THEN
RAISE_APPLICATION_ERROR(-20210,'O VALOR DO MONTANTE COMPENSADO NÃO PODE TOMAR
VALORES NEGATIVOS!!!');
END IF;
END;
EVITA A INSERÇÃO DE REGISTOS DE ACIDENTES COM DATA INFERIOR À DE HOJE
create or replace trigger trigger12
BEFORE INSERT OR UPDATE on registos1
for each row
begin
if (:new.data < sysdate)
then
raise_application_error
(-20210,'Inseriu uma data inválida');
end if;
end;
EVITA A INSERÇÃO DE APOLICES COM DATA INFERIOR À DE HOJE
create or replace trigger trigger13
BEFORE INSERT OR UPDATE on apolices1
for each row
begin
if (:new.datainicio < sysdate)
then
raise_application_error
(-20210,'Inseriu uma data inválida');
end if;
end;
EVITA A INSERÇÃO DE PAGAMENTOS COM DATA INFERIOR À DE HOJE
create or replace trigger trigger14
BEFORE INSERT OR UPDATE on pagamentos1
for each row
begin
if (:new.data < sysdate)
then
raise_application_error
(-20210,'Inseriu uma data inválida');
end if;
end;
Joel Carvalho e Jorge Correia
9 / 21
PAGA & CALA - Companhia de Seguros
Sistemas de Informação 2001/2002
EVITAR A INTRODUÇÃO DE APOLICES COM MATRICULAS IGUAIS
CREATE or replace TRIGGER trigger15
BEFORE INSERT or UPDATE ON apolices1
FOR EACH ROW
DECLARE
times number(3);
BEGIN
times:= 0;
SELECT COUNT(*) INTO times
FROM apolices1
WHERE matricula = :new.matricula;
IF (times != 0) THEN
RAISE_APPLICATION_ERROR(-20210,'Matricula já tem apólice!');
END IF;
END;
NAO PODE HAVER MAIS QUE UM PAGAMENTO POR ANO
CREATE or replace TRIGGER trigger21
before INSERT or UPDATE ON pagamentos1
FOR EACH ROW
DECLARE
contagem number(1);
BEGIN
select count(data) into contagem from pagamentos1
where to_char(pagamentos1.data,'YY')=to_char(:NEW.data,'YY')
and apo1_matricula=:NEW.apo1_matricula;
if(contagem=1)
then raise_application_error(-20210,'Já pagou este ano');
end if;
END;
ACTUALIZA OS VALORES SEGURADOS E A PAGAR AQUANDO DE NOVA APOLICE
CREATE or replace TRIGGER trigger19
AFTER INSERT or UPDATE ON apolices1
FOR EACH ROW
BEGIN
if :new.tip1_categoria='A'
if :new.tip1_categoria='B'
if :new.tip1_categoria='C'
if :new.tip1_categoria='D'
END;
then
update tipos1 set anuidade=35 where categoria='A';
update tipos1 set montmax=100000 where categoria='A';
end if;
then
update tipos1 set anuidade=20 where categoria='B';
update tipos1 set montmax=50000 where categoria='B';
end if;
then
update tipos1 set anuidade=10 where categoria='C';
update tipos1 set montmax=20000 where categoria='C';
end if;
then
update tipos1 set anuidade=7 where categoria='D';
update tipos1 set montmax=10000 where categoria='D';
end if;
CALCULA O VALOR DE ANUIDADE A PAGAR DE ACORDO COM OS ACIDENTES EXISTENTES OU NÃO
CREATE or replace TRIGGER trigger25
BEFORE INSERT or UPDATE ON pagamentos1
FOR EACH ROW
DECLARE
times number(3);
times2 number(3);
xpto number(15);
xpto2 number(15);
BEGIN
times:= 0;
Joel Carvalho e Jorge Correia
10 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
times2:=0;
SELECT COUNT(*) INTO times
FROM registos1
WHERE
to_number(to_char(data,'YY'))=to_number(to_char(:new.data))-1
:new.apo1_matricula=apo1_matricula;
SELECT COUNT(*) INTO times2
FROM registos1
WHERE
to_number(to_char(data,'YY'))=to_number(to_char(:new.data))-2
:new.apo1_matricula=apo1_matricula;
select tip1_categoria into xpto2 from apolices1 where matricula=:new.apo1_matricula;
select anuidade into xpto from tipos1 where categoria=xpto2;
if (times=0) then
and
update pagamentos1 set valor=xpto;
elsif
(times=1) then
update pagamentos1 set valor=xpto+15000;
elsif
(times=2) then
update pagamentos1 set valor=xpto+35000;
elsif
(times=3) then
update pagamentos1 set valor=xpto+65000;
elsif
(times>3) then
and
raise_application_error(-20210,'Comece a deixar o carro em casa...');
update pagamentos1 set valor=xpto+100000;
end if;
end if;
if (times2=0) then
update pagamentos1 set valor=xpto-2000;
END;
Joel Carvalho e Jorge Correia
11 / 21
PAGA & CALA - Companhia de Seguros
V
Sistemas de Informação 2001/2002
SCRIPTS DE INICIALIZAÇÃO DAS INSTANCIAS
•
Instancia TIPOS1
insert into tipos1 values ('A', '100000000', '35000');
insert into tipos1 values ('B', '50000000', '20000');
insert into tipos1 values ('C', '20000000', '10000');
insert into tipos1 values ('D', '10000000', '7000');
•
Instancia APOLICES1*
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-25-AB','C','4465','11-12-80','12457899','127' ,'rua das couves 11'
,'fiat'
,'123456789','04-08-96','Masculino','Chico Santola' ,'225689759');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('25-25-AD','A','4465','12-12-80','12457898','wdm' ,'rua dos nabos 12'
,'porsche' ,'123456788','05-08-96','Feminino','Xuana Molinha' ,'225689758');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('35-25-AG','D','4465','13-12-79','12457897','xl' ,'rua das pencas 13'
,'fiat'
,'123456787','06-08-96','Masculino','Bigodalho Sapudo' ,'225689757');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('45-25-AV','A','4466','14-12-79','12457896','xs' ,'rua das cenouras 14'
,'ferrari' ,'123456786','07-09-97','Feminino','Carlota das Neves','225689756');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('55-25-AK','A','5466','15-12-78','12457895','hh' ,'rua dos tomates 15'
,'bmw'
,'123456785','08-08-97','Masculino','Rain Men'
,'225689755');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('65-25-AL','D','6479','16-12-78','12457894','pico' ,'praceta do
manjericao 16' ,'ford'
,'123456784','09-10-98','Feminino','Urina Pacova' ,'225689754');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('75-25-AE','B','7489','17-12-77','12457893','mk' ,'praceta dos
espinafres 17' ,'citroen' ,'123456783','08-11-99','Masculino','Jota Carvalho' ,'225689753');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('85-26-AQ','D','8455','18-12-77','12457892','xpto' ,'avenida dos
agrioes 18' ,'ford'
,'123456782','07-12-00','Masculino','Faria Asakebrada' ,'225689752');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('95-17-AP','A','9433','19-12-76','12457891','toto' ,'travessa das
ervilhas 19' ,'vw'
,'123456781','06-08-99','Masculino','Postas de Pescada','225689751');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-28-AU','A','4132','20-12-76','12457890','mac' ,'rua da beterraba
20'
,'vw'
,'123456709','05-08-98','Feminino','Susanita Santos' ,'215689750');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-29-GG','D','4212','21-12-75','22407896','ttl' ,'rua das vagens 21'
,'fiat'
,'123456719','04-08-97','Feminino','Little Debbie' ,'225689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-35-JK','D','4211','21-11-75','22417896','tt' ,'rua das vagens 22'
,'vw'
,'123456729','03-08-96','Feminino','Marina Xau'
,'235689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-45-AH','D','4245','21-10-75','22427896','sos' ,'rua das vagens 23'
,'opel'
,'123456739','02-08-95','Masculino','Joalho Pi'
,'245689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-75-AK','A','4245','21-09-75','22437896','civic','rua das vagens 24'
,'honda' ,'123456749','01-08-96','Feminino','Martina Silves' ,'255689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-85-AL','D','4245','21-08-75','22447896','hh' ,'rua das couves 21'
,'bmw'
,'123456759','01-08-96','Masculino','Tó Carro'
,'265689704');
Joel Carvalho e Jorge Correia
12 / 21
PAGA & CALA - Companhia de Seguros
Sistemas de Informação 2001/2002
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-95-AZ','C','4246','21-07-75','22457896','vi' ,'rua das pencas 21'
,'seat'
,'123456769','01-08-96','Feminino','Lia Ontem'
,'275689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-15-AX','D','4744','21-06-75','22467896','clio' ,'rua das tomates 21'
,'renault' ,'123456779','02-08-96','Masculino','Lio travasso' ,'285689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-25-AC','C','4744','21-05-75','22477896','vi' ,'rua das nabos 21'
,'seat'
,'123456789','03-08-97','Feminino','Andrea Kappa' ,'295689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('15-35-AV','D','4944','21-04-75','22487896','sos' ,'rua das jarras 21'
,'opel'
,'123456799','04-08-98','Masculino','Marito Jó'
,'220689704');
insert into apolices1
(MATRICULA,TIP1_CATEGORIA,CODIGOPOSTAL,DATANASC,BI,MODELO,MORADA,MARCA,NUMCONTRIB,D
ATAINICIO,SEXO,NOME,TELEFONE) values ('18-38-BV','D','4944','22-04-75','25487396','sos' ,'rua das jarras 22'
,'opel'
,'123456799','05-08-99','Masculino','Marisa Chata' ,'220689704');
•
Instancia REGISTOS1
insert into registos1 values ('15-25-AB','09-12-98','1444','11-12-80','100000' ,'Masculino','225689759','12457899','rua
das couves 11' ,'Chico Santola','123456789');
insert into registos1 values ('15-25-AB','11-12-00','1474','04-08-77','400000' ,'Feminino','225689756','12457555','rua
do xilindro' ,'Gina da Bouça','123456755');
insert into registos1 values ('15-25-AB','11-12-01','1445','11-12-80','250000' ,'Masculino','225689759','12457899','rua
das couves 11' ,'Chico Santola','123456789');
insert into registos1 values ('15-95-AZ','11-12-01','4246','21-07-75','250000' ,'Feminino','275689704','22457896','rua
das pencas 21' ,'Lia Ontem' ,'123456769');
insert into registos1 values ('15-15-AX','11-12-00','4744','21-06-75','400000' ,'Masculino','285689704','22467896','rua
das tomates 21' ,'Lio travasso','123456779');
insert into registos1 values ('15-25-AC','11-12-99','4744','21-05-75','500000' ,'Feminino','295689704','22477896','rua
das nabos 21' ,'Andrea Kappa','123456789');
insert into registos1 values ('15-35-AV','11-12-98','4944','21-04-75','100000' ,'Masculino','220689704','22487896','rua
das jarras 21' ,'Marito Jó','123456799');
•
Instancia PAGAMENTOS1*
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('05-06-01','15-25-AB','4465');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('05-07-01','25-25-AD','4465');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('09-10-01','15-25-AC','4744');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('09-11-01','15-35-AV','4944');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('05-09-01','18-38-BV','4944');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('06-09-01','15-15-AX','4744');
insert into pagamentos1 (DATA,APO1_MATRICULA,VALOR) values ('07-09-01','15-95-AZ','4246');
Nota: Tanto a entidade APOLICES1 como PAGAMENTOS1 necessitam aquando da geração de dados que se mencionem os nomes dos seus
campos uma vez que alguns destes são optativos.
Joel Carvalho e Jorge Correia
13 / 21
PAGA & CALA - Companhia de Seguros
VI
Sistemas de Informação 2001/2002
OS FORMS CRIADOS
Joel Carvalho e Jorge Correia
14 / 21
PAGA & CALA - Companhia de Seguros
VII
Sistemas de Informação 2001/2002
OS WEBFORMS CRIADOS
Joel Carvalho e Jorge Correia
15 / 21
PAGA & CALA - Companhia de Seguros
VIII
Sistemas de Informação 2001/2002
OS REPORTS CRIADOS
Joel Carvalho e Jorge Correia
16 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
IX
ELABORAÇÃO DAS PERGUNTAS A BASE DE DADOS
1.
Indique os nomes dos condutores que não têm acidentes há 2 anos ou mais.
Álgebra relacional:
∏
NOME
[∏
SYSDATE (YY )− DATA(YY )> 2 , AP 01 _ MATRICULA
]
( REGISTOS1) >< APOLICES1
Linguagem SQL:
select nome from apolices1
where matricula in
(
select apo1_matricula
from registos1
where to_number(to_char(data,'YY'))
not in
( to_number(to_char(sysdate,'YY')),to_number(to_char(sysdate,'YY'))-1,to_number(to_char(sysdate,'YY'))-2)
);
Resposta da BD:
NOME
-------------------Chico Santola
Andrea Kappa
Marito Jó
2.
Qual o nome e o valor do último pagamento de apólice efectuado, pelo
possuidor da apólice do último veículo a ter um acidente?
Álgebra relacional:
∏
NOME ,VALOR
[σ
MAX ( DATA )
]
( PAGAMENTOS1) >< APOLICES1
Linguagem SQL:
select nome,valor,data
from apolices1,pagamentos1
where matricula=apo1_matricula and data in
(select max(data) from pagamentos1);
Resposta da BD:
NOME
VALOR
DATA
-----------------------------------------------------------------Marito Jó
4944
09-11-01
3.
Qual foi o lucro (ou prejuízo, se negativo) da seguradora com os seguros
efectuados no ano 2000?
4.
Álgebra relacional:
∏
SUM ( − MONTANTECOMP ,VALOR )
Joel Carvalho e Jorge Correia
[σ
DATA (YY ) = 00
( REGISTOS1) >< σ DATA(YY )=01 ( PAGAMENTOS1)
]
17 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
Linguagem SQL:
select sum(-soma_comp+soma_pagamentos) Balanço2000
from (
select sum(montantecomp) soma_comp,sum(valor) soma_pagamentos
from registos1 r,pagamentos1 p
where to_number(to_char(r.data,'YY'))=00 and to_number(to_char(p.data,'YY'))=01
);
Resposta da BD:
BALANÇO2000
----------------------5534896
4.
Qual a matrícula, marca e modelo do veículo que regista mais acidentes no
último ano?
∏
Álgebra relacional:
MATRICULA , MARCA , MODELO
[σ
MAX ( COUNT ( AP 01 _ MATRICULA ))
( REGISTOS 1) >< σ DATA (YY )= SYSDATE (YY )−1 ( REGISTOS 1)
Linguagem SQL:
select matricula,marca,modelo from apolices1 where matricula=(
select apo1_matricula
from (select apo1_matricula,count(*) n
from registos1 where to_number(to_char(data,'YY'))=(select (to_number(to_char(sysdate,'YY')))-1 from dual)
group by apo1_matricula)
where n=(select max(n)
from (
select apo1_matricula,count(*) n
from registos1
group by apo1_matricula
))
);
Resposta da BD:
não foram seleccionadas linhas
Nota:
por lapso esquecemo-nos de inserir valores que nos permitissem obter resposta obvia a esta pergunta. No entanto parece-nos
obvia a boa formulação da mesma, não tendo sido obtido qualquer resultado uma vez que na nossa base de dados não existem veículos que
tenham sofrido ou estado envolvidos em mais do que um acidente durante o ultimo ano
5.
Quais os veículos que tiveram um acidente no ano de 1999?
Álgebra relacional:
∏
MATRIOCULA
[σ
DATA(YY ) =99 ,COUNT ( DATA ) =1
( REGISTO1)
]
Linguagem SQL:
select apo1_matricula from (select apo1_matricula,data,count(*) n
from registos1
group by apo1_matricula,data)
where to_number(to_char(data,'YY'))=99 and n=1;
Resposta da BD:
APO1_MATRICULA
---------------------------15-25-AC
Joel Carvalho e Jorge Correia
18 / 21
]
PAGA & CALA - Companhia de Seguros
X
Sistemas de Informação 2001/2002
NORMALIZAÇÃO
Ao construirmos o modelo entidade-associação, tivemos o cuidado de não termos
redundância. O esquema está na forma normalizada. Vamos seguir os passos necessários
para o estudo da normalização.
O método da normalização compreende 5 passos:
1- Determinar as dependências funcionais aplicáveis na relação.
2- Determinar as chaves a partir das dependências funcionais.
3- Reduzir o conjunto de dependências funcionais a uma forma minimal.
4- Verificar se a relação está normalizada ou, se pelo contrário, tem dependências
funcionais que causam redundância.
5- No caso de não estar normalizado, decompor a relação em duas ou mais relações
normalizadas.
De seguida seguiremos estes passos para as nossas tabelas:
Tabela TIPOS1
TIPOS1 (CATEGORIA,ANUIDADE,MONTMAX)
1- CATEGORIA → ANUIDADE MONTMAX
2- Chave CATEGORIA, como é evidente.
3- O conjunto de dependências funcionais já esta na forma minimal (ver ponto 1)
4- Verificação da forma normal de Boyce-Cood (BCNF), que diz que uma relação R está
na BCNF quando não tem nenhuma DF não trivial X → A, em que X não contém uma chave.
Como podemos constatar a nossa relação esta na forma BCNF.
CATEGORIA → ANUIDADE MONTMAX
5- Visto que a relação esta na forma BCNF, não é necessário decompor-se em várias
relações. Assim este ponto não se pode aplicar.
Tabela PAGAMENTOS1
PAGAMENTOS1 (DATA, APO1_MATRICULA, PERCENTAGEMDESC, VALOR)
1- DATA → APO1_MATRICULA, PERCENTAGEMDESC, VALOR
2- Chave DATA, como é evidente.
3- O conjunto de dependências funcionais já esta na forma minimal (ver ponto 1)
4- Verificação da forma normal de Boyce-Cood (BCNF), que diz que uma relação R está
na BCNF quando não tem nenhuma DF não trivial X → A, em que X não contém uma chave.
Como podemos constatar a nossa relação esta na forma BCNF.
Joel Carvalho e Jorge Correia
19 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
DATA → APO1_MATRICULA, PERCENTAGEMDESC, VALOR: Obedece à BCNF
5- Visto que a relação esta na forma BCNF, não é necessário decompor-se em várias
relações. Assim este ponto não se pode aplicar.
Tabela REGISTOS1
REGISTOS1
(DATA,
APO1_MATRICULA,
BI,
CODIGOPOSTAL,
DATANASC,
MONTANTECOMP, MORADA, NOME, NUMCONTRIB, SEXO ,TELEFONE)
1- DATA MATRICULA → BI CODIGOPOSTAL DATANASC MONTANTECOMP
MORADA NOME NUMCONTRIB SEXO TELEFONE
2- Chave DATA MATRICULA, como é evidente.
3- O conjunto de dependências funcionais já esta na forma minimal.
DATA
MATRICULA
→ BI CODIGOPOSTAL DATANASC MONTANTECOMP
MORADA NOME NUMCONTRIB SEXO TELEFONE
4- Verificação da forma normal de Boyce-Cood (BCNF), que diz que uma relação R está
na BCNF quando não tem nenhuma DF não trivial X → A, em que X não contém uma chave.
Como podemos constatar a nossa relação esta na forma BCNF.
COD_CUR → TIPO_CUR DESIGN_CUR: Obedece à BCNF
5- Visto que a relação esta na forma BCNF, não é necessário decompor-se em várias
relações. Assim este ponto não se pode aplicar.
Tabela APOLICES1
APOLICES1 (MATRICULA, TIP1_CATEGORIA, BI, CODIGOPOSTAL, DATAINICIO,
DATANASC, MARCA, MODELO, MORADA, NOME, NUMCONTRIB, SEXO, NUMACID,
TELEFONE)
1- MATRICULA → TIP1_CATEGORIA BI CODIGOPOSTAL DATAINICIO DATANASC
MARCA MODELO MORADA NOME NUMCONTRIB SEXO NUMACID TELEFONE
2- Chave MATRICULA, como é evidente.
3- O conjunto de dependências funcionais já esta na forma minimal.
MATRICULA → TIP1_CATEGORIA BI CODIGOPOSTAL DATAINICIO DATANASC
MARCA MODELO MORADA NOME NUMCONTRIB SEXO NUMACID TELEFONE
4- Verificação da forma normal de Boyce-Cood (BCNF), que diz que uma relação R está
na BCNF quando não tem nenhuma DF não trivial X → A, em que X não contém uma chave.
Como podemos constatar a nossa relação esta na forma BCNF.
MATRICULA → TIP1_CATEGORIA BI CODIGOPOSTAL DATAINICIO DATANASC
MARCA MODELO MORADA NOME NUMCONTRIB SEXO NUMACID TELEFONE
5- Visto que a relação esta na forma BCNF, não é necessário decompor-se em várias
relações. Assim este ponto não se pode aplicar.
Joel Carvalho e Jorge Correia
20 / 21
Sistemas de Informação 2001/2002
PAGA & CALA - Companhia de Seguros
XI
CONCLUSÕES
Todo o trabalho efectuado na elaboração da base de dados da seguradora Paga &
Cala permitiu-nos adquirir alguma experiência na formulação e técnicas de projecto de uma
base de dados.
Devemos no entanto reconhecer que o nosso trabalho contem algumas limitações,
sendo que uma verdadeira base de dados de uma também verdadeira companhia de
seguros devesse ser manifestamente mais complexa.
Um esquema entidade-associação anterior da nossa base de dados era o seguinte:
TIPO
# CATEGORIA
* ANUIDADE
* MONTMAX
do
a que pertence a
APOLICE
onde fica o
#
*
*
*
o
MATRICULA
DATAINICIO
MARCA
MODELO
NUMACID
a que se refere o
que se refere a
da
REGISTO
# DATA
* MONTANTECOMP
que pertence a
do
CONDUTOR
que efectuou
#
*
*
*
*
*
BI
DATANASC
MORADA
NOME
SEXO
TELEFONE
PAGAMENTO
* DATA
* PERCENTAGEMDESC
o VALOR
efectuado pelo
titular da
SEGURADO
a que se refere o
# NUMCONTRIB
* CODIGOPOSTAL
No entanto, já numa fase avançada do nosso projecto não nos foi possível garantir,
inexplicavelmente, a manutenção da relação ISA entre CONDUTOR e SEGURADO. Apartir
daí(noite de terça-feira_11.12) refizemos a base de dados optando por um esquema mais
simples mas adequado ao que era pretendido por este projecto.
Os constantes erros do servidor blaster_db limitaram em muito o percurso normal
deste projecto, a criação por vezes inexplicável de tabelas desconhecidas é um exemplo
claro disso. No entanto a perseverança em busca de um resultado satisfatório, que fomos
obrigados a demonstrar, permitiu-nos obter alguma prática de manuseamento do Oracle 6i.
O nosso login
sinf24
A nossa password
jota
Joel Carvalho - [email protected]
Jorge Correia - [email protected]
Dezembro 2001
FEUP
Joel Carvalho e Jorge Correia
21 / 21
Download

de uma Companhia de Seguros