Você está na página 1de 72

Modelagem de Dados com Ms Access

Autor: Robert Friedrick Martim Este mdulo visa introduo a Modelagem de Dados com MS Access. O curso primeiramente introduz as ferramentas que utilizaremos e termina com o estudo de casos para avaliao da melhor forma de abordar um problema. Vale lembrar que os estudos de casos no so verdades absolutas, mas apenas exemplos de como o problema pode ser abordado e resolvido. Ao final deste curso e do estudo dos casos o leitor ter uma ampla viso das diferentes abordagens e dever ser capaz de aplicar o que for ensinado na soluo de seus prprios problemas. A linguagem utilizada descontrada e com o mnimo de jargo possvel. O objetivo ter um ebook com contedo relevante e de fcil compreenso. Este mdulo pode ser lido juntamente com os cursos de programao no Access de minha autoria, principalmente se o leitor no tem experincia com VBA no MS Access em especial acesso de dados com ADO e DAO. Outro curso recomendado o curso sobre Consultas. * Para completar este curso, voc precisa conhecer o mnimo do MS Access. O processo de modelagem de dados se dar da base ao topo e todo e qualquer usurio poder se beneficiar deste curso. Comentrios e sugestes para melhora do material podem ser enviados diretamente para o autor no endereo rm@faircourt.com Introduo Bem-vindo a srie Como Fazer. Nas sries que sero escritas olharemos aspectos distintos do Access de acordo com a demanda do site. A inteno principal fornecer ao internauta uma ferramenta que concentre a ateno na soluo de um problema especfico. Neste mdulo veremos como modelar dados no Access. O objetivo iniciar na base de tudo introduzindo conceitos e informaes importantes na modelagem de dados e terminar com o estudo de casos os quais serviro como laboratrios prticos ao leitor. Antes de continuar

Sugestes so sempre bem-vindas e esperamos que o leitor participe pro ativamente no desenvolvimento do material aqui apresentado. Finalmente, todo um esforo foi feito para assegurar que o material aqui apresentado est livre de qualquer erro, mas no improvvel evento de encontrar algo errado, por favor, no deixe de me comunicar, pois terei prazer em revisar o material imediatamente. Lio 001 - Armazenamento de dados: Access e voc, tudo a ver Dentre todos os aplicativos do Microsoft Office, certamente o Excel o mais popular entre os usurios, mas provavelmente o mais utilizado seja realmente o Word. Talvez pela extrema popularidade entre os usurios, muitos acabam utilizando o Excel como uma base de dados para os mais diferentes tipos de trabalho. O problema em utilizar o Excel que sua funo principal a anlise de dados e no o armazenamento dos mesmos. No por acaso a Microsoft chama o MS Office como uma sute de produtividade. A produtividade no est em um aplicativo apenas, mas na integrao dos aplicativos para fazer o seu trabalho melhor. Suponha que voc colete dados sobre a umidade relativa do ar a cada minuto. Se voc tentar gravar estes dados no Excel no h problema algum, pois voc far 1440 medies no dia e o nmero mximo de linhas em uma nica planilha de 65.536. Contudo, voc provavelmente estar registrando a umidade para outras cidades tambm e certamente o far todos os dias se este for o seu trabalho. Aqui, voc comea a enfrentar problemas no Excel, pois ficar mais difcil manter a integridade e relacionamento dos dados. Voc pode argumentar que cada planilha leva o nome da cidade e que, portanto, esta uma forma de relacionar as medies com cada cidade. Como o Excel, teoricamente, no tem limite de planilhas, voc poderia gravar a medio para todas as cidades brasileiras, e at do mundo, utilizando este mtodo. Contudo o resultado completamente ineficiente por um simples motivo: o Excel no foi feito para armazenar dados, o Excel foi feito para analisar dado. Se voc compreender que no Access o mesmo armazenamento apenas necessita de duas tabelas (uma que contm as cidades e outra que contm as medies) voc ver que a sua produtividade aumentar em muito, basta apenas relacionar as duas tabelas. Quando o momento for oportuno e a necessidade de anlise de dados surgir, voc novamente ver que analisar dados no Access, embora possvel, ineficiente. Com as ferramentas do Office completamente entrelaadas voc ver que a anlise se dar de forma mais bela no Excel. E se voc necessita apresentar os resultados, entra em cena o PowerPoint e se h necessidade de escrever um relatrio a vez do Word. Quanto mais voc se aprofundar no Office e conhecer cada uma de

suas ferramentas, mais produtivo voc se tornar. E digo isso por experincia prpria. Que tipo de banco de dados o Access e o que significa RDBMS? O Access um banco de dados relacional. Se voc nunca ouviu falar em banco de dados relacional esta uma tima oportunidade para compreender o que isso significa. A sigla RDBMS refere-se ao termo em ingls Relational Database Management System (Sistema de Gerenciamento por Banco de Dados Relacional). E o que isso significa? Colocando o preto no branco, isso quer dizer que os dados contidos no banco de dados possuem algum tipo de relao, isto , o seu tio est relacionado a voc porque ou ele irmo de sua me ou de seu pai. Se no fosse, ele no teria nenhuma relao direta com voc. Um banco de dados relacional funciona assim. A tabela contendo todas as cidades brasileiras e do mundo pode estar relacionada com uma tabela contendo todos os pases do mundo. Porm, somente o pas Brasil est diretamente relacionado a todas as cidades brasileiras na tabela de cidades do mundo. Desta forma, se voc tivesse que consultar o banco de dados por pas para criar uma lista de cidades, ao escolher Brasil, somente as cidades relacionadas ao Brasil seriam listadas. Agora, volte ao exemplo do seu tio. Eu disse que se ele no for irmo de seu pai ou me; ento, ele no est relacionado a voc diretamente. Mas isso no quer dizer que esta pessoa no esteja relacionada a voc de alguma outra forma. Se o mundo animal surgiu de apenas uma clula que gerou toda a vida no planeta Terra; ento, todos os animais esto relacionados de uma forma ou de outra. Assim, os animais prximos tm um relacionamento direto, como lees e leoas, ao passo homem e leo no possuem relacionamento direto, mas ambos so seres vivos que possuem caractersticas simulares como sangue, crebro, corao, fgado, etc, gerando assim uma relao indireta. Em um banco de dados relacional, o que voc notar exatamente isso. s vezes, voc possui vrias tabelas onde duas esto diretamente relacionadas, mas na ponta de uma cadeia de relacionamento h uma tabela que no contm um campo comum com uma tabela na outra ponta do relacionamento; porm, ambas as tabelas possuem algum relacionamento, pois no meio do caminho existem outras tabelas relacionadas que eventualmente convergem para estas duas. Obviamente que este apenas um exemplo simples. O Access nos permite criar bancos de dados relacionais muito mais complexos do que isso. O que compe um banco de dados Access? O Access composto por vrios objetos. O objeto mais importante aquele que armazena os dados. Sem ele o seu banco de dados intil a menos que voc esteja acessando dados de outra fonte e utilizando o ambiente do Access exclusivamente como um front-end.

Os objetos que compem o Access so:


Tabelas Consultas Formulrios Relatrios Pginas de acesso de dados Macros Mdulos

Figura 1-1 Janela do banco de dados para o objeto Tabela Cada um destes objetos tem uma finalidade especfica no Access. As tabelas funcionam como os rgos vitais do banco de dados. Sem as tabelas, no existe uma banco de dados Access, a menos que voc esteja acessando dados de uma fonte externa o que, diga-se de passagem, voc pode fazer com qualquer outro aplicativo. Isto , voc pode acessar dados do Word, Excel, PowerPoint, Outlook, uma pgina ASP, etc, desde que voc tenha os drivers e saiba como utiliz-los para acessar dados. Consultas podem ser descritas com sub-tabelas ou tabelas-derivadas. Com isso quero dizer que as consultas so utilizadas para filtrar dado utilizando certos critrios que resultam em uma nova tabela a qual denominamos consulta. Por exemplo, se temos a tabela de pases e cidades, podemos criar uma consulta por pas onde somente as cidades brasileiras so listadas na consulta. Formulrios permitem ao desenvolvedor criar uma interface grfica amigvel ao usurio. Inserir valores diretamente em uma tabela nem sempre a melhor opo para o usurio (ou para o desenvolvedor), pois dependendo de como as tabelas esto dispostas o usurio simplesmente no saber como proceder. Utilizando a interface grfica dos formulrios (Graphical User Interface ou GUI) tornamos o aplicativo mais amigvel para o usurio com pouco conhecimento e provavelmente facilita o treinamento no

uso do aplicativo, pois no necessrio entrar em detalhes de como as tabelas esto relacionadas umas com as outras, como elas funcionam, o que cada ndice ou chave primria faz, etc. Relatrios so utilizados para sumarizar ou analisar dado dentro do Access. Dependendo do tipo de trabalho feito, se tudo que voc precisa uma lista com valores e referncias cruzadas, em muitos casos no necessrio exportar os dados para o Excel para anlise. Pginas de acesso de dados j dizem tudo no nome. Elas servem para acessar dados contidos no banco de dados. Macros so comandos predefinidos utilizados para automatizar certas tarefas que se repetem com freqncia. Por exemplo, voc pode adicionar uma macro a um boto onde toda vez que o usurio clicar em tal boto um novo registro adicionado. Este tipo de interatividade faz parte do GUI do Access. O usurio no precisa saber como o boto funciona, ele apenas precisa saber o que ele faz (e como clicar nele). Se a interface for intuitiva, isto , se voc desenhar a interface de forma que ela seja similar s interfaces j conhecidas pelo usurio, ele provavelmente s de olhar j saber o que o boto faz. Mdulos fazem parte de uma classe especial de objetos contidos no seu projeto Access. Mdulos levam cdigos escritos em VBA (Visual Basic for Application) que visam melhorar o desempenho e adicionar ferramentas que no esto disponveis diretamente a partir dos outros objetos. Por exemplo, no VBA voc pode escrever funes que afetam a forma como o usurio trabalha, como adicionar senhas extras para dar uma maior segurana ao acesso aos dados de seu projeto. O que voc precisa saber que o seu projeto ser na verdade dois. Um o projeto do Access e o outro o projeto do VBA. O projeto do VBA onde voc escrever o cdigo por trs (code behind) da interface grfica (GUI). Por exemplo, um formulrio pode receber cdigo assim como um mdulo. A diferena que no formulrio o cdigo Private e no Mdulo ele ser Public (a menos que voc defina o contrrio). Alm disso, no projeto VBA voc poder inserir um objeto que no aparece na lista da janela do banco de dados. Este objeto chamado de Classe. Infelizmente, a discusso sobre classes vai alm do escopo deste mdulo, pois aqui estaremos tratando de modelagem de dados e no de criao de cdigo utilizando VBA. Porm, caso o leitor queira expandir o conhecimento, o segundo pacote de cursos desta srie:

