Projeto de Banco de Dados Prof. Fernanda Baião [email protected] Material adaptado do Prof. Márcio Barros Projeto do Banco de Dados Atividades do projeto de BD Normas de projeto conceitual Heurísticas de projeto Formas Normais Projeto físico Atividades do Projeto de BD Principais atividades do projeto – Projeto do esquema conceitual: produzir um esquema conceitual do banco de dados independente do SGBD que será utilizado pelas aplicações – Projeto transacional: determinar e descrever detalhadamente as operações que serão realizadas pelas aplicações que deverão manipular as informações do SGBD – Seleção de um SGBD: selecionar o produto que será utilizado pelas aplicações (depende de uma variedade de fatores técnicos e não-técnicos) – Projeto lógico de dados: especializar o modelo conceitual para o SGBD que foi selecionado e definir os modelos externos com que o banco de dados será manipulado Atividades do Projeto de BD Principais atividades do projeto (continuação) – Projeto físico de dados: selecionar as estruturas de armazenamento, caminhos de acesso, índices, agrupamentos, tamanho dos blocos de disco, entre outras decisões de nível interno que otimizem o desempenho do sistema – Implementação: colocar o SGBD em operação, executar os programas em DDL que criam a estrutura vazia de tabelas do banco de dados e povoar as tabelas com informações – Ajuste fino (tunning): ajustar as características do BD de acordo com os acessos realizados e os gargalos de desempenho Projeto Conceitual e Lógico Normas de projeto conceitual e lógico – O projeto conceitual e o projeto lógico de dados utilizam um conjunto de técnicas que determinam como os atributos serão distribuídos entre as relações do modelo conceitual – Como os atributos podem ser distribuídos de diversas formas entre as relações, o projeto lógico é a atividade que seleciona boas alternativas de distribuição dos atributos entre as entidades, dentre o universo de possibilidades de distribuição As principais normas são: – Norma da simplicidade de relacionamentos – Norma das anomalias de inserção – Norma das anomalias de remoção – Norma das anomalias de atualização – Norma dos atributos com valores nulos Projeto Conceitual e Lógico Norma da simplicidade de relacionamentos – Quando um conjunto de atributos são agrupados para formar uma relação, assume-se a existência de um certo significado associado a estes atributos – Este significado, ou semântica, especifica como os valores armazenados para um atributo nas tuplas de uma relação devem ser interpretados – Um bom projeto de banco de dados deve posicionar os atributos em relações de forma a facilitar o entendimento da semântica dos atributos e da relação propriamente dita Projeto Conceitual e Lógico Norma das anomalias de inserção – Anomalias de inserção geralmente ocorrem quando uma relação representa duas ou mais entidades do mundo real relacionadas entre si – Neste caso, como uma mesma tupla representa as duas ou mais entidades, o banco de dados não é capaz de incluir as informações de uma entidade sem incluir informações da segunda (ou demais) – Uma alternativa consiste em preencher os dados da entidade complementar com valores nulos. Entretanto, esta alternativa promove um número excessivo de atributos com valor nulo, o que contradiz outro critério de qualidade do projeto de banco de dados – Outro problema com as anomalias de inserção é a duplicação de informações, o que gera redundância e, por conseqüência, anomalias de atualização Projeto Conceitual e Lógico Funcionário_Empresa Nome Número Valdir da Silva José Souza Moacyr Oliveira Endereço NomeEmpresa 001 R. Bauru, 10 002 R. Tambiri, 200 003 R. Santa Maria, 34 Refrig. Horizonte Viação Machado Refrig. Horizonte EndereçoEmpresa R Voluntários, 200 R. Sariava, 102 R Voluntários, 200 Como inserir uma empresa sem inserir um funcionário na empresa? Funcionário Nome Número Endereço NomeEmpresa Empresa Nome Endereço Projeto Conceitual e Lógico Norma das anomalias de remoção – Como nas anomalias de inserção, as anomalias de remoção ocorrem quando uma mesma relação representa duas ou mais entidades do mundo real – Neste caso, os dados de uma entidade não podem ser removidos do banco de dados sem que os dados da entidade associada também o sejam – Como no caso das anomalias de inserção, a utilização de valores nulos reduz é uma alternativa a este problema, mas contradiz outro critério de qualidade do projeto Projeto Conceitual e Lógico Funcionário_Empresa Nome Número Valdir da Silva José Souza Moacyr Oliveira Endereço NomeEmpresa 001 R. Bauru, 10 002 R. Tambiri, 200 003 R. Santa Maria, 34 Refrig. Horizonte Viação Machado Refrig. Horizonte EndereçoEmpresa R Voluntários, 200 R. Sariava, 102 R Voluntários, 200 Como remover uma empresa sem remover os dados de seus funcionários? Funcionário Nome Número Endereço NomeEmpresa Empresa Nome Endereço Projeto Conceitual e Lógico Norma das anomalias de atualização – Quando uma relação representa duas ou mais entidades do mundo real, duas ocorrências da primeira entidade podem estar relacionadas com uma ocorrência da segunda entidade – Como uma única tupla representa um par de entidades, este caso seria descrito por duas tuplas. A primeira tupla conteria a relação entre a primeira ocorrência da primeira entidade e a única ocorrência da segunda entidade, enquanto a segunda tupla relacionaria a segunda ocorrência da primeira entidade com a única ocorrência da segunda – As anomalias de atualização ocorrem nestes casos devido à replicação de dados da única ocorrência da segunda entidade em duas tuplas da relação – Além de provocar um maior consumo de disco, a replicação exige maior esforço para garantir a consistência dos dados (ou seja, que a alteração de alguma informação sobre a segunda entidade afete as duas tuplas que a representam) Projeto Conceitual e Lógico Funcionário_Empresa Nome Número Valdir da Silva José Souza Moacyr Oliveira Endereço NomeEmpresa 001 R. Bauru, 10 002 R. Tambiri, 200 003 R. Santa Maria, 34 Refrig. Horizonte Viação Machado Refrig. Horizonte EndereçoEmpresa R Voluntários, 200 R. Sariava, 102 R Voluntários, 200 Se for necessário alterar o endereço da empresa de refrigeração teremos que alterar dois registros Funcionário Nome Número Endereço Empresa Nome Endereço NomeEmpresa Projeto Conceitual e Lógico Norma dos atributos com valor nulo – Se muitos dos atributos de uma relação não se aplicam a todas as ocorrências desta relação, o banco de dados possuirá muitas tuplas com atributos contendo valores nulos – Estes atributos, além de ocuparem um espaço desnecessário, podem gerar problemas na interpretação dos resultados das operações de seleção – Assim, os atributos que podem assumir valores nulos devem ser reduzidos. Heurísticas para Projeto Conceitual Baseado nas normas de projeto, existe um conjunto de heurísticas para o projeto do banco de dados H1: Projete um esquema de relação de fácil explicação – Não combine atributos de diversos tipos de entidades e tipos de relacionamentos em uma mesma tabela – Caso contrário, a relação será uma mistura de diversos conceitos do mundo real, dificultando seu entendimento – Intuitivamente, uma tabela que represente uma única entidade ou relacionamento é mais fácil de entender Heurísticas para Projeto Conceitual H2: Projete um esquema relacional sem anomalias – Considere as anomalias de inserção, remoção e atualização – Caso estas anomalias sejam necessárias, anote claramente estes problemas – Certifique-se que os programas que manipulam o banco de dados atendam a estas restrições H3: Projete um esquema que evita atributos com valores nulos – Evite especialmente atributos onde valores nulos ocorram com maior freqüência nas tuplas de uma tabela – Valores nulos devem ser tratados como exceção e não como regras, ocorrendo em poucas tuplas Princípios de Normalização Vantagens de aplicação das regras – As tabelas resultantes podem ser armazenadas em estruturas de representação mais simples – Elas facilitam a comunicação de dados entre sistemas com representações distintas – Os nomes das colunas das tabelas resultantes da normalização podem ser mais simples. Formas normais mais utilizadas – FN1: todos os atributos devem ser atômicos – FN2: todos os atributos não chave são atômicos e dependentes de todas as colunas da chave primária (chave primária mínima) – FN3: todos os atributos não chave são atômicos e dependentes não transitivos da chave primária Projeto Físico do Banco de Dados Objetivo – Definir uma boa estrutura de armazenamento, mas levando em conta características de desempenho – Com isto, o projeto conceitual pode ser ajustado para as características do SGBD selecionado para o projeto – Esta etapa do projeto exige maior conhecimento sobre as consultas e transações que serão realizadas pela aplicação – A partir destas consultas e transações definiremos os caminhos de armazenamento e índices que otimizarão o acesso aos dados Projeto Físico do Banco de Dados Dados relevantes sobre as consultas – Tabelas que serão acessadas por elas – Atributos sobre os quais serão estabelecidas condições – Atributos que serão utilizados para agrupamentos – Atributos que serão utilizados para ordenações – Atributos que serão manipulados por operadores nas consultas – Atributos que serão retornados pelas consultas Transações – Operações mais comuns nas tabelas (insert, update, delete, ...) – Atributos sobre os quais serão estabelecidas condições – Atributos cujos valores são alterados com maior freqüência Projeto Físico do Banco de Dados Atividades do projeto físico – Analisar consultas e transações realizadas com maior frequência: em geral, cerca de 20% das operações irá consumir 80% do tempo de processamento de uma aplicação – Analisar consultas e transações que tenham restrições de tempo: em algumas situações, o tempo de resposta da aplicação é crítico e pode depender destas consultas e transações – Analisar as restrições de unicidade dos atributos: a unicidade deve exige que uma consulta seja realizada antes de cada operação de atualização ou inserção. Assim, existe a necessidade de otimização destas consultas Projeto Físico do Banco de Dados Estratégias de otimização de consultas – Indexação » A criação de índices sobre determinados atributos ou grupos de atributos acelera a realização de consultas » Crie índices para chaves primárias (em geral o SGBD já cria), para chaves estrangeiras e para atributos com unicidade – Denormalização » Em algumas situações, a construção de tabelas representando dois ou mais entidades pode ser necessária para acelerar as consultas a estas entidades » Eventualmente pode ser necessário infringir as regras da 3FN ou 2FN para acelerar as consultas » Esta quebra de regra geralmente traz um custo maior para a atualização e manutenção de consistência nas tabelas – Replicação de Dados – Particionamento de Dados Composição da Aplicação Arquitetura Principais componentes Acesso ao banco de dados Janela principal Janela de cadastro Controle do dialeto do banco Arquitetura de Software O que é a arquitetura? – Conjunto de soluções de projeto de sistemas que se aplicam a situações recorrentes em um domínio de projetos de software – As soluções envolvem todas as dimensões de projeto, i.e., as interfaces com o usuário, as definições de armazenamento e as soluções lógicas (distribuição do código) – Definimos um conjunto de classes que resolvem um problema geral do projeto e que serão especializadas para cada situação em particular deste projeto – A solução muitas vezes depende da plataforma e da linguagem a ser utilizada no projeto Projeto detalhado – Especialização da arquitetura para cada caso de uso em que ela recorre dentro do projeto Restrições Impostas pelo Delphi Interface gráfica com o usuário – Idealmente dividiríamos a interface gráfica em três tipos de classes (modelo, visão e controle) – Esta divisão vem do padrão arquitetural mais conhecido dos desenvolvedores de software: o padrão MVC – As classes de modelo representam os elementos do domínio da aplicação (ex. cliente, livro, ...) – Em Delphi, eles geralmente não são representados como classes, sendo manipulados diretamente do banco de dados – As classes de visão representam os formulários e relatórios, sendo comumente encontradas em aplicações Delphi – As classes de controle recebem e tratam eventos provenientes dos formulários – Em Delphi é comum termos as classes de visão e controle dentro de uma mesma classe (formulário) Restrições Impostas pelo Delphi Visão Modelo Modelo Controle Visão / Controle Arquitetura MVC Arquitetura Delphi Principais Componentes da Aplicação Os sistemas de informação são geralmente compostos por: – Componentes de acesso ao banco de dados – Uma janela principal ou área de trabalho – Diversas janelas de manipulação de cadastro e operações – Diversos relatórios Eventualmente as aplicações precisarão de: – Classes de controle do banco de dados utilizado – Classes de apoio a internacionalização Acesso ao Banco de Dados O acesso ao banco de dados em aplicações Delphi – Originalmente, a Borland oferecia um conjunto de componentes para acesso a bancos de dados (BDE) – O Borland Database Engine caiu em desuso e a própria empresa anunciou que era mantido no Delphi por compatibilidade – Atualmente, a maior parte das aplicações utilizam o pacote de componentes de acesso a dados ADO – O pacote ADO é uma evolução de diversos pacotes de acesso a dados oferecidos pela Microsoft em suas linguagens e ferramentas de desenvolvimento – Ele é composto pode um pequeno conjunto de componentes que permitem a execução de consultas em bancos de dados – O problema com o ADO é seu baixo nível de abstração, ou seja, ele é muito distante das aplicações e próximo ao SGBD – Com isto, precisamos de uma camada de software intermediária para facilitar a construção da aplicação Acesso ao Banco de Dados Em nossa aplicação temos duas classes de acesso – TBDIterador » Simplifica a realização de consultas » Recebe uma conexão e um comando SQL de consulta » Executa a consulta e mantém o cursor e seus dados – TBDManipuladorGenerico » Classe que centraliza o acesso ao banco de dados » Permite a execução de consultas e atualizações » Cria e mantém uma conexão independente de acesso ao BD Acesso ao Banco de Dados Iterador – Construído a partir de uma conexão e uma consulta SQL – Mantém o estado da consulta, permitindo que o usuário navegue pela consulta (unidirecional) e consulte seus dados – Possui métodos que retornam campos na forma de strings. Datas, valores numéricos reais e inteiros – Esta classe é utilizada internamente pelo manipulador de bancos de dados, mas pode ser usada diretamente pelo desenvolvedor TBDIterador = class (TObject) Constructor Create (const Conexao : OleVariant; SQL : String); Function HasNext : Boolean; Procedure MoveNext; Function FieldAsString (Indice : Integer) : String; Function FieldAsInteger (Indice : Integer) : Integer; Function FieldAsDouble (Indice : Integer) : Double; Function FieldAsDate (Indice : Integer) : TDateTime; end; Acesso ao Banco de Dados TBDManipuladorGenerico = class Function PegaConexao : OleVariant; Procedure ExecutaComando (SQL : String); Procedure ExecutaComandoParametrizado (ComandoSQL : String; Parametros : Array of Variant); Function ExecutaConsulta (SQL : String) : OleVariant; Function ExecutaConsultaParametrizada (ComandoSQL : String; Parametros : Array of Variant) : OleVariant; Function ExecutaConsultaIdentificador (ComandoSQL : String) : Integer; Function ExecutaConsultaIdentificadorParametrizada (ComandoSQL : String; Parametros : Array of Variant) : Integer; Procedure ExecutaConsultaLista (ComandoSQL : String; NumeroCampo : Integer; Lista : TStringList); Procedure ExecutaConsultaListaParametrizada (ComandoSQL : String; NumeroCampo : Integer; Lista : TStringList; Parametros : Array of Variant); Function ConsultaIdentificadorString (NomeTabela, NomeCampo, Valor : String) : Integer; Function ConsultaIdentificadorValor (NomeTabela, NomeCampo, Valor : String) : Integer; Function CriaIterador (SQL : String) : TBDIterador; Function CriaIteradorParametrizado (ComandoSQL : String; Parametros : Array of Variant) : TBDIterador; Function PegaIdentificadorUltimaInsercao (NomeTabela : String) : Integer; Procedure ExecutaInsercaoSemCampos (NomeTabela : String); Procedure VerificaRegraNegocio (Condicao : Boolean; Mensagem : String; Vetor : Array of Const); end; Acesso ao Banco de Dados • Manipulador genérico – Em sua instanciação, cria uma conexão de acesso ao banco de dados, que pode ser capturada pelo método PegaConexao – O método ExecutaComando recebe um comando SQL e executa este comando – O método ExecutaComandoParametrizado é similar ao anterior, mas pode receber parâmetros para o comando Var SQL : String; Manipulador : TBDManipuladorGenerico; Begin Manipulador := TBDManipuladorGenerico.Create; ... SQL := ‘SELECT * FROM TbCliente WHERE Nome LIKE @1 AND Idade=@2’; ... Manipulador.ExecutaComandoParametrizado (SQL, [‘Fulano’, 25]); ... End; Valores dos parâmetros Parâmetros que serão preenchidos Acesso ao Banco de Dados De forma similar ao comando anterior ... – O método ExecutaConsulta / ExecutaConsultaParametrizada recebe um comando SQL de consulta, executa a consulta e retorna a representação interna do ADO – Este método é pouco utilizado, pois idealmente trataríamos as consultas com iteradores – Assim, o método CriaIterador / CriaIteradorParametrizado recebe um comando de consulta SQL e retorna um iterador para esta consulta Acesso ao Banco de Dados Determinadas consultas retornam apenas um ID – Estas consultas são úteis em operações onde desejamos localizar um elemento específico no banco de dados – O manipulador genérico oferece consultas que simplificam o processo de captura do identificador (tratamento do iterador) – O método ExecutaConsultaIdentificador recebe um comando SQL de consulta, realiza a consulta e retorno identificador resultante desta – O comando ConsultaIdentificadorString recebe o nome de uma tabela, o nome de um campo e um valor (string) e retorna o identificador do elemento que possui o referido valor no campo indicado da tabela indicada – Se dois elementos possuem o mesmo valor no mesmo campo da mesma tabela, apenas o identificador do primeiro é retornado (não use o método neste caso) Acesso ao Banco de Dados Inserção de elementos – O comando PegaIdentificadorUltimaInsercao recebe o nome de uma tabela e retorna o ID do último elemento inserido nesta tabela – Este comando é útil quando incluímos detalhes (em tabelas separadas) de um elemento recém-incluídos – Normalmente os detalhes mantém uma associação (através do ID) com o elemento que acabou de ser inserido na tabela Verificação de regras de negócio – O comando VerificaRegraNegocio é útil para a verificação de regras de negócio em cadastros – Ele recebe uma condição, uma mensagem parametrizada (conforme a rotina Format do Delphi) e um vetor de parâmetros para formatação da mensagem – O método gera uma exceção com a mensagem recebida (após sua parametrização) Janela Principal Principais componentes – Menu da aplicação e barra de ferramentas – Action list, para concentrar os comandos da aplicação – Barra de status, para notificação do usuário Janela Principal O componente ActionList – Permite a declaração e classificação de ações que podem ser realizadas no sistema – Cada ação poderá ser, posteriormente, associada a um menu, botão de barra de ferramenta, botão convencional, ... – As ações de um ActionList podem ser associadas a um texto de ajuda, um título, uma imagem, entre outros detalhes ActionList ImageList MainMenu Janela Principal Editando um ActionList Características da lista de ações Propriedades de uma ação Janelas de Cadastro Janela padronizada para atualização de dados – Existe uma superclasse da qual todas as janelas herdam – A superclasse define o comportamento e estilo genérico Janelas de Cadastro Comportamento e estilo padronizados – Lista de elementos cadastrados na combo no topo da janela, que pode ser filtrada pelo botão ao lado – Ao selecionar um elemento na combo, seus dados são apresentados em pastas no centro da janela – Clique no botão “Incluir” insere no cadastro o elemento que está atualmente sendo editado pelo usuário – Clique no botão “Excluir” remove no cadastro os dados do elemento que está sendo consultado pelo usuário – Clique no botão “Alterar” altera no cadastro os dados do elemento que está sendo editado pelo usuário – Botão de fechamento da janela sempre a direita no rodapé da janela, que pode conter outros botões específicos do cadastro Janelas de Cadastro Padronização, padronização, padronização ... – Usuário sabe usar um cadastro Æ sabe usar todos os cadastros Vantagens – Aplicação se comporta de maneira uniforme (harmonia) – Menor risco de erro por operação incorreta – Operação mais rápida do sistema – Um único manual do usuário – Menor volume de código por cadastro Janelas de Cadastro A janela WinBDBaseCadastro – É utilizada como superclasse de todas as janelas de cadastro A janela possui diversos tipos de métodos – Métodos que devem ser sobreescritos pelas subclasses – Métodos opcionalmente sobreescritos pelas subclasses – Métodos de apoio Janelas de Cadastro Métodos que devem ser escritos por todas as subclasses – Estes métodos são todos definidos como virtual e abstract na superclasse WinBDBaseCadastro – Eles devem ser implementados na subclasses que representam cadastros específicos Lista de métodos sobreescritos nas subclasses (cont.) – function IncluirElemento : Integer; » Captura os dados da janela, insere no banco de dados e retorna o identificador do novo elemento – procedure ApagarElemento (ID : Integer); » Remove do banco de dados o elemento cujo identificador seja o recebido como parâmetro e seus elementos associados – procedure AlterarElemento (ID : Integer); » Captura os dados da janela e atualiza o elemento identificado no banco de dados pelo identificador recebido como parâmetro Janelas de Cadastro Lista de métodos sobreescritos nas subclasses (cont.) – procedure ApresentaElemento (ID : Integer); » Captura do SGBD os dados do elemento com o identificador recebido como parâmetro e apresenta na janela – function ConsultaTodosElementos : TBDIterador; » Retorna um iterador de banco de dados com todos os elementos do cadastro (veremos o iterador depois) – function GeraNomeElemento (Consulta : TBDIterador) : String; » Gera o nome com que um elemento do cadastro se identifica na combo-box do topo da janela a partir de sua iterador – procedure HabilitaControles (Flag : Boolean); » Habilita ou desabilita os controles da janela de acordo com o estado do flag recebido como parâmetro Atributo protegido – GerenciadorBancoDados : TBDManipuladorGenerico; » Objeto que centraliza o acesso ao banco de dados da aplicação » É criada uma instância para cada janela de cadastro da aplicação Janelas de Cadastro Métodos sobreescritos opcionalmente pelas subclasses – São definidos como virtual, mas possuem uma implementação default na superclasse WinBDBaseCadastro Lista de métodos sobreescritos opcionalmente – procedure MudaModificado (Flag : Boolean); » Função chamada sempre que um elemento foi alterado na janela de cadastro » Pode ser utilizada para atualizar algum controle da janela, mas a versão original deve sempre ser chamada – function PodeRemoverElemento (ID : Integer) : Boolean; » Retorna TRUE se o elemento identificado pelo parâmetro pode ser removido do banco de dados. Por default, retorna TRUE sempre – procedure VerificaRegrasNegocio (ID : Integer); » Retorna com sucesso se o elemento cujos dados estão sendo editados na janela atende às regras de negócio do sistema. » Caso alguma regra de negócio da aplicação seja infringida, gera uma exceção. » O parâmetro indica o identificador do elemento no banco de dados ou –1, se for um novo elemento. Janelas de Cadastro Lista de métodos sobreescritos opcionalmente (cont.) – function VerificaFiltroElemento (Consulta : TBDIterador) : Boolean; » Determina se um elemento do cadastro atende ao filtro que foi imposto pelo usuário. » Se o desenvolvedor quiser implementar um filtro, esta função deve retornar TRUE se o elemento no iterador atende ao filtro » Por default, a janela não oferece filtros. Assim, todos os elementos atendem ao filtro. – function VerificaFiltroAtivo : Boolean; » Determina se existe um filtro ativo no cadastro » Por default, não existem filtros na superclasse – procedure InicializaFiltro; » Chamada na abertura da janela para inicializar os dados do filtro que poderá ser programado pelo usuário » Por default, não faz nada – procedure DefineFiltro; » Deve abrir uma janela para edição dos filtros do cadastro » Por default, não faz nada Janelas de Cadastro Métodos protegidos de manipulação da interface – Os métodos “MudaEstadoXXX” facilitam a habilitação e desabilitação dos controles da janela – Existe um método para cada tipo de controle mais comumente utilizado em cadastros – Além de desabilitar os controles, os métodos trocam sua cor para cinza, aprimorando o visual da aplicação procedure MudaEstadoComboBox (Combo : TComboBox; Enabled : Boolean); procedure MudaEstadoListBox (Lista : TListBox; Enabled : Boolean); procedure MudaEstadoLinhaEdicao (Linha : TCustomEdit; Enabled : Boolean); procedure MudaEstadoGrade (Grade : TStringGrid; Enabled : Boolean); procedure MudaEstadoEditorDatas (Editor : TDateTimePicker; Enabled : Boolean); Janelas de Cadastro Métodos de apoio úteis para preencher os dados iniciais do cadastro e controlar quando suas funções devem estar disponíveis Preenchimento de uma combo a partir de um vetor de strings – Útil para preencher campos enumerados do cadastro – Geralmente chamado no início da execução da janela Informação de que o elemento foi alterado – Deve ser chamada sempre que, durante uma edição, os dados do elemento corrente forem alterados – Os botões de alteração e inclusão serão ativados, tendo em vista que alguma informação foi digitada procedure PreencheComboVetor (Combo : TComboBox; Default : String; Vetor : Array of String); procedure InformaElementoAlterado; Janelas de Cadastro Métodos de apoio úteis quando a janela tem funções que complementam as quatro operações básicas do cadastro VerificaElementoSelecionado – Retorna TRUE se houver algum elemento do cadastro selecionado no momento. Retorna FALSE, caso contrário. PegaIdentificadorElementoSelecionado – Retorna o identificador (ID) de banco de dados do elemento selecionado na janela de cadastro PegaNomeElementoSelecionado – Retorna o nome do elemento selecionado na janela function VerificaElementoSelecionado : Boolean; function PegaIdentificadorElementoSelecionado : Integer; function PegaNomeElementoSelecionado : String; Controle do Dialeto do Banco Outro problema comum nos cadastros é o controle do dialeto do banco de dados SQL é padronizada? – Uma primeira resposta seria que sim, pelo menos para a maior parte dos comandos – Por outro lado, existem funcionalidades particulares de um ou outro banco de dados – Em outras situações, os bancos de dados diferem em como realizam uma determinada tarefa – Exemplos: » Retornar o ID do último elemento inserido em uma tabela » Realizar uma inserção de registro sem campos » Realizar inserções múltiplas em um único comando » Entre outras ... Controle do Dialeto do Banco Uma solução para o problema do dialeto ... BDSeletorDrivers BDDriverGenerico Nome BDManipuladorGenerico Registra SelecionaDriverNome PegaDriverSelecionado VerificaDriverSelecionado Configura CriaConexao ExecutaComando ExecutaConsulta PegaIdentificadorUltimaInsercao ExecutaInsercaoSemCampos BDDriverMySQL BDDriverPostgreSQL BDDriverPostgreSQL PegaIdentificadorUltimaInsercao ExecutaInsercaoSemCampos PegaIdentificadorUltimaInsercao ExecutaInsercaoSemCampos PegaIdentificadorUltimaInsercao ExecutaInsercaoSemCampos Controle do Dialeto do Banco Drivers genéricos e controlador de drivers – Um driver genérico define as funcionalidades que variam entre sistemas gerenciadores de banco de dados distintos – Um driver interno implementa as diversas versões de uma funcionalidade para um SGBD específico – Um controlador possui um driver selecionado em um conjunto de drivers disponíveis – O manipulador genérico de bancos de dados se comunica com o controlador de dados para executar os comandos SQL e as outras funcionalidades Projeto de Aplicações de BD É muito importante estudar o código! – A próxima etapa é o desenvolvimento do código – O código mostra como as soluções arquiteturais vão ser utilizadas na prática – Assim, somente estudando o código poderemos entender completamente o funcionamento do projeto