Upload
internet
View
110
Download
2
Embed Size (px)
Citation preview
Projeto Farmácia Paul
Eduardo Costa
Gabriel Cypriano
Rodrigo Calhau
Escopo do Sistema
• Controle de Estoque– aviso automático de medicamentos com
estoque abaixo de um limite configurável– aviso automático de lotes com validade
próxima do vencimento (configurável)
• Controle de Vendas
• Controle de Funcionários
• Controle de Clientes
Projeto Conceitual – parte 1
Projeto Conceitual – parte 2
Projeto Conceitual (UML com atributos)
Projeto ConceitualDiagrama de Estados - Lote
Mapeamento de heranças
• Herança parcial– Podem existir Vendas que não
sejam VendaEntrega
• Abordagem com apenas uma tabela utilizando flags não serve, pois não suporta atributos not null de VendaEntrega
• Utilizamos abordagem de duas tabelas (superclasse e subclasse)
Mapeamento de heranças• Herança total
– Não podem existir PessoaFisica que não seja das subclasses
• Herança sobreposta– Pode haver PessoaFisica que seja
tanto Cliente quanto Funcionario
• Abordagem com apenas uma tabela utilizando flags não serve, pois não suporta atributos not null de VendaEntrega
• Abordagem com duas tabelas (subclasses) não serve, pois não é uma herança disjunta
• Utilizamos abordagem de três tabelas (superclasse e subclasses)
Outros Mapeamentos
• Relação NxN com atributos ItemVenda foi mapeada para uma tabela item_venda
• Atributo multivalorado Telefones de PessoaFisica foi mapeado para uma tabela telefones_pessoa_fisica (1a. Forma normal)
• Atributos derivados foram mapeados nas Views
Projeto Lógico 1FN – parte 1
Projeto Lógico 1FN – parte 2
Dependências Funcionais(diagrama parcial da 1FN)
• Tabela Medicamento desnormalizada
Dependências Funcionais (diagrama parcial da 3FN)
• Tabela Medicamento desnormalizada
Projeto Lógico 3FN (parcial)
Criação do Schema
• Domínios
Criação do Schema
• Tabelas (1)
Criação do Schema
• Tabelas (2)
Criação do Schema
• Tabelas (3)
Criação do Schema
• Tabelas (4)
Criação do Schema
• Tabelas (5)
Criação do Schema
• Tabelas (6)
Criação do Schema
• Tabelas (7)
Criação do Schema
• Tabelas (8)
Criação do Schema
• Tabelas (9)
Criação do Schema
• Tabelas (10)
Criação do Schema
• Views
Criação do Schema
• Restrições(1)
Criação do Schema
• Restrições(2)
Consultas
• Consulta 1: Dentre os funcionários que trabalham no caixa, recupere seu nome e o valor total de vendas efetuadas (quanto já vendeu), em ordem decrescente do valor de total de vendas.
SELECT nome, SUM (valor_item)
FROM item_venda, venda, pessoa_fisica
WHERE (item_venda.num_boleto_fiscal = venda.num_boleto_fiscal)
GROUP BY venda.cpf_caixa, nome, cpf
HAVING pessoa_fisica.cpf = cpf_caixa
ORDER BY SUM DESC
Item_Venda
Venda
Pessoa_fisica
Resultado
Consultas
• Consulta 2: Recupere o valor total de descontos concedidos, via cupons de desconto, por mês, ordenados por ordem decrescente de valor
SELECT round(SUM(descontos.valor_desconto), 2) AS valor_descontos, descontos.mes
FROM (SELECT (valor_item * 100 / (100 - desconto_medicamento)) AS valor_desconto, to_char(data, 'Month/ YYYY') AS mes
FROM (item_venda NATURAL JOIN venda)) AS descontos
GROUP BY descontos.mes
ORDER BY SUM(descontos.valor_desconto) DESC;
Plano de Execução
Consultas
• Consulta 3:
• Enunciado: Recupere para cada funcionário o seu nome e o valor
de descontos concedidos por ele em cada mês. • Consulta:
Consultas
• Consulta 3:VIEW valor_venda
Resultado
Tabela funcionario
Tabela pessoa_fisica
Consultas
• Consulta 4: Dentre os clientes que residem na cidade de Vitória, recupere seu nome e o valor total de compras efetuadas, em ordem decrescente do valor total de compras efetuadas
SELECT nome, SUM(item_venda.valor_item)FROM (((item_venda JOIN venda ON venda.num_boleto_fiscal =
item_venda.num_boleto_fiscal)JOIN endereco ON endereco.cpf_pessoa_fisica =
venda.cpf_cliente)JOIN pessoa_fisica ON pessoa_fisica.cpf = venda.cpf_cliente)
WHERE endereco.cidade = 'Vitoria'GROUP BY pessoa_fisica.nomeORDER BY SUM DESC
Resultado
Consultas
• Consulta 5: Recupere os nomes dos medicamentos mais vendidos, ordenados pelo número de unidades vendidas
• SELECT nome, SUM(item_venda.num_unidades_medicamento)
• FROM ((item_venda JOIN lote ON codigo_lote=codigo)
• JOIN medicamento ON codigo_barras_medicamento=codigo_barras)
• GROUP BY medicamento.nome
• ORDER BY SUM(item_venda.num_unidades_medicamento) DESC;
Resultado
Consultas
• Consulta 6:• Enunciado: Recupere para cada funcionário o seu nome e a
quantidade de entregas por ele efetuada, em ordem decrescente do número de entregas.
• Consulta:
Consultas
• Consulta 6:
Resultado da Consulta
Tabela venda_entrega
Tabela funcionario
Tabela pessoa_fisica
Consultas
• Consulta 7: Recupere a razão social e o número de lotes devolvidos por ano de cada distribuidor, em ordem decrescente de lotes devolvidos
SELECT distribuidor.razao_social, COUNT(*) AS nDevolucoes
FROM lote, distribuidor, devolucao_lote
WHERE (lote.cnpj_distribuidor = distribuidor.cnpj
AND devolucao_lote.codigo_lote = lote.codigo)
GROUP BY distribuidor.razao_social
ORDER BY COUNT(*) DESC
Resultado
Consultas
• Consulta 8: Recupere para cada medicamento o seu nome e sua quantidade em estoque
• SELECT nome, SUM(qtde_estoque) AS quantidade_estoque
• FROM (medicamento JOIN lote ON codigo_barras_medicamento=codigo_barras)
• WHERE lote.qtde_estoque > 0
• GROUP BY nome
• ORDER BY SUM(qtde_estoque) DESC;
Resultado
Plano de Execução
Consultas
• Consulta 9:• Enunciado: Recupere para o conhecimento medicamento
‘Gadernal’ as dosagens existentes e a quantidade em estoque de cada uma das dosagens, ordenado pela quantidade em estoque.
• Consulta:
Consultas
• Consulta 9:
Resultado
Tabela lote
Tabela medicamento
Consultas
• Consulta 10: Recupere para as cidades com mais de 5 entregas o seu nome e a quantidade de entrega, em ordem decrescente do numero de entregas.
• SELECT cidade, COUNT(*) AS nEntregas
• FROM (venda_entrega JOIN endereco ON venda_entrega.cpf_endereco = endereco.cpf_pessoa_fisica)
• GROUP BY cidade
• HAVING COUNT(*) > 5
• ORDER BY nEntregas DESC
Resultado
Consultas
• Consulta 11: Para cada cliente, recupere seu nome e a quantidade de cupons de desconto já utilizados por ele, ordenando pela ordem decrescente da quantidade de cupons
• SELECT nome, SUM(item_venda.num_unidades_medicamento)
• FROM ((item_venda JOIN lote ON codigo_lote=codigo)
• JOIN medicamento ON codigo_barras_medicamento=codigo_barras)
• GROUP BY medicamento.nome
• ORDER BY SUM(item_venda.num_unidades_medicamento) DESC
Resultado
Consultas
• Consulta 12:• Enunciado: Recupere a quantidade medicamentos genéricos
contidos em vendas que foram entregues em Vila Velha. • Consulta:
Consultas
• Consulta 12:
Tabela lote
Tabela medicamento
Consultas
• Consulta 12:
Resultado
Tabela venda
Tabela item_venda
Consultas
• Consulta 13: Recupere para cada lote cujo tempo de expiração seja menor que o especificado no medicamento que ele representa o nome do medicamento e a quantidade em estoque dele
SELECT tempo_expiracao_lote.codigo, nome, qtde_estoqueFROM (tempo_expiracao_lote JOIN medicamento ON
codigo_barras_medicamento=codigo_barras)
WHERE tempo_expiracao_lote.limite_dias_expiracao < medicamento.limite_dias_expiracao
ORDER BY qtde_estoque DESC
Resultado
Plano de Execução
Consultas
• Consulta 14:• Enunciado: Recupere para cada lote o seu código e seu tempo de
expiração em dias e o medicamento que ele refere. • Consulta:
Consultas
• Consulta 14:• Enunciado: Recupere para cada lote o seu código e seu tempo de
expiração em dias e o medicamento que ele refere. • Consulta:
Consultas
• Consulta 14:
VIEW tempo_expiracao_lote
ResultadoTabela medicamento
Consultas
• Consulta 15:
• Enunciado: Recupere para cada venda o numero do seu boleto, o nome do caixa que efetuou a venda, o nome do cliente (caso
possua), o nome do entregador (caso possua) e o seu valor. • Consulta:
Consultas
• Consulta 15:
Tabela venda
Tabela venda_entrega
View valor_entrega
Consultas
• Consulta 15:
Resultado
Tabela pessoa_fisica