Projeto Farmácia Paul Eduardo Costa Gabriel Cypriano Rodrigo Calhau

Preview:

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