http://loja.msofficegurus.com/como-fazer-pacote-deprogramac-o-vba-access-2003.html

Por que usar o Access? Se voc possui o MS Office e a sua verso vem com o Access, o primeiro motivo para us-lo que no h necessidade de se gastar mais dinheiro com um novo banco de dados.

Mas talvez o melhor motivo mesmo seja a facilidade de uso. Criar aplicativos no Access relativamente fcil. O maior problema organizar a idia, a estrutura das tabelas e os relacionamentos de forma que o resultado seja o mais robusto e significativo possvel. O Access o banco de dados para idiotas (e isso inclui o seu autor, pois sou grande f deste aplicativo). Digo idiota no no sentido pejorativo da palavra, mas para fazer uma aluso a palavra dummies que comumente utilizada em ingls para se referir ao usurio que no tem a menor idia de como um software funciona. Como isso voc deve entender que idiota significa que o Access realmente fcil de aprender. Obviamente fcil no uma palavra para descrever todas as funes e ferramentas disponveis no Access, mas fcil no sentido de que voc conseguir resolver problemas relativamente complexos com o mnimo de esforo ao utilizar todos os assistentes disponveis no Access. Alm dos assistentes, o Access vem com vrios modelos que podem ser criados e estudados pelo leitor para desenvolver o conhecimento do ambiente de trabalho e ferramentas do Access. Portanto, considere fcil um sinnimo para produtividade. Se eu espremer o Access, ele confessa? Quando o Access no a melhor soluo Neste tpico no falarei de experincia, mas sim do que dito pela prpria Microsoft quando o assunto tamanho, velocidade e confiabilidade. Se o Access fosse o melhor banco de dados do mundo e o nico banco de dados que voc usar pelo resto de sua vida, tenha certeza que seria desnecessrio para a prpria Microsoft criar dois outros produtos com a mesma finalidade. Estes dois outros produtos so o MSDE e o SQL Server. O MSDE (Microsoft SQL Server Desktop Engine) um servidor de banco de dados bem similar ao SQL Server. Mas antes de irmos mais fundo nestes dois, vamos retornar ao Access por um instante. O Microsoft Access foi basicamente desenvolvido para uso por um nico usurio. Por exemplo, se voc utiliza o Access como um fontend e um usurio toma controle do projeto Access ele pode abrir o arquivo em modo exclusivo o que travaria acesso para outros usurios. Para acesso compartilhado nem a prpria Microsoft diz quantos usurios simultneos so possveis. Uma das limitaes comumente citada o tamanho do banco de dados. Um banco Access suporta cerca de 2GB de informaes e depois disso implode (geralmente o limiar cerca de 1GB e, a partir da, voc est nas mos de sua amiga sorte). De qualquer modo, o argumento dos 2GB (ou 1GB) somente entra na equao se o seu projeto realmente prev um volume muito grande de dados sendo entrados diariamente (24 horas por dia) no seu banco de dados. Mesmo assim, com 2GB dependendo da velocidade de entrada de dados talvez leve alguns anos antes de voc atingir tal massa crtica, assim, a menos que o seu aplicativo seja do porte de uma Amazon,

