I
I
n
n
s
s
t
t
i
i
t
t
u
u
t
t
o
o
S
S
u
u
p
p
e
e
r
r
i
i
o
o
r
r
P
P
o
o
l
l
i
i
t
t
é
é
c
c
n
n
i
i
c
c
o
o
d
d
e
e
V
V
i
i
s
s
e
e
u
u
E
E
s
s
c
c
o
o
l
l
a
a
S
S
u
u
p
p
e
e
r
r
i
i
o
o
r
r
d
d
e
e
T
T
e
e
c
c
n
n
o
o
l
l
o
o
g
g
i
i
a
a
D
D
e
e
p
p
a
a
r
r
t
t
a
a
m
m
e
e
n
n
t
t
o
o
d
d
e
e
I
I
n
n
f
f
o
o
r
r
m
m
á
á
t
t
i
i
c
c
a
a
Ficha prática nº 8
SGBD Microsoft SQL Server e projecto do Microsoft Access
Objectivos: Continuação do desenvolvimento de uma aplicação em ambiente cliente servidor:
Exploração de capacidades de ferramentas cliente (tratamento de eventos, utilização de recordsets e execução de operações de manipulação de registos via ADO); Utilização de procedimentos armazenados e triggers.
I
1. Teste os diferentes tipos de (cursores de) recordsets, visualizando o conteúdo de um recordeset de cada tipo antes e depois de operações de alteração e inserção (ou remoção) de dados. Para tal crie o formulário apresentado na Figura 1.
Figura 1- Formulário frm_teste_recordsets
AJUDA:
Com o intuito de analisar o efeito (se algum) de operações de manipulação de dados, no conteúdo do recordset, associe as seguintes acções a cada um dos botões da Figura 1: A1- Criação de recordset do tipo especificado, que selecciona os registos de uma tabela
(e.g. N_ingrediente e Designação da tabela Ingredientes); A2- Visualização do conteúdo do recordset;
A3 - Alteração de registo(s) da tabela utilizada em A1; A4- Nova visualização do conteúdo do recordset;
A5 - Inserção de registo(s) na tabela utilizada em A1 e A3; A6 - Nova visualização do conteúdo do recordset;
Para facilitar a implementação das acções anteriores, considere as seguintes sugestões: a) Crie o seguinte subprograma, a usar na implementação das acções A2, A4 e A5:
Sub mostra (rst As Recordset)
Descrição: Percorre os registos do recordset, guardando numa variável local do tipo string
o conteúdo de cada registo, através de concatenações sucessivas; Recorra a espaços e mudanças de linha para tornar o conteúdo da variável local legível
a) Crie dois subprogramas em VBA, altera e insere, a usar na implementação das acções A3 e A5. Utilize o método Execute do objecto Connection para realizar as operações de manipulação de registos destes subprogramas. Consulte a ajuda do Access para obter mais informação sobre este método.
II
2. Para iniciar a implementação das operações de gestão de stocks, adicione ao formulário menup os controlos apresentados na Figura 2, utilizando os seguintes nomes:
• Grupo de opções – og_stock;
• Botões: Cmd_consultar_c, Cmd_Editar_c, Cmd_inserir_c, cmd_reabast;
• Caixa de verificação – cb_filtrar_c.
Figura 2 - Formulário Menup
3- Crie os seguintes formulários:
3.1- Formulário frm_ing_forns e subformulário sub_ing_forns, de acordo com a Figura 3; 3.2- Formulário frm_fornecedores e subformulário sub_fornecedores, de acordo com a
Figura 4 e Figura 5; (utilize este formulário para actualizar os dados da tabela Ing_forn de acordo com os valores das figuras).
Figura 4 - Formulário frm_fornecedores (registo 1)
Figura 5 - Formulário frm_fornecedores (registo 2)
III
4. Implementação de reabastecimento automático.
A finalidade da operação de reabastecimento automático consiste em inserir automaticamente encomendas, para os ingredientes que necessitam de ser reabastecidos. Antes de inserir uma encomenda, é ainda necessário analisar as encomendas existentes, para garantir que não se inserem múltiplas encomendas do mesmo ingrediente. Sem esta verificação, corre-se o risco de inserir encomendas duplicadas, quando se repete a execução desta operação.
6.1- Crie a tabela Encomendas de acordo com as características ilustradas na Tabela 1. Adicionalmente, os atributos N_ingrediente e N_forn formam (em conjunto) uma chave estrangeira para a tabela Ing_forn.
Atributo Tipo de Dados Restrições de integridade Nencomenda N_ingrediente N_forn Estado Data Quantidade Quantidade_recebida Int Int Int Char(1) Datetime Float Float Chave primária Não nulo Não nulo
Valor por defeito ‘N’ e valores válidos ∈ [‘N’,’P’,’R’]1 Valor por defeito data corrente
Valor por defeito 0 Tabela 1- Tabela Encomendas
4.2- Crie o formulário frm_encomendas, baseado na tabela Encomendas, utilizando um
esquema de formulário em tabela;
Figura 6 – Formulário frm_encomendas
4.3- Elabore os seguintes subprogramas:
• Function obter_elemento_rst(rst As Recordset) - devolve o valor do primeiro campo
do último registo do recordset rst ou 0 no caso de não existirem registos;
• Function obter_fornecedor_por_defeito(N_ing As Long) - devolve o código do
fornecedor por defeito de um ingrediente (se este existir);
• Sub Insere_encomenda(N_ing As Long, N_forn As Long, quant_enc As Double) -
obtém o próximo número sequencial de encomenda e insere uma nova encomenda na tabela encomendas.
4.4- Implemente gradualmente o código necessário para o tratamento do evento
cmd_reabastecer_Click(). Utilize os subprogramas anteriormente criados e tenha em
consideração os seguintes requisitos:
• O reabastecimento automático só se aplica aos ingredientes que necessitam de ser reabastecidos; Consequentemente, o processo de reabastecimento só deve incluir os ingredientes cujas existências sejam <= que a quantidade_alerta;
• É necessário analisar as encomendas existentes, antes de inserir uma nova encomenda de um ingrediente a reabastecer; Deve verificar se a quantidade das encomendas em curso (que ainda não foram totalmente recebidas ou sem entregas) cobre as necessidades de reabastecimento do ingrediente; Em caso afirmativo, não deve inserir uma nova encomenda. Deve ainda supor que o valor da quantidade_recebida, das encomendas parcialmente recebidas, já foi anteriormente adicionado às existências;
1 N - Normal, R - (totalmente) Recebida e P - Parcialmente recebida (quando quantidade_recebida <quantidade).
• Na inserção de uma encomenda deve utilizar o fornecedor por defeito e a quantidade_encomenda do ingrediente;
• Para terminar o processo de reabastecimento automático, deve mostrar os dados de todas as encomendas em curso ao utilizador, para que este possa alterar as novas encomendas (que entretanto gerou) e consultar as encomendas pendentes.
4.5- Substitua a invocação do subprograma Insere_encomenda (gerado no ponto 4.3) pela execução de um procedimento armazenado, sp_insere_encomenda, que realize as mesmas acções.
IV
5. Actualização automática de entradas de ingredientes.
A finalidade da operação de actualização automática de entradas de ingredientes consiste em facilitar o registo da recepção dos ingredientes encomendados, através das seguintes acções: preenchimento automático de alguns controlos do formulário de registo de entradas, validação de dados e actualização automática de atributos das tabelas ingredientes (e.g. existências) e encomendas (e.g. estado e quantidade_recebida).
5.1- Crie a tabela Entradas de acordo com as características ilustradas na Tabela 2. Atributo Tipo de Dados Restrições de integridade
N_entrada N_encomenda Data Quantidade Int Int Datetime Float Chave primária
Chave estrangeira da tabela Encomendas Valor por defeito data corrente
Tabela 2- Tabela Entradas
5.2- Crie o formulário frm_entradas, baseado na tabela Entradas e no atributo N_ingrediente da tabela Encomendas. Utilize ainda um esquema de formulário em tabela
5.3- Dado o valor do número de encomenda, trate o evento N_encomenda_After_update, do controlo N_encomenda do formulário frm_entradas, preenchendo automaticamente o valor da quantidade (da entrada); O valor por defeito da quantidade será determinado com base em atributos da tabela encomendas, subtraindo a quantidade_recebida à quantidade (encomendada);
5.4- Valide o valor da quantidade introduzida no formulário frm_entradas, de modo a não permitir que seja definido um valor maior do que a quantidade que falta receber;
5.5- Trate o evento Form_AfterInsert, do formulário frm_entradas, através da actualização dos valores das tabelas ingredientes e encomendas;
5.6- Substitua o tratamento do evento anterior (Form_AfterInsert do formulário frm_entradas) por um trigger que realize as mesmas acções.
V
6. Gere o código necessário para implementar as seguintes acções:
6.1- Garantir que um ingrediente só possui um fornecedor utilizado por defeito:
Cada ingrediente pode ser fornecido por vários fornecedores, mas só pode ter um fornecedor por defeito (Utilizado = true), para que as encomendas de ingredientes possam ser geradas automaticamente; Assim sendo, a selecção de um fornecedor a utilizar, através da caixa de verificação Utilizado, deve alterar o valor de Utilizado do fornecedor anterior para falso;
(Sugestão: Para implementar esta acção mais facilmente, garantindo que um ingrediente só tem um fornecedor utilizado, só devem ser permitidas alterações do campo utilizado de falso para verdadeiro. Em caso contrário, o utilizador deve ser avisado e a alteração deve ser anulada. Esta acção deve ser implementada para os dois sub-formulários criados no ponto 3);
6.2- Garantir que um ingrediente tem sempre um fornecedor utilizado associado:
• Criar um botão Ver fornecedores no formulário frm_ingredientes, que abre o formulário frm_ing_forns, para visualização, alteração e definição dos fornecedores de um dado ingrediente;
• Forçar a definição de um fornecedor utilizado após criação de um novo ingrediente, através das acções e tratamento dos eventos convenientes.
7- Filtragem de registos da tabela ingredientes:
7.1- Crie o Formulário frm_filtro_ingredientes para especificação de critérios de filtragem de registos a apresentar no formulário frm_ingredientes;
7.2- Gere o código necessário para tratar a opção ingredientes, tendo em consideração que deve ser implementada executando as tarefas equivalentes às apresentadas na ficha nº6 para a tabela receitas;
8- Implemente a filtragem de registos do formulário frm_fornecedores através do formulário frm_filtro_fornecedores, de forma equivalente ao ponto 7.