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

Delphi Aplicado Módulo 4A, Notas de estudo de Tecnologia Industrial

Apostila de delphi, curso completo

Tipologia: Notas de estudo

2010

Compartilhado em 21/02/2010

hacker-zombie-5
hacker-zombie-5 🇧🇷

4.9

(16)

13 documentos

Pré-visualização parcial do texto

Baixe Delphi Aplicado Módulo 4A e outras Notas de estudo em PDF para Tecnologia Industrial, somente na Docsity! Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 473  Como somar horas ?  Ícone projeto  Como definir um ícone para o projeto ? Clique na opção que está na barra de títulos – Project – Options e clique na aba Application, clique no botão Load Icon ( carrega ícone ), o arquivo ícone deve ter a terminação .ico Ícone padrão Ícone que foi definido. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 474  Gauge  Tela de abertura Neste exemplo mostrarei como fazer uma tela de abertura com um gráfico indicador.  Insira um formulário, insira um Panel ( aba Standard ), insira um componente Gauge ( aba Samples ), na propriedade Kind defina gkHorizontalBar, se preferir escolha o tipo de gráfico que lhe agradar. Na propriedade Name do formulário defina Abertura_Frm.  Clique no ícone View Unit ou pressione Ctrl F12 para abrir o projeto. Tela de abertura onde mostrará o gráfico indicador carregamento a página. Este é o segundo formulário que será aberto, poderia ser o Menu do seu sistema etc. Digite o conteúdo que esta dentro da área pontilhada. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 477  Discos instalação  Criando discos de instalação do seu projeto Tornando instalação do seu projeto dinâmica. Seu projeto esta pronto, todos módulos, neste exemplo estou usando uma Data Module de nome DM_dat e dentro deste estão todos os componentes Table usados para abrir as tabelas. Todo componente Table possui uma propriedade chamada de DatabaseName e ao lado deve ser informado o caminho onde estão as tabelas de dados ou um Alias. No exemplo a seguir em todos os componentes Table não foi definido Alias, porque este foi criado via programação. O código para criar o Alias deve ser digitado no evento OnCreate do Dm_dat ( neste caso ). Após criado Alias via programação, gere os discos de instalação ( página seguinte ). Veja a criação do Alias via programação. Abrindo as tabelas. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 478 Para tornar a instalação do seu projeto mais dinâmico. Crie os discos de instalação e também crie um alias via programação. Usarei o utilitário InstallShield versão 4.0, já existem mais recentes ☺  Instale o utilitário InstallShield, através dele criaremos os discos de instalação para o sistema. Você poderá fazer download no site http://www.installshield.com/express  Selecione a opção Criar um novo Setup para o projeto. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 479  Após ter clicado na terceira opção será aberta a tela abaixo, digite o nome do projeto ( Project Name ), e uma pasta onde o projeto ficará armazenado ( New Subdirectory )  Após clicar no botão Create ( criar ) será aberta a tela abaixo: Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 482 Escolha o driver Paradox Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 483 Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 484 Specify Components and Files. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 487 Make Registry Changes. Specify Folders and Icons. Clique na aba Registry-Keys e na aba Registry- Values e OK Clique na aba General e Advanced e clique OK Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 488  Run Disk Builder. Gerando os discos. Após clicado no botão Build serão gerados os discos de instalação. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 489  Test the Installation. Veja a seguir as telas do teste de instalação do sistema. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 492  Create Distribution Media. Nesta seção serão copiados para os disquetes o sistema. Dentro do HD se encontram as pastas discos de instalação. Após ter executado o teste de instalação, será criada uma pasta onde ficará o ícone do sistema. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 493  SGDB  O que é Sistema Gerenciador de Banco de Dados ? Segundo [Hackathorm], o SGDB, também é conhecido como DATABASE MANAGEMENT SYSTEM (DBMS), é uma coleção de programas e utilitários para organizar, armazenar, atualizar e recuperar dados. O objetivo principal do SGDB é capturar os dados de forma que modelem adequadamente o mundo real, ou seja, o SGDB deve modelar as entidades importantes (tanto internas quanto externas à organização) que relacionam-se como o negócio da empresa. A) ESTRUTURAS LÓGICAS O processo de modelagem de uma percepção do mundo real é feito construindo-se estruturas lógicas formadas pelas entidades e relações relevantes a essa percepção. B) ESTRUTURAS FÍSICAS As estruturas físicas representam a forma utilizada para organizar os dados nos meios de armazenamento secundário. Para permitir que sejam criadas estruturas físicas convenientes a cada situação, um SGDB deve oferecer diversos tipos de estruturas e, entre as principais temos: Listas encadeadas, arquivos de inversões, estruturas de acesso randômico, arquivos seqüenciais, índices primários e secundários, arquivo de ligações. FUNÇÕES BÁSICAS DO SGDB 1. Manipulação de dados: Organizar o conteúdo dos dados inserindo, atualizando, excluindo e recuperando dados. 2. Definição de dados: Estruturar os elementos de dados em esquemas lógicos e físicos. 3. Restrições de integridade: Garantir a segurança, integridade e concorrência dos dados. Um SGDB normalmente oferece o seguinte conjunto de funções ou meios: 1. Linguagem de manipulação de dados; 2. Linguagem de definição de dados; 3. Meio de carregamento de dados; 4. Meio de recuperação de dados; 5. interface de programação de banco de dados; 6. Ferramentas de desenvolvimento de aplicações; 7. Ferramentas de questionamento de relatórios; Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 494  Modelagem de Dados  Ferramenta Case Power Designer Já ouviu falar em modelagem de dados, pois bem, a seguir faremos um pequeno exemplo de como modelar dados lógicos e físicos usando a ferramenta “case” ( pronúncia = keis ) Power Designer, também usaremos Interbase e alguns dos seus componentes. Esta ferramenta ( tool ) ajudará na produção / ganho de tempo em projetos grandes ou em softerhouses. ☺  Modelagem lógica  Neste exemplo de modelagem de dados usaremos o modelador Power Designer.  Após clicado OK teremos a tela abaixo:  Escolha a opção marcada. Modelo de dados conceitual e clique OK.  Clique duplo no nome ConceptualDataModel_1 e digite o nome Projeto_Empresa_13. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 497 Digamos que você esqueceu de definir o domínio código, como fazer ? Clique sobre a palavra Domain, clique no botão direito, clique New, no campo Name digite o nome Domain_Codigo, clique no botão interrogação e clique em Long Integer. Vamos criar as entidades. Insira duas entidades, uma para Professores e outra para Matéiras. Clique no objeto Entity_1, clique no botão direito, clique em Properties para definir as propriedades deste objeto. Vamos alterar os nomes e adicionar um pequeno comentário. Entidade 1 e Entidade 2 Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 498 Clique na aba Attributes ( atributos ) para definir nomes dos campos, tamanhos, domínios. No canto direito da tela abaixo há três letras M = Mandatory ( Obrigatório ), P = Primary ( Chave Primária ) e D = Display ( Exibe nome do campo na entidade ) Se não houvesse domínios você teria que definir o nome do campo e o tamanho na coluna Data Type. Note que estamos na aba ( paleta ) General ( geral ) Clique no botão (...), será aberta uma tela, clique na opção Variable Characters ( caracteres ), clique em Length e digite um número para definir o tamanho do campo. A vantagem da criação dos domínios poupa este serviço. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 499 Veja abaixo como está a entidade graficamente... Alterando propriedade(s): Clique na Entidade Professores, clique no botão direito, clique em Properties e todas as propriedades estarão disponíveis para serem alteradas. Terminei a parte acima e fechei projeto para continuar em um outro dia... Com esta situação quero mostrar como fazer para abrir o projeto e continuá-lo ☺ Para abrir o projeto e continuá-lo clique duplo em Projeto_Empresa13. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 502 Digite Professor_Materia que é o nome do relacionamento. Digite Digite Definindo relacionamento. “Muitos para muitos” Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 503 Após definido o relacionamento veja abaixo como esta o projeto lógico.  Vamos verificar se está tudo correto, pressione F4 ( ou clique na opção da barra de título – Tools – Check Model ) Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 504 Segue abaixo listagem da checagem do Projeto Lógico: Checking package ... - Circular dependency - Circularity with mandatory links - Shortcut code uniqueness Checking domain ... - Domain name uniqueness - Domain code uniqueness - Detect inconsistencies between check parameters - Precision > Maximum Length - Check for undefined data types - Check for non-valid data types Checking data item ... - Data Item name uniqueness - Data Item code uniqueness - Data Item not used - Data Item used multiple times - Detect differences between data item and associated domain - Detect inconsistencies between check parameters - Precision > Maximum Length - Check for undefined data types - Check for non-valid data types Checking entity ... - Entity name uniqueness - Entity code uniqueness - Entity name maximum length - Entity code maximum length - Existence of attributes - Number of serial types > 1 - Existence of identifiers - Existence of relationship - Redundant inheritance Checking entity attribute ... - Entity Attribute name uniqueness - Entity Attribute code uniqueness Checking identifier of entity - Identifier name uniqueness - Identifier code uniqueness - Existence of entity attribute - Identifier inclusion Checking relationship ... - Relationship name uniqueness - Relationship code uniqueness - Reflexive dependency - Reflexive mandatory - Bijective relationship between two entities - Name uniqueness constraint between many-to-many relationship and entities - Consistency between dominant and dependent Checking association ... - Association name uniqueness - Association code uniqueness - Number of links >= 2 - Number of links = 2 with an identifier link Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 507 Uma subclasse de comandos DML, é a DCL (Data Control Language – Controle de dados Declarados), que dispõe de comandos de controle como Grant, Revoke e Lock. A Linguagem SQL tem como grande virtude a sua capacidade de gerenciar índices, sem a necessidade de controle individualizado de índice corrente, algo muito comum nas linguagens de manipulação de dados do tipo registro a registro. Outra característica muito importante disponível em SQL é sua capacidade de construção de visões, que são formas de visualizarmos os dados, como listagens independentes das tabelas e organização lógica dados dados. Outra característica interessante na linguagem SQL é a capacidade que dispomos de cancelar uma série de atualizações ou de as gravarmos, depois de iniciarmos uma seqüência de atualizações. Os comandos Commit e Rollback são responsáveis por estas facilidades. Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo fato de estar baseada em Banco de Dados, que garantem por si mesmo a integridade das relações existentes entre as tabelas e seus índices.  Modelagem física  Na barra de títulos, clique na opção Tools – Generate Physical Data Model ( ou pressione Ctrl G ) e clique OK. Após clicado no botão OK será gerado um pequeno relatório informado resultados: Digite o nome do projeto Projeto_Empresa_13 Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 508 Generation of model Projeto_Empresa_13... - Generation of domains... - Generation of tables... - Generation of references... - Migration of columns... - Generation of diagrams and graphical symbols... The model has been successfully generated...  Na barra de títulos, clique na opção Database para gerar base de dados. Digite o nome do arquivo que armazenará a SQL: Profe_Mat.sql. O arquivo Profe_Mat.sql será armazenado na sub-pasta C:\Temp\Ewb13 Nas abas/paletas azuis desative remova/cancele/desabilite as caixinhas que iniciam com a palavra “drop” ... aba Tables & Views ( drop table, drop view ) , Keys & Indexes ( drop index ), Database ( drop database, drop sequence, drop data type ). Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 509 Arquivo gerado: PROJETO_EMPRESA_13 /*==============================================================*/ /* Database name: PROJETO_EMPRESA_13 */ /* DBMS name: InterBase 6.x */ /* Created on: 30/09/2002 16:26:49 */ /*==============================================================*/ /*==============================================================*/ /* Domain: DOMAIN_CIDADE */ /*==============================================================*/ create domain DOMAIN_CIDADE as VARCHAR(35); /*==============================================================*/ /* Domain: DOMAIN_CODIGO */ /*==============================================================*/ create domain DOMAIN_CODIGO as INTEGER; /*==============================================================*/ /* Domain: DOMAIN_EMAIL */ /*==============================================================*/ create domain DOMAIN_EMAIL as VARCHAR(20); /*==============================================================*/ /* Domain: DOMAIN_ENDER */ /*==============================================================*/ create domain DOMAIN_ENDER as VARCHAR(60); /*==============================================================*/ /* Domain: DOMAIN_FAX */ /*==============================================================*/ create domain DOMAIN_FAX as VARCHAR(18); /*==============================================================*/ /* Domain: DOMAIN_FONE */ /*==============================================================*/ create domain DOMAIN_FONE as VARCHAR(18); /*==============================================================*/ /* Domain: DOMAIN_NOME */ /*==============================================================*/ create domain DOMAIN_NOME as VARCHAR(60); Clique no botão Edit caso deseja visualizar código abaixo. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 512  Na barra superior da tela acima, clique em Tools, clique em Interactive SQL, será aberta uma tela, na barra superior desta clique em Query, após clique em Load Script ( para carregar o Script ou SQL que criamos no início – nome do arquivo SQL = Projeto_profe_materias.sql )  Para gerar o banco de dados clique no raio ( ou Ctrl E ) Posicione o ponteiro do mouse sobre a opção Interbase Servers, dê um clique duplo, será aberta uma tela, na parte inferior desta tela preencha o campo do User name com sysdba e a Password a ( senha ) digite masterkey User Name: SYSDBA Password: masterkey Digite a linha que esta destacada, após clique no raio para criar o banco de dados. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 513  Vamos registrar o banco de dados. Clique com o botão direito sobre a opção Register será aberta a tela abaixo, preencha os campos de acordo com o exemplo. Clique neste botão e informe o banco de dados Profe_Alunos.gdb, neste arquivo serão armazenadas todas as tabelas do sistema. Digite a senha masterkey Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 514 Processo com InterBase está pronto. A seguir veremos apenas telas e suas propriedades: Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 517  Insira um componente SQLTable ( aba dbExpress ), defina a propriedade SQLConnection para SQLConnection1, a propriedade TableName defina a tabela de Professores.  Insira um componente DataSetProvider ( aba Data Access ), clique neste objeto e defina a propriedade DataSet para SQLTable1  Insira um componente ClientDataSet ( aba Data Access ), clique neste objeto e defina a propriedade ProviderName definindo DataSetProvider1. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 518  Insira um componente DataSource ( aba Data Access ) e defina a propriedade DataSet para ClientDataSet1. Clique no DBGrid e defina a propriedade DataSource para DataSource1.  Defina as propriedades dos 5 componentes para True, clique em SQLConnection, clique na propriedade Connected e defina o valor para True, clique em SQLTable1 = True, DataSetProvider1 – propriedade Constraints para True, ClientDataSet1 – Active = True, DataSource1 – Autoedit = True. No botão Grava Registro digite código fonte abaixo: Insira um DBNavigator ( aba Data Controls ) e defina a propriedade DataSource para DataSource1. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 519 Filtrando registros. Atenção: Quando usamos Table usamos Table + Locate, agora usamos ClientDataSet + Locate. Além de toda a flexibilidade do Power Designer é também possível gerar vários tipos de relatórios sobre seu projeto ( o nome já diz Power = Poder ☺ ), veja na página a seguir alguns relatórios. Existem vários modeladores de dados, o Power Designer é considerado um dos melhores. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 522 Report Jurandir 25/08/2009 Diagram Diagram_1 Professor_Mateira Prof Mat Professores Profe_Codigo Profe_Nome Profe_Fone Profe_Email <pi> DOMAIN_CODIGO DOMAIN_NOME DOMAIN_FONE DOMAIN_EMAIL <M> Identifier_1 <pi> Materias Mate_Codigo Mate_Materia <pi> DOMAIN_CODIGO DOMAIN_NOME <M> <M> Identifier_1 <pi> Diagram entity list Name Code Professores PROFESSORES Materias MATERIAS Diagram relationship list Name Code Professor_Mateira PROFESSOR_MATEIRA Entity list Name Code Parent Gene rate Num ber Professores PROFESSORE S Conceptual Data Model 'Projeto_Empresa_13' TRU E Materias MATERIAS Conceptual Data Model 'Projeto_Empresa_13' TRU E Relationship list Name Code Parent Entity 2 Entity 1 Professor_Ma teira PROFESS OR_MAT EIRA Conceptual Data Model 'Projeto_Empresa_1 3' Materias Professores Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 523  O que é Sistema Gerenciador de Banco de Dados ? ( SGDB ) Segundo [Hackathorm], o SGDB, também é conhecido como DATABASE MANAGEMENT SYSTEM (DBMS), é uma coleção de programas e utilitários para organizar, armazenar, atualizar e recuperar dados. O objetivo principal do SGDB é capturar os dados de forma que modelem adequadamente o mundo real, ou seja, o SGDB deve modelar as entidades importantes (tanto internas quanto externas à organização) que relacionam-se como o negócio da empresa. Segundo [Leite], as principais estruturas utilizadas nos SGDB são: A) ESTRUTURAS LÓGICAS O processo de modelagem de uma percepção do mundo real é feito construindo-se estruturas lógicas formadas pelas entidades e relações relevantes a essa percepção. B) ESTRUTURAS FÍSICAS As estruturas físicas representam a forma utilizada para organizar os dados nos meios de armazenamento secundário. Para permitir que sejam criadas estruturas físicas convenientes a cada situação, um SGDB deve oferecer diversos tipos de estruturas e, entre as principais temos: Listas encadeadas, arquivos de inversões, estruturas de acesso randômico, arquivos seqüenciais, índices primários e secundários, arquivo de ligações. FUNÇÕES BÁSICAS DO SGDB 1. Manipulação de dados: Organizar o conteúdo dos dados inserindo, atualizando, excluindo e recuperando dados. 2. Definição de dados: Estruturar os elementos de dados em esquemas lógicos e físicos. 3. Restrições de integridade: Garantir a segurança, integridade e concorrência dos dados. Um SGDB normalmente oferece o seguinte conjunto de funções ou meios: 8. Linguagem de manipulação de dados; 9. Linguagem de definição de dados; 10.Meio de carregamento de dados; 11.Meio de recuperação de dados; 12.interface de programação de banco de dados; 13.Ferramentas de desenvolvimento de aplicações; 14.Ferramentas de questionamento de relatórios; Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 524 Introdução A primeira vista, as tabelas Paradox não apresentam muitas diferenças das tabelas criadas no InterBase e as seguintes semelhanças são evidentes: • o acesso pode ser feito através de um Alias; • os tipos dos campos possíveis são similares, apesar de possuirem nomes diferentes; • as tabelas podem ser criadas com o DataBase Desktop; • são utilizados os mesmos componentes TTable e TQuery para acesso; Na realidade, o BDE (Borland DataBase Engine) cria uma ilusão de que tabelas InterBase e Paradox comportam-se da mesma maneira. Para alguns desenvolvedores, entretanto esta ilusão termina logo. A primeira decepção vem com a utilização do Database Desktop para manipulação de tabelas InterBase. Enquanto o Database Desktop é a ferramenta ideal para criação e reestruturação de tabelas Paradox, é deficiente com relação ao Interbase, onde a restruturação e a utilização de características mais avançadas só podem ser alcançadas através da montagem de scripts que serão executados no Interbase Windows ISQL. As pesquisas e índices no InterBase diferenciam maiúsculas e minúsculas, enquanto que no Paradox esta diferenciação é configurável. Ainda no InterBase a definição de chaves primárias e estrangeiras é realizada facilmente, porém a alteração destas chaves não é tão trivial. Algumas operações utilizando o InterBase são mais lentas do que no Paradox. Torna-se rapidamente claro que o InterBase não é automaticamente melhor que o Paradox. A idéia de que o InterBase não é sempre mais adequado do que o Paradox é verídica.Os dois produtos apresentam diferenças significativas e a escolha de qual utilizar é plenamente dependente das condições e dos objetivos do aplicativo final. Na realidade, a única coisa que eles tem em comum é que ambos armazenam dados em tabelas. Cada um possui pontos fortes e fracos dependendo da realidade a ser trabalhada. O importante é decidir qual deles é apropriado para uma situação particular. A decisão tomada, usar Paradox ou InterBase, afetará de forma significativa o desenvolvimento do seu projeto. Paradox: Baseado em arquivos O Paradox é um sistema de banco de dados baseado em arquivos. Os arquivos de dados contêm registros de dados que possuem uma ordem fixa. Em outras palavras, o registro de número 106 será sempre o mesmo registro, até que seja movido fisicamente dentro do arquivo, através de uma operação de ordenação, por exemplo. O que é mais importante, ele será sempre o sucessor do registro 105 e o antecessor do 107, até que esta ordem seja explicitamente alterada. Isto permite uma fácil navegação entre os registros, através do cursor, já que é possível localizar um registro em uma tabela através da sua posição, sem necessidade de referenciar seu conteúdo. Esta ordenação explícita de registros em uma tabela, apresenta algumas vantagens: a movimentação para o início ou para o final de um arquivo de dados é simples e os registros podem ser facilmente relidos quando um cursor é posicionado sobre eles. A concepção de navegação (browsing) pode ser conveniente para usuários e desenvolvedores. Isto permite que os registros sejam manipulados um de cada vez e em uma ordem previsível. Este comportamento de navegação nas tabelas Paradox é uma das características mais difíceis de serem adaptadas ao sistema InterBase, e muitos desenvolvedores em InterBase têm grandes problemas em efetuar esta transição. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 527 Travamento ( Locking ) Quando dois usários tentam acessar a mesma faixa de dados podem surgir problemas ameaçando a integridade do banco de dados. O Paradox e o InterBase lidam com estes problemas de maneiras diferentes. Como o Paradox não possui nenhum conhecimento do que outro processo Paradox está fazendo, ele utiliza um esquema pessimista de travamento (Pessimistic Locking Scheme). Assim que um usuário tenta mudar um registro o registro é travado. Nenhum outro usuário pode fazer alterações neste registro até que o primeiro usuário termine as alterações ou cancele a operaçao. Por um lado, este esquema de travamento é positivo se considerarmos que o usuário que obteve o travamento poderá concluir com sucesso a sua operação de alteração. Por outro lado, isto é negativo no sentido em que um usuário poderá mononopolizar um registro indefinidamente. Isto seria um problema, por exemplo, num sistema de reserva de viagens. Um viajante indeciso poderia “trancar” um assento por um longo período, levando os outros a acreditarem que assento já foi tomado, sendo que no final o indeciso pode acabar desistindo do assento. O InterBase, por outro lado, lida com a manipulação de todos os dados através de um esquema de concorrência otimista (Optimistic Concurrency Scheme). Na verdade, quando um usuário processa uma alteração o registro não impedirá que outras pessoas tentem também alterar este registro. Quando um usuário começa a alterar um registro InterBase uma cópia do registro original é salva. O usuário executa seu serviço, mas os outros usuários não estão sob nenhuma forma impedidos de acessar o mesmo registro. Quando algum usuário termina sua alteração e efetua um post (atualização no banco) a cópia do registro original é comparada com o registro corrente. Se os valores são diferentes (provavelmente porque outro usuário alterou mais rapidamente o mesmo registro) as alterações efetuadas pelo usuário no registro são rejeitadas. Isto significa que usuários individuais não podem travar o acesso de outros usuários ao mesmo registro. No exemplo anterior de reservas de viagens, o primeiro passageiro a confirmar a reserva ficaria com o lugar, mesmo se vários outros usuários estivessem simultaneamente considerando o mesmo lugar. O lado ruim da estória, porém, é que as alterações são rejeitadas apenas no momento em que se tenta efetuar a atualização no banco, após todo o trabalho de alteração ter sido efetivado. Isto pode ser corrigido relendo-se (pelo método refresh) os campos alterados e tentando-se novamente efetuar a atualização. Os camponentes TTable ou TQuery tornam esta operação transparente através da propriedade UpdateMode. A verificação, quando enviamos comando de atualização no banco, pode ser feita dependendo do valor desta propriedade, em todos os campos, somente nos campos alterados ou somente nas chaves primárias. Estas duas visões refletem as diferenças básicas nas duas filosofias. O modelo pessimista Paradox assume que as colisões serão frequentes e deverão ser tratadas de uma forma rigorosa, enquanto o modelo otimista InterBase assume que as colisões serão ocasionais e maximiza a habilitação dos usuários para o compartilhamento de dados sem interferência de um com o outro, enquanto estiver sendo mantida a integridade. Um importante benefício do modelo do InterBase é que um usuário que quer visualizar um conjunto de dados estáveis, talvez para gerar uma série de relatórios que precisam refletir a situação atual dos dados, não sofrerá interferencia de outro usuário que estiver naquele momento alterando os dados. Em tabelas Paradox, o gerador de relatórios deverá colocar um “write lock” na tabela para garantir que os dados não sejam alterados e ninguém poderá efetuar transações na tabela até que este lock tenha deixado de existir. No InterBase as versões dos registros mais antigos, são retidas durante o tempo em que o usuário estiver algum interesse sobre elas. Isto significa que nem os leitores dos dados impedem a ação dos “editores” e nem os últimos comprometem o resultado dos primeiros. InterBase é o único banco SQL que torna isto transparente. Quando os adeptos do InterBase são questionados sobre as vantagens do banco, este controle da disponibilidade do registro é normalmente a primeira vantagem a ser mencionada. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 528 Processamento de Transações Como você já sabe, o modelo “baseado em conjuntos” constitui-se em um conjunto de dados que podem ser tratados como entidades individuais, levando em consideração o conteúdo específico destes conjuntos. O processamento de transações é uma extensão destas idéias. Uma transação é um grupo de operações onde ou todas elas são bem ou mal sucedidas. Nunca deverá ocorrer a situação onde apenas algumas sejam bem ou mal sucedidas. Por exemplo, um caixa automático realiza transações com bancos de dados. Sempre que você retira dinheiro, duas operações devem ser realizadas para que o banco possa contabilizar seu ativo apropriadamente: o saldo da sua conta deve ser reduzido e o saldo de dinheiro disponível no banco deve ser reduzido na mesma quantia. Obviamente, a situação preferível é aquela na qual as duas operações sejam bem sucedidas, mas se acabar a energia no meio de uma operação, é totalmente inaceitável que uma conta seja atualizada e a outra não - ambas operações deveriam “falhar” para manter uma contabilização apropriada. O processamento de transações permite que isto aconteça. As operações em uma transação não são permanentes até que seja efetuado o commit na transação. Até que isto aconteça, as operações podem ser desfeitas, retornando-se ao ponto de partida. Um Rollback pode ser implementado explicitamente, utilizando-se o método Rollback, ou automaticamente, quando ocorre uma falha do sistema. O InterBase suporta totalmente o conceito de transações. Na realidade, todas as operações ocorrem dentro de um contexto de transação. Na ausência de um controle explícito do programador, o BDE automaticamente envolve todas as operações na sua própria transação. Por exemplo, toda vez que você atualiza um registro, a transação é inicializada (started) e finalizada (commited) automaticamente após cada confirmação (post). Usando o componente TDataBase você pode explicitamente controlar uma única transação, e também fazê-la conter quantas operações você quiser. O Paradox porém não suporta transações. Sempre que um registro é atualizado no banco, as mudanças são permanentemente gravadas na tabela. Será necessária uma nova alteração para desfazer manualmente as alterações anteriores se um Rollback for desejado. Além disto, o sistema não irá garantir que, em um grupo de operações, todas elas serão bem sucedidas ou todas elas falharão. É possível simular algumas destas características através de certos truques de programação e tabelas temporárias, mas eventualmente, haverá a necessidade de se modificarem os registros um de cada vez, em lote, o que deixaria aberturas para a ocorrência de falhas. Além disto, é impossível de se programar um aplicativo Paradox para se recuperar de uma falha de sistema como queda de força ou danos na memória secundária. Gatilhos ( Triggers ) e procedimentos ( Procedures ) Uma Stored Procedure consiste em um “pedaço” de código armazenado em um banco de dados junto aos dados que este contém. Isto permite ao servidor efetuar manipulações complexas de dados inteiramente no próprio servidor. As vantagens principais disto são que processos ainda mais complexos podem ser delegados ao servidor, e qualquer número de diferentes aplicações clientes podem chamar os mesmos procedimentos. Se o procedimento for modificado no servidor, nenhuma das aplicações necessitará ser reescrita, desde que a interface do procedimento continue a mesma. Um trigger consiste em uma Stored Procedure que não é explicitamente chamado por uma aplicação, mas é executado em resposta a uma ação ocorrida com determinados dados, como por exemplo, uma inserção de novos registros. A utilização de triggers permite que você realize validações de dados extremamente complexas, sendo que as operações planejadas ocorrerão garantidamente no interior da mesma transação que disparou o “engatilhamento”. Se alguma das operações falhar, todas as alterações feitas por triggers associados a esta operação serão também desfeitas (rolled back). Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 529 O InterBase suporta Stored Procedures que retornam Result sets, os quais são tratados exatamente como tabelas somente de leituras, assim como triggers que simplesmente executam transações de dados e não retornam nenhum resultado. O InterBase suporta essencialmente um número ilimitado de triggers para cada tabela os quais podem ocorrer antes ou depois das operações de inserção, alteração e remoção de registros. Se mais de um trigger é associado a uma operação a ordem de execução pode ser especificada. Triggers podem efetuar mudanças que disparem outros triggers, numa reação em cadeia, mas estas ações em cascata continuarão contidas numa única transação. O Paradox não suporta nenhum destes conceitos. Todos os processamentos de dados devem ser realizados no cliente. Cada aplicação deve conter a mesma codificação para manutenção dos dados, e cada uma delas deve também ser modificada caso o método de manipulação de dados necessitar ser alterado. Não existe uma garantia que uma aplicação será completada uma vez que tenha sido iniciada. Por exemplo a operação de se efetuar uma deleção em cascata de registros “detalhe” após a deleção de um registro “mestre” pode falhar no seu meio, deixando alguns registros detalhe sem serem apagados. Se esta “cascata” fosse implementada por meio de triggers no InterBase, ou todos os registros ou nenhum deles seriam apagados. Além disto, numa aplicação Paradox, a codificação para perpetuar a deleção deveria ser escrita em cada uma das aplicações diferentes que utilizassem os dados do sistema Paradox. Utilizando-se InterBase, por outro lado, a codificação necessita ser escrita apenas uma vez, no trigger. A aplicação simplesmente deleta o registro “mestre” e o InterBase cuida da deleção dos registros “detalhe”. Fazendo a melhor escolha Escolher entre Paradox e InterBase pode ter implicação importante para o seu projeto. Portanto, é essencial saber o que é mais adequado em cada situação. A figura 1 mostra alguns princípios gerais que podem ajudá-lo a tomar a melhor decisão. Isto são sugestões e não devem ser encaradas como regras. A maioria presume que uma rede estará envolvida. Se você está implementando um sistema mono-usuário, o Paradox é usualmente a melhor escolha. O servidor InterBase local pode ser indicado para um sistema mono-usuário, mas sem os aspectos de concorrência, as vantagens básicas do InterBase não estarão sendo utilizadas. View O objeto View é criado com o objetivo de se dimensionar o acesso a uma tabela ou combinação de tabelas, de forma a definir a estrutura no sentido horizontal (pela referência criteriosa na cláusula Select de algumas colunas) e no sentido vertical (pela aplicação de restrições na cláusula Where). Uma View é um objeto composto por uma instrução Select, podendo ser aplicado todo o seu composto (conforme abordado no tópico referente ao comando Select), ou seja Select, From, Where, Group By, Having e Order By. Sua aplicação prática, se estende desde aspectos administrativos, como por exemplo, o fornecer acesso limitado a uma tabela para usuários, como também, elaborar instruções que combinem tabelas (Join), para atender demanda de solicitação de dados numa dimensão não encontrada pelas estruturas lógicas definidas. Como exemplo para esta segunda hipótese, citamos a necessidade de um acesso a dados que tivesse como retorno, uma lista de clientes com compras num certo período e que apresentasse a descrição dos produtos envolvidos. Todas estas possibilidades se aplicam a criação de View que façam referência a outras View combinadas com Tabelas. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 532 28) CREATE PROCEDURE PROC_EXCPRODUTOS (PARID_PRODUTO INTEGER) AS begin Delete From Produtos Where ID_Produto = :PARID_PRODUTO; END 29) CREATE PROCEDURE PROC_SELECT RETURNS (VARNOME CHAR(60)) AS BEGIN FOR SELECT NOME FROM CLIENTES INTO :VARNOME DO SUSPEND; END 30) CREATE PROCEDURE PROC_ESTATVENDA (PARID_CLIENTE INTEGER, PARDATAINI DATE, PARDATAFIM DATE) RETURNS ( TOT_VENDA NUMERIC(15, 2), AVG_VENDA NUMERIC(15, 2), MIN_VENDA NUMERIC(15, 2), MAX_VENDA NUMERIC(15, 2)) AS BEGIN SELECT SUM(ITENS.QUANTIDADE * ITENS.PRECO), AVG(ITENS.QUANTIDADE * ITENS.PRECO), MIN(ITENS.QUANTIDADE * ITENS.PRECO), MAX(ITENS.QUANTIDADE * ITENS.PRECO) FROM CLIENTES, PEDIDOS, ITENS WHERE CLIENTES.ID_CLIENTE = PEDIDOS.ID_CLIENTE AND PEDIDOS.ID_PEDIDO = ITENS.ID_PEDIDO AND CLIENTES.ID_CLIENTE = :PARID_CLIENTE AND PEDIDOS.DATA BETWEEN :PARDATAINI AND :PARDATAFIM INTO :TOT_VENDA, :AVG_VENDA, :MIN_VENDA, :MAX_VENDA; SUSPEND; END Triggers Triggers são blocos ISQL que contém códigos que implementam instruções que podem afetar dados contidos em tabelas, validos dados baseadas em certas condições, acionar procedimentos armazenados entre outros objetos. Uma Trigger, que significa gatilho, é definida (criada) e associada a um evento (ocorrência) conseqüente aos comandos Insert, Delete ou Update. Ao contrário de uma Store Procedure (Procedimento Armazenad), uma Trigger não é invocada nem referenciada em código Cliente nem no servidor InterBase . Conforme sugere seu nome, uma Trigger é disparada ( executada )pela manipulação da tabela na qual foi criada. Conforme conceitualmente já abordado no tópico integridade, uma Trigger é um excelente mecanismo para se controlar as restrições, tendo em vista a possibilidade de interferir nos valores que estão sendo manipulados, pode-se ainda estabelecer uma comunicação clara com a aplicação Front-End. Como exemplos de situações em que a adoção de Triggers se aplica, relacionamos o seguinte: Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 533 - Fazer manutenção (atualização) em outras tabelas quando ocorrerem operações de inclusão, alteração ou exclusão na tabela corrente. - Estabelecer validação para colunas. - Alimentar tabelas de controle de Log. - Sinalizar aplicação Front-End de alguma ocorrência específica. 30) CREATE TRIGGER TRIG_TESTACREDITO_INC FOR CLIENTES ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.CREDITO > 20000) THEN BEGIN NEW.CREDITO = 20000; END END 31) CREATE TRIGGER TRIG_TESTACREDITO_ALT FOR CLIENTES ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN IF (NEW.CREDITO > 20000) THEN BEGIN NEW.CREDITO = 20000; END END 32) CREATE TRIGGER TRIG_ID_CLIENTE FOR CLIENTES ACTIVE BEFORE INSERT POSITION 0 AS BEGIN NEW.ID_Cliente = GEN_ID(Gen_clientes, 1); END 33) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_ALT FOR ITENS ACTIVE BEFORE UPDATE POSITION 0 AS DECLARE VARIABLE VARSALDO INTEGER; BEGIN UPDATE PRODUTOS SET PRODUTOS. SALDO = PRODUTOS.SALDO + OLD.QUANTIDADE WHERE PRODUTOS.ID_PRODUTO = OLD.ID_PRODUTO; SELECT PRODUTOS.SALDO FROM PRODUTOS WHERE PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO INTO :VARSALDO; IF (:VARSALDO >= NEW.QUANTIDADE) THEN BEGIN UPDATE PRODUTOS SET PRODUTOS.SALDO = PRODUTOS.SALDO - NEW.QUANTIDADE WHERE PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO; END ELSE BEGIN EXCEPTION EXC_SALDO; END END Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 534 34) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_EXC FOR ITENS ACTIVE BEFORE DELETE POSITION 0 AS BEGIN UPDATE PRODUTOS SET PRODUTOS.SALDO = PRODUTOS.SALDO + OLD.QUANTIDADE WHERE PRODUTOS.ID_PRODUTO = OLD.ID_PRODUTO; END 35) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_INC FOR ITENS ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE VARSALDO INTEGER; BEGIN SELECT PRODUTOS.SALDO FROM PRODUTOS WHERE PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO INTO :VARSALDO; IF (:VARSALDO >= NEW.QUANTIDADE) THEN BEGIN UPDATE PRODUTOS SET PRODUTOS.SALDO = PRODUTOS.SALDO - NEW.QUANTIDADE WHERE PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO; END ELSE BEGIN EXCEPTION EXC_SALDO; END END IB - O que o faz diferente Quando voce entra no mundo Client/Server a primeira coisa que voce tem que fazer é selecionar um servidor SQL. As arquiteturas de servidores de banco de dados variam amplamente e como resultado o comportamento deles em uma determinada situação também varia. Isso significa que para selecionar o servidor correto para sua aplicação você tem que entender duas coisas : Como os dados serão acessados e modificados em sua aplicação. Como o servidor se comportará em cada acesso aos dados ou situação de atualização. A diferença mais significante entre o Interbase e outros servidores de banco de dados é sua arquitetura multi-gerencional. A arquitetura Multi-geracional também é chamada arquitetura de versões e para entender como ela é diferente, você precisa explorar os diferentes métodos de controlar o acesso simultâneo aos dados em um ambiente multi-usuário. Esquemas de travamento O mais antigo e mais comum método de controlar o acesso simultâneo aos dados por vários usuários é o travamento. Quando um usuário trava um objeto em um banco de dados , ele restringe a habilidade de outros usuários ter acesso àquele objeto. Quando uma trava afeta a concorrência em uma tabela inteira, ela restringe o acesso de outros usuários em todos os registros da tabela. Portanto, uma trava de tabela tem uma granularidade muito baixa. Uma trava à nível de página na tabela limita o acesso a todos os registros pertencentes àquela página. Uma trava à nível de página é mais granular do que uma trava à nível de tabela. Em contraste, uma trava atribuída à um simples registro é muito granular e provê a restrição mínima ao acesso de dados simultâneo. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 537 Neste ambiente, transações são muito curtas e as leituras envolvem um único registro de cada vez, portanto o isolamento transacional aqui não é uma preocupação muito séria. Porém, muitas das aplicações de banco de dados de hoje não se ajustam nesse modelo. Transações de atualização curtas ainda são a norma, mas o advento de sistemas de informação executivos introduziram longas transações de leitura que percorrem tabelas inteiras e as vezes bancos de dados inteiros. Para entender o problema com transações de leitura longas, considere o seguinte cenário : Um executivo pede o valor total do inventário da companhia. Enquanto a Query está varrendo a tabela de inventário, um usuário move uma qtde de barras de platina do armazém A para o armazém B e confirma a transação. É possível que a Query conte a platina em ambos os armazéns produzindo um relatório de inventário errado. A pergunta se torna então : Que atualizações uma transação de leitura deveria ver e quando deveria ver ? Isto é controlado pelo nível de isolamento transacional. Há quatro níveis de isolamento definidos no SQL 92 padrão, como segue : Leitura não confirmada (Read Uncommitted) - este nível de isolamento, algumas vezes chamada de leitura- suja (dirty read), permite que qualquer registro do banco de dados possa ser lido, independente de já ter sido commitado ou não. Leitura Confirmada (Read Committed) - este nível permite que transações de leitura vejam somente os registros que já foram commitados. Leitura repetitiva (Repeatable Read) - Assegura que se a transação re-lê os registros que já foram lidos anteriormente, ela encontrará os mesmos valores em todos os campos nessa segunda leitura. Isso não quer dizer que o número de registros que retornará na segunda leitura será o mesmo que o da primeira. Por exemplo, se uma outra transação insere um registro que satisfaça o critério da cláusula WHERE no seu select você verá este registro novo na segunda vez sua transação executa o SELECT. Serial (Serializable) - Assegura que se voce executar um mesmo select diversas vezes durante a duração de uma transação, voce verá exatamente o mesmo número de registros com os mesmos valores nos campos. Também assegura que há uma ordem serial de transações concorrentes que produzirão o mesmo resultado como o produzido por uma execução concorrente. O isolamento Snapshot do Interbase provê o mesmo nível de isolamento das alterações feitas por outras transações seriais. No exemplo anterior, voce precisa do isolamento Serial para assegurar que seu relatório de inventário seja consistente. O problema é o preço que você tem que pagar para ter esse tipo de isolamento em um banco de dados que usa arquitetura de travas. Com o modelo de trava, o único modo de assegurar que aqueles dados não mudarão durante uma transação de leitura longa é impedir que qualquer atualização aconteça até que a transação de leitura termine, travando cada registro conforme eles são lidos. Isso em inúmeras vezes é inaceitável. Versioning Há outro modelo para controle de concorrência chamado versioning que supera os problemas que o modelo de travas têm quando o ambiente consiste em uma mistura de transações de leitura longas e atualizações. Este modelo é chamado de versioning e é o modelo usado pelo Interbase. Para entender esse modelo, considere o exemplo anterior. Em um banco de dados usando versioning, a transação de leitura para produzir o relatório de inventário se inicia. Quando a transação de atualização para mover a platina do armazém A para o B é confirmada uma nova versão do registro é criado no BD. Em um banco de dados de versioning, cada transação recebe um número de transação sequencial. Além disso, o gerenciador de banco de dados mantém um inventário de todas as transações ativas. Esse inventário de transações mostra quando uma transação está ativa, confirmada (commited) ou anulada (rollback). Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 538 Quando uma transação de atualização commitar, o software de banco de dados confere para ver se há transações com o número de transação mais baixo ainda ativas. Nesse caso uma versão nova do registro é criada que contém os valores atualizados. Cada versão também contém o número de transação da transação que o criou. Veja ainda que o Interbase não cria uma cópia completa do registro. Ao invés disso, ele cria um registro de diferença que só contém os campos que foram alterados. Quando uma transação de leitura inicia, ela recebe o próximo número de transação e uma cópia da página de inventário de transações que mostra o status de todas as transações que ainda não foram commitadas. Quando a transação reclama cada registro de uma tabela, o BD checa se o número de transação da última versão do registro é maior que o número de transação da transação que está reclamando o registro e se a transação estava commitada quando a transação de leitura se iniciou. Se o número de transação da última versão do registro é maior que o número de transação da transação requerente ou se a transação que criou a última versão do registro estava ativa quando a transação de leitura se iniciou, o Interbase olha para trás através das versões prévias do registro até encontrar um onde o número da transação seja menor que o número de transação da transação que está tentando ler o registro e cujo status estava commitado quando a transação de leitura se iniciou. Quando o gerenciador do banco de dados acha a versão mais recente que satisfaça estes critérios ele retorna aquela versão. O resultado é um isolamento de transação serial sem proibir atualizações durante a vida da transação de leitura. Considere o exemplo seguinte de um registro onde 4 versões existem: Tran=100 (status=committed) Tran=80 (status=ativo quando a leitura começou) Tran=60 (status=rolled back) Tran=40 (estado = commitado quando leitura começou) Assuma que uma transação de leitura com o número de transação 90 tenta ler esse registro. A transação de leitura não verá a versão do registro criada pela transação 100 porque a atualização que criou esta versão aconteceu depois que transação 90 começou. A transação 90 também não poderá ler a versão criada pela transação 80 embora ela tenha um número de transação mais baixo, porque a transação 80 ainda não commitou. Embora a versão para transação 60 ainda exista, ela foi desconsiderada e transações desconsideradas sempre são ignoradas. Então, a versão que a transação 90 lerá é a versão criada pela transação 40. Note neste exemplo que a transação 80 não terá permissão para commitar. Quando a transação 80 tentar commitar, o sistema de BD verá que a transação 100 já commitou e a transação 80 será desconsiderada (rollback). Como eles se comparam ? Para ter um entendimento maior de como os modelos de travamento e versioning se comparam voce precisa ver os tipos de conflitos de concorrência que podem ocorrer em um ambiente multi-usuário e qual o comportamento de cada modelo em cada caso. Os exemplos seguintes assumem que o modelo de travamento usa uma trava de leitura compartilhada e uma trava com exclusividade para escrita para implementar um sistema otimista. Múltiplos usuários podem colocar taravas de leitura mas ninguém pode colocar uma trava de escrita se outro usuário já realizou uma trava de escrita ou de leitura. Se um usuário tem uma trava de escrita, então outros usuários não poderão ler ou gravar no registro. Isso é tipico de BD que utilizam arquitetura de travamento. Nos exemplos seguintes, 3 cenários são explorados. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 539 O primeiro é o que acontece quando não há controle de concorrência, o segundo é o que acontece quando se usa travas e o terceiro utiliza versioning. Considere o caso onde um marido e a esposa vão à 2 Bancos 24 horas ao mesmo tempo sacar dinheiro de sua conta corrente. Sem um controle de concorrência a sucessão seguinte de eventos poderia acontecer : John lê o saldo da conta que é de $1,000.. Jane lê o saldo da conta que ainda é $1,000. John posta uma retirada de $700 . Jane posta uma retirada $500 . Neste momento o saldo da conta é - $200 e o banco não ficará muito feliz com isso. Isto aconteceu porque sem mecanismo de controle de concorrência, Jane não vê a mudança de saldo feita pelo saque do John em sua conta. Com o modelo de travas : John lê o saldo da conta que causa uma trava de leitura. Jane lê o saldo da conta que causa uma trava de leitura. John posta o saque dele que falha devido à trava de leitura de Jane. Jane posta o saque dela que falha devido à trava de leitura de John. Um deadlock acaba de ocorrer. Com sorte, o software de banco de dados descobrirá o deadlock e ferá um rollback de uma das transações. Usando o modelo de versões (versioning): John lê o saldo da conta. Jane lê o saldo da conta John posta a retirada dele que faz com que uma nova versão com o novo saldo seja escrita. Jane posta a retirada dela, mas um rollback é executado quando a versão mais nova é detectada. Um problema diferente acontece se um usuário cancela a transação. Sem controle de concorrência : John retira dinheiro da conta que atualiza o saldo. Jane lê o saldo. John cancela a operação antes que ela seja commitada. Jane está vendo o saldo errado agora. Neste caso, uma dependência existe entre as duas transações. A transação de Jane só produz os resultados corretos se a transação de John commitar. Isto mostra o perigo de se usar o isolamento uncommitted. Usando o modelo de travamento : John lê o saldo que coloca uma trava de leitura. John faz a retirada dele, o que coloca uma trava de gravação durante a atualização. Jane lê o saldo, o que tenta colocar uma trava de leitura mas tem que esperar devido a trava de John. John cancela a transação antes de commitar. Isso gera um rollback que libera a trava de escrita. Jane pode ler agora e adquirir o saldo correto. Usando o modelo de versões (versioning) : John retira dinheiro que atualiza o saldo e cria uma nova versão não commitada. Jane lê o saldo. O saldo não mostra a retirada de John pois ainda não foi commitada. John cancela a transação, o que gera um rollback na nova versão. Isto mostra uma vantagem de desempenho do modelo de versões, pois Jane não teve que ficar esperando para ler o saldo. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 542 O que acontece se um dos HDs onde está o BD parar de funcionar ? Nos modelos de BD com travas, voce pode colocar o arquivo de LOG em outro HD e logar todas as transações feitas desde o último backup. Se um desastre físico ocorrer no HD, voce pode recuperar o último backup e usar o arquivo de LOG para relançar o movimento. Nos BDs utilizando versioning, a única proteção para isso é criar um mirror do BD em outro dispositivo (HD). Voce pode utilizar o recurso de shadowing do Interbase para fazer isso, use drives RAID ou use um sistema de mirror do próprio sistema operacional. Ampliando o Banco de dados Enquanto alguns bancos de dados requerem a paralisação do BD para aumentar o tamanho do arquivo de log e para descarregar e recarregar os dados, o Interbase não necessita disso. Bancos de dados Interbase se expandem automaticamente até o tamanho de máximo permitido pelo sistema de arquivo, conforme os dados vão sendo inseridos. Se o BD precisa de mais espaço, voce pode adicionar um arquivo secundário através do comando ALTER DATABASE. Enquanto o ALTER DATABASE requer uso exclusivo do banco de dados, ele é muito rápido pois não exige que se descarregue e recarregue os dados. Outros Assuntos No princípio pode parecer que um banco de dados de versioning tem uma desvantagem significante pois as múltiplas versões dos registros farão com que o tamanho do banco de dados aumente rapidamente comparado com um BD que utiliza o modelo de travas. Enquanto que isso é verdade, não esqueça que esses outros BDs também crescem na medida que seus arquivos de LOGs aumentam. Porém, bancos de dados de versioning certamente crescerão rapidamente se algo não for feito para controlar a proliferação de versões de registro. O gerenciador de banco de dados executa automaticamente um pouco da administração doméstica para você. Cada vez que um registro é acessado, o gereciador do banco de dados confere para ver se quaisquer das versões anteriores daquele registro não é mais necessária. Uma versão não é mais necessária se uma transação foi cancelada (rolled back) ou se existe uma versão mais nova já commitada e não há nenhuma transação ativa com um número de transação menor que o número de transação da versão commitada mais nova. Versões que não são mais necessárias são apagadas automaticamente e o espaço que elas ocuparam nas páginas do banco de dados é re-utilizado. Muitos registros em muitos bancos de dados são acessados infreqüentemente. Para remover versões desnecessárias destes registros, o banco de dados deve ser varrido periodicamente. Uma operação de varredura visita todos os registros em todas as tabelas no banco de dados e apaga versões desnecessárias. Você pode rodar a varredura enquanto o banco de dados estiver em uso mas ela implicará numa queda de performance enquanto estiver sendo executada. O Interbase, pode default, começará uma varredura automaticamente depois de 20.000 transações. Isso não é o melhor modo para administrar um sweep porque você não tem nenhum controle de quando a varredura começará e o usuário que começa a transação que disparou a varredura é travado até o final da varredura. É melhor ativar o sweep manualmente quando ninguém estiver utilizando o BD, ou através de um BACKUP/RESTORE. Isto é porque o Interbase não removerá versões de registros mais velhos que a mais Velha Transação Interessante (OIT). A OIT é a mais velha transação cujo estado não seja o de commitado. O estado de todas as transações desde que a OIT é mantida na TIP e as versões de registros para estas transações é retido no banco de dados. Executando uma varredura quando você tem uso exclusivo do banco de dados ou executando um backup/restore reajustará o OIT à última transação commitada e removerá todas as transações anteriores da TIP e removerá as versões delas do banco de dados. Isto não só libera o máximo de espáco no banco de dados, mas também reduz o tamanho da TIP. Desde que a TIP deve ser copiada para cada transação quando ela se inicia, fazer com que a TIP seja pequena fará com que as transações iniciem mais rapidamente. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 543 O Interbase requer menos de 10 megabytes de espaço de disco e é muito fácil de instalar e configurar. Há só dois parâmetros que você precisa fixar. O primeiro é o tamanho de página do banco de dados e o segundo é o tamanho do cache das páginas. Uma vez que estes parâmetros são definidos, o Interbase se ajusta para prover máximo desempenho. Instalação fácil e manutenção fazem do Interbase uma boa escolha para instalações onde não existe um administrador de banco de dados. Finalmente, o Interbase roda em uma grande variedade de plataformas que o tornam facilmente escalável. O Interbase também suporta múltiplos character sets por tabela, o que o faz uma escolha ideal para aplicações internacionais. O Interbase foi o pioneiro no armazenamento eficiente de dados de BLOBs e suporta múltiplos campos BLOB por banco de dados bem como VIEWs atualizáveis. Conclusão Selecionar o banco de dados certo para sua aplicação requer uma compreensão clara dos tipos de transações, isolamentos e atualizações. O sistema de versioning tem uma vantagem clara porque pode processar transações de leitura e escrita concorrentemente e ainda provê o isolamento serializável para garantir segurança. O versioning também provê uma rápida recuperação depois de falhas pois não há arquivos de LOG para serem processados. Quando um BD versioning re-starta, ele só marca as transações abertas e que não foram commitadas como rolled-back e está pronto para continuar. Quando esse artigo foi escrito, o IB era o mais novo servidor de BD e o único à utilizar o modelo de versioning. Além das vantagens do modelo de versioning, o Interbase tem o menor tamanho e necessita de menos memória, é auto-configurável e está disponível para o Netware, Windows NT, Windows 9x, Linux, Solaris sendo altamente escalável. Tipos de Dados do InterBase Igualmente a todos os bancos de dados relacionais, o lnterBase armazena dados em tabelas que compreendem linhas (registros) e colunas (campos). Cada coluna representa informação de um único tipo, cada linha representa uma instância desta informação. Uma coluna pode armazenar texto, número, data, e outros tipos de dados. Quando você define uma coluna como parte de um domínio ou de uma tabela você deve especificar o tipo de dado que ela armazenará. Para alguns tipos de dados você deverá ainda especificar o tamanho máximo daquela coluna, isto faz com que o InterBase garanta espaço suficiente. O InterBase suporta vários tipos de colunas numérica, colunas de texto fixo ou variável, colunas de data que armazenam também informações sobre a hora e colunas BLOB que armazenam qualquer tipo de dado binário tais como som e vídeo. Cada um destes tipos serão vistos em detalhe. Binary Large Objects (Blobs) Tem por objetivo armazenar dados binários, como gráficos, sons digitalizados e textos. Visando acomodar os diversos tipos de dados, as colunas tipos blob são divididas em 7 subtipos. Veja as características dos subtipos mais usados: Subtipo 0: utilizado para acomodar dados binários ou dados de tipo inderteminado; Subtipo 1: utilizado para acomodar texto; Você pode, por exemplo, executar um SELECT em uma string armazenada dentro de um campo BLOB. No entanto, o InterBase não sabe nada sobre a estrutura de tais dados. Você não pode pedir para o InterBase mostrar uma imagem TIFF ou para "rodar" um videoclip. Você deve escrever aplicações que interpretem o campo BLOB. A técnica mais comum é passar isto par um arquivo e então visualizar/executar este arquivo através de um programa especializado, que entenda tal formato. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 544 Char(n) Define um tamanho fixo de coluna de 1 a 32.767 bytes. Colunas CHAR são utilizadas tipicamente para armazenar colunas que já tenham um tamanho pré-definido. O CEP é um bom exemplo, já que quase sempre varia entre 07 e 10 digitos. Exemplo: Nome_cliente char(50) Varchar(n) VARCHAR define um tamanho variável de coluna entre 1 a 32.765 bytes. Quando você armazena um valor mais curto que esta quantia o valor não é aumentado com espaços. Colunas VARCHAR são usadas na maioria das vezes para armazenar dados textuais. Endereços por exemplo, devem ser armazenados em colunas VARCHAR. Você poderá especificar 50 caracteres para n, mas endereços atuais variarão dentre uma série vasta. Exemplo: Endereco varchar(50) Date Tipo de dado para armazenamento de datas. É requerido 4 bytes para este armazenamento. Exemplo: Data_nascimento date Data_inscri date Time Tem por objetivo armazenar valores de tempo na faixa de 00:00 AM até 23:59:9999 PM. É requerido 4 bytes para este armazenamento. Exemplo: Hora_entrada time Timestamp Armazena em uma única coluna informações referentes à Data e Hora. . E requerido 8 bytes para este armazenamento. Tem o mesmo funcionamento do tipo de dado DATE no InterBase 5.x. Exemplo: Data_hora_curso timestamp Decimal(precisão - escala) e Numeric(precisão - escala) Ambos os tipos especificam uma coluna numérica onde o valor do ponto decimal é fixado, como moeda. Precision representa os numeros de dígitos do lado direito do ponto flutuante. Ambos os numeros vão de 1 a 15, porém a escala(scale) deve ser sempre menor ou igual a precisão(precision). O InterBase suporta um número de opções para especificar ou não especificar precision e scale. Se você deixa tanto precision como scale vazios - sem preenchimento, o InterBase define a coluna como INTEGER ao invés de NUMERIC ou DECIMAL e armazena somente a porção inteira dos valores. Exemplo: Decimal(10,3) Double Precision Uma coluna DOUBLE PRECISION é usada para armazenar números com até 15 decimais significantes. Isto requer 8 bytes para armazenamento, o ponto decimal aparece dentro da coluna. DOUBLE PRECISION são comumente conhecidos como DOUBLE. Exemplo: Area_sala double precision Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 547  IB Expert Instale o IB Expert 2.0, com este utilitário poderemos criar tabelas, índices ou relacionamentos sem precisar usar uma ferramenta case. Podes baixar o IB Expert no site http://www.ibexpert.com, escolha o link IB Expert Free Personal Edition, esta é um versão gratuita com algumas restrições, porém para fins educativos é excelente.  Execute o IB Expert, clique em Database ( barra de título ), clique em Create Database, na opção Server, clique em Local, clique no campo abaixo, informe a pasta onde armazenará o arquivo Gdb, digite o arquivo de nome dados1, dentro deste arquivo ficarão armazenados os arquivos.   Informe o nome do arquivo dados1.gdb ( digite no nome do banco de dados que deseja criar ) C:\Gdbs\dados1.gdb  Digite o usuário SYSDBA  Digite a senha masterkey Escolha a opção WIN1251 ou ISO8859_1 Entre com tamanho de página de banco de dados, em bytes (1024 através default). Outros valores legais para bancos de dados são: 2048, 4096, e 8192, 16384. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 548 Teste conexão do banco de dados clicando no botão Test Connect após clique no botão Register. Veja nosso banco de dados. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 549 Posicione o ponteiro do mouse sobre a opção Domains ( para criar Domínios ), clique no botão direito e clique em New Domain. Cria-se domínios para não precisar digitar nomes para os campos, define-se um nome genérico e um tamanho e este domínio poderá ser usado para vários outro campos quando definir uma base de dados. Defina um nome para o domínio Codigo, defina o tipo do campo deste domínio Integer e vamos forçar que a digitação de um código neste campo, ou seja, conteúdo do campo não pode ser nulo ( branco ), após ter feito o primeiro domínio clique na setinha para baixo ( no teclado ) vamos criar o segundo domínio, Veja acima os vários domínios que criamos. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 552 Se não tivéssemos criado os domínios ( domains ), teríamos que definir para cada campo seu campo, se é inteiro, data etc. Basta escolher o domínio. Abaixo, digito o nome do campo, após escolho o domínio que possui a definição do campo de inteiro. Escolha o domínio CODIGO que possui o tipo de campo inteiro. Clique no raio ( Ctrl F9 ) para compilar e clique em Commit. Digite o nome do campo ALU_CODIGO Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 553  Vamos criar um índice secundário para tabela de Alunos. Clique na aba Constraints, no menu atalho ( suspenso ) clique no botão direito, será mostrado um menu de atalho, clique em New primary key Ins, selecione o campo que fará parte do índice primário. Clique no raio ( Ctrl F9 ) para compilar. Após clique na aba Índices e verifique que o índice já foi criado. Clique neste local, serão listados os campos, escolha o campo Código que fará parte do índice primário ( PK = Primary Key ou Índice Clique no botão direito, escolha New primary key, clique em OnField e selecione o campo ALU_CODIGO para definir índice primário para o código. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 554 Veja abaixo o índice criado. Veja abaixo, até agora criamos os Domínios ( Domains ) e a tabela Alunos.  Reabrindo banco de dados. A segunda vez que abrir o banco será solicitado o Login e a senha. Abra o IBExpert, clique duplo no banco DADOS1.GDB Dê um clique duplo para abrir o banco. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 557  Clique duplo em Tables. Clique duplo em Alunos. Índice primário Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 558 Criando domínios e tabela. Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 559 Conhecendo mais o IBExpert, cadastrei alguns registros para mostrar outros recursos. Note na parte inferior da tela gráfica as três opções, GridView, FormView e PrintData, são recursos que permitem visualizar os registros (dados) de maneiras diferentes. Grid View Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 562 O SQL Editor grava um histórico das sqls que foram executadas , veja abaixo: Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 563  Abra o Delphi e crie um novo projeto, lembre-se que ao criar um novo projeto o Delphi insere automaticamente um formulário em branco, insira neste 5 componentes abaixo, como definir suas propriedades veja adiante. Paleta / aba onde estão os componentes que serão usados neste formulário. • SQLConnection esta na aba DBExpress • SQLTable esta na aba DBExpress • DataSetProvider esta na aba DataAccess • ClientDataSet esta na aba DataAccess • DataSource esta na aba DataAccess Parte do código fonte: Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 564 Propriedades dos componentes usados no formulário: Dê um clique duplo em SQLConnection, será aberta a tela abaixo e defina os itens em vermelho, altere a propriedade LoginPrompt = False. Clique no componente SQLTable1 , pressione F11 ( propriedades ) e defina as propriedades MasterSource para DataSource1 e SQLConnection para SQLConnection1. Defina a propriedade TableName para ALUNOS e a propriedade Connected = True. Clique no componente DataSetProvider1, pressione F11 ( propriedades ) e defina a propriedade DataSet para SQLTable1 e a propriedade Constraints = True. Clique no componente ClientDataSet1, pressione F11 ( propriedades ), defina a propriedade ProviederName para DataSetProvider1 e a propriedade Active = True. Clique no componente DataSource1, pressione F11 ( propriedades ) e defina a propriedade DataSet para ClientDataSet1. Clique no DBGrid, defina a propriedade DataSource par DataSource1. Insira um componente DBNavigator e defina a propriedade DataSource para DataSource1. Digite o caminho/pasta onde esta o banco de dados C:\Gdbs\Dados\dados1.gdb Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 567 Adicionei mais dois usuários, Mike e Eric ( senha para estes usuários: 123 )  No IBConsole, clique no ícone Interactive SQL , vamos definir os privilégios para os usuários. Grant Select, Delete on Alunos To JURA ( linha acima, permite que o usuário JURA selecione registros e apague ) Revoke Select, Delete on Alunos From JURA ; ( linha acima, remove privilégios do usuário JURA não podendo selecionar registros e apagar ) Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 568 TAMBÉM podemos criar tabelas via SQL com o Interactive SQL , o único importantíssimo detalhe é que você terá que saber todos os comandos SQL de cor, sem erros ! Se tiver um utilitário como o IBExpert será super fácil criar tabelas, alterar etc... CREATE TABLE FUNCIONARIO ( FUNC_CODIGO INTEGER NOT NULL, FUNC_NOME VARCHAR(50) NOT NULL, FUNC_ENDERECO VARCHAR(50), FUNC_CIDADE VARCHAR(30), FUNC_DATA_NASC TIMESTAMP, FUNC_SALARIO NUMERIC(15, 2), FUNC_SEXO VARCHAR(4), CONSTRAINT PK_FUNCIONARIO PRIMARY KEY (FUNC_CODIGO) ); No exemplo abaixo criei uma tabela de Alunos com 3 campos, índice primário e domíneos. /* Domain definitions */ CREATE DOMAIN CODIGO AS INTEGER NOT NULL; CREATE DOMAIN DATA AS TIMESTAMP; CREATE DOMAIN NOME AS VARCHAR(50) CHARACTER SET WIN1251; /* Table: ALUNOS, Owner: SYSDBA */ CREATE TABLE ALUNOS ( ALU_CODIGO CODIGO, ALU_NOME NOME, ALU_DATA_NASC DATA, CONSTRAINT PK_ALUNOS PRIMARY KEY (ALU_CODIGO) ); Delphi Aplicado  by Jurandir A. Pellin – Timbó – SC (E-mail: delphiewb@gmail.com) 569  IBExpert  Criando Exceptions e Triggers Podemos disparar gatilhos ( Triggers ) que são eventos executados de dentro do banco sem precisar executar de dentro de um programa, o banco fará tudo para cuidar dos dados. Usaremos a tabela Alunos que criamos anteriormente. Note no exemplo acima abri o banco de dados chamado de dados1.gdb  Vamos criar uma Exception ( exceção ), clique com o botão direito sobre Exceptions, veja tela abixo: Será mostrado um nome NEW_EXCEPTION, mude este nome para E_Digite_Nome, na coluna ao lado digite a mensagem texto que será mostrada caso o campo for deixado em branco Um NOME DO ALUNO deve ser digitado. Após pressione F9 para compilar.
Docsity logo



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