Submarino, etc, improvvel que esta limitao seja um problema quando tudo que voc deseja fazer tabular os dados de uma pesquisa ou manter o controle de estoque de sua pequena livraria. O problema maior mesmo se o seu banco de dados precisa ser acessado por vrios usurios simultaneamente. Ai voc pode encontrar problemas (veja, por exemplo, o seguinte KB*http://support.microsoft.com/default.aspx/kb/222135), pois o driver do Access no alavancado para isso. De todos os bancos de dados que desenvolvi em Access, nenhum jamais me deu qualquer problema ou problema a algum cliente. Talvez o nico problema real que eu possa exemplificar quando h a necessidade de se modificar a estrutura do banco de dados quando h usurio utilizando o aplicativo. Se voc algum vez utilizou o Access, voc saber que isso no possvel. Por exemplo, se existe um formulrio alimentado por uma tabela aberta, voc no poder acessar a tabela para edio. Outra situao comum acontece com desenvolvedores de pginas ASP. Se voc utiliza o Dreamweaver provvel que j tenha recebido uma mensagem avisando que o BD est aberto em modo exclusivo por outro usurio. De qualquer modo, a maioria das informaes aqui no vem de experincia prpria, pois certamente nunca experimentei situaes extremas com bancos de dados Access. No obstante, importante estarmos cientes dos problemas, pois em caso de crise sabemos exatamente como proceder para san-lo rapidamente. As referncias sobre os problemas encontrados na escalabilidade do Access so todas em ingls, mas vale um esforo por parte do leitor para que ele possa ficar por dentro das informaes oficiais da Microsoft e dos maiores desenvolvedores de software do mercado mundial. O MSDE uma verso menor do servidor SQL e pode ser utilizado como uma plataforma de desenvolvimento para uma eventual escalada para a verso completa do servidor SQL. O problema com o MSDE provavelmente o mesmo que o SQL para pequenos projetos. Ao utilizar o MSDE ou o SQL voc ter uma demanda maior para administrao do banco de dados. Quanto ao servidor SQL apenas posso falar por tabela, pois nunca o utilizei, de verdade. De qualquer modo, o prprio site da Microsoft sugere que para projetos grandes como bancos de dados que prometem crescer rapidamente acima dos 2GB, bancos de dados que necessitam de acesso simultneo por diversos usurios, bancos de dados que necessitam de replicao, etc. * KB a abreviao de Knowledge Base (Base de Conhecimento) em ingls e o termo utilizado pela Microsoft nos artigos publicados nas reas de suporte e no MSDN.

Lio 002 - Uma viso geral dos modelos de banco de dados O Microsoft Access vem com uma srie de exemplos de banco de dados pr-intalados com o pacote. Para acessar tais bancos de dados clique em Novo no menu Arquivo e depois clique sobre a opo No meu computador na barra de tarefas do Access. Na janela que se abrir clique sobre a tabulao Bancos de dados:

Figura 2-1 Modelos de banco de dados Nele h dez modelos de banco de dados, mas voc pode ainda ir at o site oficial do Office online para baixar mais modelos. Muitos usurios reclamam que os bancos de dados no servem para o problema que eles precisam resolver. Contudo, voc no deve olhar para tais bancos de dados como solues para seus problemas, mas o que eles realmente so, isto , os bancos de dados so modelos e devem ser vistos como tais. Desta forma voc no ficar desiludido com os bancos de dados e certamente aprender muito com tais modelos no somente em termos de estrutura dos dados, mas tambm em programao utilizando VBA. Ao selecionar um dos modelos e clicar OK o Assistente de banco de dados aberto e ele te guiar durante todo o processo. A nica coisa que voc precisar fazer clicar nos botes para continuar o

processo:

Figura 2-2Assistente de banco de dados Na janela esquerda encontram-se as tabelas que comporo o seu banco de dados. Na janela direita encontram-se os campos que comporo a sua tabela. Alguns campos so opcionais ao passo que outros campos so obrigatrios. Campos opcionais podem ser removidos ou includos bastando apenas clicar na caixa de seleo para desmarcar ou marcar um campo da lista. Ao clicar em Avanar a prxima janela do Assistente aberta:

Figura 2-3 Escolhendo estilo de fundo para exibio de formulrio Aqui, voc pode escolher o estilo dos formulrios e seu banco de dados. Existem vrios estilos que voc pode utilizar livremente. O prximo passo refere-se aos estilos de relatrios. Existem vrios relatrios padres e voc pode escolher o estilo de formatao:

Figura 2-4 Escolhendo estilo de relatrio A seguir, precisamos definir o ttulo de nosso banco de dados. Feito isso, o Access resolver o resto sozinho. A nica coisa que voc precisa fazer sentar e esperar que o Assistente termine o resto to trabalho. Uma barra de progresso mostrada para que voc saiba como anda a criao de seu novo banco de dados

Figura 2-5 Progresso da criao de um banco de dados modelo Com o banco de dados pronto, tudo que voc precisa fazer aprender como ele funciona. Porm, nem esta parte complexa, pois todos os modelos so bem intuitivos e seguem uma mesma linha de layout, portanto, se voc alguma vez utilizou um modelo do Access, voc no ter problemas em aprender algum outro modelo rapidamente. Utilize os modelos do Access como ferramentas de aprendizagem e no como ferramentas que resolvero os seus problemas num piscar de olhos. Como este curso visa modelagem de dados, no entrarei em mais detalhes sobre os modelos do Access. Partimos agora para a criao de nosso banco de dados do marco zero. Mais para o final do curso estudaremos casos para avaliarmos a melhor forma de abordar um problema. Vale lembrar que o estudo de casos no verdade absoluta, mas os estudos mostram exemplos de como o problema pode ser abordado e resolvido. Ao final deste curso e do estudo dos casos o leitor ter uma ampla viso das abordagens e dever ser capaz de aplicar o que for ensinado na soluo de seus prprios problemas.

Lio 003 - Reconhecendo o ambiente de insero de tabelas no seu banco de dados O ponto de partida de nossa jornada pela modelagem de dados no Access inicia-se pelas tabelas. A tabela o corao de seu banco de dados, pois sem ela para alimentar o crebro de seu BD (os drivers JET) no h nada para se fazer mesmo. Nesta introduo irei cobrir os componentes das tabelas tais como campos, ndices, chaves primrias e os tipos de formatao e dados disponveis. A nossa primeira parada a criao de tabelas propriamente ditas. Como criar suas tabelas Existem vrias formas de criar suas tabelas. Para criar uma tabela, clique sobre o objeto Tabelas e em seguida clique sobre Novo. A janela de opes de tabelas aberta conforme mostra a figura:

Figura 3-1 Opes de criao de Tabelas Aqui, voc possui vrias opes de como proceder. Uma das opes de tabelas o assistente de criao de tabelas. Para iniciar, iremos utilizar o assistente de tabelas. Clique nesta opo e clique em OK. O assiste aberto fornecendo duas opes de banco de dados uma pessoal e outra de negcios. O Assistente no somente lhe dar as opes dos modelos de tabelas como tambm modelos de campos. Ao escolher o modelo de tabelas, campos sero apresentados para aquela tabela. Para adicionar um campo qualquer clique no boto com o sinal de maior (>). Para inserir todos os campos clique sobre o boto com o duplo sinal de maior (>>).

Figura 3-2 Assistente de tabela

Ao selecionar qualquer uma das tabelas voc notar que o primeiro campo um ID (identity identidade ou cdigo) do campo. Este campo utilizado como a chave primria em nossa tabela (discutirei chaves primrias mais adiante). Ao passar os campos para a janela Campos na nova tabela, voc ter a opo de modificar o nome para o que desejar. Caso voc esquea de modificar o nome sugerido ou queira modific-lo posteriormente, no se preocupe, pois isso pode ser facilmente feito. A opo Modo folha de dados funciona como uma planilha no Excel. O Access lhe fornece uma tabela em branco com vrios campos. Nenhuma tabela ser criada a menos que voc digite algum tipo de dados em um dos campos disponveis. Este mtodo muito inflexvel, pois no lhe fornece controle sobre a criao das tabelas como a definio dos tipos de campo, etc. O que ela faz tentar adivinhar o que voc realmente deseja fazer. Por exemplo, ao digitar texto em um campo o tipo de dado ser definido como texto para aquele campo. Se o valor digitado for numrico o campo assume um tipo de dado numrico (se voc digitar um nmero inteiro o campo assume um valor Inteiro, se voc digitar um decimal ele assume um valor Duplo) e assim por diante. A opo Modo de Design a que lhe dar maior controle sobre a criao de tabelas e esta que utilizaremos daqui por diante. As outras duas opes (importar e vincular tabelas), na verdade, no so exatamente o que podemos chamar de criao de tabelas. Importar tabelas simplesmente trs para o BD atual uma tabela em outro banco de dados ao passo que vincular tabelas cria uma espcie de tabela virtual no seu banco de dados onde a tabela original se encontra em um outro banco de dados. Esta ltima opo adequada para front-ends. Trabalhando com campos em sua tabela Vamos iniciar criando um banco de dados novo. Clique em Arquivo Novo e na barra de tarefas clique na opo para criar um BD novo a partir de modelos em seu computador. Escolha o banco de dados em branco e salve-o para o seu HD. Com o banco de dados criado e salvo, clique sobre o objeto Tabelas e clique em Novo. Selecione a opoModo de Design para entrarmos em modo de design do banco de dados. No modo de design voc ter a seguinte visualizao:

Figura 3-3 Adicionando campos em modo de design Observe que a janela acima , na verdade, um banco de dados tambm. O campo Nome do campo recebe vrios valores que definem os rtulos dos campos. O segundo campo refere-se ao tipo de dado e o terceiro uma descrio do que o campo, o que ele faz, como deve ser usado, etc. O nome do campo o nome que voc deseja dar a rea da tabela onde os dados sero inseridos. Por exemplo, se voc deseja inserir nomes de convidados voc pode nomear o campo para nome ou PrimeiroNome ou o que desejar. Ao lado do nome do campo temos Tipo de Dados que pode variar entreNumerao Automtica ou Sim/No. Estarei tratando deste assunto mais adiante. Logo abaixo vem as propriedades dos campos. As propriedades dizem respeito a vrias coisas como formatao, tipo de nmero a ser formatado, de onde vem os dados, se o campo indexado ou no, etc. Compreendendo e definindo o tipo de dado a ser utilizado no campo. Antes de criar qualquer campo no Access importante que voc compreenda o que cada um destes campos significa, pois facilitar muito o seu desenvolvimento quando voc escolhe o tipo certo para o que voc est fazendo. Um aspecto importante do tipo de dado que um campo qualquer somente pode armazenar um tipo de dado por vez. Isso gera confuso com usurios quando eles vem nmeros misturados com

texto. Um campo de texto pode conter qualquer caractere vlido e como nmeros so caracteres vlidos eles sero aceitos em campos de texto. Contudo, letras no sero vlidas em um campo numrico, pois letras no so vlidas no contexto numrico. Na tabela a seguir, h uma descrio dos dados possveis para os seus campos: Tipo Texto Tipo de dado Este o tipo padro para qualquer campo criado no Access. Se voc no definir explicitamente o tipo de dado, o Access assumir que o campo contm um valor do tipo texto. Este campo aceitar tanto texto quanto valores numricos que no so utilizados em clculos no seu banco de dados, assim como logogramas. Memorando Textos longos e combinao de texto, nmeros, logogramas, etc. At 65.535 caracteres. Se voc acha que 65.535 caracteres pouco, apenas para colocar em contexto, do incio deste ebook at este ponto h cerca de 28.000 caracteres, ou seja, 43% do total possvel. 1, 2, 4 ou 8 bytes . Tamanho do campo Este campo aceita no mximo 255 caracteres. Para definir um campo maior necessrio utilizar o campo Memorando.

Nmero

Valores numricos sero utilizados clculos ou no.

que em

Data/Hora

Armazena valores que representam datas entre o

8 bytes

ano 100 e o ano 9999 Moeda Armazena valores de moeda e valores numricos utilizados em clculos no banco de dados. A preciso do clculo de 15 dgitos esquerda do decimal e 4 dgitos direita do decimal. Um valor numrico nico armazenado no banco de dados. O valor pode ser seqencial ou aleatrio, mas sempre ser nico. Aceita apenas dois valores Sim ou No. Os valores podem vir em diferentes formas como valores booleanos (True/False) ou um valor numrico convertido para valor booleano (1/0). Um objeto OLE como um documento Word, por exemplo, grficos, som, ou qualquer tipo de dado binrio. Um texto hiperlink. Auxilia o usurio a criar uma consulta a uma tabela para alimentar o campo com valores. O tipo de dado ser igual ao tipo do campo da chave primria da fonte de dados. 8 bytes

AutoNumeracao

4 bytes

Sim/No

1 bit

OLEObjetc

Cerca de 1GB se houver espao disponvel em disco. Cerca de caracteres. 4 bytes. 2048

Hiperlink Assistente

Escolhendo o tipo de dado quando o tipo de informao

compete uma com a outra Escolhe o tipo de dado para o seu campo nem sempre uma tarefa fcil. Assim, voc precisar analisar o tipo de dado que voc espera no campo e como este tipo de dado se comportar no futuro. Abaixo apresento algumas consideraes na hora de decidir o tipo de dado para os campos:

Ao ordenar campos, voc deve estar ciente que valores numricos guardados em campos cujo tipo texto no sero ordenados numericamente, mas sim como texto. Assim, os valores 1, 20, 2 e 3 sero ordenados como 1, 2, 20 e 3 ao invs de 1, 2, 3 e 20; Devido ao diferentes tipos e representaes de datas (01/12/05 no Brasil indica 1 dezembro de 2005 ao passo que nos EUA indica 12 Janeiro 2005), datas gravadas como texto podem gerar problemas em tabelas dependentes de datas; Objetos OLE no podem ser ordenados; Valores numricos gravados como texto no podem ser utilizados em clculos (embora seja possvel converter texto representando um valor numrico para nmero ou viceversa); O tipo de dado sempre ter o mesmo formato? Isto , um campo somente receber nmeros e nada mais? Se sim, use um campo numrico ao invs de texto; O valor numrico requer preciso? Se sim, utilize o tipo moeda ao invs do tipo nmero. Se utilizar nmero, mude o tipo para duplo ao invs de inteiro; Voc precisa mostrar dados de um objeto externo como um grfico? Se sim, utilize o campo ObjetoOLE

Em algumas situaes voc ter uma idia clara de como proceder ao passo que em outras a deciso no ser to clara. Por exemplo, os tipos Texto e Memorando recebem o mesmo tipo de dados. Contudo o tipoTexto est limitado a 255 caracteres ao passo que o Memorando pode receber mais de 65.000 caracteres. O tipo texto deve ser utilizado quando o dado sendo inserido uma combinao curta de texto, nmeros e caracteres especiais. Por outro lado, se o campo est reservado para a insero de comentrios, por exemplo, voc querer um tipo Memorando. Mas supondo que voc queira ir muito alm do limite possvel de um memorando, voc pode ainda definir o seu campo como um objeto OLE. Neste caso, voc precisa ter em mente as conseqncias de ter um objeto OLE. Embora vivel, voc notar um rpido crescimento no seu banco de dados o que pode tornar o seu projeto

invivel embora interessante. Um outro grupo que pode gerar confuso o tipo Nmero e Moeda. Embora bastante similares, estes dois tipos funcionam de uma forma bastante diferente. A primeira grande diferena diz respeito a acurcia dos dados. O tipo Moeda possui uma preciso maior do que o tipo Nmero e se voc utiliza campos calculados que requerem uma preciso maior voc deve optar pelo tipo Moeda. Uma vez que voc tenha optado pelo tipo Moeda o Access automaticamente formata o valor para o tipo de moeda do seu sistema. Se o seu sistema est configurado para o portugus do Brasil o valor ser mostrado com o R$ em sua tabela. Por outro lado, se ele estiver para polons, por exemplo, o valor ser mostra com o smbolo z aps o nmero digitado na tabela. Isto pode causar bastante confuso e voc tem que se assegurar que os valores so formatados para a moeda local (pas onde o seu projeto ser usado) e no para o formato local da mquina, pois muitas vezes usurios utilizam a configurao do sistema de diferentes formas. Para terminar, voc pode definir um campo de numerao automtica como sendo via incremento ou aleatrio. Antes de entrar nestes dois tipos diferentes, voc precisa estar ciente que uma vez que valores sejam inseridos em um campo de numerao automtica voc no pode mais mudar o valor contido no campo. Se voc cancelar o processo de insero de um novo registro o nmero gerado para o campo ser descartado. Este tipo de dado normalmente utilizado como chave primria em tabelas. Digo normalmente, pois h vrias situaes onde voc pode querer um outro tipo de chave como utilizar o nmero de CPF no campo de chave primria. Como cada CPF nico para cada brasileiro adulto, o campo no possuir nmeros repetidos e no haver conflito entre registros. Finalmente, ao criar um campo de numerao automtica voc poder a qualquer momento modific-lo para um outro tipo. Porm, ao modific-lo para Texto e salvar a tabela, voc no poder retornar ao campo para transform-lo em um tipo numerao automtica novamente. Definindo a chave primria e ndices A chave primria o que mantm os seus dados em bom estado de sade e possibilita o Access exercer com destreza a sua funo de

banco de dados relacional. Sem ela, o processo de busca de dados drasticamente ineficiente e na maioria dos casos passiva de erros extremos. Para que todo o poder de manuteno dos dados possa ser utilizado, o Access precisa que cada tabela contenha ao menos uma chave primria, pois ser ela que identificar cada registro em seu banco de dados. Como a chave primria geralmente um valor numrico seqencial a indexao dos registros se torna extramente fcil e a busca e retorno dos dados um passeio no parque. No Access voc pode definir a chave primria de trs formas: 1) auto numerao, 2) chave primria de campo nico e 3) mltipla chave primria. Para uma chave primria de auto numerao o campo automaticamente cria um valor nico seqencial toda vez que um novo registro adicionado ao banco de dados. Ao criar uma tabela nova, caso voc no defina uma chave primria o Access lhe perguntar se no deseja criar tal campo. Caso um campo de auto numerao no exista na tabela o Access criar um. Se voc tiver definido um campo de auto numerao mas no o tiver definido como a chave primria, ao clicar Sim o Access determinar este campo como sendo a chave primria. No segundo caso, o exemplo do CPF. Como sabemos que os nmeros de CPF so nicos; ento, podemos defini-lo como sendo a nossa chave primria. Embora saibamos que os nmeros no so repetidos importante definir a formatao da indexao para evitar que um erro de digitao duplique um CPF no campo. Finalmente, o ltimo caso um bem especial. Este caso refere-se ao tipo de relacionamento muitos-para-muitos. O exemplo clssico o controle de pedidos. Se voc tem uma tabela contendo os produtos e outra tabela contendo o controle dos pedidos, o que voc notar os produtos no podem ser repetidos em sua tabela e nem os pedidos podem ser repetidos em sua tabela. Aqui, entra em cena uma terceira tabela para reconciliar as duas onde tantos os pedidos quanto os produtos podem ser repetidos. Para definir uma chave primria voc tem vrias opes. Voc pode clicar com o boto direito do mouse sobre o campo e selecionar a opo Chave Primria ou voc pode clicar no boto de chave primria na barra Design de Tabela conforme mostra a figura:

Figura 3-4 Determinando a chave primria ltimas palavras sobre campos em tabelas Campos so extremamente importantes para a integridade dos seus dados. Sem campos, a tabela no existe e, portanto, importante que o leitor dedique algum tempo para estudo o campo que ser criado e qual ser sua funo dentro do banco de dados. Muitas vezes conveniente criar todos os campos como texto apenas para descobrir mais tarde que o tipo de dado no pode ser utilizado em outros contextos. Como o leitor deve ter notado, o design de tabela , na verdade, uma tabela. Pode parecer bvio, mas muitos falham em notar este detalhe e utilizar isso em benefcio prprio. O que costumo fazer criar uma pasta de trabalho no Excel onde possuo os trs cabealhos acima. A guia da planilha o nome da tabela e ali eu crio os meus campos com os tipos de dados e descrio. Posteriormente, utilizando um script em VBA eu crio o banco de dados, respectivas tabelas, campos e relacionamentos. O script me levou um tempo para criar, mas depois de criar o vendo utilizando h anos. Ento, valeu a pena o esforo inicial. Desde modo, o leitor deve dedicar um tempo inicial exatamente para planejar esta parte para evitar a criao e destruio constante de tabelas. At porque, quando a modificao posterior em BDs com dados, o resultado sempre desastroso ou complicado. Prefira gastar tempo no planejamento a gastar tempo no conserto de erros posteriores. Oito bytes pode armazenar um nmero negativo entre -1,79769313486231E308 e -4,94065645841247E-324 ou um valor positivo entre 4,94065645841247E-324 e 1,79769313486232E308 Quatro bytes pode gerar cerca de 2,15 bilhes de nmeros sequenciais. Em teoria, assumindo que nenhum registro foi

removido do BD, voce poderia armazenar cerca de 2,15 bilhes de registros em uma tabela. Existe um terceiro tipo chamado de Globally Unique Identifiers - GUI (Identificadores Globalmente nicos), mas este no ser discutido aqui.

Lio 004 - Criando campos no estilo ComboBox Uma grande vantagem no que diz respeito a criao de campos e tabelas que determinados campos podem receber como argumento detalhes de um campo de uma outra tabela. Observe a figura abaixo:

Figura 4-1 Campo no estilo combobox (caixa de combinao) Neste exemplo, ao invs de digitarmos o nome da cidade toda vez que um novo registro adicionado o que fazemos simplesmente selecionar a cidade em uma caixa de combinao (combobox). No prximo tpico veremos como criar tais listas em tabelas. Combobox com valores digitados Vamos iniciar com um exemplo de lista digitada. Neste exemplo, a lista no obtida de uma outra tabela, pois as opes so poucas e dificilmente crescero alm dos itens disponveis. Exemplos de listas que no crescem so: a) sexo (masculino/feminino); b) Tipo de Pessoa (Fsica/Jurdica); c) Estado civil; etc. Para listas que crescem constantemente, veja exemplo do prximo tpico. Para criar tal exemplo siga os passos abaixo:

Adicione uma nova tabela;

Adicione o campo de numerao automtica Adicione um segundo campo do tipo texto Selecione a aba Pesquisa e modifique de Caixa de Texto para Caixa de Combinao Modifique a propriedade Tipo de origem da Linha para Lista de Valores Na propriedade Origem da Linha digite os valores que deseja e separe-os com ponto-e-vrgula;

Figura 4-2 Definindo a origem da linha Salve e feche a janela de design de tabela. Abra a tabela na janela do banco de dados e experimente com a nova criao (coloque as opes na ordem que desejar):

Figura 4-3 Selecionando uma opo da combobox A grande vantagem da utilizao deste mtodo que sabemos que as informaes sero entradas corretamente e sero padronizadas. Sendo assim, no h espao para erros de digitao bastando

apenas selecionar o item desejado. Combobox com valores consultados O exemplo anterior OK, porm h cenrios onde a lista cresce sempre. Ns simplesmente no temos como prever de antemo o quanto tal lista crescer. Pegue, por exemplo, uma lista de cidades. Embora o nmero de cidades brasileiras seja limitado invivel digitar tudo de uma vez s, ao invs disso digitamos as principais cidades e aquelas mais obscuras ficam para o momento que surgir a necessidade. Para este exemplo, vamos criar duas tabelas:

tblCidades Tabela para armazenar as cidades. Os campos para esta tabela so mostrados abaixo:

Figura 4-4 Campos para a tabela tblCidades

tblUF Tabela para armazenar as Unidades Federativas

Figura 4-5 Campos para a tabela tblUF Agora que temos as duas tabelas prontas, vejamos como modificar o campo IDUF da tblCidades. Abra a tabela tblCidades e selecione o campo IDUF.

Figura 4-6 Definio de consulta para caixa de combinao Antes de modificarmos as propriedades Origem da Linha, modifique as seguintes propriedades:

Exibir controle Se ainda for caixa de texto, modifique para Caixa de Combinao; Tipo de Origem da Linha Modifique para Tabela/Consulta; Coluna acoplada Determine como sendo 1 (primeira coluna). Isso porque a primeira coluna ser numrica para o nosso relacionamento, mas desejamos visualizar o nome ao invs do nmero; Nmero de colunas Determine como sendo 2. A primeira coluna para armazenar o nmero e a segunda para armazenar o texto; Larguras das colunas Determine como sendo 0cm; 5cm. O primeiro valor a largura da coluna 1 e o segundo valor a largura da coluna 2. Deste modo, o valor numrico ficar oculto.

Clique sobre as reticncias para abrir a caixa de construo de consultas:

Figura 4-7 Campos para a tabela tblCidades Com o construtor de consultas aberto, adicione a tabela tblUF rea reservada s tabelas. Para a primeira coluna selecione o campo IDUF e para a segunda coluna selecione o campo UF:

Figura 4-8 Construtor de consultas Caso queira, na linha Classificao escolha qual campo (IDUF ou UF) deve ser classificado e que tipo de ordem devem aparecer. Caso nenhuma ordem seja especificada a

ordem ser a de entrada dos dados. Feche o construtor e a instruo SQL ser adicionada como valor para a propriedade Origem da Linha: SELECT tblUF.IDUF, tblUF.UF FROM tblUF ORDER BY tblUF.UF;

Figura 4-9 Selecionando UF na tabela tblCidades Com a consulta pronta podemos abrir a tabela tblCidades para verificar como funciona a caixa de combinao. Adicionando itens lista Como o nosso banco de dados certamente ter uma interface grfica compreendida por formulrios, o mnimo que podemos esperar que durante a insero de um novo registro um item da lista esteja faltando. Em um cenrio como este ns no desejamos que o usurio feche tudo para abrir um outro formulrio para inserir o item que falta para posteriormente retornar ao formulrio onde trabalhava para continuar onde havia parado:

Figura 4-10 Cidade no se encontra na lista Na figura acima, ns no possumos a cidade Santa Maria e seria perda de tempo parar este processo, abrir o formulrio para insero da nova cidade, fechar este formulrio e finalmente reabrir o formulrio de insero de clientes. Ao invs disso, podemos utilizar VBA para controlar tal insero. Siga os passos abaixo para completar esta tarefa:

Abra o formulrio de clientes em modo de design; Selecione a caixa de combinao para a cidade; Selecione a tabulao (guia) de eventos: o Para o evento No est na lista, adicione o seguinte cdigo: Private Sub IDCidade_NotInList(NewData As String , _ Response As Integer) MsgBox "Item no se encontra na lista. Duplo-clique " _ & "sobre este campo para adicionar um item lista.", _ vbExclamation, "Item no est na lista..." Response = acDataErrContinue End Sub
o

