Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Banco de Dados - Delphi, Notas de estudo de Análise de Sistemas de Engenharia

Apostila sobre Banco de dados em Delphi

Tipologia: Notas de estudo

2010

Compartilhado em 29/04/2010

Brigadeiro
Brigadeiro 🇧🇷

4.4

(99)

181 documentos

Pré-visualização parcial do texto

Baixe Banco de Dados - Delphi e outras Notas de estudo em PDF para Análise de Sistemas de Engenharia, somente na Docsity! Bancos de Dados Conceitos Importantes O gerenciamento de bancos de dados é essencial para o desenvolvimento comercial, e para criar um banco de dados eficiente é necessário o conhecimento prévio de modelagem de bancos de dados relacionais. Conceitos como banco de dados, tabelas, campos, registros, índices, chaves, relacionamentos, normalização, dentre outros são pré-requisitos básicos para o desenvolvimento desse conteúdo. Modelo de Dados É essencial planejar o banco de dados antes de implementar. Um dos métodos que você pode utilizar é o DER, como no exemplo não normalizado mostrado logo abaixo. Borland Database Engine A BDE fornece a capacidade de acesso padronizado a banco de dados para Delphi, C++ Builder e outros ambientes de programação da Borland, oferecendo um grande conjunto de funções para auxiliar no desenvolvimento de aplicações Desktop e Cliente/Servidor. Os controladores da BDE podem ser usados para acessar bases de dados dBase, Paradox, Access, FoxPro, Interbase, Oracle, Sybase e MS-SQL Server, DB2, Informix, além de um controlador de acesso a arquivos texto. Você também pode utilizar fontes de dados ODBC, podendo acessar qualquer base de dados compatível. As funções que compõe uma API da BDE são usadas internamente pelos componentes de acesso a dados do Delphi e muito raramente você teria que usá-las diretamente, mas isso é totalmente possível. A referência completa das funções da BDE, com exemplos em Delphi, está no BDE API Help na pasta do Delphi no Menu Iniciar. Arquitetura de Acesso O acesso e manipulação de um banco de dados por um programa Delphi é realizado como mostrado abaixo, note que a aplicação não acessa os dados diretamente, mas usa sempre a BDE. Assim, para uma aplicação de bancos de dados funcionar, é preciso que a BDE esteja instalada na máquina, não bastando apenas o arquivo executável. Criação do Banco de Dados Para criar um banco de dados novo, normalmente, é necessário dispor de alguma ferramenta do próprio banco de dados, como o Access, mas se a base de dados for Paradox, ou dBase, você pode usar o Database Desktop, um utilitário que vem com o Delphi e permite a criação desses tipos de bancos de dados. Database Desktop Fornece uma interface simples e completa para configuração, definição e manipulação de tabelas de bancos de dados Paradox e dBase. Além disso na Opção Tools/Alias Manager você pode configurar seu banco de dados, como será lembrado logo adiante. Tabelas Paradox Para criar tabelas Paradox, siga os passos abaixo. Você deve salvar as tabelas de um mesmo banco de dados na mesma pasta, pois o Paradox trata a pasta onde estão as tabelas como sendo o banco de dados. Clique em File/New/Table Escolha o tipo da nova tabela, Paradox 7 Aparece uma janela para que você defina a estrutura de campos, índices e demais opções necessárias na criação da tabela Em Field Name, você escolhe o nome do campo, com até 25 caracteres Em Type, o Tipo do campo, com a barra de espaço ou o botão direito do mouse você pode escolher o tipo a partir de uma lista Size é o tamanho do campo, usado somente em alguns tipos de campos Key especifica os campos que farão parte da chave primária, que não pode se repetir e deve ser composta pelos primeiros campos da tabela Table Properties Em Table Properties você define os vários aspectos de configuração da tabela. Muitas dessas opções podem ser implementadas no Delphi e vários programadores preferem não usá-las no Database Desktop. Opção Descrição Validity Checks Validações para os campos, como obrigatoriedade, valor mínimo e máximo Table Lookup Indica que o valor atribuído a um determinado campo tem que estar gravado em outra tabela Secondary Indexes Cria índices secundários Referential Integrity Cria integridade referencial, geralmente utilizada em relacionamentos de 1 para N. Password Security Permite a criação de senhas, protegendo a tabela de acesso não autorizado Table Language Especificar o driver de língua utilizado pela tabela, geralmente é o Pdox ANSI Intl850 Dependent Tables Mostra todas as tabela dependentes através da integridade referencial Tipos de Campos Os principais tipos de campos são mostrados abaixo, mas existem outros além desses. Os tamanhos marcados com asterisco indicam que o campo pode guardar tamanhos maiores que os informados, o que ultrapassar o tamanho será guardado em um arquivo externo com a extensão MB. EOF Informa se está no fim da tabela Exclusive Define se a tabela pode ser compartilhada por outro usuário FieldCount Número de campos da tabela FieldDefs Lista com a Definição dos campos da tabela Fields Lista de objetos do tipo TField, que representam os campos da tabela Filter String com uma condição de filtragem Filtered Define se a tabela é filtrada IndexFieldNames Nome dos campo de índice, usados para ordenar os registros da tabela IndexName Nome do índice atual, vazia quando o índice for a chave primária IndexDefs Lista com a definição dos índices MasterFields Campos usados no relacionamento com a tabela mestre MasterSource DataSource da tabela mestre em uma relação Mestre/Detalhe Modified Define se o registro atual foi modificado ReadOnly Define se a tabela é somente para leitura RecNo Número do registro atual RecordCount Número de registros State Estado da tabela TableName Nome da tabela TableType Tipo da tabela Método Descrição AddIndex Cria um novo índice, a tabela deve ser exclusiva Append Entra em modo de inserção e, ao gravar, o registro será colocado no fim do arquivo AppendRecord Insere um registro no final do arquivo através de código Cancel Cancela as alterações feitas no registro atual Close Fecha a tabela CreateTable Cria uma tabela, depende de FieldDefs e IndexDefs Delete Exclui o registro corrente DeleteIndex Exclui um índice DeleteTable Exclui a tabela DisableControls Desabilita a atualização dos controles visuais Edit Permite a alteração dos campos do registro atual EmptyTable Apaga todos os registro da tabela, para isso a tabela não pode esta sendo compartilhada EnableControls Habilita os controles visuais FieldByName Acessa um campo, do tipo TField, pelo nome FindKey Procura o registro com os valores exatos aos dos parâmetros nos campos do índice atual FindNearest Procura o registro com os valores mais aproximados aos dos parâmetros nos índices First Move para o primeiro registro Insert Entra em modo de inserção de um novo registro na posição atual InsertRecord Adiciona um novo registro, já com os dados, na posição atual IsEmpty Define se a tabela está vazia Last Move para o último registro Locate Procura um registro, usando ou não índices, de acordo com a disponibilidade LockTable Trava a tabela Lookup Procura um registro e retorna valores dos campos deste MoveBy Move um número específico de registros Next Move para o próximo registro Open Abre a tabela Post Grava as alterações no registro atual Prior Move para o primeiro registro Refresh Atualiza a tabela com os dados já gravados RenameTable Renomeia a tabela UnlockTable Destrava a tabela Evento Descrição AfterCancel Após do método Cancel AfterClose Após o fechamento da tabela AfterDelete Após do método Delete AfterEdit Após do método Edit AfterInsert Após do método Insert AfterOpen Após do método Open AfterPost Após do método Post AfterScroll Após mudar de registro BeforeCancel Antes do método Cancel BeforeClose Antes do fechamento da tabela BeforeDelete Antes do método Delete BeforeEdit Antes do método Edit BeforeInsert Antes do método Insert BeforeOpen Antes do método Open BeforePost Antes do método Post BeforeScroll Antes de mudar o registro OnCalcFields Evento usado para calcular os valores dos campos calculados OnDeleteError Quando ocorre um erro ao chamar o método Delete OnEditError Quando ocorre um erro ao chamar o método Edit OnFilterRecord Evento usado com filtragem variável OnNewRecord Quando a tabela entra em modo de inserção, não deixa Modified igual a True OnPostError Quando ocorre um erro ao chamar o método Post Filtros Usando o Filter, você pode filtrar os registro de uma tabela usando uma expressão lógica, como nos exemplos abaixo. Para tornar um filtro ativo, basta colocar Filtered igual a True. Data = '20/04/1998' (Data = '20/04/1998') AND (Vendedor = 'Gilherme Augusto da Fonseca') (Nome > 'A') AND (Nome < 'B') Contudo, se a condição de filtragem for muito variável, é preferível usar um código como o mostrado abaixo no evento OnFilterRecord da Table, para fazer uma filtragem dinâmica, com a propriedade Filter vazia e Filtered igual a True. Accept := TblData.Value = Date; Ao filtrar uma tabela, a propriedade RecordCount da Table, só mostra o número de registros que satisfazem ao filtro, como se os outros registros nao existissem. Alterando Registros Para alterar registros em código, colocamos a tabela em modo de edição, alteramos o valor dos campos e gravamos as alterações, se for necessário. with DtmPedidos do; begin Tbl.Edit; TblData.Value := Date; TblHora.Value := Time; Tbl.Post; end; Inserindo Registros Para inserir registros em código você pode usar os métodos AppendRecord e InsertRecord, caso você não precise de algum campo, mesmo assim ele deve ser informado com o valor Null. DtmProd.Tbl.AppendRecord([Null, EdtDescricao.Text, EdtPreco.Text]); Localizando Registros Para localizar registros você pode usar vários métodos, mas o melhor deles é o Locate, no exemplo abaixo é feita uma pesquisa exata. if not DtmCli.Tbl.Locate('CodCli', Edt.Text, []) then ShowMessage('Cliente não encontrado.'); Você também pode fazer uma pesquisa parcial e/ou sem sensitividade de caso usando o terceiro parâmetro, que é um conjunto de opções. DtmCli.Tbl.Locate('Nome', Edt.Text, [loPartialKey, loCaseInsensitive]); Se você precisar fazer uma pesquisa por mais de um campo, separe os nomes dos campos por ponto e vírgula e use a função VarArrayOf para criar um array com os valores que você quer procurar. if not DtmPed.Tbl.Locate('Vendedor;Data', VarArrayOf([EdtVendedor.Text, EdtData.Text]), [loCaseInsensitive]) then ShowMessage('O vendedor não realizou nenhuma venda nessa data'); Caso os campos pesquisados sejam indexados, a pesquisa será muito mais eficiente, senão será criado um filtro temporário da BDE para localizar os registros Indexação A indexação é usada para ordenar os registros da tabela, para isso você deve escolher os campos pelos quais você quer ordenar na propriedade IndexFieldNames, inclusive em código, como mostrado abaixo, todos campos devem ser indexados e separados por ponto e vírgula. DtmCli.Tbl.IndexFieldNames := 'Nomcli'; DtmPed.Tbl.IndexFieldNames := 'Data, Vendedor'; Estados da Tabela A propriedade State determina o estado das tabelas, os principais estados são demonstrados abaixo, veja como os métodos mudam o estado. Verificando Alterações Onde for necessário a verificação de alterações feitas em uma Tabela, por exemplo no evento OnClose de um Form de manutenção, você pode usar a propriedade Modified, como mostrado no exemplo abaixo. if DtmCli.Tbl.Modified then if Application.MessageBox('Gravar alterações?', 'Dados Alterados', MB_ICONQUESTION + MB_YESNO) = IDYES then DtmCli.Tbl.Post else DtmCli.Tbl.Cancel; Valores Default Caso você queira especificar valores Default para os campos de uma tabela, use o evento OnNewRecord, pois nesse evento o registro não é marcado como modificado. TblData.Value := Date; Percorrendo uma Tabela Utilize um código semelhante ao mostrado abaixo para percorrer uma tabela do início ao fim. Tbl.DisableControls; Total := 0; Tbl.First; while not Tbl.EOF do begin Total := Total + TblValor.Value; Tbl.Next; end; Tbl.EnableControls; Forms Modais de Inclusão/Alteração Para mostrar Forms Modais de inclusão ou alteração de registros utilize comandos como os mostrados abaixo. TblCli.Insert; if FormInsCli.ShowModal = mrOk then TblCli.Post else TblCli.Cancel; Mestre/Detalhe Nos relacionamentos de 1 para N, uma tabela pode estar ligada a outra em uma relação Mestre/Detalhe, nesse tipo de relação os registros da tabela de ordem N são filtrados pelo campo de relacionamento com a tabela de ordem 1. Por exemplo, se o relacionamento de Clientes com Pedidos for mestre/detalhe, só serão acessados em pedidos, os registros cujo campo CodCli seja igual ao CodCli da tabela de Clientes. Para fazer esse tipo de relacionamento, siga os passos abaixo. No uses da Unit detalhe, Pedidos, inclua a Unit da tabela mestre, Clientes Na Table detalhe, Pedidos, Coloque em MasterSource o DataSource da tabela mestre, Clientes Em MasterFields, chame o Fields Links Designer e escolha os campos de ligação das tabelas, no caso, CodCli para as duas tabelas Fields Editor Para criar objetos para os campos de uma tabela clique duas vezes no componente TTable ou escolha Fields Editor no seu menu de contexto, na janela do Fields Editor, clique com o botão direito do mouse e escolha Add, na janela Add Fields, escolha os campos que você vai querer usar e clique em Ok. No Fields Editor podemos também remover os campos criados, alterar sua ordem de apresentação e usar suas propriedades e eventos no Object Inspector. Para cada campo é criado um objeto de um tipo descendente de TField, como TStringField, TIntegerField, TFloatField. As principais propriedades dos objetos TField estão listadas na tabela abaixo. Se você não criar nenhum objeto TField, todos os campos da tabela estarão disponíveis, mas caso você crie algum, somente os campos que você criar estarão disponíveis. Se você selecionar os campos no Fields Editor e arrastar para o Form, serão criados os controles visuais para esses campos, Label, DBEdit e outros, mas antes coloque a descrição dos campos na propriedade DisplayLabel. TField A classe TField é usada como ancestral para todos as classes dos campos. Geralmente iremos usar objetos de classes descendentes de TField, mas em todos eles podemos encontrar os itens mostrados abaixo. Propriedades Descrição Alignment Alinhamento do texto do campo nos controles visuais AsBoolean Valor do campo convertido para Boolean AsCurrency Valor do campo convertido para Currency AsDateTime Valor do campo convertido para DataTime AsFloat Valor do campo convertido para Double AsInteger Valor do campo convertido para Integer AsString Valor do campo convertido para string AsVariant Valor do campo convertido para Variant Calculated Indica se o campo é calculado em tempo de execução CanModify Indica se um campo pode ser modificado Propriedade Descrição AutoEdit Define se a tabela entrará em modo de edição assim que o usuário digitar novos valores nos controles DataSet DataSet ao qual o TDataSource faz referência Evento Descrição OnDataChange Ocorre quando o DataSet é alterado, ao mudar de registro ou mudar os valores dos campos OnStateChange Ocorre quando o estado do DataSet é alterado OnUpdateData Ocorre antes de uma atualização Botões de Navegação Personalizados O DBNavigator tem os principais botões necessários para a navegação por uma tabela, contudo se você quiser criar seus próprios botões de navegação, o que não é recomendado, no evento OnClick desses botões deve ser chamados os métodos de navegação, como indicado abaixo. DtmCli.Tbl.Next; Para controlar a habilitação dos botões de navegação use o evento OnDataChange do DataSource correspondente como indicado abaixo. BtnProx.Enabled := not DtmCli.Tbl.EOF; Para criar botões de controle, como inclusão e exclusão, use o evento OnStateChange do DataSource como indicado abaixo para controlar a habilitação. BtnAlterar.Enabled := DtmCli.Tbl.State = dsBrowse; Data Controls Controles usados na interface com o usuário. Todos esses componentes tem uma propriedade DataSource, que deve ter o DataSource do Table ao qual estão ligados. TDBNavigator O DBNavigator permite que o usuário realize operações padrão de controle de dados. Cada um dos botões do DBNavigator chama um método do Componente Table ao qual está ligado. Podemos personalizar o DBNavigator usando as suas propriedades e eventos, mas se quisermos mudar a figura dos botões teremos que editar diretamente o arquivo LIB\DBCTRLS.RES, na pasta do Delphi. Propriedades Descrição VisibleButtons Define os botões que serão visíveis Hints Hints exibidos pelos botões ConfirmDelete Define se será solicitado uma confirmação antes da exclusão Eventos Descrição BeforeAction Quando um botão do Navigator é pressionado, antes da ação ser executada OnClick Quando um botão do Navigator é pressionado, depois da ação ser executada TDBGrid Mostra os registros de uma tabela em forma de grade, cada coluna é um campo e cada registro, uma linha. Propriedades Descrição Columns Lista do tipo TDBGridColumns, com as colunas da Grid, cada item da lista é do tipo TColumn Fields Lista de objetos TField mostrados nas colunas Options Set com as opções da Grid, como ConfirmDelete, MultiSelect, ColumnResize SelectedField Campo da coluna selecionada SelectedIndex Índice da coluna selecionada SelectedRows Lista do tipo TBookmarkList, com os registros selecionados em uma Grid com MultiSelect TitleFont Fonte do título das colunas FixedColor Cor Fixa, usada nas colunas e indicadores Eventos Descrição OnCellClick Ao clicar em uma célula da Grid OnColEnter Quando uma célula de alguma coluna da Grid recebe o foco OnColExit Quando uma célula de alguma coluna da Grid perde o foco OnColumnMoved Quando o usuário mover uma coluna OnDrawDataCell Evento usado para personalizar a forma de desenhar os dados que são apresentados na Grid OnEditButtonClick Ao clicar no botão de edição de uma célula, mostrado pela propriedade ButtonStyle da coluna OnTitleClick Ao clicar no título das colunas TColumn Item de uma lista TDBGridColumns, usada na propriedade Columns da Grid, objetos desse tipo representam uma coluna da Grid. Às vezes as propriedades definidas para o campo sobrepõem as propriedades Propriedades Descrição ButtonStyle Botão mostrado ao editar as células da coluna Field Objeto TField ligado à coluna FieldName Nome do campo ligado à coluna PickList TStrings com os itens da lista DropDown usada nas células da coluna Title Propriedade do tipo TColumnTitle com as opções do título da coluna TDBText, TDBEdit, TDBMemo, TDBListBox, TDBComboBox, TDBImage, TDBRichEdit Controles genéricos ligados a um campo de uma tabela. Propriedades Descrição DataField Campo ao qual o controle está ligado TDBCheckBox Usado em campos que podem receber apenas dois valores, como campos lógicos. Propriedades Descrição ValueChecked Valor a ser armazenado quando está selecionado ValueUnchecked Valor a ser armazenado quando não está selecionado TDBRadioGroup Mostra algumas opções para o preenchimento de um campo. Propriedades Descrição Values Valor a ser armazenado para cada botão de rádio TDBLookupListBox, TDBLookupComboBox Preenche um campo com dados contidos em outra tabela. Se o campo mostrado nesses componentes for um campo Lookup, você não precisa especificar nenhuma das propriedades abaixo, apenas DataSource e DataField. Propriedades Descrição ListSource DataSource que contém os valores a serem exibidos na lista ListField Campo de ListSource que será exibido KeyField Campo de ListSource usado no relacionamento Exercícios 1. Crie uma aplicação que cadastre os Clientes de uma empresa e as Compras feitas por estes Clientes, permita inclusão, alteração, exclusão e consulta aos dados cadastrados. Na janela principal fica o cadastro de Clientes, com a grade de visualização de suas Compras, crie também uma Janela para localizar Clientes por Nome. A tabela de clientes deve ter Nome, Endereço, Bairro, Cidade, Estado, CEP e Telefone, defina também índices para melhorar a localização de clientes por Nome. Na tabela de Compras, deseja-se saber a Data, Produtos e Valor, assuma que cada compra tem um Produto apenas. Como foi mencionado, as compras serão cadastradas pelo cliente atual, crie a relação Mestre/Detalhe entre Clientes e Compras. O Form de localização de Clientes deve permitir pesquisa Nome, da mesma forma da questão anterior. 2. Uma academia de ginástica deseja manter um controle maior sobre seus Alunos, para isso ela organizou os clientes em turmas. Os dados de uma Turma são Número de alunos, Horário da aula, Duração da aula, Data inicial, Data final e Instrutor. Deve ser feita também uma tabela de instrutores para evitar a digitação repetitiva do Nome. Os dados dos Alunos são Matrícula, Data de Matrícula, Nome, Endereço, Bairro, Cidade, Estado, Telefone, Data de nascimento, Altura e Peso. Crie um banco de dados, normalizado, para guardar essas informações. No cadastro de Turmas, o Horário de aulas deve ser entre 7:00 e 18:00, a Duração não pode ser maior que 2 horas e a Data Final tem que ser, no mínimo 5 dias após a Inicial. Esse cadastro deve ser ordenado primeiro pela Data Final, em ordem decrescente e depois pelo Horário, em ordem crescente. As turmas já encerradas não devem ser mostradas no cadastro, mas crie um arquivo morto com as turmas já encerradas, onde os dados não possam ser alterados. Deve ser possível também procurar o Instrutor pelo Nome, usando um ComboBox, com os registros da tabela de Instrutores. No cadastro de Alunos, a matrícula é Auto-incremental, a Data de Matrícula deve ser, obrigatoriamente, a Data do sistema e deve ser criado um campo calculado com o peso ideal do cliente, altura menos 1,15.
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved