Instituto Superior Politécnico de Viseu Escola Superior de Tecnologia Departamento de Informática 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 Escreve o conteúdo da variável local. Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 1
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 3 - Formulário frm_ing_forns Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 2
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. Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 3
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 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). Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 4
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 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. Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 5
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. Engenharia de Sistemas e Informática Sistemas de Informação e Bases de Dados 6