Para o evento Duplo clique, adicione o seguinte cdigo: Private Sub IDCidade_DblClick(Cancel As Integer) On Error GoTo Err_Handler Dim lngIDCidade As Long If IsNull(Me![IDCidade]) Then

Me![IDCidade].Text = "" Else lngIDCidade = Me![IDCidade] Me![IDCidade] = Null End If DoCmd.OpenForm "tblCidades", , , , acDialog, "GotoNew" Me![IDCidade].Requery If lngIDCidade <> 0 Then Me![IDCidade] lngIDCidade Sair: Exit Sub Err_Handler: MsgBox Err.Description Resume Sair End Sub

, =

Salve e feche este formulrio; Abra o formulrio de insero de cidades onde o seguinte cdigo deve ser inserido: Private Sub Form_Load() If Me.OpenArgs "GotoNew" And Not IsNull(Me![IDCidade]) Then DoCmd.DoMenuItem acFormBar, 3, 0, acMenuVer70 End If End Sub = ,

Salve e feche este formulrio.

Com isso feito, podemos agora adicionar novas cidades tabela de cidades quando trabalhamos com o formulrio de clientes sem necessidade de reiniciar todo os processo. Caso o usurio tente inserir um item que no se encontra na lista a mensagem do primeiro cdigo ser mostrada:

Figura 4-11 Mensagem encontra na lista

mostrada

quando

item

no

se

Quando damos um duplo-clique sobre o campo o formulrio de insero de cidades aberto sobre o formulrio de insero de clientes como mostra figura:

Figura 4-12 Adicionando uma nova cidade lista Selecione a UF a qual a cidade pertence e digite o nome da cidade. Clique no X para fechar o formulrio. Quando retornamos ao formulrio de insero de clientes ocorrer um reconsulta tabela de cidades pela campo IDCidade (veja o mtodo Requery no cdigo anterior) e os valores contidos na combobox sero atualizados para mostrar todos as cidades da tabela:

Figura 4-13 Lista de cidades atualizada ltimas palavras sobre este tpico O leitor capaz de identificar algum erro nesta modelagem de dados?

Coloco erro entre aspas porque no exatamente um erro, mas uma duplicao desnecessria de informaes. Duplicao de informao algo normal, mas que deve ser evitado. A idia principal de termos uma tabela para UF que, fazendo assim, evitamos a repetio da UF na tabela de cidades. Porm, na tabela de clientes eu tambm adiciono UF. Note que est adio, embora completamente vivel, desnecessria. Observe o relacionamento (relacionamentos so discutidos no prximo tpico) das tabelas:

Figura 4-14 Relacionamento entre tabelas O que isso nos diz? O relacionamento acima nos diz que para cada UF ns podemos ter vrias cidades (relacionamento umpara-muitos) e que cada cidade pode ter vrios clientes (novamente um relacionamento um-para-muitos). Como existe uma cadeia entre as trs tabelas e o cliente tem um relacionamento com a tabela de cidades, o cliente est indiretamente relacionado UF. Observe a figura na prxima pgina:

Figura 4-15 Expanso das tabelas relacionadas Como a figura acima mostra, ao expandirmos a tabela de UF e de cidades obtemos os clientes de cada cidade e, consequentemente, obtemos os clientes de cada UF. Portanto, o campo IDUF que o leitor v na tabela de cliente logo ao lado de seu nome irrelevante. Poderamos criar um relacionamento deste campo com a UF? Sim, poderamos. No obstante, neste cenrio a relao seria direta entre as duas tabelas e perderamos a parte intermediria referente cidade. Vejamos ento o prximo tpico a questo de relacionamento de dados para evitar duplicao desnecessria de dados.

Lio 005 - Relacionamento de dados

At o momento vimos como criar nossas tabelas e campos. No tpico anterior tambm olhamos rapidamente um relacionamento e como o mesmo pode nos ajudar a evitar a duplicao de informaes no banco de dados. Alm de evitar a duplicao de informaes, relacionamento serve outros propsitos tais como:

Manter integridade das informaes (veja mais adiante tpico sobre imposio de integridade referencial); Criar um vnculo entre informaes; Facilitar a anlise de dados.

Para criar um relacionamento bastante simples. O que o leitor precisa ter em mente durante a criao das tabelas:

Ter duas tabelas; As duas tabelas precisam ter um campo em comum (de preferncia uma chave primria de numerao automtica); Procurar manter os nomes dos campos iguais em ambas as tabelas. Embora no seja crtico, esta prtica facilitar a compreenso e relacionamento dos campos, principalmente se isso ocorrer via VBA.

Para criar um relacionamento, com a janela do banco de dados aberta em Tabelas, v a Ferramentas Relacionamentos. Caso a janela contendo a lista de tabelas no esteja visvel, clique com o boto direito do mouse sobre uma rea qualquer. No menu popup que aparecer, clique sobre Mostrar tabela...:

Figura 5-1 Abrindo a janela de tabelas/consultas disponveis para relacionamento Nesta janela selecione as tabelas e/ou consultas que deseja relacionar. Clique no boto Adicionar para que as mesmas sejam adicionadas rea de relacionamentos:

Figura 5-2 Selecionando tabelas e/ou consultas para relacionamento Uma vez que as tabelas/consultas estejam na rea de relacionamento, simplesmente arraste o campo de relacionamento de uma tabela para outra. O Access determinar automaticamente se o tipo de um-para-muitos ou muitos-para-muitos:

Figura 5-3 Relacionamento um-para-muitos Com estas informaes bsicas em mente, vejamos os tipos de relacionamentos e como cri-los. Relacionamentos um-para-muitos Relacionamentos um-para-muitos provavelmente o tipo mais comum de relacionamento onde um registro na tabela primria pode estar relacionado com vrios registros de uma tabela secundria. Por exemplo, poderamos ter uma tabela de categorias de produtos

(tabela primria) e uma tabela de produtos (tabela secundria). Neste caso, todos os produtos so categorizados de acordo com as categorias na tabela primria:

Figura 5-4 Relacionamento um-para-muitos A figura acima mostra este tipo de relacionamento. A tabela lojas contm uma lista de lojas ao passo que a tabela produtos contm diversos produtos. Porm, uma loja pode ter vrios produtos listados para ela. Neste exemplo especfico a via uma loja para muitos produtos. No obstante, se o banco de dados fosse de uma cadeia de lojas o melhor relacionamento seria muitos-para-muitos para evitar a repetio de produtos, pois uma loja poderia ter vrios produtos e um mesmo produto (digamos, cafeteira) pode ser vendida em vrias lojas diferentes. No prximo tpico discuto este tipo de relacionamento. Relacionamentos muitos-para-muitos Relacionamentos um-para-muitos o tipo mais comum de relacionamento, isto voc tem um item relacionado a vrios outros itens. Agora, imagine o seguinte cenrio: voc possui uma empresa de treinamento e deseja criar um banco de dados para controlar alunos, professores, classes, etc. Neste cenrio, no h nada que impea que um aluno participe de vrias classes. Assim como cada classe pode ter vrios alunos. Da mesma forma, um professor pode dar aula para vrias classes e vice-versa. Sendo assim, ns temos um relacionamento muitospara-muitos. Este tipo de relacionamento no pode ser feito diretamente entre

duas tabelas. Portanto, ns precisamos de uma tabela intermediria a qual utilizada para consolidar e reconciliar os dados. Vejamos ento o cenrio dos alunos e salas delineado acima (mais adiante no curso veremos um estudo de caso mais elaborado deste exemplo):

Figura 5-5 Relacionamento muitos-para-muitos A tabela central (tblCursosAlunos), como podemos observar, possui o smbolo de infinito de ambos os lados. Isso indica que esta tabela pode conter vrios registros da tabela de alunos e tambm vrios registros da tabela de cursos. Observe a tabela intermediria:

Figura 5-6 Tabela intermediria para relacionamento muitos-paramuitos O mesmo curso e aluno se repetem vrias vezes na tabela intermediria. Por outro lado, quando abrimos a tabela de aluno ou cursos ns podemos expandir o relacionamento para saber quais cursos o aluno faz parte ou quais alunos pertencem a determinado curso. A pergunta pode ser colocada tanto para a tabela de alunos

quanto a tabela de cursos:

Figura 5-7 Expandindo as tabelas de alunos e cursos Como podemos ver no na figura acima, independentemente de qual direo caminhamos podemos facilmente reconciliar as informaes. Na tabela de alunos podemos rapidamente saber em quais cursos o aluno est matriculado. Por outro lado, na tabela de cursos vemos rapidamente quais alunos esto matriculados em determinado curso. Vejamos agora como impor integridade referencial e o que isso significa em termos de segurana e integridade dos registros. Impondo Integridade referencial Quando impomos integridade referencial no Access o que desejamos que o relacionamento entre registros das tabelas relacionadas sejam vlidos. Por exemplo, no faria sentido relacionar e deixar um campo relacionado vazio. Quando o leitor fez o primeiro relacionamento a janela abaixo foi apresentada:

Figura 5-8 Editando relacionamentos Aqui, precisamos tomar algumas decises em relao ao que desejamos fazer. Qual o motivo para se impor integridade referencial? Pergunte-se o que ocorreria quando voc adicionasse um registro na tabela intermediria, mas entrasse somente o nome do curso. Em um cenrio como este, sem a imposio de integridade, no h problema algum no momento da entrada do registro. Porm, este registro rfo, isto , ele no possui o outro lado do relacionamento. Deste modo, os dados no estariam verdadeiramente relacionados. Agora, pergunte-se o que ocorreria caso um aluno fosse removido da tabela de alunos. Sem a imposio de integridade referencial e propagao para excluso de registro, novamente teramos registros rfos. Obviamente que nem um nem outro cenrio satisfatrio. O que queremos um banco de dados a prova de balas. Um banco de dados onde informaes no sejam perdidas por detalhes como estes. Deste modo, podemos resumir a imposio da integridade como segue:

Impor integridade referencial Assegura que os relacionamentos entre registros so vlidos e que informaes em uma tabela so consistentes com informaes requeridas em outra tabela relacionada; Propagar atualizao dos campos relacionados Assegura a propagao de mudanas para os registros relacionados. Por exemplo, se a informao na chave primria da tabela primria modificada esta mudana

propagada para todos os registros relacionados na tabela secundria. Contudo, caso o campo relacionado seja de numerao automtica no faz diferena esta imposio, pois no possvel editar um campo de auto numerao; Propagar excluso dos registros relacionados Assegura a propagao da excluso de registros relacionados. Por exemplo, se um tabela de categorias est relacionada com uma tabela de produtos, se uma categoria removida, todos os produtos relacionados tambm so removidos evitando registros rfos na tabela de produtos.

Condies para integridade referencial Para que a integridade referencial seja vlida, o leitor deve observar algumas condies nos campos e tabelas que se deseja relacionar:

O campo relacionado na tabela primria deve ser indexado e seu valor deve ser nico. Para evitar problemas, o leitor deve utilizar o campo de numerao automtica ou informaes nicas como o nmero de CPF ou RG, por exemplo; Os campos sendo relacionados no precisam ter o mesmo nome (embora tal prtica seja til para a compreenso dos relacionamentos), mas o tipo de dado deve ser o mesmo nas tabelas primria e secundria. As excees a esta regra so: o Campo de auto numerao pode ser relacionado a um campo numrico desde que a propriedade do comprimento do campo numrico seja Inteiro Longo; o Campo de auto numerao tenha a propriedade Tamanho do campo setada para Replication ID e o mesmo seja verdadeiro para o campo numrico na tabela secundria. As tabelas sendo relacionadas devem pertencer ao mesmo banco de dados; Tabelas vinculadas precisam ter integridade referencial determinada no local de origem das tabelas e as mesmas precisam ser tabelas do Access.

Regras ps aplicao de integridade referencial Uma vez que integridade referencial tenha sido imposta entre as tabelas, o leitor precisar observar as seguintes regras:

No possvel remover um registro da tabela primria quando existir itens relacionados na tabela secundria. Caso seja necessria tal remoo de registro necessrio selecionar a

propagao na excluso de registros:

Figura 5-9 Registro no pode ser excludo havendo integridade referencial para no deixar rfo

No possvel adicionar um registro na tabela secundria quando um registro relacionado inexistente na tabela primria. Por exemplo, voc no pode adicionar um aluno a um curso se este curso no existir na tabela de cursos; No possvel modificar o valor da chave primria se a mesma j possuir valores relacionados na tabela secundria. Para que isso seja possvel necessria a propagao da atualizao feita.

Tipos de associaes Na caixa de edio de relacionamento h um boto para seleo do tipo de associao. Ao clicarmos neste boto uma nova caixa de dilogo nos dada onde podemos determinar o tipo de associao:

Figura 5-10 Tipo de associao As trs opes so definidas abaixo:

Primeira opo A primeira opo refere-se uma associao interna (Inner Join). A associao interna aquela onde registros de duas tabelas distintas so combinados no resultado de uma consulta com a condio de que somente se os valores dos campos relacionados se encaixam na condio predeterminada. Associao interna a associao padro no

relacionamento; Segunda opo A segunda opo refere-se uma associao externa esquerda (Left Outer Join). Neste caso, todos os registros da tabela esquerda so adicionados consulta, mesmo quando no h nenhum campo com valores determinados no critrio na tabela direita; Terceira opo A terceira opo refere-se uma associao externa direita (Right Outer Join). Neste caso, temos o oposto do Left Outer Join onde todos os registros da tabela direita so adicionados mesmo quando no h registro algum dentro do critrio determinado para os valores do campo da tabela esquerda.

Lio 006 - Estudos de Casos - Modelando dados para escritrio advocatcio: determinando processos, clientes e pagamentos Com ltimo tpico, veremos estudos de casos para modelagem de dados. Os exemplos aqui dados so exemplos reais os quais podem ser adaptados (de preferncia melhorados) pelo leitor para o trabalho que faz. Os estudos de casos esto longe de ser exaustivos, mas cobrem dvidas recorrentes dos mais variados nveis de usurios. Embora cada estudo possa ser visto individualmente aconselhvel que o leitor estude a lgica para ver como, mesmo tendo aplicaes diferentes, os exemplos, de certo modo, convergem para um tipo especfico de modelagem de dados. Finalmente, o estudo de casos no visa criar o banco de dados por completo, mas estudar a modelagem de dados. Questes como anlise de informaes atravs de consultas, criao de macros, acesso a dados, formulrios, relatrios, etc, no so discutidos aqui, embora possam aparecer para deixar mais clara a idia da modelagem dos dados. importante que o leitor esteja ciente de cada um destes processos separadamente e como os mesmos trabalham em conjunto para solucionar o problema final de um banco de dados completo. Por este motivo h outros mdulos desta srie que tratam de assuntos especficos no Access. 1. Modelando dados para escritrio advocatcio: determinando processos, clientes e pagamentos

Este exemplo serve como demonstrativo para o exemplo do prximo tpico. Aqui, no teremos um formulrio com mltiplos subformulrios com entrada automtica de prestaes. Isso fica para o prximo tpico. Neste, estamos interessados em como criar as tabelas e relacionlas. O objetivo deste banco de dados controlar clientes, contratos e recebimentos em um escritrio de advocacia. Vamos iniciar dando uma olhada no relacionamento entre as tabelas:

Figura 6-1 Relacionamento entre tabelas do projeto A tabela esquerda, tblClientes, a tabela mais importante para ns. Com ela determinamos quantos contratos temos com um determinado cliente e a partir da poder determinar quantos pagamentos esto pendentes por contrato para cada cliente:

Figura 6-2 Expanso entre tabelas Neste exemplo no discutirei todas as tabelas, pois algumas so apenas de apoio (como a tabela de cidades) e so irrelevantes para

o foco principal deste exemplo. O primeiro passo requer a construo da tabela de clientes. Os detalhes de cada campo no sero discutidos, pois so bastante diretos. A figura na prxima pgina mostra o detalhamento dos principais campos para a tabela de clientes:

Figura 6-3 Campos da tabela de clientes Note que o campo TipoCliente uma caixa de combinao do tipo Lista de valores. Sendo assim, os valores Pessoa Fsica e Pessoa Jurdica so digitados como possveis argumentos do campo. Uma alternativa seria utilizar uma consulta a uma outra tabela para criarmos a lista para este campo, mas com dois itens apenas isso desnecessrio. A prxima tabela a de contratos:

Figura 6-4 Campos da tabela de contratos Finalmente, ns temos a tabela de recebimentos a qual controla os pagamentos efetuados por determinado cliente em determinado contrato:

Figura 6-5 Campo da tabela de recebimentos Com as tabelas prontas, ns podemos comear a construo da interface grfica para o usurio final. No exemplo abaixo utilizo um formulrio principal e dois subformulrios. Quando um contrato selecionado no primeiro subformulrio os detalhes de pagamento so mostrados no segundo subformulrio:

Figura 6-6 Formulrio principal com dois subformulrios O formulrio acima e seus subformulrios podem ser obtidos pelo prprio Assistente de Formulrios. Na prxima lio discuto um exemplo mais complexo no qual utilizo VBA para executar certas funes.

Lio 007 - Estudos de Casos - Modelando dados para uma escola: determinando cursos, alunos e mensalidade Este tpico ser bastante til se o leitor procura exemplo para algo similar. Imagine o cenrio onde voc deseja criar um banco de dados para controlar:

Cursos disponveis; Alunos que fazem parte de cada curso disponvel (um aluno pode fazer mais de um curso por vez); Controlar pagamentos em mensalidades dos alunos por curso.

Ns podemos definir o problema em termos de tabelas como segue:


tblAlunos Tabela utilizada para armazenar informaes sobre os alunos; tblCursos Tabela utilizada para armazenar informaes sobre os cursos; tblCursoAluno Tabela utilizada para armazenar qual aluno pertence a qual curso. Esta tabela tem um relacionamento muitos-para-muitos entre as tabelas dos alunos e cursos; tblFormaPgto Tabela para armazenar as diferentes formas de pagamento; tblPgto Tabela para armazenar os pagamentos dos alunos

em relao ao curso que freqentam.

Figura 6-7 Relacionamentos entre as tabelas da escola Vejamos os campos de cada tabela e seus tipos de dados:

tblAlunos

Figura 6-8 Campos da tabela tblAlunos

tblCursos

Figura 6-9 Campos para a tblCursos

tblCursoAluno:

Figura 6-10 Campos da tabela tblCursoAluno (para relacionamento muitos-para-muitos)

tblFormaPgto

Figura 6-11 Campos da tabela tblFormaPgto

tblPgto

Figura 6-12 Campos para a tabela tblPgto Com as tabelas devidamente criadas e os relacionamentos feitos, ns podemos criar um formulrio com mltiplos subformulrios utilizando o assistente de formulrios.

Figura 6-13 Formulrio para aluno e respectivos subformulrios Na figura anterior, quando selecionamos um curso (veja seta ao lado do curso Access Avanado), os detalhes dos pagamentos para este curso so mostrados no subformulrio logo abaixo:

Na figura acima, quando curso de PowerPoint selecionado nenhuma informao de pagamento aparece, pois ainda no foram geradas as parcelas (note que o campo GerarParcela no foi marcado ainda). O nosso prximo objetivo escrever o cdigo que, ao marcarmos este campo, os dados referentes ao pagamento sejam inseridos. OptionCompare Database Sub Form_Current()

Dim ParentDocName As String

On Error Resume Next ParentDocName = Me.Parent.Name

If Err <> 0 Then GoTo Form_Current_Exit Else On Error GoTo Form_Current_Err Me.Parent![tblPgto Subformulrio].Requery End If

Form_Current_Exit: Exit Sub

Form_Current_Err: MsgBox Error$ Resume Form_Current_Exit

EndSub

PrivateSub GerarParcelas__Click() Dim rs Dim blnAtual Dim resposta As ADODB.Recordset As Boolean

blnAtual = Not (Me.GerarParcelas_.Value) If blnAtual = True Then resposta = MsgBox("Voc remover as parcelas " _ _ & vbCr & vbCr & "Se voc clicar 'sim', TODOS os registros das parcelas " _ & "sero removidos incluindo informaes de pagamentos j " _ & "efetuados!", vbQuestion + vbYesNo) If resposta = vbYes Then Call removerParcelas(Me.IDCurso) Exit Sub Else: Me.GerarParcelas_.Value = True Exit Sub End If End If If Me.NomeDoCurso = 0 Or IsNull(Me.DataInicio) _ Or IsNull(Me.DataTrmino) Or IsNull(Me.Custo) _ Or IsNull(Me.NmPgtos) Or (Me.FormaPgto 0) Then MsgBox "Voc precisa preencher todos os campos antes de clicar nesta " _ & "opo.", vbCritical Me.GerarParcelas_.Value = False Exit Sub = realmente deseja

& "dos pagamentos gerados para este curso?"

End If Call adicionarParcelas(Me.IDCurso, Me.NmPgtos, _ Me.JurosMensais, Me.Custo, Me.DataInicio) EndSub PrivateSub adicionarParcelas(ByVal IDCurso As Long, _ ByVal Parcelas As Integer, ByVal juros As Double, _ ByVal valorCurso As Currency, ByVal dataInicial As Date) Dim db Dim rs As DAO.Database As DAO.Recordset

OnError GoTo Err_Handler Me.Requery Set db = CurrentDb Set rs = db.OpenRecordset("tblPgto", dbOpenTable) For i = 1 To Parcelas With rs .AddNew .Fields("IDCurso") = IDCurso .Fields("Parcela") Parcelas) .Fields("ValorParcela") Round(Abs(Pmt(juros, Parcelas, valorCurso)), 2) .Fields("Vencimento") DateSerial(Year(dataInicial), Month(dataInicial) Day(dataInicial)) .Update End With + = = i, = CStr(i & "/" &

Next i Sair: Set db = Nothing Set rs = Nothing Me.Requery Exit Sub

Err_Handler: MsgBox Err.Description, vbCritical, Err.Number Resume Sair EndSub PrivateSub removerParcelas(ByVal IDCurso As Long) Dim db Dim qryDef As DAO.Database As DAO.QueryDef

On Error GoTo Err_Handler Set db = CurrentDb Set qryDef = db.CreateQueryDef("qryRemover", _ "Delete tblPgto.IDCurso tblPgto.IDCurso=" & IDCurso) qryDef.Execute db.QueryDefs.Delete "qryRemover" Sair: Set db = Nothing Set qryDef = Nothing Me.Requery FROM tblPgto WHERE

Exit Sub

Err_Handler: MsgBox Err.Description, vbCritical, Err.Number Resume Sair EndSub Basta agora clicar no boto de insero das prestaes que o clculo ser feito diretamente e inserido na tabela de controle de pagamentos. Caso os dados j tenham sido calculados e o campo j esteja marcado, mas o usurio clique por engano sobre o boto uma mensagem de aviso mostrada:

Figura 6-14 Aviso de remoo Caso o usurio confirme a excluso todas as informaes de pagamento sero removidas. Modelando dados para pesquisas de opinio O objetivo deste tpico criar uma pesquisa para resposta diretamente no Access. Tal pesquisa foi criada em cima de um desafio do frum onde diversos participantes postaram solues diferentes para o mesmo problema. Aqui, apresento a minha resposta ao problema original a qual pode ser comparada com os exemplos do link. Acredito que a comparao seja importante, pois ela d ao leitor uma idia de como um mesmo problema pode ser resolvido de formas diferentes. Pesquisa interna: entrevistando e tabulando diretamente no Access Este exemplo de pesquisa interna pode ser utilizado em vrios

cenrios como pesquisas online utilizando ASP. O objetivo desta pesquisa delineado abaixo:

tblOpcoes Tabela utilizada para armazenar a opo de cada pergunta; tblPerguntas Tabela utilizada para armazenar cada pergunta da pesquisa; tblPesquisa Tabela para armazenar cada pesquisa; tblPesquisaRespondentes Tabela para armazenar o respondente e respectiva pesquisa da qual tenha participado; tblRespondentes Tabela para armazenar os detalhes dos respondentes; tblRespostas Tabulao das respostas s opes.

Para termos uma melhor noo de como os dados se relacionaro, vejamos o resultado do relacionamento entre tabelas:

Figura 6-15 Relacionamento entre as tabelas da pesquisa O leitor e capaz de identificar as relaes? Como estamos tratando de uma pesquisa, a tabela de pesquisa ser a mais importante neste exemplo. Note que ela se ramifica em duas direes. A primeira direo refere-se s perguntas e a segunda refere-se aos respondentes. O leitor deve notar tambm que a tabela tblPesquisaRespondentes possui um relacionamento muitospara-muitos (note o smbolo de infinito saindo em ambos os lados). Isso implica que ela pode conter vrias vezes a mesma pesquisa e vrias vezes o mesmo respondente.

Isso importante porque podemos ter vrias pesquisas, ao passo que um pesquisado pode participar de vrias pesquisas. Esta tabela a que reconciliar isso tudo. As outras tabelas possuem uma relao de um-para-muitos. Vejamos a estrutura de cada tabela iniciando pela tabela que armazena o nome da pesquisa seguida pelas tabelas que armazenam as questes da pesquisa, respectivas opes e armazenamento dos resultados:

tblPesquisa o IDPesquisa Refere-se ao nmero de identificao da pesquisa; o NomePesquisa Refere-se ao texto do nome da pesquisa que ser feita. tblPergunta o IDPergunta Refere-se ao nmero de identificao da pergunta; o IDPesquisa Refere-se ao nmero da pesquisa. Este campo utilizado para o relacionamento com a tabela tblPesquisa; o Pergunta Refere-se ao texto da pergunta. tblOpcoes o IDOpcao Refere-se ao nmero de identificao da opo da pergunta; o IDPergunta Refere-se ao nmero da pergunta. Este campo utilizado para o relacionamento com a tabela tblPergunta. o Opo Refere-se ao texto da opo da pergunta. tblPesquisaRespondente o ID Refere-se ao nmero serial de identificao dos registros. Este nmero no ser utilizado para nenhum controle a no ser o da prpria tabela; o IDPesquisa Nmero de identificao da pesquisa. Serve para controlar a pesquisa respondida casada com o respondente. Este campo relacionado ao campo IDPesquisa na tabela tblPesquisa; o IDRespondente Nmero de identificao do respondente. Serve para controlar o respondente casado com a pesquisa. Este campo relacionado ao campo IDRespondente na tabela tblRespondentes tblRespondentes o IDRespondente Refere-se ao nmero de identificao do respondente; o Nome Refere-se ao texto do nome do respondente; o Telefone Refere-se ao texto do telefone do

o o

respondente; Endereo Refere-se ao texto do endereo respondente; CEP Refere-se ao texto do CEP do respondente;

do

Agora que j possumos todas as tabelas e campos, o leitor pode efetuar o relacionamento entre os campos conforme figura j mostrada. Feito isso ns estamos prontos para entrar as informaes da pesquisa. O leitor deve estudar as imagens a seguir para compreender como as informaes fluem entre as tabelas relacionadas. Iniciaremos pela tabela principal (a tabela que armazena a pesquisa):

Figura 6-16 Pesquisa e respectivas perguntas Na figura acima, foram adicionadas duas pesquisas. A primeira pesquisa possui 10 questes ao passo que a segunda pesquisa possui apenas 1. Na linha onde aparece o (*) podemos digitar algo para adicionar mais uma pergunta. Neste exemplo, nos limitaremos a 10 perguntas (devido ao formato do formulrio). Podemos expandir uma pergunta para adicionar/editar/visualizar as opes de resposta para a pergunta:

Figura 6-17 Perguntas e respectivas opes de resposta Na figura acima, vemos as opes de resposta para determinada pergunta. Podemos editar, adicionar, remover, etc, opes de perguntas nesta janela. Finalmente, ns temos as respostas:

Figura 6-18 Opes de respostas e respectivas respostas No caso da tabela de respostas, temos dois cenrios:

Contagem individual; Contagem cumulativa.

O primeiro tipo de contagem a que ocorre no exemplo desenvolvido, isto para IDOpcao (valor indexado e nico) existir um nmero infinito de respostas. No exemplo acima, temos que a opo Em uso foi respondida trs vezes. A tabulao e contagem dos dados ocorre em uma consulta ao invs de diretamente na tabela. J a contagem cumulativa mostraria o resultado diretamente na tabela, evitando a adio de registros de resposta. Deste modo, ao invs de termo n-registros (onde n um nmero qualquer e no exemplo acima ele igual a 3 trs respostas) teramos uma acumulao em um registro nico representado pelo IDResposta o qual casado com o IDOpcao. Este tipo de contagem requer uma instruo SQL de atualizao, pois no h adio de registros novos. Neste exemplo, optei por utilizar uma contagem individual para facilitar a soluo. Com isso terminamos o ndulo iniciado na tabela de pesquisa. Podemos agora abrir a tabela de respondentes para verificar em quais pesquisas os respondentes registrados no banco de dados participaram:

Figura 6-19 Respondentes e respectivas pesquisas Finalmente, precisamos construir o formulrio onde a pesquisa deve ser respondida:

Figura 6-20 Formulrio representando o questionrio Aqui, ns teremos um mximo de 10 perguntas e respostas sendo as cinco primeiras de resposta nica ao passo que as cinco ltimas o respondente pode selecionar mais de uma opo conforme mostra a figura anterior. Para criar o formulrio, siga as instrues abaixo:

Adicione um novo formulrio; Ao formulrio adicione um controle multi guia (MultiPage) com trs guias (tabulaes). Nomeei as tabulaes como segue: o Seus dados Para esta guia (tabulao) adicione os seguintes controles: 5 caixas de texto; 6 rtulos; 2 botes.

Figura 6-21 Disposio de controles para a primeira guia (tabulao)


o

Escolha pesquisa Para esta guia (tabulao) adicione os seguintes controles: 2 rtulos; 1 caixa de combinao.

Figura 6-22 (tabulao)


o

Disposio

de

controles

para

segunda

guia

Responda a pesquisa Para esta guia (tabulao) adicione os seguintes controles: 12 rtulos; 1 boto; 10 caixas de listagem

Figura 6-23 Disposio de controles para a terceira guia (tabulao) O leitor deve notar que os controles que recebero dados no esto acoplados. Para as caixas de combinao na terceira guia (Responda a Pesquisa), o leitor deve modificar as seguintes propriedades:

Para as cinco primeiras caixas de listagem determinar: o nmero de coluna igual a 2; o largura da coluna iguais a 0cm e 5cm; o acoplamento na coluna 1 o nomes como sendo de lstP1 a lstP5 (o mesmo vale para os rtulos que acompanham cada caixa de listagem) Para as cinco ltimas caixas de listagem determinar: o nmero de coluna igual a 2; o largura da coluna iguais a 0cm e 5cm; o acoplamento na coluna 1 o seleo mltipla como simples; o nomes como sendo de lstP6 a lstP10 (o mesmo vale para os rtulos que acompanham cada caixa de listagem)

Finalmente, ns devemos adicionar o cdigo a seguir para cada um dos objetos determinados (todo o cdigo ir dentro do formulrio que criamos): OptionCompare Database

OptionExplicit

Dim rs Dim db Dim strSQL

As DAO.Recordset As DAO.Database As String

PrivateSub cboPesquisa_Change() On Error GoTo Err_Handler Dim rsPerguntas Dim rsOpcoes Dim ctrl Dim ctrlPergunta Dim ctrlOpcoes Dim i Call limparControles Set db = CurrentDb() strSQL = "SELECT * FROM tblPerguntas IDPesquisa=" & CLng(Me.cboPesquisa.Value) WHERE As DAO.Recordset As DAO.Recordset As Control As Control As Control As Integer

Set rsPerguntas dbOpenSnapshot)

db.OpenRecordset(strSQL,

Me.lblUmaOpcao.Visible = True For i = 1 To 10 If rsPerguntas.EOF Then Exit For If i > 5 Then Me.lblMaisOpcoes.Visible = True

Set ctrlPergunta = Me.Controls("lblP" & i)

Set ctrlOpcoes = Me.Controls("lstP" & i)

With ctrlPergunta .Caption = "P" & i rsPerguntas.Fields("Pergunta").Value .Visible = True End With & ": " &

strSQL = "SELECT IDOpcao, Opcao, IDPergunta,* FROM tblOpcoes " strSQL = strSQL & "WHERE IDPergunta= & CLng(rsPerguntas.Fields("IDPergunta").Value) "

With ctrlOpcoes .RowSource = strSQL .Visible = True End With Me.cmdVotar.Visible = True rsPerguntas.MoveNext

Next i

sair: ' limparControles On Error Resume Next Set rsPerguntas = Nothing

Set rsOpcoes = Nothing Set ctrl = Nothing Set ctrlPergunta = Nothing Set ctrlOpcoes = Nothing

ExitSub

Err_Handler: MsgBox "Um erro administrador " _ inesperado ocorreu. Reportar ao

& "a seguinte informacao:" & vbCr _ & "Erro nmero: " & Err.Number & vbCr _ & "Descricao do erro: " & Err.Description, _ vbCritical, "Erro nmero: " & Err.Number

Err.Clear GoTo sair EndSub PrivateSub cmdCadastrar_Click() Dim resposta On Error GoTo Err_Handler resposta = MsgBox("Voce est prestes a cadastrar tal informacao. " _ & "Voce deseja vbQuestion + vbYesNo) realmente continuar?",

If Not resposta = vbYes Then MsgBox "Operao cancelada.", vbInformation Exit Sub End If If IsNull(Me.Nome) Then MsgBox "Voce precisa digitar o seu nome antes de continuar!", vbCritical Me.Nome.SetFocus Exit Sub End If Set db = CurrentDb Set rs dbOpenTable) With rs .AddNew .Fields("Nome") = CStr(Me.Nome) .Fields("Telefone") = CStr(Me.Telefone) .Fields("Endereco") = CStr(Me.Endereco) .Fields("CEP") = CStr(Me.CEP) .Update End With = db.OpenRecordset("tblRespondentes",

rs.MoveLast Me.IDRespondente = rs.Fields("IDRespondente")

sair: OnError Resume Next IfNot rs Is Nothing Then rs.Close db.Close Set rs = Nothing Set db = Nothing EndIf

ExitSub

Err_Handler: MsgBox "Um erro administrador " _ inesperado ocorreu. Reportar ao

& "a seguinte informacao:" & vbCr _ & "Erro nmero: " & Err.Number & vbCr _ & "Descricao do erro: " & Err.Description, _ vbCritical, "Erro nmero: " & Err.Number Err.Clear GoTo sair

EndSub PrivateSub cmdProcurarNome_Click() On Error GoTo Err_Handler

Set db = CurrentDb strSQL = "SELECT * FROM tblRespondentes IDRespondente = " & CLng(Me.IDRespondente) WHERE

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot) With rs Me.Nome = .Fields("Nome") Me.Telefone = .Fields("Telefone") Me.Endereco = .Fields("Endereco") Me.CEP = .Fields("CEP") End With sair: OnError Resume Next IfNot rs Is Nothing Then rs.Close db.Close strSQL = "" Set rs = Nothing Set db = Nothing EndIf

ExitSub

Err_Handler: MsgBox "Um erro administrador " _ inesperado ocorreu. Reportar ao

& "a seguinte informacao:" & vbCr _ & "Erro nmero: " & Err.Number & vbCr _ & "Descricao do erro: " & Err.Description, _ vbCritical, "Erro nmero: " & Err.Number Err.Clear GoTo sair EndSub PrivateSub cmdVotar_Click() Dim ctrl Dim P Dim rsPesqResp Dim rsRespostas Dim item OnError GoTo Err_Handler If IsNull(Me.IDRespondente) Then MsgBox "Voce identificacao " _ precisa entrar seu nmero de As Control As String As DAO.Recordset As DAO.Recordset As Variant

& "antes de continuar.", vbInformation Me.multiPage.Pages(0).SetFocus Me.IDRespondente.SetFocus Exit Sub End If

For Each ctrl In Me.multiPage.Pages(2).Controls If TypeName(ctrl) = "Listbox" Then

If ctrl.Visible = True Then If ctrl.ItemsSelected.Count < 1 Then P = Right(ctrl.Name, Len(ctrl.Name) - 3) MsgBox pergunta nmero " & P _ & pergunta antes de " _ & "continuar.", vbInformation Exit Sub End If End If End If Next ". "Voce Por nao favor, respondeu responda a a

strSQL = "SELECT * FROM tblPesquisaRespondente WHERE IDPesquisa = " &CLng(Me.cboPesquisa.Value) strSQL = strSQL & CLng(Me.IDRespondente) On Error Resume Next Set db = CurrentDb() Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot) & " AND IDRespondente="

If rs.RecordCount = 1 Then MsgBox "Voce j votou neste pesquisa. Somente possvel " _ & "votar uma vez", _ vbInformation

limparControles GoTo sair End If

Set rsPesqResp = db.OpenRecordset("tblPesquisaRespondente", dbOpenTable) With rsPesqResp .AddNew .Fields("IDPesquisa") = CLng(Me.cboPesquisa.Value) .Fields("IDRespondente") = CLng(Me.IDRespondente.Value) .Update End With Set rsRespostas dbOpenTable) = db.OpenRecordset("tblRespostas",

For Each ctrl In Me.multiPage.Pages(2).Controls If TypeName(ctrl) = "Listbox" Then For Each item In ctrl.ItemsSelected With rsRespostas .AddNew .Fields("IDOpcao").Value = CLng(ctrl.ItemData(item)) .Fields("Resposta").Value = 1 .Update End With Next

End If Next

sair: On Error Resume Next rs.Close rsPesqResp.Close rsRespostas.Close db.Close Set rs = Nothing Set rsRespostas = Nothing Set rsPesqResp = Nothing Set db = Nothing Exit Sub Err_Handler: MsgBox "Um erro administrador " _ inesperado ocorreu. Reportar ao

& "a seguinte informacao:" & vbCr _ & "Erro nmero: " & Err.Number & vbCr _ & "Descricao do erro: " & Err.Description, _ vbCritical, "Erro nmero: " & Err.Number Err.Clear GoTo sair EndSub

PrivateSub limparControles() Dim ctrl As Control

For Each ctrl In Me.multiPage.Pages(2).Controls ctrl.Visible = False Next

EndSub PrivateSub Form_Load() limparControles EndSub

Lio 009 - Sobre o autor FORMAO ACADMICA:


Formado e Ps-Graduado em Finanas pela Universidade de Londres, Reino Unido Membro da Sociedade Brasileira de Econometria Microsoft Office Specialist Expert, Microsoft Certified Professional

LINGUAGENS DE PROGRAMAO E PLATAFORMAS:


Visual Basic, Calculadores Programveis Casio e Sharp BDs: MS Access and Lotus Approach Plataformas: Windows NT, 2000, XP, Linux Red Hat

EXPERINCIA PROFISSIONAL abril 04 - Consultor de TI Independente outubro 02 - abril 04: FairCourt Capital Limited (Reino Unido)

Diretor TI

fev96-maio02: Melvale Group (Reino Unido)

Gerente de Exportao para a frica Ocidental

Gerente de TI

OUTRAS ESPECIALIZAES

Inspeo e regulamentaes Nigerianas para importao e exportao (Nigerian-British Chamber of Commerce & Cotecna International) Procedimentos de exportao no Reino Unido (The Institute of Export, Reino Unido) ICC 500 e Incoterms (The Institute of Export, Reino Unido)

OUTRAS ATIVIDADES Votado Microsoft Most Valuable Professional (MVP) Excel 2006-11. Fornece suporte pro bono em TI entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora Organisation Europe) desde 2001. Participou ativamente na organizao da conferncia sobre Boa Governana e Responsabilidade Fiscal promovida pelo ONG em Abuja, Nigria, em Novembro 2003. Foi um dos principais colaboradores na elaborao do relatrio final sobre a conferncia entregue a presidncia da Repblica Nigeriana em maio de 2004. Autor do livro Excel e VBA na Modelagem Financeira: abordagem prtica. Editora Axcel Books, 2005. Colaborador ativo do frum Excel site www.juliobattisti.com.br, onde divide seu experincia com outros membros do espao. Uma

Avanado do conhecimento e

Colunista dos sites www.linhadecodigo.com.br e www.ativoaccess.com.br e do Microsoft Community Experts http://www.microsoft.com/brasil/2007office/artigos/default. mspx