Você está na página 1de 68

NDICE

Metodologias

Usando Automao em Access 2003, para

Conhea Extreme Programming (XP)

trabalhar com o Outlook 2003

Este artigo apresenta a metodologia de trabalho Extreme

Este artigo apresenta diferentes tcnicas para usar

Programming, popularmente conhecida como XP. P. 04

automao trabalhando com o Outlook a partir do


Access. P. 37

ITIL: Melhores prticas no gerenciamento


de servios de TI

.NET

Este artigo apresenta o ITIL - Information Tecnology

Criando um Custom Control para Windows

Infrastructure Library - metodologia ainda no to

Forms

conhecida, mas j muito admirada pelos resultados que

O artigo abordar a construo de um Custom Control

pode trazer com sua adoo. P. 10

para agilizar e padronizar o processo de validaes de


entrada de dados em Windows Forms, utilizando o

Access Bsico

Framework 2.0 e o Visual Studio 2005. P. 41

Aprenda com as melhores dicas de Access

Capa
Conhea o novo (mesmo) Excel
Conhea as principais novidades na estrutura e na
interface do Excel 2007. P. 28

NESTA EDIO
04 Metodologias
14 Access Bsico

Utilize VBA para importar especificaes de txt, centralizar

Verses do Visual Studio 2005

23 Access Avanado

na tela um formulrio j aberto, impedir que um formulrio

A matria aborda as principais aplicaes de cada uma

28 Office Bsico

seja movido pelo usurio e muito mais. P. 14

das edies do Visual Studio 2005. P. 48

Novas Caractersticas de XML no Access 2003

SQL Server

51 SQL Server

Saiba o que destaque no Microsoft Access 2003 em

Investigao avanada de problemas de

59 Frutos do Suporte

relao caractersticas relacionadas ao padro XML. P. 19

locking
Nesta matria so discutidos os principais problemas

Access Avanado

de locks que acontecem em servidores de produo e

Access ListBar

como combat-los de forma eficiente. P. 51

A ListBar (ou Menu Vertical) um tipo de interface muito


til e verstil para sistemas que administram muitos

Monitorando aplicaes com o System

tipos de dados, fornecendo um ambiente nico para

Monitor

administr-los. Infelizmente, o Access no possui esse

Veja como monitorar a sua aplicao de banco de

recurso nativamente e, por isso, h alguns componentes

dados utilizando contadores customizados no SQL

(pagos) no mercado para os desenvolvedores, mas

Server. P. 55

nesta matria mostrarei como construir essa


funcionalidade usando apenas objetos do Access. P. 23

Frutos do Suporte
Aprenda mais com as dvidas selecionadas pelo nosso

Office Bsico
Quer ajudar o meio ambiente? Use sua
impressora virtual!
Impressora virtual: uma simples atitude, uma grande
diferena. P. 35

suporte tcnico. P. 59

41 .NET

Upgrade de verdade
Internet, .NET, Visual Basic, SQL Server, Access e Office.

Qual a melhor verso do Office? Esta pergunta tem enorme potencial para gerar discusses
apaixonadas, capazes de competir com futebol e outros temas polmicos. As verses 2000 e 2003
so as mais utilizadas hoje, mas ainda h quem utilize o Office 97. Se transportarmos a pergunta para
cada aplicativo do pacote isoladamente, a divergncia de opinies tende a aumentar. Para dar um
exemplo, h quem defenda com bons argumentos que o Access 2 foi at hoje o melhor.

Ano XIV - Nmero 74 - Setembro/Outubro 2006


Diretor Geral
Daniel Burd
Diretor de Marketing
Oscar Burd

No toa que a prpria Microsoft reconhea na verso anterior de cada Office seu maior
concorrente.
2007 est chegando e com ele a nova verso do Microsoft Office. Como aconteceu em lanamentos
anteriores, deve levar um bom tempo para a grande maioria dos usurios migrarem. Desenvolvedores
e analistas de suporte, acompanhados por entusiastas e apaixonados por Tecnologia, certamente
sero os primeiros.
Tenho um sentimento de que, ao contrrio de outras vezes, esta verso ser percebida como um
upgrade de verdade, com mudanas significativas, a comear pelo visual de sua nova interface grfica.
H quem diga que tantas mudanas podem atrapalhar. Talvez. Mas uma coisa certa: cedo ou tarde o
Mercado vai adotar o novo Office. Se voc ainda no comeou a avali-lo, este pode ser um timo
momento. Convido voc para a leitura da matria de capa sobre o novo Excel 2007.
Nesta edio
Alm das dicas escritas por Luiz Cludio C.V da Rocha, a sesso Access traz mais trs matrias
abordando a integrao com o Outlook, Recursos XML e ListBar. Nesta ltima, Paulo Sarraino mostra
como desenvolver passo a passo uma interface bem interessante para navegao s com recursos do
prprio Access. Mais sobre Access pode ser encontrado em Frutos do Suporte, com perguntas

Editor
Jacques Zetune
Coordenao e reviso geral
Julie Annie Dantas
Reviso tcnica
Fernando Pessoa e Ricardo Pessoa
Reviso Gramatical
Tatiana Meneses
Colaboraram nesta edio
Adriano Marques Pereira Brazo, Alex Prado de Carvalho,
Fernando Pessoa, Frank Rice, Gabriel Pitgoras Silva e Brenner,
Joo Talles Dantas Batista, Keidy Marcelo Sakamoto,
Luiz Cludio C. V. da Rocha, Maurcio Martins e
Paulo Sergio Sarraino.
Administrativo Financeiro
Carlos Burd
Jornalista Responsvel
Renato Vaisbih - MTB 23605
Diagramao
Carlos Relva
Capa
Patricia Candido

selecionadas respondidas pelo nosso suporte tcnico.

Alterao de dados
Fone: (11) 2168.0688
ou e-mail para:
info@forumaccess.com.br

A sesso SQL Server mostra como resolver problemas de Locking e como criar um Custom Monitor
em duas matrias assinadas por Adriano Brazo. Gabriel Brenner mostra passo a passo como

Anncios
Fone: (11) 2168.0688
ou e-mail para: info@forumaccess.com.br

desenvolver um controle para validao de dados em aplicativos Windows Forms no .NET.


Estou ao seu dispor para ouvir seus comentrios e sugestes!
Boa leitura e um grande abrao a todos!

Jacques Zetune
editor@forumaccess.com.br

Opinies
Fax: (11) 2168.0688. a/c:Opinio
ou e-mail para: info@forumaccess.com.br
Fale com o editor
Fone/fax: (11) 2168.0688. a/c:Editor
ou e-mail para: editor@forumaccess.com.br
Inscrio em eventos
Site: www.forumaccess.com.br ou envie e-mail para:
eventos@forumaccess.com.br
Exemplares avulsos e produtos FrumAccess
Fone: (11) 2168.0688
ou envie e-mail para: vendas@forumaccess.com.br
Suporte Tcnico para
Site: www.forumaccess.com.br/suporte
Grupos de Discusso
Acesse www.forumaccess.com.br
Impresso e Fotolito
Multiformas
Fone (11) 2188 1111
FrumAccess uma publicao bimestral da DJB
Informtica, Publicao e Comrcio Ltda. info@forumacess.
com.br, Caixa Postal 26.001 CEP 05599-970 - So Paulo - SP.

Metodologias

Conhea Extreme Programming (XP)


Keidy Marcelo Sakamoto *

DESCOBRIR O QUE UM CLIENTE DESEJA, MONTAR UMA


ESTRUTURA PARA O DESENVOLVIMENTO E IMPLEMENTAR
UM SOFTWARE NUNCA FORAM TAREFAS FCEIS. E
COMO SE ISSO NO BASTASSE, H CLIENTES QUE
INSISTEM EM MUDAR ALGUNS REQUISITOS DO
SISTEMA BEM NO MEIO DO CRONOGRAMA.
PRAZOS? ESTES NUNCA PODEM MUDAR, SO SAGRADOS. CONVENCER UM CLIENTE DE QUE O
CRONOGRAMA PRECISA SER ALTERADO DE FORMA
A ALONGAR O TEMPO DE DESENVOLVIMENTO DO
PROJETO UMA TAREFA QUASE IMPOSSVEL DE SER
REALIZADA, E NO FIM AINDA CORRE-SE O RISCO DE
DEIXAR AQUELA IMPRESSO DE QUE O PROGRAMADOR NO TEVE COMPETNCIA PARA CUMPRIR SEUS
PRAZOS.
A EXTREME PROGRAMMING FOI CRIADA PARA MELHORAR
A VIDA DE EQUIPES QUE TRABALHAM COM ESSE PERFIL DE
CLIENTE, SUGERINDO TCNICAS QUE PROMETEM ELEVAR
AO MXIMO A QUALIDADE DO SEU SOFTWARE E AINDA
REDUZIR SEU TEMPO DE DESENVOLVIMENTO EM AT 40%.

vida em meados de 1996 por Kent Beck e tem sido utilizada com
sucesso em equipes de desenvolvimento de software at hoje.
Essa metodologia foi criada pensando nos problemas que muitas equipes de desenvolvimento encontram ao lidar com clientes que no tm certeza do que esperam do seu produto. A XP
permite que a especificao dos requisitos do software seja alterada freqentemente, de forma a no prejudicar o rendimento
da equipe. Isso se d por meio da participao do cliente no
processo de desenvolvimento.

Para tanto, a equipe precisa passar por uma mudana de cultura. Todos, desde o programador at o cliente, precisam entender que a forma de trabalho ser baseada em quatro princpios
bsicos, sendo eles:

INTRODUO
Neste artigo apresentaremos uma metodologia de trabalho denominada Extreme Programming ou simplesmente XP, que tem como
objetivo auxiliar pequenas e mdias equipes de desenvolvimento
de software em projetos onde os requisitos encontram-se pouco
definidos ou necessitando de constantes alteraes.

O QUE XP?
A Extreme Programming uma metodologia gil para desenvolvimento de software em equipes pequenas e mdias, que visa
tornar a programao mais simples e eficiente. Ela foi desenvol-

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Metodologias
Metodologias
Comunicao
Deve existir a toda hora. A burocracia para comunicao na equipe deve ser a mnima possvel. O cliente no participa com a
equipe, ele participa na equipe.
Simplicidade
Apenas o necessrio deve ser feito, sempre com um cdigo limpo, da forma mais simples possvel e gerando o mnimo de documentao.
Coragem
Todo problema encontrado deve ser reportado de imediato. Se
houver necessidade de refazer um cdigo, ele deve ser feito o
quanto antes. A coragem necessria em diversas situaes,
desde uma conversa desagradvel para o cliente at uma pausa
para descanso durante a programao. Fazer sempre a coisa
certa, mesmo que isso cause um desgaste momentneo.
FeedBack
Ocorre no momento em que o cliente comea a receber pequenos pacotes do software contendo determinadas funcionalidades. Com isso possvel determinar se os requisitos esto seguindo um caminho correto ou precisam de atualizaes.
Todo software pode ter seus requisitos alterados ao longo do
tempo e a equipe deve estar preparada para isso. Se uma atualizao nos requisitos tornar o prazo de concluso do projeto
impossvel de ser atendido, o cliente saber de imediato, porque agora ele estar envolvido diretamente com as atividades
previstas no cronograma. Com isso, os prazos podem aumentar, porm a qualidade nunca sair prejudicada.

AS TCNICAS DA XP
Kent Beck sugeriu que uma srie de tcnicas fossem adotadas
pelas equipes de desenvolvimento de forma a disciplin-las a
tornarem-se menos dispersivas e mais produtivas. A seguir encontra-se um breve resumo sobre algumas dessas tcnicas.
Programao em pares
Provavelmente essa a
tcnica mais polmica da
XP, trata-se de colocar dois
programadores em um s
computador. Isso nos remete quelas escolas de
informtica, que, visando
entupir as classes com alunos, colocam duas pessoas estudando em cada computador, mas essa uma experincia bem diferente.
A programao em pares funciona da seguinte forma: dois programadores sentam-se frente de um micro, um deles ser o
condutor e o outro ser o observador. O condutor aquele
que far a codificao, ele dominar o teclado e o mouse por

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

um tempo pr-determinado (duas horas o ideal), enquanto


isso o observador analisa o que est sendo feito sob uma tica externa, o objetivo do observador entender o que est
sendo feito e verificar se essa realmente a melhor forma de
faz-lo. Encontradas divergncias, a programao pra at que
os dois entrem em comum acordo ou que um gerente resolva
o impasse.
Implementar essa tcnica complicado, pois exige uma mudana na cultura da equipe. preciso mostrar como a programao em pares pode agregar qualidade ao cdigo e ainda assim aumentar a velocidade na programao. Alguns pontos so
particularmente mais difceis, como, por exemplo, convencer
um condutor de que ele deve trocar de posio com o observador, mesmo que ele esteja empolgado em meio a uma rotina
especfica.
As vantagens da programao em pares so muitas, dentre as
quais podemos citar: maior qualidade por constante
brainstorming da dupla, maior velocidade, pois ningum pode
parar para bater papo no msn ou escrever emails pessoais e
tambm um significativo nivelamento no conhecimento da equipe sobre o software desenvolvido, visto que, com trocas semanais das duplas, cada programador tem contato com variados
processos do sistema.
No Overtime
Horas extras so proibidas. Cada programador deve trabalhar
40 horas por semana. Se houver problemas com o cronograma,
deve-se realizar uma reunio visando alterar o ritmo da equipe
ou o escopo do projeto. Novos membros na equipe, quando o
projeto j est atrasado, no ajudam como deveriam, geram mais
atraso, pois os novatos precisam se adaptar ao que j foi feito.
Lembre-se: Na XP mais importante atender um escopo reduzido com alta qualidade do que atender um escopo maior com
qualidade medocre.
Refactoring
Consiste em refazer um cdigo j funcional quando este for
passvel de ser implementado de forma mais simples. Aqui entra a coragem, que foi listada, como sendo um dos valores da
XP. O cdigo deve ser refabricado sempre que possvel.
Padronizao de cdigo
No novidade para ningum que um cdigo padronizado
muito mais fcil de ser lido. Usando ou no usando XP, todo
programador deve manter o mesmo padro na escrita do seu
cdigo. Isso se aplica a nomes de objetos, identao, layout de
tela e tudo o mais que puder ser implementado de forma diferente por um membro da equipe.
Simplicidade
Mantenha o cdigo o mais simples possvel. Um software simples sempre leva menos tempo para ser implementado do que
um software complexo, por isso, atenha-se ao que o cliente so-

WWW.FORUMACCESS.COM.BR

Metodologias
licitou como requisito do produto. Funcionalidades extras para
impressionar o cliente devem ficar para o fim do projeto.
Metfora do sistema
Deve-se criar uma metfora para lidar com o sistema. O seu
software pode ser como uma linha de produo, onde a cada
tela uma informao acrescida de outras informaes. Pode
ser como um correio, onde a informao precisa passar por diversos setores at chegar ao destinatrio. A metfora do sistema pode ser definida pela prpria equipe, seu objetivo dar
nomes mais comuns aos objetos que manipulamos na programao e com isso facilitar o seu entendimento.
Em uma metfora de correio, por exemplo, ao invs de termos
os objetos setor1, arquivo_resumo e setor2, podemos ter: remetente, mensagem e destinatrio. No incio pode parecer algo
banal, mas muito mais simples lidar com o sistema desta forma, pois mesmo uma pessoa leiga no assunto pode intuir as
funcionalidades de cada pedao do software, facilitando a comunicao entre os membros da equipe.
Cliente est sempre disponvel
De acordo com Kent Beck, XP uma disciplina para desenvolvimento de software com a mnima documentao e a mxima
comunicao. Por isso o cliente no participa do projeto somente como um auxiliar. O cliente deve ser parte da equipe, se
possvel at participando das reunies pessoalmente.
obvia a dificuldade em convencer um cliente a participar fulltime do projeto de seu software, mas existe uma srie de adaptaes que podem ser feitas visando possibilitar a comunicao necessria equipe. Isso pode ser feito por meio da nomeao de um representante do cliente. Esse representante deve
ser uma pessoa que sabe exatamente do que o cliente precisa
ou ento que tem disponibilidade total para comunicar-se com
o cliente a fim de tirar alguma dvida.

Cada membro da equipe pode exercer um ou mais papis.


importante ressaltar que, como essa metodologia exige uma
mudana radical na cultura da equipe, difcil implant-la de
uma s vez. O ideal que as tcnicas propostas pela XP sejam utilizadas gradualmente, fazendo a equipe se acostumar
com mais facilidade aos novos conceitos de trabalho. Antes
de iniciar um projeto 100% XP, importante realizar vrios
ensaios com a metodologia. Um comeo interessante colocar alguns membros da equipe para programar em pares em
alguns dias da semana. Isso j deve gerar uma srie de discusses e novas propostas para a adaptao da equipe at
que se possa iniciar um projeto que utilize XP desde o 1 dia.
Paralelamente, outras tcnicas menos polmicas podem ser
implantadas, como a padronizao do cdigo, a simplicidade e a abolio de horas extras.

CONCLUSO
A XP uma metodologia que trouxe poucas inovaes. Na
verdade, a principal inovao que ela trs a de unir diversas metodologias de programao gil pr-existentes com o
objetivo de agregar qualidade e produtividade a uma equipe
de desenvolvimento. Outra concluso importante a respeito
da XP que ela pode ser utilizada em vrios tipos de projeto
e no s nos que dizem respeito a desenvolvimento de
software.

Para se aprofundar

IMPLEMENTANDO XP NA SUA EQUIPE


Para comear a utilizar XP na sua equipe, alguns papis precisam ser definidos dentro dela:
Papel

Descrio

GoldOwner

a pessoa que est comprando o software.

GoalDonor

quem especifica os requisitos do produto, geralmente

www.xispe.com.br

um futuro usurio do sistema.

www.extremeprogramming.org

Manager

Responsvel por lidar com problemas externos equipe.

www.pairprogramming.com

Acceptance Tester

Define critrios de aceitao junto ao cliente e apresenta

Beck, Kent. Extreme Programming Explained

resultados pelo menos uma vez por dia.


Programmer

Responsvel pela implementao do cdigo fonte.

Tracker

Responsvel pela mtrica do projeto, ele quem

* Keidy Marcelo Sakamoto (keidysakamoto@gmail.com) MCP em Windows

informa a equipe sobre o rendimento e os resultados

Application com C# e graduado em Tecnologia em Informtica pela UNICAMP.

obtidos.

Atua na HST Sistemas e Tecnologia desenvolvendo aplicaes .NET para

o motivador da equipe, sempre levando todos a

automao bancria.

Coach

trabalhar com as tcnicas da XP.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Metodologias

ITIL: Melhores prticas no


gerenciamento de servios de TI
Alex Prado de Carvalho *

COM O AUMENTO DO NVEL DE QUALIDADE DOS SERVIOS DE TI DAS EMPRESAS E DA COMPLEXIDADE DAS
TAREFAS, TORNA-SE CADA VEZ MAIS COMPLEXA A GESTO E RASTREABILIDADE DESSES SERVIOS E TAMBM
SUA MANUTENO. A ADOO DE METODOLOGIAS QUE
VISAM APOIAR ESSA GESTO TEM SIDO UMA SADA
MUITO PROCURADA, MAS AINDA NO SUFICIENTEMENTE MADURA NO MERCADO BRASILEIRO. SEGUNDO ESTATSTICAS RECENTES, APENAS GRANDES EMPRESAS
INVESTEM REALMENTE VALORES SIGNIFICATIVOS EM
P&D E EM ESFOROS PARA A UTILIZAO DESSAS METODOLOGIAS. PORM,
O SUCESSO ALCANADO POR ESSAS
METODOLOGIAS ATRAI A ATENO DE
TODOS AO SEU REDOR DE COMO TIRAR
PROVEITO DENTRO DA REALIDADE DE
CADA UM. ESTE ARTIGO APRESENTA
UMA DESSAS METODOLOGIAS, O ITIL
INFORMATION TECNOLOGY INFRASTRUCTURE LIBRARY, AINDA NO TO
CONHECIDO, MAS J MUITO ADMIRADO
PELOS RESULTADOS QUE PODE TRAZER
COM SUA ADOO.

O QUE O ITIL
O ITIL, cuja sigla significa IT Information Infrastructure Library,
uma biblioteca criada pelo governo britnico nos anos 80 (atualmente sob custdia da OGC Office of Government Commerce)
e composta por um conjunto de recomendaes e melhores prticas para operaes e gerenciamento de servios de TI. Ele proporciona uma abordagem efetiva e eficiente no uso de sistemas
de informao, alm de fomentar o alinhamento estratgico com
os negcios.
O ITIL um framework aberto, ou seja, qualquer empresa
pode usar livremente a sua biblioteca (ou parte dela), o que
tem contribudo para o aumento exponencial da utilizao
de seus processos. O foco da metodologia mostrar o que
fazer e no como fazer, dando nfase aos objetivos, ativi-

10

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

dades, entradas e sadas de informaes, etc., fazendo com


que possa ser incorporada praticamente qualquer organizao.
O ITIL tem por objetivo dar suporte ao fornecimento de Servios de TI com os maiores ndices de qualidade possveis, dando uma ateno especial s atividades de relacionamento com
o cliente. Desta forma, o ITIL fortalece o relacionamento entre a
rea de TI e seus clientes atravs do cumprimento de metas previamente acordadas (SLAs Service Level Agreements) para a
prestao de Servios de TI.
Quanto biblioteca, hoje ela composta de vrios livros, constantemente sob avaliao e aperfeioamento:

Figura 1 - Coleo de livros do ITIL

Desses, os dois primeiros livros citados acima formam os pilares fundamentais da gesto de servios de TI, que so:
Service Support (o livro azul composto por cinco disciplinas
e uma funo).
Service Delivery (o livro vermelho com tambm cinco disciplinas).
Esses livros definem disciplinas fortemente relacionadas, que
por sua vez esto dividas em processos, conforme mostrado
no esquema a seguir:

WWW.FORUMACCESS.COM.BR

Metodologias
partes afetadas, buscando entender e controlar seus impactos para a intra-estrutura de TI e os negcios da organizao.
Permite tambm avaliar os prazos e riscos inerentes s mudanas propostas.
Release Management
Responsvel por planejar e gerenciar recursos e meios para testar, liberar, distribuir e implantar mudanas (ou atualizaes) em ambiente de operao/produo de forma sistmica e controlada.
Configuration Management
Assegura que apenas componentes
mapeados e autorizados (tambm chamados de Itens de Configurao - IC:
softwares, hardwares, documentos, processos, procedimentos, etc.) sejam usados no ambiente de TI, e que todas as
mudanas nestes componentes sejam
gravadas e rastreadas durante todo o seu
ciclo de vida. Estes dados ficam armazenados em uma estrutura chamada CMDB
(Configuration Management Data Base).

Figura 2 - Relacionamento das reas de concentrao do ITIL

Vejamos brevemente o objetivo de cada uma dessas reas.

DISCIPLINAS BASE DO ITIL

SERVICE DELIVERY

Service Support
Service Desk
Distingui-se como uma funo e no uma disciplina. Atua
como um ponto focal para o atendimento a usurios, clientes
e pessoal interno da organizao. Caminha pela estrutura
organizacional para prover um contato mais centralizado com
a rea de TI.

Service Level Management


Permite ao departamento de TI entregar exatamente o que foi
definido e acordado com o cliente, alm de gerenciar estes
acordos. Tambm se preocupa em garantir que os servios
sejam reconhecidos como benficos para a organizao.

Incident Management
Responsvel por restaurar e normalizar a operao de um servio ou produto com o menor tempo possvel, a fim de
minimizar os impactos sobre a operao dos negcios e conseguir os melhores nveis de qualidade e disponibilidade de
servio possvel.
Problem Management
Visa minimizar o impacto e reincidncia de problemas
gerenciais sobre os negcios de uma organizao atravs da
investigao, diagnstico e soluo de problemas. D-se atravs da preveno pr-ativa de incidentes e auto-aprendizado
(base de dados de erros conhecidos, solues, tempos de soluo, etc.).
Change Management
Garante o rastreamento de todas as mudanas e respectivas

Availability Management
Realiza o desenho, implementao, medio e gerenciamento
da disponibilidade da infra-estrutura de TI para garantir que
os requisitos de disponibilidade dos negcios sejam constantemente satisfeitos.
IT Service Continuity Management
Proporciona mecanismos pra garantir que qualquer servio
de TI seja capaz de sobreviver e continuar a prover valor para
seus clientes e usurios, mesmo em situaes com restrio
ou em que as solues de disponibilidade normais falhem.
Capacity Management
Planeja, justifica e gerencia nveis apropriados de recursos,
negcios e/ou servios necessrios para uma dada soluo
de TI, evitando e controlando baixas ou excessos.
Financial Management
Administrar de forma slida e concisa os recursos monetrios

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

11

Metodologias
Metodologias
da organizao (custos efetivos, contabilidade, alocao e retorno do investimento), fornecendo suporte no planejamento
financeiro e execuo dos objetivos de negcios.

INDO MAIS ADIANTE COM O ITIL


Neste ponto voc j est familiarizado com os conceitos relacionados ao ITIL, suas origens, objetivos, benefcios e sua composio fundamental. Como j utilizado em outras reas da TI,
faz-se importante a utilizao de mtricas para a valorizao deste
conhecimento e tambm de prticas para manuteno constante destas informaes. Veremos um pouco mais a seguir.

CERTIFICAO PROFISSIONAL EM ITIL


Cada vez mais, as grandes organizaes tm disponibilizado
certificaes para aferir o conhecimento dos profissionais em
suas ferramentas, tecnologias e metodologias.
O ITIL tambm possui seus programas de certificao, com
abrangncia internacional, que so orientados por nveis de especializao e no por produtos ou reas de conhecimento
(parmetros comumente utilizados por outras organizaes). O
conhecimento em cada nvel aferido de uma forma um pouco
diferente, complementar ao nvel anterior, o que credibilita muito a certificao.
Um profissional que obtm a certificao recebe o ttulo de
Certified IT Service Management Professional, com variaes
de acordo com o nvel da certificao.

NVEIS DE CERTIFICAO
Atualmente existem trs nveis de certificao para o ITIL:
Foundation Certificate in IT Service Management
Destinado s pessoas que atuam na rea de Gerenciamento
de Servios de TI, essa a primeira das certificaes do ITIL e
pr-requisito para as demais.
Practitioner's Certificate in IT Service Management
Para se certificar, o candidato deve se especializar em pelo
menos uma disciplina especfica (de Service Support ou
Service Delivery), com foco na sua experincia na rea escolhida.
Manager's Certificate in IT Service Management
Este o nvel mais avanado dos programas de certificao
em ITIL. Com essa qualificao, o profissional deve ser capaz
de analisar uma organizao existente e definir estratgias para
o gerenciamento da intra-estrutura de TI. Deve tambm conseguir avaliar os processos existentes e organiz-los de maneira sistemtica.

CERTIFICAO CORPORATIVA EM ITIL


Da mesma forma que um profissional pode obter um ttulo que
comprove seus conhecimentos e/ou prticas em determinado
assunto, existem certificaes destinadas s empresas que buscam expor ao mercado sua aderncia, prtica e expertise. Ainda

12

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

muito recente, mas muito procurada, a ISO 20.000 uma


certificao corporativa com reconhecimento internacional para
Gesto de Servios de Tecnologias de Informao. Foi publicada
para enderear o fornecimento destes servios e a sua contribuio para o sucesso do negcio da empresa, e substitui o
standard britnico reconhecido mundialmente, BS 15000.
Semelhante ao que acontecia com o BS 15000, esse padro
publicado em duas partes e permitir aos prestadores de servios compreender como podero alcanar a qualidade no servio prestado aos seus clientes internos e externos:
Parte 1: ISO/IEC 20000-1:2005
Gesto de Servios de TI - Especificaes para a Gesto de
Servio.
Fornece os requisitos da gesto de servios e relevante para
os responsveis pela preparao, implementao ou gesto continuada dos servios de TI na organizao. As organizaes
podero assegurar a certificao dos seus sistemas de gesto
de servios de TI de modo independente, em conformidade com
os requisitos da ISO/IEC 20000-1:2005.
Parte 2: ISO/IEC 20000-2:2005
Gesto de Servios de TI - Cdigo de Prtica para a Gesto de
Servio.
Fornece orientao para os auditores internos e assistncia aos
prestadores de servios que planejam melhorias no servio ou
que querem se preparar para auditorias em relao norma ISO/
IEC 20000-1:2005.
A ISO/IEC 20000:2005 "promove a adoo de um processo integrado para a prestao e gesto eficaz dos servios que respondem aos requisitos de negcio e dos clientes", atravs do
alinhamento entre as partes 1 e 2. o primeiro padro mundial
para a Gesto de Servios de TI. Suporta e totalmente compatvel com o modelo ITIL.

POR QUE UTILIZAR O ITIL


Um aspecto interessante na utilizao do ITIL a padronizao
de um vocabulrio comum na prestao de servios e comunicao entre TI, seus clientes e fornecedores. Atravs das recomendaes do ITIL, possvel que todo o relacionamento no
gerenciamento desta prestao de servios seja otimizado, o
que facilita seu controle e posterior avaliao de benefcios.
Alm disso, o ITIL prov alguns benefcios diretos relacionados
Gesto de Servios de TI:
Gesto mais eficiente da infra-estrutura e dos servios prestados de forma clara e sistemtica;
Diminuio gradativa da indisponibilidade dos recursos e sistemas de TI, causada por falhas no planejamento das mudanas e implantaes em TI.
Maior controle nos processos com menor incidncia dos riscos envolvidos.
Torna os processos de gerenciamento dos servios de TI
mensurveis.

WWW.FORUMACCESS.COM.BR

Metodologias
Atuao na causa raiz dos problemas, com foco no negcio.
Definio clara e transparente de funes e responsabilidades.
Eliminao de redundncia de tarefas e aes.
Maior qualidade nos servios prestados.
Elevao dos nveis de satisfao dos usurios internos e clientes com relao disponibilidade e qualidade dos servios
de TI.
Reduo de custos de TI e aumento do ROI (Return on Investment).
Flexibilidade e menores impactos na gesto de mudanas.
Processos mais geis e organizados graas organizao e
relacionamento entre eles.
Melhor relacionamento com os fornecedores e com os servios prestados.
As prticas do ITIL so extremamente bem estruturadas e implicam, na maioria dos casos, em uma criteriosa ao de mudana
cultural, o que provavelmente tenha impacto direto na razo do
ITIL ainda no ter uma aplicao to ampla no cenrio atual das
empresas que necessitam de um gerenciamento de seus servios de TI. Contudo, sua aplicabilidade e os benefcios que vem
comprovadamente trazendo esto fazendo com que seja cada
dia maior a procura por informaes e tentativas concretas de
adoes de suas melhores prticas.

implementao local seguiu o roteiro da matriz, comeando


com um conjunto de processos operacionais.2
Inmeras instituies de renome vm adotando o ITIL e alcanando bons resultados, apesar de no terem nmero divulgados oficialmente: Siemens, General Motors, Banco Central, Petrobrs, Bradesco e muitas outras.
Evoluo contnua
As constantes evolues tecnolgicas e corporativas incentivaram uma evoluo na biblioteca do ITIL. Batizado de ITIL
Refresh Project e previsto para 2006, a prxima verso do ITIL
(3.0) pretende adequar-se ainda mais ao universo de constante
mudao da TI, de forma complementar verso atual. Tambm
se prope a abordar com mais profundidade a integrao das
melhores prticas com terceirizao, cumprimento de leis fiscais e normas regulatrias.1

CONCLUSO
Este artigo fez uma breve introduo ao ITIL, metodologia ainda pouca conhecida mas em uso crescente por profissionais e
corporaes.

1. Fonte: ComputerWorld Online(http://computerworld.uol.com.br)

ITIL NO MERCADO CORPORATIVO

2. Fonte: Revista InformationWeek, n. 112 de 02/03/2004

Mercado de TI
O mercado de TI conta ainda com outras metodologias e "modelos de negcios" dispostos em frameworks, com similaridades e complementaridade tais como Control Objectives for
Information and related Technology (COBIT), Capability Maturity
Model Integration (CMMI), as boas prticas na gesto de projetos segundo o PMBoK, entre outros. Alm disso, dispe de vrios pacotes corporativos que so comumente usados para promover a Governana de TI, como Balanced Scorecard (BSC),
Business Intelligence (BI), Customer Relationship Management
(CRM), Enterprise Resource Planning (ERP) e Supply Chain
Management (SCM).

Para se aprofundar
OGC. ITIL The key to managing IT Services: Service Delivery. Cronw
Copyright, 2003.
OGC. ITIL The key to managing IT Services: Service Support. Cronw
Copyright, 2003.
Artigo feito pela interPromUSA: Justification of ITIL, www.interpromusa.com, 2002.
Artigo feito pela interPromUSA: What is ITIL, www.interpromusa.com, 2002.
White Paper feito pela organizao PinkElephant: The benefits of ITIL, www.
pinkelephant.com, 2004.
Site da COMPUTERWORLD (http://computerworld.uol.com.br), 2006.
Site do EXIN (www.exin-exams.com/), 2006.

Alguns casos de utilizao do ITIL


A Empresa Brasileira de Correios e Telgrafos (ECT) pretende implantar, at dezembro deste ano, as diretrizes do CobiT
4.0 em vrios de seus processos de TI, alm de alinhar suas
iniciativas tambm com a metodologia de melhores prticas
do ITIL.1
A Construtora Norberto Odebrecht tambm contratou uma
consultoria para analisar seus macro-processos e mape-los
em relao ao CobiT e o ITIL, ainda este ano.1
Um caso recente - e otimista - de implementao o da Cassi
(Caixa de Assistncia ao Funcionrio do Banco do Brasil),
cujos processos esto sob influncia do ITIL desde setembro de 2003.2
O ABN no Brasil adotou o ITIL depois que o conceito virou
norma global da empresa, em novembro de 2002. A

Site do itSMF Portugal (www.itsmf.pt/), 2006.


Revista InformationWeek, n. 112 de 02/03/2004.

* Alex Prado de Carvalho Foundation Certificate in IT Service Management,


pelo EXIN. Tambm possui certificaes MCP, MCSD, MCAD e MCT da
Microsoft, alm de formao Six Sigma Black Belt. Formado em Engenharia de
Software e ps-graduado em Gesto e Tecnologia da Informao, atua em Belo
Horizonte como Gerente de Engenharia de Software da TechBiz Informtica
(www.techbiz.com.br). Tem trabalhado cada vez mais na busca da excelncia
em Gesto de TI atravs das disciplinas do ITIL, relacionando-as com outros
frameworks (CobiT, CMMI, PMBoK, ISOs, etc.) em busca de melhores ndices
para a garantia da qualidade. Tambm dedica parte de seu tempo para acompanhar avanos na rea de Gesto Estratgica, Inteligncia Competitiva e
Gesto do Conhecimento.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

13

Access Bsico

Aprenda com as melhores dicas de


Access
Luiz Cludio C. V. da Rocha *

Artigo para Access 2000, XP e 2003


Pr-requisitos: Conhecimento bsico de VBA

NESTA EDIO, TRAGO NOVAS DICAS E TCNICAS PARA


VOC USAR NO ACCESS E VBA: COMO IMPORTAR
ESPECIFICAES DE TXT, COMO CENTRALIZAR NA TELA UM
FORMULRIO J ABERTO, COMO IMPEDIR QUE UM FORMULRIO SEJA MOVIDO PELO USURIO, COMO FIXAR A
LARGURA DE COLUNAS DE UMA FOLHA DE DADOS E COMO
CRIAR UMA INPUTBOX COM MSCARA DE SENHA.

banco de dados, sem ter que refazer o trabalho, basta abrir o


MDB de destino, clicar no menu Arquivo Obter dados externos Importar e selecionar o MDB onde foram criadas as
especificaes. Na janela de importar objetos, clique no boto
Opes para exibir os itens adicionais de importao, selecione
a caixa Especificaes de importao/exportao (Figura 2) e
clique em OK. As especificaes sero importadas.

1) COMO EXPORTAR PARA OUTRO MDB AS ESPECIFICAES


DE IMPORTAO/EXPORTAO DE TXT?
R. Ao importar ou vincular um arquivo TXT, o Access traz um
assistente para criao das especificaes (Figura 1). Dependendo do TXT, as configuraes podem ser trabalhosas, especialmente se o arquivo contiver muitas colunas.

Figura 2 - Opo de importao de especificaes

No MDB de destino, para usar a especificao, basta fazer a importao/vinculao do TXT (por meio do menu Arquivo Obter dados
externos), assim que o assistente for aberto, clique no boto Avanado para exibir a janela de especificao e, em seguida, no boto
Especificaes para trazer a lista de especificaes salvas (Figura 3).

Figura 1 - Assistente de especificao de importao

As especificaes criadas ficam salvas nas tabelas de sistema


MSysIMEXSpecs e MSysIMEXColumns. Para pass-las a outro

DISPONVEL PARA DOWNLOAD


COLUNA_LC_21.ZIP (ACCESS 2000, XP

2003)

Disponvel para download em www.forumaccess.com.br

Figura 3 - Especificao salva no novo MDB

14

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Access Bsico
2) COMO CENTRALIZAR UM FORMULRIO NA TELA POR
MEIO DE CDIGO?
R. Abrir um formulrio centralizado na tela fcil, basta configurar a propriedade AutoCentralizar para Sim na janela de propriedades do formulrio (Figura 4). Isso geralmente feito em
formulrios popup e em janelas de dilogo. Observao: ao alternar do modo estrutura para o modo formulrio, a centralizao automtica no feita. necessrio fechar e abrir o formulrio para que funcione corretamente.

Se a sua verso do Access no tiver o mtodo Move (disponvel


a partir do Access XP), pode usar em seu lugar o mtodo
DoCmd.MoveSize, que funciona da mesma forma.

Figura 5 - Centralizando formulrio por meio de cdigo

3) COMO IMPEDIR QUE O USURIO MOVA UM FORMULRIO


NA TELA?
R. Para que um formulrio no seja movido de sua posio,
basta ajustar a propriedade Movvel para No (Figura 6).

Figura 4 - Ajustando a propriedade AutoCentralizar

Para formulrios j abertos, a centralizao pode ser feita por


meio de cdigo. A lgica armazenar a posio superior e a
posio esquerda do formulrio no momento de sua abertura
(considerando que o AutoCentralizar seja Sim) e depois usar o
mtodo Move para restabelecer sua posio.
Na seo geral do formulrio (logo abaixo de Option Compare
Database e Option Explicit), declare duas variveis:
Private mlngTop As Long
Private mlngLeft As Long

O valor dessas variveis ser atribudo no evento Ao Abrir do


formulrio:

Figura 6 - Ajustando a propriedade Movvel

Esta configurao tambm pode ser feita por meio de cdigo,


usando a propriedade Moveable:

Private Sub Form_Open(Cancel As Integer)


'Armazena a posio original
mlngTop = Me.WindowTop

Private Sub Label1_Click()

mlngLeft = Me.WindowLeft

'Trava ou destrava a movimentao do formulrio

End Sub

If Me.Moveable = False Then


Me.Moveable = True

Para centralizar o formulrio, voc pode usar o evento Ao Ativar


(se no for um formulrio popup) ou qualquer outro evento que
achar conveniente, passando ao mtodo Move as posies originais armazenadas nas variveis de mdulo (Figura 5).
Private Sub Label1_Click()
'Centraliza o formulrio

Me.Label1.Caption = "Clique aqui para travar"


Else
Me.Moveable = False
Me.Label1.Caption = "Clique aqui para mover"
End If
End Sub

Me.Move mlngLeft, mlngTop


End Sub

O exemplo mostrado na Figura 7 est disponvel para download


no material deste artigo.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

15

Access Bsico
Access
Bsico
Resume ExitHere
End Sub

Esse procedimento chama duas funes externas:


AutoFitColumns (que faz o ajuste automtico da largura das
colunas) e LoadCollection (que carrega num objeto Collection
o nome e a largura de todas as colunas do formulrio). Essas
duas funes devem ser criadas em um mdulo padro.
Obs.: a chamada ao procedimento AutoFitColumns opcional.
Voc pode preferir ajustar as larguras na mo e salvar o formulrio.
Figura 7 -Travando movimentao do formulrio

Public Sub AutoFitColumns(objForm As Form)


'Faz auto-ajuste de largura das colunas

4) COMO FIXAR A LARGURA DE COLUNAS EM UM FORMULRIO FOLHA DE DADOS PARA QUE O USURIO NO AS
ALTERE?
R. A largura de uma coluna de um formulrio folha de dados
definida pela propriedade ColumnWidth. Para impedir que o
usurio altere a largura das colunas, no h uma propriedade
especfica, mas possvel usar o VBA para se obter o resultado desejado.
A lgica adotada a seguinte: ao abrir o formulrio, voc armazena a largura de todas as colunas; ao clicar no formulrio
para redimensionar alguma coluna, voc restabelece as larguras originais.
Para armazenar as larguras das colunas, voc pode usar uma
varivel Collection, declarada na seo geral do formulrio:

Dim ctl As Control

For Each ctl In objForm.Controls


If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox _
Or TypeOf ctl Is CheckBox Or TypeOf ctl Is ListBox Then
'Largura -2 o auto-fit
ctl.ColumnWidth = -2
End If
Next ctl
End Sub

Public Sub LoadCollection(objForm As Form, _


ByRef colColumns As Collection)
'Retorna uma coleo com a largura e o nome das colunas
Dim ctl As Control

Private mcolColumns As Collection

Dim i As Integer

No evento Ao Abrir do formulrio folha de dados, as colunas


so auto-ajustadas e o objeto Collection preenchido:

'Limpa a Collection
For i = 1 To colColumns.Count
colColumns(i).Remove

Private Sub Form_Open(Cancel As Integer)

Next i

Dim ctl As Control


For Each ctl In objForm.Controls
On Error GoTo ErrHandler

If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox _


Or TypeOf ctl Is CheckBox Or TypeOf ctl Is ListBox Then

'Faz auto-ajuste das larguras


Call AutoFitColumns(Me)

colColumns.Add ctl.ColumnWidth, ctl.Name


End If
Next ctl

'Armazena a largura das colunas em um Collection

End Sub

Set mcolColumns = New Collection


Call LoadCollection(Me, mcolColumns)

ExitHere:
Exit Sub

ErrHandler:
MsgBox Err.Description & vbCrLf & Err.Number & vbCrLf & _
Err.Description, vbCritical, "Form_frmLarguraFixa_Form_Open"

16

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Com isso, ao abrir o formulrio, voc ter todas as colunas corretamente ajustadas e as larguras armazenadas na varivel
mcolColumns.
Quando um usurio quer alterar a largura de alguma coluna, ele
clica no ttulo, arrasta o mouse e libera na posio desejada. A
liberao do mouse pode ser feita no prprio cabealho do formulrio, em alguma coluna da grade de dados e at mesmo fora
do formulrio.
Quando o usurio clica sobre o ttulo de alguma coluna, o even-

WWW.FORUMACCESS.COM.BR

Access Bsico
to Ao Apertar Mouse disparado. Crie na seo geral do formulrio uma varivel booleana e use o evento Ao Apertar Mouse
do formulrio para passar o valor True a essa varivel. A finalidade indicar que as colunas devero ser posteriormente reajustadas:
Private mblnClicked As Boolean

Private Sub Form_MouseDown(Button As Integer, _


Shift As Integer, X As Single, Y As Single)

Figura 8 - Redimensionando colunas

'O usurio clicou no formulrio

5) COMO COLOCAR MSCARA DE SENHA EM UMA


INPUTBOX?

mblnClicked = True
End Sub

Por fim, falta a rotina que restabelece as larguras originais.


Este procedimento deve ser criado no mesmo mdulo padro
onde foram colocadas as rotinas AutoFitColumns e
LoadCollection:

R. A funo InputBox bastante prtica para se obter um texto


informado pelo usurio, como um nome, um valor ou um filtro
de pesquisa (Figura 9).

Public Sub FixColumns(objForm As Form, colColumns As Collection)


'Ajusta a largura das colunas com os valores originais
Dim ctl As Control
Dim lngWidth As Long

For Each ctl In objForm.Controls


Figura 9 - Inputbox

If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox _


Or TypeOf ctl Is CheckBox Or TypeOf ctl Is ListBox Then

A Inputbox seria bem mais funcional se permitisse a configurao de mscaras de entrada, porm no possui tal recurso. A soluo acaba sendo a criao de um formulrio popup personalizado, com botes de comando e caixa de texto com mscara.
No caso de mscara de senha, entretanto, existe uma soluo
criada pelo ingls Daniel Klann (www.danielklann.com). Tratase de uma InputBox comum, mas com a entrada na forma de
senha (Figura 10).

lngWidth = colColumns(ctl.Name)
If lngWidth > 0 And ctl.ColumnHidden = True Then
ctl.ColumnHidden = False
End If
ctl.ColumnWidth = lngWidth
End If
Next ctl
End Sub

Este procedimento FixColumns deve ser chamado nos eventos Ao Liberar Mouse do formulrio e de todas as colunas (pois
ao redimensionar alguma coluna, o usurio pode liberar o
mouse sobre qualquer campo). A chamada feita da seguinte
forma:
Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)

Figura 10 - Inputbox com mscara de senha

'Restaura as larguras originais

O segredo est no uso de algumas APIs do Windows. O cdigo,


que deve ser inserido em um mdulo padro, o seguinte:

If mblnClicked = True Then


Call FixColumns(Me, mcolColumns)
mblnClicked = False

'////////////////////////////////////////////////////////////////////

End If

'Password masked inputbox

End Sub

'Allows you to hide characters entered in a VBA Inputbox.

O exemplo completo est no material disponvel para download.


O arquivo se chama bdFixaLargura_LC.mdb (Figura 8).

'
'Code written by Daniel Klann

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

17

Access Bsico
Access
Bsico
'March 2003

If Left$(strClassName, RetVal) = "#32770" Then 'Class name of the Inputbox

'////////////////////////////////////////////////////////////////////
'This changes the edit control so that it display the password character *.
'API functions to be used

'You can change the Asc("*") as you please.

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _

SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"),

ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

&H0
End If

Private Declare Function GetModuleHandle Lib "kernel32" Alias


"GetModuleHandleA" (ByVal lpModuleName As String) As Long

End If

Private Declare Function SetWindowsHookEx Lib "user32" Alias

'This line will ensure that any other hooks that may be in place are

"SetWindowsHookExA" _

'called correctly.

(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _

CallNextHookEx hHook, lngCode, wParam, lParam

ByVal dwThreadId As Long) As Long


End Function
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As
Long) As Long

Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional


XPos, _

Private Declare Function SendDlgItemMessage Lib "user32" Alias

Optional YPos, Optional HelpFile, Optional Context) As String

"SendDlgItemMessageA" _

Dim lngModHwnd As Long, lngThreadID As Long

(ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _


ByVal wParam As Long, ByVal lParam As Long) As Long

lngThreadID = GetCurrentThreadId
lngModHwnd = GetModuleHandle(vbNullString)

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA"


(ByVal hwnd As Long, _

hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd,

ByVal lpClassName As String, _

lngThreadID)

ByVal nMaxCount As Long) As Long


InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

UnhookWindowsHookEx hHook

'Constants to be used in our API functions

End Function

Private Const EM_SETPASSWORDCHAR = &HCC

Para abrir a Inputbox, basta chamar a funo InputBoxDK:

Private Const WH_CBT = 5


Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

Function SenhaDigitada() As String


'Retorna a senha digitada pelo usurio

Private hHook As Long

SenhaDigitada = InputBoxDK("Permisso de acesso", _


"Digite a senha:")

Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long,

End Function

ByVal lParam As Long) As Long


Dim RetVal

CONCLUSO

Dim strClassName As String, lngBuffer As Long

Nesta edio voc viu como importar especificaes de TXT, como


centralizar na tela um formulrio j aberto, como impedir que um
formulrio seja movido pelo usurio, como fixar a largura de colunas de uma folha de dados e como criar uma Inputbox com
mscara de senha. Bom estudo e at a prxima!

If lngCode < HC_ACTION Then


NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
Exit Function
End If
strClassName = String$(256, " ")
lngBuffer = 255

Para se aprofundar
Inputbox com mscara de senha:
http://www.danielklann.com/excel/hiding_text_in_a_vba_inputbox.htm

If lngCode = HCBT_ACTIVATE Then 'A window has been activated


* Luiz Cludio C. V. Rocha (luiz@mvps.org) coordenador de projetos da

RetVal = GetClassName(wParam, strClassName, lngBuffer)

FrumAccess, Microsoft Most Valuable Professional, MCP e autor dos cursos


Access Professional Kit e VSTO Professional Kit

18

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Access Bsico

Novas Caractersticas de XML no


Access 2003
Frank C. Rice *
Traduo: Fernando Pessoa**

Artigo para Access 2003


Pr-requisitos: Conhecimentos intermedirios de Access

OS NOVOS RECURSOS EXISTENTES NO MICROSOFT


ACCESS 2003 DO DESTAQUE S CARACTERSTICAS RELACIONADAS AO PADRO XML (EXTENSIBLE MARKUP
LANGUAGE). POR EXEMPLO, AGORA VOC PODE TRANSFORMAR DADOS XML EM UM OUTRO FORMATO UTILIZANDO ARQUIVOS XSL (EXTENSIBLE STYLESHEET
LANGUAGE) DURANTE AS OPERAES DE IMPORTAO
E EXPORTAO. ALM DISSO, VOC AGORA PODE INCLUIR TABELAS RELACIONADAS AO EXPORTAR PARA UM
ARQUIVO XML A PARTIR DO BANCO DE DADOS. ESSAS E
OUTRAS CARACTERSTICAS SERO VISTAS MAIS
DETALHADAMENTE NESTE ARTIGO.

PARA EXPORTAR DADOS PARA UM ARQUIVO XML


1. Inicie o Microsoft Access 2003 e abra o banco de dados
Northwind. Para faz-lo, a partir do Access, v no menu Ajuda, em Banco de dados de exemplo, e ento clique em Banco
de dados de exemplo Northwind.
2. D um duplo-clique na tabela Funcionrios, v ento no menu
Arquivo e clique em Exportar.
3. Na caixa Nome do arquivo, escreva Exemplo1.

EXPORTANDO DADOS XML


Na ltima verso do Access, somente era possvel exportar dados para XML usando o schema que o Access gerava. No entanto, muitas vezes necessrio transformar os dados em um outro formato. O Access 2003 tem agora um recurso que permite
que voc especifique um arquivo de transformao (XSLtransform) para ser usado ao exportar dados para um arquivo
XML. O procedimento a seguir mostra esse processo.

ANTES DE COMEAR
Extraia o contedo dos arquivos deste artigo em uma pasta de
trabalho do seu computador, note que h uma pasta BR e outra
EN para verso em portugus e ingls do banco de dados de
exemplo Northwind:
Pasta: BR

Figura 1 - Exemplo1.xml

4. Na caixa Salvar como tipo, clique na seta e selecione XML (*.xml).


5. Clique em Exportar Tudo.
6. Na caixa de dilogo Exportar XML, clique em Mais Opes.

Pasta: EN

-Funcionarios_Saida.xsl

- Employees_Out.xsl

-Funcionarios_Entrada.xsl

- Employees_In.xsl

-Funcionarios_Entrada.xsd

- Employees_In.xsd

-Funcionarios_Entrada.xml

- Employees_In.xml

DISPONVEL PARA DOWNLOAD


SAMPLES_ACCESS_XML.ZIP(ACCESS 2003)
Disponvel para download em www.forumaccess.com.br

Figura 2 Clicando em Mais Opes

7. Na aba Dados, clique em Transformaes.


8. Na caixa de dilogo Exportar Transformaes, clique em Adicionar.
9. Na caixa de dilogo Adicionar Nova Transformao, procure
pelos arquivos de exemplo da matria, clique no arquivo
Funcionarios_Saida.xsl e, ento, clique em Adicionar.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

19

Access Bsico
Access
Bsico
10. Na caixa de dilogo Exportar Transformaes, selecione
Funcionarios_Saida.xsl e, ento, clique em OK.

</td>
</tr>
</xsl:template>

</xsl:stylesheet>
Lista 1 - O arquivo transformao Funcionarios_Saida.xsl

A lista seguinte mostra o arquivo de sada dos Funcionrios:


<html>
<body>
<table>
<tr>
<td>Nancy</td>
<td>Davolio</td>
</tr>
<tr>
Figura 3 Selecionando Funcionarios_Saida.xsl

<td>Andrew</td>
<td>Fuller</td>

11. Na caixa de dilogo Exportar XML, clique em OK. O arquivo


Exemplo1.XML criado com os dados transformados usando a transformao Funcionarios_Saida.xsl.

</tr>
<tr>
<td>Janet</td>
<td>Leverling</td>

Nota: O arquivo Funcionarios_Saida.xsl usado para


mostrar apenas o primeiro nome e o sobrenome dos
dados na tabela Funcionrios.

</tr>
<tr>
<td>Margaret</td>
<td>Peacock</td>

EXAMINANDO O ARQUIVO DE TRANSFORMAO

</tr>

A lista a seguir mostra o contedo do arquivo de transformao


utilizado (Funcionarios_Saida.xsl).

<tr>
<td>Steven</td>
<td>Buchanan</td>

<?xml version="1.0" encoding="UTF-8"?>

</tr>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

<tr>

version="1.0">

<td>Michael</td>

<xsl:output method="html" version="4.0" indent="yes"/>

<td>Suyama</td>

<xsl:template match="dataroot">

</tr>

<html>

<tr>
<body>

<td>Robert</td>
<table>

<td>King</td>

<xsl:apply-templates select="Funcionrios"/>

</tr>

</table>

<tr>

</body>

<td>Laura</td>

</html>

<td>Callahan</td>

</xsl:template>

</tr>
<tr>

<xsl:template match="Funcionrios">

<td>Anne</td>

<tr>

<td>Dodsworth</td>

<td>
</tr>

<xsl:value-of select="Nome"/>
</table>

</td>
</body>

<td>
<xsl:value-of select="Sobrenome"/>

</html>
Lista 2 - Sada ao exportar para XML usando arquivo de transformao

20

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Access Bsico
IMPORTANDO DADOS DE XML
Nas verses anteriores, o Access permitia que voc importasse
dados no padro XML em tabelas novas ou acrescentasse dados a tabelas j existentes. Esta verso do Access permite que
voc transforme os dados antes de criar tabelas novas ou
adicion-los s tabelas existentes. Os procedimentos a seguir
demonstram a transformao de um arquivo de dados de funcionrios durante a importao. Isso um detalhe muito importante quando tentamos importar dados de arquivos XML e
adicion-los a tabelas j existentes.
1. Inicie o Access 2003 e abra novamente o banco de dados de
exemplo Northwind.
2. No menu Arquivo, v em Obter dados externos e clique em
Importar.
3. Na caixa de dilogo Importar, na lista Arquivos do tipo, clique
em XML (*.xml, *.xsd).
4. Se necessrio, procure pelos arquivos de exemplo e ento
clique no arquivo Funcionarios_Entrada.xml.

Figura 5 - Selecionando Funcionarios_Entrada

10. Clique OK para fechar a caixa de mensagem.


11. D um duplo-clique na tabela Funcionrios1 para abr-la. A
tabela contm duas colunas (Nome e Sobrenome). Lembrese que a tabela original foi reduzida para duas colunas usando o arquivo XSL de transformao.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" version="4.0" indent="yes"/>
<xsl:template match="dataroot">
<html>
<body>
<table>
<xsl:apply-templates
select="Funcionrios"/>
</table>
</body>
</html>

Figura 4 Selecionando Funcionarios_Entrada.xml.

</xsl:template>
<xsl:template match="Funcionrios">

5. Clique em Importar.

<Funcionrios>
<Nome><xsl:value-of select="Nome"/></Nome>

Nota: O arquivo Funcionarios_Entrada.XML foi criado exportando a tabela Funcionrios do banco de


dados de exemplo Northwind e consiste de campos
como Nome, Sobrenome, Tratamento, Data de
Contratao e assim por diante.

<Sobrenome><xsl:value-of select="Sobrenome"/></
Sobrenome>
</Funcionrios>
</xsl:template>
</xsl:stylesheet>
Lista 3 - Arquivo de transformao Funcionarios_Entrada.xsl

6. Na caixa de dilogo Importar XML, abaixo do n da tabela, clique em Funcionrios, clique em Opes e, ento,
clique em Transformao.
7. Na caixa de dilogo Importar Transformao, clique em Adicionar.
8. Na caixa de dilogo Adicionar Nova Transformao,
clique em Funcionarios_Entrada.xsl e, ento, clique em
Adicionar.
9. Na caixa de dilogo Importar Transformaes, clique em
Funcionarios_Entrada, clique em OK e, ento, clique em
OK novamente.

A figura 6 mostra a nova tabela Employee.

FRUMACCESS

Figura 6 - Resultado da importao do XML com uma transformao

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

21

Access Bsico
Access
Bsico
INCLUINDO TABELAS RELACIONADAS AO EXPORTAR UM XML

<?xml version="1.0" encoding="UTF-8"?>

XML um timo formato para troca de dados entre o Access e


outras aplicaes. comum esses dados estarem localizados
em vrias tabelas diferentes. Por exemplo, quando uma lista de
pedidos exportada, a lista no estar completa a menos que
as tabelas correspondentes Detalhes de Pedidos e Produtos
tambm sejam exportadas. A partir do Access 2003, voc pode
exportar dados de vrias tabelas e consultas relacionadas.

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://


www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Exemplo2.xsd" generated="2006-0829T17:10:35">
<Pedidos>
<NmeroDoPedido>10248</NmeroDoPedido>
<CdigoDoCliente>VINET</CdigoDoCliente>
<CdigoDoFuncionrio>5</CdigoDoFuncionrio>

Nota: Tabelas e consultas relacionadas so definidas


usando a janela Relacionamentos, que pode ser acessada
a partir do menu Tools.

<DataDoPedido>1996-07-04T00:00:00</DataDoPedido>
<DataDeEntrega>1996-08-01T00:00:00</DataDeEntrega>
<DataDeEnvio>1996-07-16T00:00:00</DataDeEnvio>
<Via>3</Via>
<Frete>32.38</Frete>

Para exportar tabelas relacionadas

<NomeDoDestinatrio>Vins et alcools Chevalier</NomeDoDestinatrio>

1. Inicie o Microsoft Access 2003 e abra o banco de dados de


exemplo Northwind.
2. Clique na tabela Pedidos e ento clique em Exportar no menu
Arquivo.
3. Na caixa Nome do arquivo, escreva Exemplo2.
4. Na caixa Salvar como tipo, clique na seta e, ento, clique em
XML (*.xml)
5. Clique Exportar Tudo.
6. Na caixa de dilogo Exportar XML, clique em Mais Opes.
7. Veja a caixa de dilogo na figura 7.

<EndereoDoDestinatrio>59 rue de l&apos;Abbaye</EndereoDoDestinatrio>


<CidadeDeDestino>Reims</CidadeDeDestino>
<CEPdeDestino>51100</CEPdeDestino>
<PasDeDestino>Frana</PasDeDestino>
<Detalhes_x0020_do_x0020_Pedido>
<NmeroDoPedido>10248</NmeroDoPedido>
<CdigoDoProduto>11</CdigoDoProduto>
<PreoUnitrio>14</PreoUnitrio>
<Quantidade>12</Quantidade>
<Desconto>0</Desconto>
</Detalhes_x0020_do_x0020_Pedido>
<Detalhes_x0020_do_x0020_Pedido>
<NmeroDoPedido>10248</NmeroDoPedido>
<CdigoDoProduto>42</CdigoDoProduto>
<PreoUnitrio>9.8</PreoUnitrio>
<Quantidade>10</Quantidade>
<Desconto>0</Desconto>
</Detalhes_x0020_do_x0020_Pedido>
<Detalhes_x0020_do_x0020_Pedido>
<NmeroDoPedido>10248</NmeroDoPedido>
<CdigoDoProduto>72</CdigoDoProduto>
<PreoUnitrio>34.8</PreoUnitrio>
<Quantidade>5</Quantidade>
<Desconto>0</Desconto>

Figura 7 - Caixa de dilogo Exportar XML com a tabela Pedidos selecionada

Observe que a tabela Pedidos e a tabela relacionada Detalhes do


Pedido esto selecionadas e prontas para a exportao. A tabela Detalhes do Pedido relacionada tabela Pedidos por um
relacionamento de um-para-muitos (de 1-N), isto , um registro
em Pedidos pode ter muitos itens na Detalhes Pedidos. Observe agora os itens mostrados no n Dados de Consulta. As tabelas que aparecem a so baseadas em um relacionamento de
muitos-para-um (N-1). Por exemplo, um cliente pode ter muitos pedidos.

</Detalhes_x0020_do_x0020_Pedido>
</Pedidos>

CONCLUSO
Neste artigo, mostrei as caractersticas de XML da verso mais
recente do Access. No Microsoft Office Access 2003, voc pode
aplicar XSL para transformar dados na importao e na exportao. Voc pode tambm exportar tabelas relacionadas ao exportar para arquivos XML.
* Frank Rice acumulou vasta experincia como desenvolvedor e engenheiro
de suporte em aplicaes Access. Atua hoje na Microsoft na criao de docu-

22

8. Para finalizar a exportao, clique em OK.

mentao para programadores, em especial, para o Office Developer Center.

A lista seguinte mostra um trecho do arquivo XML gerado na


exportao:

** Fernando Pessoa (fernando.pessoa@forumaccess.com.br) Analista de

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Suporte da Revista FrumAccess.

WWW.FORUMACCESS.COM.BR

Access Avanado

Access ListBar
Paulo Sergio Sarraino*

Artigo para Access 2000, XP e 2003


Pr-requisitos: Conhecimentos de Access e VBA

A LISTBAR (OU MENU VERTICAL) APARECEU COM ALGUMAS VERSES MAIS ANTIGAS DO OUTLOOK. O CONCEITO
DELA ABRIGAR FUNES SEMELHANTES DENTRO DE GRUPOS QUE, QUANDO CLICADOS, ABREM-SE VERTICALMENTE PARA ACESSAR AS FUNES RELACIONADAS. COMO
UMA BARRA DE MENU, PORM NA VERTICAL, EXIBE TEXTOS E CONES COM CONFIGURAES DIFERENTES E ESSES ELEMENTOS PODEM SER REORDENADOS E REAGRUPADOS LIVREMENTE, A GOSTO DO USURIO.
Logo, sua utilidade foi percebida para sistemas em Access que
administram grande quantidade de tipos de dados. Assim, esses tipos poderiam ser agrupados e disponibilizados numa
interface mais simples para manuteno dos dados. Mas esse
componente nunca foi inserido no Access (at a verso 2003)
para uso em sistemas construdos nessa plataforma.
Surgiram, ento, atravs de empresas de ferramentas de
software, componentes semelhantes que permitem explorar esse
recurso no Access incorporando-os aos sistemas desenvolvidos. Pesquisando na internet e no GD da FrumAccess, localizei alguns deles com custos tanto para o desenvolvimento quanto para o uso desses componentes.
Da pensei: possvel desenvolver algo semelhante apenas usando
os objetos do Access? Mos obra, pesquisas, testes, e hoje posso dizer: sim! Com algumas limitaes, porm bem funcional.
Nesta matria vou demonstrar isso com 2 exemplos: um usando apenas textos (com uma caixa de listagem) e outro usando
cones/textos (com um subformulrio).
No arquivo disponibilizado para essa matria h, alm do mdb de
demonstrao, diversos bmps para os cones; ao descompactar
o zip, mantenha todos os arquivos na mesma pasta.
Ateno, importante destacar que a verso do Access seja 2000
ou posterior, pois h algumas referncias que no so suportadas em verses anteriores (usadas no exemplo com
subformulrio).

DISPONVEL PARA DOWNLOAD


LISTBAR.ZIP (ACCESS 2000, XP

2003)

Disponvel para download em www.forumaccess.com.br

A NECESSIDADE
Em sistemas que desenvolvemos sempre h cadastros que considero como bsicos: Cidades, Estados, Produtos, Funcionrios, Projetos, Fornecedores, Clientes e muitos outros. Por isso,
na maioria dos meus projetos sempre h uma tela de Cadastros
com 2 componentes: um grupo de opes para cada cadastro
necessrio e um subformulrio no-vinculado. Conforme
clicamos no item do grupo de opes o subformulrio exibe
o formulrio desenvolvido para o item (tipo datasheet) ou podese at mesmo exibir a prpria tabela ou consulta dos dados (conceito usado nessa matria). Essa estrutura fornece uma interface
nica, consistente e fcil para o usurio nesta parte do sistema.
O problema surge quando temos muitos cadastros para
gerenciar de tal forma que o espao fsico de um formulrio no
comporta todos os itens no grupo de opes. O layout fica
comprometido e perde a eficincia.
Com uma ListBar seria possvel exibir todos os itens de cadastros que precisamos, agrupando-os sob alguma classificao e
permitindo adotar o mesmo estilo de layout citado.
Para comear, necessria uma tabela que permita registrar os
itens da nossa tela de cadastros. Veja os dados da tabela
tbl_ListBar e a sua estrutura:
Campo

Tipo

IDGrupo

Nmero (Inteiro) [chave] Identifica o Grupo

Descrio

Item

Texto (20) [chave]

Objeto

Texto (20)

Identifica o Item do Cadastro


Identifica o Objeto que dever ser
aberto quando o Item selecionado

Tabela 1 Estutura da tabela tbl_ListBar

Nos dados da tabela, observe que existem 4 grupos identificados (de 1 a 4) e uma tabela fsica correspondente para cada
Objeto citado. Algumas delas vieram do banco de dados
Northwind Traders, de outros projetos, e usei tambm o assistente de criao de tabela do prprio Access para enriquecer
ainda mais esta matria. Para esse exemplo, a estrutura e os
dados de cada tabela dessas no tm importncia.

LISTBAR COM CAIXA DE LISTAGEM


Esta interface corresponde ao formulrio frm_Cadastros_ listbox.
Veja a Figura 1 com a estrutura do formulrio na primeira fase
da construo.
FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

23

Access
Avanado
Access
Avanado
Detalhando melhor - a funo ListBar responsvel por:
Receber, atravs do parmetro i, o cdigo de grupo clicado.
Identificar, numa matriz (matGrupo), os valores de Top de cada
boto de grupo que criamos.
Ocultar a caixa de listagem lstGrupo.
Alinhar, no topo da caixa boxGrupo, os botes de grupo at o
grupo clicado (usando um For...Next com Step -30, teremos
um efeito de deslize da posio atual do boto at o limite
possvel do topo da caixa boxGrupo).
Alinhar, na base da caixa boxGrupo, os botes de grupo depois do grupo clicado (tambm usando um For...Next com Step
30 para termos o efeito de deslize do boto at o limite possvel da base da caixa boxGrupo na mesma velocidade).
Montar um SELECT da tabela tbl_ListBar conforme o grupo clicado.
Posicionar a caixa de listagem lstGrupo abaixo do boto de
grupo clicado e reexibi-la atualizada.

Figura 1 - Estrutura do formulrio na primeira fase da construo

Segue um descritivo dos objetos utilizados:


Objeto

Tipo

Descrio

boxGrupo

caixa

Efeito visual para a ListBar

cmd1 at cmd4 botes de comando

Exibe os grupos desejados (a


nomenclatura padronizada facilita a
manipulao dos botes na tela)

lstGrupo

caixa de listagem

Exibe os itens do grupo selecionado


atravs de pesquisa na tabela
tbl_ListBar

Tabela 2 - Objetos utilizados

Aps configurar esses objetos, coloque-os sobrepostos para


montar o layout da ListBar e insira um subformulrio ao lado.
Veja a fase 2 na prxima figura.

Figura 2 - Fase 2

Para movimentar os botes de Grupos, reposicionar e atualizar


a caixa de listagem, h uma funo chamada ListBar(Grupo),
que pode ser usada para quantos grupos forem necessrios.
Veja, em cada boto, a propriedade Ao clicar (On Click).

Function ListBar(i As Integer)


Dim matGrupo(1 To 4) As String
Dim j As Integer, p As Long, X As Long
Dim strListBox As String
'matriz de grupos
matGrupo(1) = Me.cmd1.Top
matGrupo(2) = Me.cmd2.Top
matGrupo(3) = Me.cmd3.Top
matGrupo(4) = Me.cmd4.Top
'esconde opes
Me.lstGrupo.Visible = False
'alinha grupos at o selecionado
p = Me.boxGrupo.Top
For j = 1 To i
For X = Me("cmd" & j).Top To p Step -30
Me("cmd" & j).Top = X
Me.Repaint
Next
p = p + Me("cmd" & j).Height
Next
'alinha grupos aps o selecionado
p = Me.boxGrupo.Height + 190
For j = UBound(matGrupo) To i + 1 Step -1
For X = (Me("cmd" & j).Top) To (p - Me("cmd" & j).Height) Step 30
Me("cmd" & j).Top = X
Me.Repaint
Next
p = p - Me("cmd" & j).Height
Next
'monta opes conforme o grupo
strListBox = "SELECT Item, Objeto " & _
"FROM tbl_ListBar " & _
"WHERE IDGrupo = " & i & " " & _
"ORDER BY Item;"
'reexibe opes
With Me.lstGrupo
.Top = Me("cmd" & j).Top + Me("cmd" & j).Height
.RowSource = strListBox
.Visible = True
End With
End Function

Figura 3 - Propriedade Ao clicar (On Click)

24

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Access Avanado
Para iniciar a nossa ListBar o formulrio tem no evento Ao Abrir
(On Open) uma chamada funo ListBar com o parmetro de grupo igual a 1 e assim, exibe o primeiro grupo automaticamente.
As outras rotinas que precisamos so: o cmdFechar_Click (o
boto que fecha o formulrio), o Form_Load (para iniciarmos o
formulrio com o primeiro cadastro disponvel j selecionado)
e o lstGrupo_AfterUpdate (para atualizarmos o SourceObject do
subformulrio conforme alteramos a seleo do item na caixa
de listagem lst_Grupo).
Private Sub cmdFechar_Click()
DoCmd.Close
End Sub
Private Sub Form_Load()
Me.lstGrupo.Selected(0) = True
lstGrupo_AfterUpdate
End Sub
Private Sub lstGrupo_AfterUpdate()
With Me.subfCadastros
.SourceObject = "Table." & Me.lstGrupo.Column(1)
.SetFocus
End With
DoCmd.RunCommand acCmdSelectRecord

Vamos primeiro trabalhar com


o subformulrio que exibir
os cones (frm_ItemList
Bar), veja na figura 5.

Figura 5 - Subformulrio que exibir os cones

End Sub

Veja agora o formulrio em execuo. Clique sobre cada grupo


e veja como os controles so atualizados dinamicamente na tela.
possvel perceber que facilmente podem-se criar mais grupos
e manipular os itens desses grupos apenas relacionando corretamente a tabela tbl_ListBar com os botes do formulrio. A
funo ListBar varrer todos os itens encontrados conforme os
critrios de nomenclatura para os objetos definidos.

Defini um mximo de 9 cones por grupo. Por isso, temos aqui 9


objetos do tipo Imagem formatados e posicionados como vimos na
figura anterior. Elas no possuem bordas, no indicam nenhuma
imagem inicial e so nomeadas seguindo o formato Item<n> (de 1
a 9) para facilitar a atualizao dos objetos. Cada objeto Imagem possui
chamadas para as rotinas MouseClick(n), no evento Ao Clicar (On
Click), para simular o click do mouse como se fosse um boto de
comando e realizar a atualizao do subformulrio de cadastros; e a
MouseMove(n), no evento Ao Mover Mouse (On MouseMove), para
simular o efeito visual de um boto alterando as bordas da Imagem.
Para alterar as bordas das imagens, usa-se a propriedade SpecialEffect,
onde cada nmero corresponde a um tipo de borda suportada pelo
objeto. Veja na tabela 3 a explicao extrada do prprio Help do
Access.
Configurao Visual Basic
Plano

Descrio
O objeto aparece plano, com as cores padro
do sistema ou cores personalizadas que
tenham sido definidas no modo de design.

Alto relevo

O objeto tem um brilho acima e esquerda e

Baixo relevo

O objeto tem uma sombra acima e esquerda

uma sombra embaixo e direita.


e realado embaixo e direita.
Esboado

Sombreado

O objeto tem uma linha em baixo relevo ao


redor do controle.

Figura 4 - Formulrio em execuo

O objeto tem uma sombra abaixo e direita do


controle.

LISTBAR COM SUBFORMULRIO

Cinzelado

Esta interface corresponde aos formulrios frm_Cadastros_


subform e frm_ItemListBar.
O uso de subformulrio permite usar cones, j que, nele, podemos
construir um layout mais parecido com o que o Outlook exibia.
Para desenvolver essa interface, a complexidade aumenta um
pouco, mas no so necessrias muitas alteraes nas rotinas
que j desenvolvemos. Por isso, recomendo duplicar o formulrio frm_Cadastros_listbox e realizar as mudanas que descreverei em seguida.

O objeto tem uma linha em baixo relevo,


abaixo do controle.

Tabela 3 Explicao sobre bordas no Access

Option Compare Database


Option Explicit
Dim ctl As Control
Sub MouseClick(i As Integer)
For Each ctl In Me.Controls
If ctl.SpecialEffect = 2 Then ctl.SpecialEffect = 0

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

25

Access
Avanado
Access
Avanado
If ctl.SpecialEffect = 1 Then ctl.SpecialEffect = 2
Next
Me("Item" & i).SpecialEffect = 2
With Me.Parent!subfCadastros
.SourceObject = "Table." & Me("Item" & i).Tag
.SetFocus
End With
DoCmd.RunCommand acCmdSelectRecord
End Sub
Sub MouseMove(i As Integer)
For Each ctl In Me.Controls
If ctl.SpecialEffect <> 2 Then
If Right(ctl.Name, 1) = i Then
ctl.SpecialEffect = 1
Else
ctl.SpecialEffect = 0
End If
End If
Next
End Sub

Como teremos cones e quantidades de cones diferentes para cada


grupo, h a funo UpdateItens para que as imagens sejam atualizadas
e sincronizadas com a ListBar. Essa rotina substitui o RowSource
dinmico do lstGrupo, que no teremos nesse exemplo.
Detalhando melhor a funo, ela responsvel por:
Receber o grupo clicado atravs do parmetro X.
Construir um RecordSet (com referncia ao DAO 3.6) da tabela
tbl_ListBar, conforme o parmetro X informado, respeitando
o limite de at 9 cones no formulrio.
Atribuir propriedade Picture de cada imagem o arquivo bmp
criado conforme a concatenao dos parmetros.
Atribuir propriedade Tag de cada imagem o valor do campo
Objeto relacionado (para ser usado posteriormente na atualizao do subformulrio subfCadastros).
Ocultar as imagens no utilizadas
Redimensionar as imagens conforme as configuraes definidas
e ajustar a altura da seo Detalhe para no sobrar espao no final
do formulrio (otimizando a barra de rolagem do formulrio).
E ainda, caso o subformulrio de Cadastros (subfCadastros)
esteja exibindo algum item, localizar o cone correspondente
e alterar suas bordas para indicar que o boto foi pressionado
(isso no era necessrio no exemplo com a caixa de listagem,
pois o item selecionado fica guardado na memria).

i=i+1
If i > qt Then Exit Do
.MoveNext
Loop
.Close
End With
j=i
For i = i To qt
Me("Item" & i).Visible = False
Next
Me.Section(0).Height = (qt * Me.Item1.Height) + 300
For i = 2 To qt
If Me("Item" & i).Visible Then
Me("Item" & i).Top = Me("Item" & i - 1).Top + Me("Item" & i - 1).Height
+ 20
Else
Me("Item" & i).Top = 0
End If
Next
Me.Section(0).Height = ((j - 1) * Me.Item1.Height) + 300
For Each ctl In Me.Controls
If InStr(Me.Parent!subfCadastros.SourceObject, ctl.Tag) > 0 Then
ctl.SpecialEffect = 2
Else
ctl.SpecialEffect = 0
End If
Next
End Function

Agora voltemos ao formulrio de Cadastros que, aps a duplicao, chamei de frm_Cadastros_subform. Como dito antes,
as alteraes so simples.
Primeiro, apague a caixa de listagem (e a sua rotina AfterUpdate) e,
no lugar dela, insira um subformulrio do objeto frm_ItemListBar
(sem vnculos de campos filho/mestres). Pra facilitar, chame-o de
frm_ItemListBar e formate-o como a figura 6.

Figura 6 Formatando o frm_ItemListBar

Public Function UpdateItens(X As Integer)


Dim rst As Recordset
Dim i As Integer, j As Integer, qt As Integer
'quantidade de cones
qt = 9
Set rst = CurrentDb.OpenRecordset("SELECT Item, Objeto " & _
"FROM tbl_ListBar " & _
"WHERE IDGrupo = " & X & ";", dbOpenSnapshot)
i=1
With rst
Do While Not .EOF
Me("Item" & i).Picture = Application.CurrentProject.Path & "\img" &
Mid(!Objeto, 5) & ".bmp"
Me("Item" & i).Tag = !Objeto
Me("Item" & i).Visible = True

26

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Para melhorar a visualizao, aumentei a largura da boxGrupo e


dos botes de Grupo.
No evento Form_Load, exclua as linhas existentes e inclua apenas uma, chamando a funo MouseClick do subformulrio para
o grupo 1, conforme cdigo:
Private Sub Form_Load()
Me.frm_ItemListBar.Form.MouseClick (1)
End Sub

Acrescente tambm uma rotina para o evento Ao Mover Mouse


da seo Detalhe (Detail_MouseMove) para realinhar as bordas
das imagens quando navegamos pelo formulrio:

WWW.FORUMACCESS.COM.BR

Access Avanado
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Dim ctl As Control
For Each ctl In Me.frm_ItemListBar.Controls
If ctl.SpecialEffect <> 2 Then
ctl.SpecialEffect = 0
End If
Next
End Sub

Para a funo ListBar, faa as seguintes alteraes:


Mude as referncias da caixa de listagem lstGrupo para o
subformulrio frm_ItemListBar.
Exclua a definio e a montagem da varivel strListBox.
Mude a linha .RowSource = strListBox para .Form.
UpdateItens (i).
Ateno para o acesso a propriedades e mtodos, j que utilizei
blocos With...End With em algumas partes do aplicativo.
Compile e veja o formulrio em execuo (figura 7). Clique sobre cada grupo e veja como os controles so atualizados dinamicamente na tela. Todas as observaes notadas no exemplo
com a caixa de listagem tambm podem ser aplicadas aqui.

Figura 9 Modificando Nvel de Segurana

Depois de mudar o nvel de segurana para Baixo, o Access


mostrar a mensagem de alerta da figura 10.

Figura 10 - Mensagem de alerta

Aps a confirmao, uma nova mensagem indica que a aplicao precisa ser reiniciada (fechar e abrir novamente o Access).
Veja na figura 11.

Figura 11 Mensagem para reiniciar a aplicao

Figura 7 - Formulrio em execuo

OPS, ALGO ESTRANHO OCORREU, O QUE EU FIZ DE ERRADO?


Mesmo que voc tenha seguido corretamente os passos demonstrados neste exemplo, poder se deparar com a tela seguinte ao abrir o formulrio frm_Cadastros_subform e passar o
mouse sobre a barra lateral (figura 8).

Figura 8 Mensagem de erro

A explicao para o erro acima est na prpria ajuda que obtemos ao


clicar no boto Show Help dessa tela. O problema ocorre, pois o
nvel de segurana do Access est configurado para Mdio ou Alto
e o service pack 8 ou superior do Jet no est instalado.
Para comear, feche a caixa de mensagem. Ela poder aparecer novamente se voc mover o mouse sobre a barra lateral ou clicar em um
de seus botes.
Para solucionar o problema, voc pode escolher entre instalar a atualizao do Service Pack mais recente (recomendado) ou mudar o
nvel de segurana do Access para Baixo. Note que essa ltima
opo expe o computador a macros maliciosos, portanto, fique
bastante atento para o risco envolvido neste procedimento. O nvel
de segurana pode ser verificado ou modificado atravs do menu
Ferramentas Macro Nvel de segurana (figura 9).

Ao mudar o nvel de segurana para Mdio ou Alto, o Access


poder mostrar um novo alerta incentivando voc a instalar o
Microsoft Jet 4.0 Service Pack 8.

CONCLUSO
Usando o subformulrio, temos mais liberdade para a construo
dos itens da ListBar, pois podemos utilizar cones e posicion-los
aonde for desejado, porm, usando a caixa de listagem, temos uma
manuteno mais simples e performance melhor. De qualquer forma, o desenvolvimento facilitado quando usamos os objetos nomeados como a estrutura de uma matriz (como cmd1, cmd2, ... e
item1, item2, ...). Aplicativos podem ser facilmente dimensionados
nesse ambiente com uma boa interface e, o melhor, sem custo para a
empresa e o desenvolvedor.
Aqui usei uma srie de tipos de cadastros, mas pode-se usar esse
recurso para outras situaes semelhantes, como relatrios, interfaces
e menus de controle.
Espero que esta matria ilumine o caminho de diversos projetos semelhantes para serem aprimorados com as tcnicas aqui apresentadas. Fiquem vontade para mandar idias, sugestes e crticas.
Bom estudo a todos!
* Paulo Sergio Sarraino (pss@sarraino.com.br) analista de sistemas e scio
da Sarraino Systems. Possui graduao de Tecnologia em Processamento de
Dados pela FASP (1997) e ps-graduao em Anlise de Sistemas c/ nfase
em Gerncia de Projetos pela FIAP (2000). Atua como consultor em Anlise e
Desenvolvimento de Sistemas em ambiente MS Office e Internet (especialista
em Access, VBA e ASP) h mais de 10 anos.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

27

Office Bsico

Conhea o novo (mesmo) Excel


Luiz Cludio C. V. da Rocha *

recursos, acompanhamento de gastos, previso de


vendas, fixao de preos, simulaes, pesquisas,
relatrios, etc.
Para todos: usurios iniciantes conseguem realizar tarefas do
dia-a-dia; usurios avanados conseguem resolver
problemas complexos no seu trabalho; usurios
corporativos no conseguem sequer trabalhar sem
o apoio do Excel.

O NOVO MICROSOFT OFFICE

O EXCEL , SEM DVIDA, UM DOS MELHORES SOFTWARES


DISPONVEIS NO MERCADO. NO EXAGERO AFIRMAR QUE
O MELHOR. EM GRANDE PARTE DAS EMPRESAS, SEJA
QUAL FOR O RAMO DE ATIVIDADE, O PROFISSIONAL QUE
PRECISA TER O TRABALHO PRONTO COM QUALIDADE E
POUCO TEMPO DISPONVEL RECORRE AO EXCEL.

Nos ltimos anos, o pacote Microsoft Office teve diversas atualizaes: Office 7.0 (1995), Office 97, Office 2000, Office XP
(2002) e Office 2003.
A cada verso, novas funcionalidades e recursos foram introduzidos, mantendo fielmente a identidade visual das ferramentas
e a compatibilidade entre verses. Muitos usurios nem se importam com a verso do produto, basta que seja o Excel ou o
Word, que ele conseguir trabalhar da mesma forma.
O Office 2007 foge desta curva crescente: ele representa um
grande salto na famlia dos produtos, no apenas em termos
visuais, mas tambm de estrutura e de recursos.
Com base em um grande estudo de usabilidade e comportamento do usurio, foi feita uma completa reorganizao dos
menus e botes do Office, agora substitudos pelo chamado
Ribbon, um conjunto de guias de comandos separadas por funcionalidades (veja a comparao nas Figuras 1 e 2).

A fama no infundada. O Excel consegue unir caractersticas


aparentemente contraditrias: ele , ao mesmo tempo, completo e prtico, poderoso e amigvel (simples de se usar). Ao usurio mostra-se como uma mera folha quadriculada, mas por trs
carrega uma infinidade de funes e recursos avanados.
O que mais se destaca no Excel o fato de ser uma ferramenta
para tudo e para todos:
Para tudo: o Excel pode ser usado tanto para imprimir uma folha vazia de papel pautado quanto para auxiliar nos
clculos da construo de um prdio. E, entre esses
dois extremos, para uma infinidade de aplicaes,
principalmente no meio corporativo: anlise financeira, gerenciamento de estoque, administrao de
Figura 1 - Interface do Excel 2003

28

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Office Bsico
apenas 25% do tamanho original, e os do PowerPoint com 75%.
A taxa de compresso pode variar em razo das imagens utilizadas nos documentos, as quais no so compactadas. Como os
documentos do PowerPoint, por sua natureza, costumam conter mais imagens, a reduo do seu tamanho menor.
Arquivos menores, alm de ocuparem menos espao no disco
rgido e em mdias removveis (pen drives, disquetes, CDs), so
mais rpidos para transmisso via e-mail.

AS PARTES INTEGRANTES DOS ARQUIVOS

Figura 2 - Interface do Excel 2007

INTERFACE DO EXCEL 2007


A parte grfica tambm foi renovada, possibilitando ao usurio
empregar um visual muito mais profissional e rico aos documentos, o que faz enorme diferena no resultado final de um
trabalho.
Para o uso corporativo, os recursos de integrao com servidores Windows 2003 e Windows SharePoint tambm so poderosos, especialmente no que se refere ao trabalho colaborativo.
No ponto de vista estrutural, a principal conseqncia destas
inovaes foi a mudana do formato de arquivos e a perda da
compatibilidade: os antigos xls, doc e ppt foram substitudos
pelos novos xlsx, docx e pptx (o x se refere a XML eXtensible
Markup Language).
A perda de compatibilidade no total: o Office 2007 consegue
trabalhar com arquivos criados nas verses anteriores e tambm
salvar arquivos nos antigos formatos. As verses anteriores do
Office, porm, no podem abrir os arquivos do novo formato.

Os documentos do Office so agora constitudos de uma coleo de arquivos menores, contidos em um nico arquivo zip.
Para ver quais so os arquivos que compem o documento,
basta renomear sua extenso (xlsx no caso do Excel) para zip e
abri-lo com qualquer utilitrio que funcione com essa tecnologia.
O mais popular o WinZip (www.winzip.com), mas tambm h
outros, como o brasileiro BraZip (www.arquivonacional.com.br/
brazip) e o gratuito FilZip (www.filzip.com).
Para testar, percorremos os seguintes passos:
Criamos no Excel 2003 uma pasta de trabalho com diversos
elementos: nmeros, frmulas, comentrios, uma figura, um
diagrama, um documento do Word e um grfico (Figura 3 e
Figura 4).

CONHECENDO O FORMATO DE ARQUIVOS DO OFFICE 2007


Os formatos de arquivos do Office (xls do Excel, doc do Word e
ppt do PowerPoint), j velhos conhecidos de todos os usurios, foram alterados no Office 2007. Agora, os arquivos do Excel
tm a extenso xlsx, os do Word tm a extenso docx e os do
PowerPoint tm a extenso pptx.
No se trata de uma mera alterao de nomenclatura, mas sim
de uma quebra do antigo arquivo binrio, nico, em vrias partes, ou seja, em vrios arquivos XML, separando dados,
formatao, grficos e objetos embutidos. As diversas partes
so zipadas em um nico arquivo zip.
O novo formato dos arquivos do Office trouxe muitas vantagens aos programadores que usam o Office como plataforma
de desenvolvimento, abrindo-lhes diversas alternativas para a
criao de solues, uma vez que possibilita o tratamento individual de cada componente do documento: dados, formatao,
grficos, etc.
Os usurios tambm tm benefcios. Um dos mais significativos o tamanho dos arquivos: com o uso da tecnologia ZIP de
compactao, arquivos do Excel e do Word ficam em mdia com

Figura 3 - Pasta de trabalho do Excel 2003 a ser convertida para o Excel 2007

Figura 4 - Objetos adicionais da pasta de trabalho a ser convertida para o Excel 2007

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

29

Office Bsico
Office
Bsico
Copiamos este arquivo para uma mquina com o Office
2007 instalado. Veja na Figura 5 que o cone do arquivo
traz o nome da verso do arquivo (2003).

Figura 5 - cone do arquivo Excel 2003 exibido na mquina com Excel 2007

Abrimos o arquivo no Excel 2007 e o salvamos como


uma pasta de trabalho do Microsoft Excel, a fim de
convert-lo para a nova verso. Isso lhe atribui a extenso xlsx.

Figura 7 - Contedo da pasta xl: diversas subpastas com o contedo do documento

Fechamos o Excel 2007 e renomeamos a extenso do novo


arquivo, trocando xlsx por zip. O contedo deste arquivo zip
pode ser visto na Figura 6.

A figura 7 mostra que h um arquivo com informaes da pasta


de trabalho (workbook.xml) e pastas com os demais contedos:
grficos (charts), diagramas (drawings), arquivos embutidos
(embeddings), imagens (media), configuraes de impresso
(printerSettings), alm de uma pasta com arquivos XML do contedo das planilhas (worksheets Figura 8).

Figura 8 - Arquivo XML do contedo da primeira planilha


Figura 6 - Contedo do arquivo zip da pasta de trabalho convertida para o Excel 2007

Vejamos com mais detalhe o contedo deste arquivo zip:


Pasta _rels: esta pasta essencial ao pacote, pois contm um
arquivo XML que informa como as partes do conjunto se relacionam para constituir o todo. H outras pastas _rels dentro
do pacote zip, com a mesma finalidade.
Pasta docProps: esta pasta armazena as propriedades do documento, como verso, ttulos de intervalos, compartilhamento,
autor, etc.
Pasta xl: o ttulo desta pasta varia de acordo com a aplicao
(xl para Excel, ppt para PowerPoint e word para Word). Ela
contm diversas subpastas e arquivos XML especficos da aplicao e do contedo do documento (Figura 7).

30

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

RECUPERAO DE ARQUIVOS CORROMPIDOS

Um benefcio trazido pela modularidade do pacote zip


do Office 2007 a proteo do documento no caso de
corrompimento de arquivo. No antigo formato binrio, um arquivo corrompido significava a perda do documento inteiro;
agora, a recuperao dos dados fica mais fcil.
Se fizermos um teste apagando do pacote zip o arquivo
worksheets\Sheet2.xml (que contm os dados da segunda
planilha), ao abrir a pasta de trabalho o Excel tentar recuperlo (Figura 9).

Figura 9 - Excel detecta a ausncia de um dos arquivos do pacote zip

WWW.FORUMACCESS.COM.BR

Office Bsico
Na restaurao, a planilha no pde ser recuperada (pois o arquivo Sheet2.xml foi apagado), mas o restante do documento
aberto (Figura 10).

praticamente todos os usurios. O termo mais correto, entretanto, pasta de trabalho. Uma pasta de trabalho pode conter
diversas planilhas, ou seja, diversas folhas quadriculadas representadas pelas abas inferiores (Figura 12).

Figura 12 - Planilhas da pasta de trabalho

Figura 10 - Documento recuperado sem a planilha 2

Se for perdido algum arquivo estrutural (como os da pasta _rels,


por exemplo), o Excel pode no conseguir abrir o documento,
mas mesmo assim os dados podem ser recuperados, desde que
os demais arquivos (especialmente os da pasta worsheets) estejam intactos.

Assim, desde j, vamos usar os termos corretos: um arquivo xlsx (ou xls) do Excel uma pasta de trabalho, enquanto cada aba representa uma planilha. Estes so os
termos usados nos menus e janelas do programa, nos
arquivos de Help, nos livros e tambm neste treinamento.
Cada planilha da pasta de trabalho uma grade de linhas
e colunas. O cruzamento de uma linha com uma coluna
representado por uma clula.
Portanto, temos a seguinte hierarquia: aplicao Excel Pasta
de trabalho Planilha Linha/Coluna Clula (Figura 13).

FIGURAS SEPARADAS DO DOCUMENTO


Outra vantagem interessante ao usurio a manuteno das figuras em pasta separada.
Antes, era trabalhoso extrair figuras de um documento e salvlas como arquivos. Sem a ajuda de utilitrios, o trabalho era
feito figura a figura e invariavelmente tnhamos a perda das
configuraes originais. Agora, basta abrirmos a pasta Media
(dentro do arquivo zip, na pasta xl) e pegarmos os arquivos
(Figura 11).
Figura 13 - Pasta de trabalho do Excel

ESTILOS DE REPRESENTAO DE CLULAS


A1
Por padro, as linhas do Excel so representadas por nmeros e
as colunas por letras. Este estilo de referncia chamado de A1,
pois traz a interseco de uma coluna (A) com uma linha (1).
Veja alguns exemplos deste tipo de notao:

Figura 11 - Pasta com as figuras originais do arquivo

Para se referir a:

Use:

Clula da coluna A na linha 10

A10

Intervalo de clulas na coluna A, entre as linhas 10 e 20

A10:A20

Intervalo de clulas na linha 15, entre as colunas B e E

B15:E15

Todas as clulas da linha 5

5:5

Todas as clulas da linha 5 at a linha 10

5:10

Todas as clulas da coluna H

H:H

PASTAS DE TRABALHO E PLANILHAS

Todas as clulas da coluna H at a coluna J

H:J

Um documento do Excel comumente chamado de planilha por

Intervalo de clulas das colunas A at E e das linhas 10 at 20 A10:E20

ESTRUTURA DO EXCEL

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

31

Office Bsico
Office
Bsico
Por ser o padro do Excel, estilo A1 o utilizado pela grande
maioria dos usurios.

L1C1

ber que a coluna X est 12 posies frente de L, e que a coluna AJ est 12 posies frente de X? Seguramente no.
Usando a notao L1C1, a funo teria a seguinte sintaxe:
=RC[-25]+RC[-13]+RC[-1]

Um outro estilo de representao de clulas suportado pelo Excel


o L1C1 (tambm chamado de R1C1). Neste estilo, tanto as
linhas como as colunas so representadas por nmeros (Figura
14). Se voc selecionar a nona linha da quinta coluna, por exemplo, o endereo da clula ser L9C5.

Pela posio relativa das colunas, fica fcil saber que elas esto
posicionadas com 12 unidades de diferena (Figura 16).

Figura 16 - Frmula com referncias relativas


Figura 14 - Estilo de referncia L1C1

O estilo L1C1, embora bastante simples, costuma ser usado apenas por usurios mais avanados. Ele torna mais produtivo e
confivel o trabalho de criar e conferir frmulas, pois as posies
das colunas so representadas por nmeros, no por letras, o
que facilita sua localizao e a noo de seu posicionamento.
Veja alguns exemplos deste tipo de notao:
A referncia

Significa

R[-2]C

Uma referncia relativa a duas linhas acima, na mesma coluna.

R[2]C[2]

Uma referncia relativa a duas linhas abaixo e duas coluna

Para escolher a notao a ser usada, clique no menu File (representado pelo cone do Office) e no boto Excel Options. Ser
aberta a janela de opes do Excel, onde voc deve escolher a
guia Formulas. Na seo Working with formulas, assinale o item
R1C1 reference style (Figura 17).

direita.
R2C2

Uma referncia absoluta clula da segunda linha na


segunda coluna.

R[-1]

Uma referncia linha (inteira) acima da clula ativa.

Uma referncia linha (inteira) da clula ativa.

Imagine uma planilha com 36 colunas, divididas da seguinte


forma: janeiro a dezembro do Ano 1, janeiro a dezembro do Ano
2 e janeiro a dezembro do Ano 3 (Figura 15).

Figura 17 - Ativando o estilo de referncia L1C1 no Excel 2007

Nas verses anteriores do Excel, a configurao feita a partir


do menu Ferramentas Opes, guia Geral, assinalando a caixa
Estilo de referncia L1C1 (Figura 18).

Figura 15 - Planilha com 36 colunas de valores

Imagine agora que na coluna 37 o usurio queira totalizar os


valores dos trs meses de dezembro. A frmula =L3+X3+AJ3
seria suficientemente clara para o usurio bater os olhos e sa-

32

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Figura 18 -Ativando o estilo de referncia L1C1 no Excel 2003

WWW.FORUMACCESS.COM.BR

Office Bsico
QUANTIDADE DE LINHAS E COLUNAS
O Excel 2007 tem 16.384 colunas (vai da coluna A at a coluna
XFD) e 1.048.575 linhas (Figura 19).

Figura 21 - Listando o nome de todas as planilhas

ZOOM NA TELA

Figura 19 - ltima clula de uma planilha do Excel 2007: XFD1048576

Sua capacidade de armazenamento extremamente superior a


das outras verses do Excel, em que tnhamos 256 colunas (A
at IV) e 65.536 linhas.
Esse grande aumento de capacidade deve ser visto com cautela. Se, por um lado, resolve a limitao de usurios que necessitam trabalhar com um grande volume de dados, por outro abre
margem a um uso indevido do Excel, transformando-o em um
grande banco de dados no-relacional.
Para armazenamento, indexao e relacionamento de um maior
volume de dados, devem ser usadas ferramentas prprias de
banco de dados, como o Microsoft Access ou Microsoft SQL
Server, capazes de alimentar o Excel com dados j filtrados e
agrupados.
Para o prprio usurio, um volume exagerado de dados dificulta o trabalho: uma simples planilha com 10.000 linhas pode ser
suficiente para tornar a navegao improdutiva.

EXIBINDO O NOME DE TODAS AS PLANILHAS


O nome de cada planilha fica exibido na sua aba inferior. Quando uma pasta de trabalho tem muitas abas, possvel
visualiz-las com auxlio das setas localizadas ao lado das
guias (Figura 20).

Dependendo da quantidade de informaes contidas na tela,


o zoom padro (100%) pode no ser o mais adequado.
comum o usurio querer exibir mais colunas do que as que
aparecem na tela, o que feito pela reduo do zoom.
O Excel 2007 traz na parte inferior direita da tela uma barra de
zoom, que o caminho mais rpido para ajustar o tamanho da
tela (Figura 22).

Figura 22 - Barra de zoom

Nas verses anteriores do Excel, o zoom ajustado a partir do


menu Exibir View.

A NOVA INTERFACE DO EXCEL 2007


Com o objetivo de melhorar a usabilidade, todos os aplicativos
do Office 2007 tiveram uma grande mudana na interface.
Nas verses anteriores do Office, usamos os menus, barras de
ferramentas, painel de tarefas (que a barra lateral presente no
Office XP e no Office 2003) e caixas de dilogo para acessar as
funcionalidades do aplicativo.
Embora essa estrutura funcione bem, no a mais adequada
quando h um grande nmero de comandos disponveis, pois
fica difcil encontr-los.
Assim, para melhorar a facilidade de se encontrar os comandos, e tambm para evitar a perda do foco no documento, a
interface foi redesenhada.

NOVOS ELEMENTOS
Veja alguns dos novos elementos criados na interface do Office 2007:
Figura 20 - Setas para rolagem horizontal das abas

RIBBON
O ribbon um elemento que contm diversos comandos, divididos em guias (abas) conforme a funcionalidade (Figura 23).

Dica: para no precisar fazer rolagem horizontal das abas,


uma dica til clicar com o boto direito do mouse sobre as setas. A lista com o nome de todas as planilhas
ser exibida e voc poder selecionar qualquer uma para
abrir (Figura 21).

Figura 23 - Ribbon do Excel

Cada guia dividida em grupos menores, chamados Chunks


(exemplo: Clipboard, Font, Alignment, etc.).

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

33

Office Bsico
Office
Bsico
CONTEXTUAL TABS
Dependendo do objeto em que o usurio est trabalhando, o ribbon
pode exibir guias de contexto. Se, por exemplo, voc selecionar
um grfico na tela, aparecer a guia de contexto Chart Tools, com
as abas Design, Layout e Format (Figura 24); se selecionar uma
tabela, aparecer a guia de contexto Table Tools, com a aba Design.

Figura 24 - Guia de contexto Chart Tools

Figura 27 - Caixa de dilogo tradicional

LIVE PREVIEW
Ao passar o mouse sobre itens de uma galeria, possvel ver na
tela o resultado da seleo, sem que para isto o usurio precise
confirmar clicando no OK (Figura 28).

Figura 25 - Guia de contexto Table Tools

Em verses anteriores do Office, esses comandos ficam mais


escondidos, sendo difcil ao usurio encontr-los.

GALLERIES

Figura 28 - Live Preview de formatao condicional

As galerias so janelas que substituem, de forma visual (Figura


26), as antigas caixas de dilogo que continham listas de opes. Trata-se de um importante recurso da nova interface, pois
facilita bastante o trabalho do usurio.

CONCLUSO
Neste artigo mostrei as principais novidades na estrutura e na
interface do Excel 2007, que mudou consideravelmente em relao verso 2003. O produto deve ser lanado pela Microsoft
no incio do ano que vem.

Para se aprofundar
http://www.microsoft.com/brasil/2007office/default.mspx

Figura 26 - Galerias
* Luiz Cludio C. V. Rocha (luiz@mvps.org) coordenador de projetos da

As caixas de dilogo continuam disponveis para quem precisa


fazer configuraes mais detalhadas (Figura 27).

34

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

FrumAccess, Microsoft Most Valuable Professional, MCP e autor dos cursos


Access Professional Kit e VSTO Professional Kit

WWW.FORUMACCESS.COM.BR

Office Bsico

Quer ajudar o meio ambiente?


Use sua impressora virtual!
Maurcio Martins *

MUDAR PEQUENOS HBITOS DE NOSSA ROTINA,


AOS QUAIS MUITAS VEZES NEM DAMOS ATENO,
PODE FAZER MUITA DIFERENA E AJUDAR NA PRESERVAO DO MEIO AMBIENTE.
EM TODO O PLANETA, CONTINUA MUITO GRANDE O
DESPERDCIO DE PAPEL, E EXISTE UMA FORMA MUITO SIMPLES DE DIMINUIRMOS ESTE PROBLEMA:
BASTA QUE TODOS PASSEM A USAR SEMPRE UMA
IMPRESSORA VIRTUAL, COMO EXPLICAREMOS NESTE BREVE TUTORIAL, FOCADO NO PBLICO DE
DESENVOLVEDORES, MAS QUE PODE SER FACILMENTE ADOTADO EM DIVERSAS COMUNIDADES DE
USURIOS.
As duas regras que devemos ter sempre em mente so:
Figura 1 O arquivo MDI sendo salvo

1 - NUNCA use impressora de papel para fazer testes de relatrios de sistemas em desenvolvimento, a no ser
em casos de absoluta necessidade. Imprima sempre em tela.
2 - Em caso de documentos comuns, que precisaro ser impressos em papel de qualquer forma, faa sempre uma impresso virtual antes, como teste.

Basta escolher o local e clicar em Salvar.


Depois de salvo, o documento ser aberto automaticamente para
sua avaliao, atravs do programa Microsoft Office Document
Imaging. Cheque para ver se a impresso est de acordo com o
esperado. Se houver algo errado, faa os ajustes necessrios e
volte a imprimir virtualmente, at que o resultado seja satisfatrio.

VEJA COMO USAR A IMPRESSORA VIRTUAL DO OFFICE


Se voc tem o Office instalado na sua mquina, basta realizar os procedimentos abaixo:
Passo 1 Configure a impressora virtual como impressora padro
Clique no boto Iniciar do Windows e v at Impressoras e
Aparelhos de fax (Printers and Faxes). Clique com o boto
direito no item Microsoft Office Document Image Writer e
em Definir como impressora padro (Set As Default Printer).
Passo 2 Usando a impressora virtual
Imprima o documento desejado. Como a impressora padro a virtual, voc ver uma tela como esta, perguntando onde voc quer salvar a impresso em tela (arquivo
com extenso MDI):

FRUMACCESS

Figura 2 A impresso sendo visualizada em tela

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

35

Office Bsico
Office
Bsico
Esse o procedimento que deve ser sempre seguido para testar
relatrios de um sistema em desenvolvimento.
Em caso de documentos comuns do escritrio, como arquivos
de Word, Excel e PowerPoint, voc desejar, depois disso, fazer
uma impresso real, em papel. Para isso, siga o passo 3.

IMPRESSORA VIRTUAL DO ACROBAT


Ao usar o Acrobat, voc pode usar tambm a impressora virtual deste aplicativo, o Adobe PDF Printer. Alm disso, o Acrobat tambm
imprime usando o Document Image Writer do Office. Veja abaixo o
Acrobat sendo configurado para usar sua prpria impressora virtual.

Passo 3 Imprimindo de verdade


Com o teste realizado, vamos imprimir em papel. V em Arquivo/Imprimir e altere a impressora a ser usada para um equipamento real, como mostra a figura abaixo:

Figura 4 A impressora virtual do Acrobat

CONCLUSO
Como se v, no nada complicado. uma atitude simples que, seguida por muitos, faz uma imensa diferena. Portanto, no se esquea: da
prxima vez que for imprimir, use sempre uma impressora virtual!
Figura 3 Alterando para uma impressora de verdade

* Maurcio Martins (mauricio.martins@forumaccess.com.br) jornalista e atuou


como editor de diversos sites e revistas na rea de Internet e Tecnologia.

36

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Office Bsico

Usando Automao em Access 2003


para trabalhar com o Outlook 2003
Frank Rice *
Traduo: Maurcio Martins **

Artigo para Access 2003

AUTOMAO O PROCESSO DE CONTROLAR UM PRODUTO


A PARTIR DE OUTRO PRODUTO, COM O RESULTADO QUE O
PRODUTO CLIENTE POSSA USAR OS OBJETOS, MTODOS E
PROPRIEDADES DO PRODUTO SERVIDOR. POR EXEMPLO, NO
MICROSOFT OFFICE, COM AUTOMAO, VOC USA O
ACCESS PARA GANHAR ACESSO AOS MTODOS DO OUTLOOK
2003 PARA REALIZAR AES COMO ENVIO DE MENSAGENS,
CRIAR UM COMPROMISSO OU CONFIGURAR UM LEMBRETE.
ESTE ARTIGO DISCUTE ESTES CENRIOS EM DETALHES, FORNECENDO CDIGO EM VISUAL BASIC FOR APPLICATIONS
(VBA) PARA ILUSTRAR DIFERENTES TCNICAS.

ENVIANDO UM E-MAIL DO OUTLOOK PROGRAMATICAMENTE

ENVIE UMA MENSAGEM PELO OUTLOOK USANDO ACCESS

Obs: Se a biblioteca em questo no aparecer na caixa Referncias Disponveis, faa o seguinte:


No Painel de Controle do Windows, d um duplo clique em
Adicionar ou Remover Programas.
Na lista de programas instalados, selecione Microsoft Office
2003 e ento clique em Alterar. O programa de instalao do
Office ser iniciado em modo de manuteno.
Clique em Reinstalar ou Reparar e, ento, clique em Avanar.
Clique em Detectar e reparar erros na minha instalao do
Office e, ento, clique em Instalar.

Enviar um e-mail pelo Outlook uma das mais importantes aes


que voc deve realizar em sua aplicao.
Voc pode usar o mtodo SendObject para enviar uma mensagem de e-mail MAPI, programaticamente, pelo Access. No entanto, o SendObject no lhe dar acesso completo s funcionalidades de e-mail, como a possibilidade de anexar um arquivo
externo ou configurar a prioridade da mensagem. O exemplo a
seguir usa automao para criar e enviar uma mensagem que
voc pode usar para tirar proveito dos muitos recursos do
Outlook que no esto disponveis com o mtodo SendObject.
H seis passos principais para enviar uma mensagem do Outlook
usando automao:

1. Crie um texto de exemplo em um arquivo chamado


Customers.txt na pasta Meus Documentos.
2. Inicie o Access e crie um banco de dados chamado
Automacao.mdb.
3. Crie um mdulo e digite a linha a seguir na seo de
Declarao, se ela ainda no estiver presente:
Option Explicit

4. No menu Ferramentas, clique em Referncias.


5. Na caixa de Referncias, selecione o Microsoft Outlook 11.0
Object Library e clique em OK.

6. Clique em Ok para fechar a janela de Referncias.


7. Digite ou cole o cdigo a seguir no novo mdulo.
Sub sbSendMessage(Optional AttachmentPath)

1. Inicialize a sesso do Outlook


2. Crie a mensagem
3. Adicione os destinatrios (To, Cc e Bcc) e resolva seus nomes
4. Configure propriedades vlidas, como Assunto, Corpo e Prioridade
5. Adicione anexos (se houver)
6. Mostre e envie a mensagem

Dim objOutlook As Outlook.Application


Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim objOutlookAttach As Outlook.Attachment

On Error GoTo ErrorMsgs

' Cria a sessao do Outlook


Set objOutlook = CreateObject("Outlook.Application")

DISPONVEL PARA DOWNLOAD

' Cria a mensagem

AUTOMACAO.EXE (ACCESS 2003)

Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

Disponvel para download em www.forumaccess.com.br

With objOutlookMsg
' Adicione os destinatrios To mensagem. Substitua os nomes aqui

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

37

Office Bsico
Office
Bsico
Set objOutlookRecip = .Recipients.Add("Nancy Davolio")
objOutlookRecip.Type = olTo
' Adicione os destinatrios Cc mensagem
Set objOutlookRecip = .Recipients.Add("Andrew Fuller")
objOutlookRecip.Type = olCC
' Configura o Assunto, Corpo e Prioridade da mensagem
.Subject = "This is an Automation test with Microsoft Outlook"
.Body = "Last test." & vbCrLf & vbCrLf
.Importance = olImportanceHigh 'High importance

Figura 2 Confirmao de envio automtico

Adiciona um anexo mensagem

8. Para testar esse procedimento, escreva a seguinte linha na


Immediate Window (Verificao Imediata), no Visual Basic Editor, e pressione Enter:

If Not IsMissing(AttachmentPath) Then


Set objOutlookAttach = .Attachments.Add(AttachmentPath)
End If
' Resolve cada nome de destinatrio
For Each objOutlookRecip In .Recipients

sbSendMessage "C:\Documents and Settings\UserName\My

If Not objOutlookRecip.Resolve Then

Documents\Customers.txt"

objOutlookMsg.Display

9. Para enviar a mensagem sem especificar nenhum anexo, omita


o argumento ao charmar o procedimento, como segue:

End If
Next
.Send

sbSendMessage

End With
Set objOutlookMsg = Nothing

ADICIONANDO COMPROMISSOS NO OUTLOOK

Set objOutlook = Nothing

Esta seo mostra como criar compromissos em um banco de


dados Access e como usar automao para adicionar os compromissos em um calendrio do Outlook.

Set objOutlookRecip = Nothing


Set objOutlookAttach = Nothing
ErrorMsgs:
If Err.Number = "287" Then

1. No Arquivo Automacao.mdb, use a informao a seguir para


criar uma tabela chamada tblAppointments:

MsgBox "You clicked No to the Outlook security warning. " & _


"Rerun the procedure and click Yes to access e-mail" & _
"addresses to send your message. For more information, & _

Nome do campo

"see the document at http://www.microsoft.com/office" & _


"/previous/outlook/downloads/security.asp. "

Tipo de

Tamanho

dados

do campo
50

Else

Appt

Texto

MsgBox Err.Number & vbCrLf & Err.Description

ApptStartDate

Data/Hora

Formato

Valor

Requerido
Sim

Data

Sim

abreviada

End If

ApptEndDate

End Sub

Data/Hora

Data

Sim

abreviada

Obs: Devido ao Outlook E-mail Security Update, quando voc


roda os procedimentos seguintes, voc ser avisado diversas
vezes para permitir o acesso aos seus endereos de e-mail, havendo ainda um aviso antes de enviar sua mensagem (veja as
figuras a seguir). Esse um comportamento esperado.

ApptTime

Data/Hora

Hora

Sim

Normal
ApptLength

Nmero

Inteiro

15

Sim

Longo
ApptNotes

Memorando

ApptLocation

Texto

ApptReminder

Sim/No

ReminderMinutes Nmero

No
50

No
No

Inteiro

15

No

Longo
AddedToOutlook

Figura 1 O Outlook pede sua permisso para continuar

38

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Sim/No

No

2. Configure os campos ApptStartDate e o ApptTime como chaves primrias concatenadas (selecione os dois campos e
clique em Chave Primria). Feche e salve a tabela.
Obs: Neste exemplo, a chave primria na tabela de compromissos composta pela data e hora do compromisso. Voc pode

WWW.FORUMACCESS.COM.BR

Office Bsico
remover ou mudar a chave primria se voc quiser adicionar
mltiplos compromissos para a mesma data e hora.
3. Use o assistente - para criao de formulrios - para criar um
formulrio baseado na tabela tblAppointments e salve o form
como frmAppointments.
4. Abra o frmAppointments em modo Design e mude as seguintes propriedades:
Propriedade do formulrio: Legenda Formulrio de Compromisso
Cabealho do formulrio: Altura 1cm
AddedToOutlook Checkbox: Ativado No
5. Adicione um CommandButton ao cabealho e configure as
seguintes propriedades:
Nome: cmdAddAppt
Legenda: Envie ao Outlook
Largura: 4cm
6. Configure o evento Ao clicar do CommandButton para o
seguinte procedimento:
Private Sub cmdAddAppt_Click()
On Error GoTo Add_Err
'Salva registro antes para ter certeza de que os campos requeridos 'esto

End With
.Save
.Close (olSave)
End With
'Release the AppointmentItem object variable.
Set objAppt = Nothing
End If
'Libera as variveis
Set objOutlook = Nothing
Set objRecurPattern = Nothing
'Configura a flag AddedToOutlook, salva o registro e mostra uma 'mensagem
Me!AddedToOutlook = True
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Appointment Added!"
Exit Sub
Add_Err:
MsgBox "Error " & Err.Number & vbCrLf & Err.Description
Exit Sub
End Sub

7. Salve o Form como frmAppointments, abra-o com modo de


formulrio e adicione as seguintes informaes para criar um
novo registro de compromisso:

preenchidos
DoCmd.RunCommand acCmdSaveRecord

Appt: Reunio de oramento

'Sai do procedimento se o compromisso j foi adicionado ao Outlook

ApptStartDate: <adicione o dia de amanh>

If Me!AddedToOutlook = True Then

ApptEndDate: <adicione o dia de amanh>

MsgBox "This appointment is already added to Microsoft Outlook"

ApptTime: 02:00 PM

Exit Sub

ApptLength: 120

'Adicione um novo compromisso

ApptNotes: Comear a discusso do oramento do prximo ano

Else

ApptLocation: Sala de Reunio

Dim objOutlook As Outlook.Application

ApptReminder: <marque a caixa de seleo>

Dim objAppt As Outlook.AppointmentItem

ReminderMinutes: 15

Dim objRecurPattern As Outlook.RecurrencePattern

Obs: Adicione ApptLenght em minutos, no em horas. Observe


que, nesse exemplo, colocamos 120 minutos, em vez de 2 horas.

Set objOutlook = CreateObject("Outlook.Application")


Set objAppt = objOutlook.CreateItem(olAppointmentItem)
With objAppt
.Start = Me!ApptStartDate & " " & Me!ApptTime

8. Clique em Enviar ao Outlook, inicie o Outlook e veja os compromissos de amanh no seu calendrio.

.Duration = Me!ApptLength
.Subject = Me!Appt
If Not IsNull(Me!ApptNotes) Then .Body = Me!ApptNotes
If Not IsNull(Me!ApptLocation) Then .Location = Me!ApptLocation
If Me!ApptReminder Then
.ReminderMinutesBeforeStart = Me!ReminderMinutes
.ReminderSet = True
End If
Set objRecurPattern = .GetRecurrencePattern
With objRecurPattern
.RecurrenceType = olRecursWeekly
.Interval = 1
'Once per week
'You can hard-wire in these dates or get the
'information from text boxes, as used here.
'.PatternStartDate = #12/1/2003#
.PatternStartDate = Me!ApptStartDate
'.PatternEndDate = #12/30/2003#

Figura 3 O formulrio preenchido

.PatternEndDate = Me!ApptEndDate

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

39

Office Bsico
Office
Bsico
ADICIONE UMA TAREFA OU UM LEMBRETE AO OUTLOOK
Ns podemos querer adicionar uma tarefa ou um lembrete de
forma programtica no Outlook a partir do Access. Esta seo
fornece cdigo de exemplo que permite a voc criar uma tarefa
e tocar um arquivo WAV como um lembrete sonoro.
Obs: No cdigo a seguir, voc deve apontar a propriedade
.ReminderSoundFile para um som vlido em seu HD. O exemplo usa o arquivo C:\Windows\Media\Ding.wav.
Realize os seguintes passos:
1. Crie um mdulo adicional no Automacao.mdb.
2. Digite ou cole o seguinte procedimento em VBA:

do em nenhuma tabela ou consulta, adicione um command


button e configure as seguintes propriedades:
Formulrio: (salvo como frmOutlook) - Legenda: Formulrio
Adicione ao Outlook
Command button:
Nome: cmdOutlook
Legenda: Inicie o Outlook
2. Digite o seguinte cdigo no evento Ao clicar do boto:
Private Sub cmdOutlook_Click()
On Error GoTo StartError
Dim objOutlook As Object

Option Compare Database

Dim objItem As Object

Option Explicit

'Cria um objeto Microsoft


Set objOutlook = CreateObject("Outlook.Application")

Function fncAddOutlookTask()
Dim OutlookApp As Outlook.Application

'Cria e abre um formulrio para um novo contato

Dim OutlookTask As Outlook.TaskItem

Set objItem = objOutlook.CreateItem(olContactItem)


'Para criar um novo compromisso, entrada no dirio, email, 'anotao, post

Set OutlookApp = CreateObject("Outlook.Application")

ou tarefa, substitua olContactItem, acima, por um dos 'seguintes:

Set OutlookTask = OutlookApp.CreateItem(olTaskItem)

'Compromisso = olAppointmentItem

With OutlookTask
.Subject = "This is the subject of my task"

'Entrada de dirio = olJournalItem

.Body = "This is the body of my task."

'Email = olMailItem

.ReminderSet = True

'Anotao = olNoteItem

'Remind 2 minutes from now.

'Post = olPostItem

.ReminderTime = DateAdd("n", 2, Now)

'Tarefa = olTaskItem

'Due 5 minutes from now.

objItem.Display

.DueDate = DateAdd("n", 5, Now)

'Fecha o Outlook

.ReminderPlaySound = True

Set objOutlook = Nothing

'Modify path.

Exit Sub
StartError:

.ReminderSoundFile = "C:\Windows\Media\Ding.wav"

MsgBox "Error: " & Err & " " & Error

.Save

Exit Sub

End With

End Sub

End Function

3. Para testar esta funo, digite a linha a seguir na janela de


Verificao Imediata e pressione Enter:
?fncAddOutlookTask()

3. Abra o form em modo formulrio e clique em Inicie o Outlook.


Repare que o Outlook mostrar uma tela de novo contato.
4. Preencha as informaes do contato e clique em Salvar e fechar.
5. Volte a iniciar o Outlook e entre na seo de Contatos. Note
que o contato j aparece na lista.

4. Inicie o Outlook para ver a nova Tarefa.

CONCLUSO
CRIE UM ITEM DE CONTATO NO OUTLOOK
Esta seo mostra como usar automao em um Form do Access
para iniciar o Outlook e mostrar um novo Contato a ser inserido.
Voc pode mudar apenas uma linha do cdigo para fazer este exemplo funcionar para um novo Compromisso, entrada do Dirio, mensagem de e-mail, anotao, post ou tarefa.
O exemplo mostra como criar um formulrio no Access que roda o
Outlook a partir de um boto de comando. Ento, o cdigo de
automao abre uma tela de novo contato para insero de dados.
Depois que voc adiciona o contato, salva e fecha o formulrio, o
cdigo fecha o Outlook e retorna para o formulrio inicial no Access.
Siga os passos abaixo:
1. No Automacao.mdb, crie um formulrio que no est basea-

40

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Este artigo apresentou diferentes tcnicas para usar automao


trabalhando com o Outlook a partir do Access. Automao
uma tecnologia poderosa que fornece mecanismos para que um
programa controle outro com a configurao e leitura de propriedades em objetos e chamada de mtodos. Usar automao
permite a voc combinar programas em suas aplicaes para
oferecer muito mais possibilidades aos seus clientes.
* Frank Rice acumulou vasta experincia como desenvolvedor e engenheiro de
suporte em aplicaes Access. Atua hoje na Microsoft na criao de documentao para programadores, em especial, para o Office Developer Center.

** Maurcio Martins (mauricio.martins@forumaccess.com.br) jornalista e


atuou como editor de diversos sites e revistas na rea de Internet e Tecnologia.

WWW.FORUMACCESS.COM.BR

.NET

Criando um Custom Control para


Windows Forms
Gabriel Brenner *

Artigo para Visual Studio 2005


Pr-requisitos: Conhecimentos de Programao com .NET Framework

O ARTIGO ABORDAR A CRIAO DE UM CONTROLE PARA


AUXILIAR O TRABALHO DE MLTIPLA VALIDAO DOS DADOS EM FORMULRIOS WINDOWS FORMS, APRESENTANDO AO LEITOR UM CONTROLE PROFISSIONAL E TIL PARA
SER UTILIZADO EM SEU DIA-A-DIA. COM OS CONCEITOS
ABORDADOS NESSE ARTIGO, O LEITOR SER CAPAZ DE
CRIAR SEUS PRPRIOS COMPONENTES PARA AS MAIS DIVERSAS FUNCIONALIDADES.

REDUZINDO E PADRONIZANDO O DESENVOLVIMENTO


Como sabemos, a utilizao de componentes prontos, fabricados pela prpria equipe ou adquiridos de terceiros, padroniza,
aumenta a qualidade e agiliza o processo de criao e manuteno de software. O componente que ser criado neste artigo
pode ser utilizado pelo leitor como ponto de partida para a criao dos mais diversos tipos de componentes Windows, permitindo ao mesmo agilizar o seu processo de criao e simplificar
o de manuteno.
Com o componente criado, as aplicaes que precisarem fazer
validaes em suas entradas de dados sero todas codificadas
da mesma forma, j que utilizaro o mesmo componente, o que
simplifica a manuteno para a equipe de desenvolvimento.
A validao de entradas de dados um trabalho repetitivo e cansativo para os desenvolvedores e, como todo trabalho repetitivo
em desenvolvimento, pode-se isolar as caractersticas comuns
e parametrizar as especficas, criando um cdigo menos passvel de erros, com maior qualidade, tornando com isso o cdigo repetitivo em cdigo reaproveitvel.
com esses fundamentos que devemos isolar funcionalidades
em objetos separados, visando sempre tornar uma rotina especfica reaproveitvel, aumentando sua reutilizao e padronizando a codificao dos sistemas. Como resultado, o controle passar a ser utilizado em massa e o cdigo sempre estar em um
mesmo local, muito menos suscetvel a erros que tendem a zero
com o seu aperfeioamento.

PLANEJANDO O CONTROLE
O componente que est sendo criado receber uma coleo
de controles atravs de sua interface e, cada controle, ser manipulado pelo validador. O controle que estamos criando prev a validao de um grupo de controles (coleo) e tratar o
conjunto. Cada controle que for adicionado coleo receber sua configurao atravs das propriedades disponveis e
poder ser manipulado de acordo com as funcionalidades expostas pelo mesmo.
Aps a definio de como o validador receber os controles,
necessrio isolar as atividades que sero exercidas pelo mesmo. No caso de validao de entradas de dados, essas atividades so muito bem definidas e facilmente isolveis. Este artigo
mostra as atividades atravs de uma tabela contendo todas as
responsabilidades que o controle possui, definindo assim os
requisitos para o seu desenvolvimento. Poderia ser utilizado UML
para definir o funcionamento do controle, no entanto, neste artigo, utilizaremos uma tcnica mais simples baseada em tabelas
e descrio das funcionalidades. As funcionalidades que o controle possuir so detalhadas na Tabela 1.
Funcionalidade
HabilitaControles

Descrio
Habilita ou desabilita o conjunto de controles passado
para o componente.

LimpaControles

Limpa a propriedade Text dos controles passados para


o componente.

isValid

Retorna True/False de acordo com as obrigaes dos


controles. Faz o conjunto de validaes em todos os
controles passados, verificando se o contedo est de
acordo com a responsabilidade atribuda aos mesmos.

Controle Numrico

Atribui ao Handle do evento Key_Press do controle


passado um evento pr-programado que no permite
a digitao de caracteres texto.

Controle Moeda

Atribui ao Handle do evento Key_Press do controle


passado um evento pr-programado que no permite
a digitao de caracteres texto e somente um
determinado nmero de casas decimais (uma vrgula e
a quantidade de casas decimais especificadas para o
controle).

DISPONVEL PARA DOWNLOAD

Controle Data

VALIDADORWINDOWS.ZIP (VISUAL STUDIO 2005)


Disponvel para download em www.forumaccess.com.br

Verifica se o contedo do controle uma Data, Hora ou


ambos vlidos. Atribui ao Handle do evento Leave do
controle passado um evento pr-programado que

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

41

.NET.NET
estiver vazio, permite que o foco saia do controle, caso

3. Exclua a classe padro criada pelo IDE


4. Adicione uma Component Class

contrrio, mantm o foco at que uma data/hora vlida

Lista 1 Criando um projeto de componente

verifica se o contedo uma data vlida e, se for ou

seja colocada ou o contedo seja apagado.


Controle CPF

O controle, ao ser marcado como CPF, ter o seu


contedo validado na execuo do mtodo IsValid do
componente de acordo com a rotina de validao de
CPF.

Controle CNPJ

O controle, ao ser marcado com CNPJ, ter o seu


contedo validado na execuo do mtodo IsValid do
componente de acordo com a rotina de validao de
CNPJ.

Controle CPF/CNPJ

O controle, ao ser marcado como CPF/CNPJ, ter seu


contedo validado na execuo do mtodo IsValid e
ser considerado como vlido quando seu contedo
tiver um CPF ou um CNPJ vlido.

Requerido

Se o contedo do controle, ao ser marcado como


requerido na execuo do mtodo IsValid do controle,
no estiver preenchido, o usurio receber o aviso
atravs de uma caixa de mensagem de que o controle
obrigatrio e o foco ser colocado sobre o mesmo.

OuExclusivo

comum em uma aplicao existirem grupos de


componentes que devam ter somente um de seus

Objetos do tipo Component Class no so desenhados no form


e no possuem interface ou interao com o usurio diretamente. Eles servem para agrupar funes e ficam disponveis para
uso do desenvolvedor. Essa talvez seja a grande vantagem desse tipo de componente, que disponibiliza as funcionalidades de
forma simples para o desenvolvedor.
Nosso novo controle receber uma coleo de controles e o
objetivo que essa coleo possa ser manipulada pela prpria
janela de propriedades da IDE. Para isso, a coleo precisar
herdar as caractersticas da classe CollectionBase. No entanto,
a implementao direta de uma coleo de controles no seria
suficiente para atribuir funcionalidades aos mesmos, j que os
controles passados no possuem as propriedades necessrias
para que sejam configurados de acordo com a necessidade de
funcionamento de cada um. Para atender a esses requisitos torna-se necessrio criar um objeto que represente cada um dos
controles que ser passado para o validador. A Lista 2 contm o
cdigo de criao da classe MyControl. Adicione a referncia
System.Windows.Forms no seu projeto.

campos preenchidos. Essa situao conhecida como


Ou Exclusivo, ou seja, ou um ou outro controle deve

Imports System.ComponentModel

estar preenchido, no sendo permitido que ambos

Public Class MyControl

estejam. Ao adicionar grupos ou exclusivos no

Legenda

Private lControle As System.Windows.Forms.Control = Nothing

validador, ser obrigao do mesmo identificar quando

Private lControlesOuExclusivo As New SubControlCollection

a situao no estiver sendo atendida, ou seja, quando

Private lNomeCampo As String = ""

todos os controles no estiverem preenchidos ou

Private lRequerido As Boolean = False

quando mais de um estiver.

Private lTipoCampo As enumTipoCampo = enumTipoCampo.SemTipo

Descrio para os controles passados para ser

Private lDecimalPlaces As Byte = 0

utilizada nas mensagens enviadas pelo validador para o

Private lCPFCNPJ As enumCPFCNPJ = enumCPFCNPJ.NaoValida

usurio final. Caso no seja preenchida, essa

Public Enum enumCPFCNPJ

propriedade automaticamente assumir o nome dado

NaoValida = 0

ao controle.

SomenteCPF = 1
SomenteCNPJ = 2

Tabela 1 Lista de Funcionalidades do Controle ValidadorWindows

Ambos = 3

Uma vez identificadas as funcionalidades que o controle possuir, pode-se comear o trabalho de codificao do mesmo.

End Enum
Public Enum enumTipoCampo
SemTipo = 0

CODIFICANDO A SOLUO

SomenteData = 1

O projeto, ao contrrio do que possa parecer, no ser do tipo


WindowsControlLibrary. Controles desse tipo so desenhados
no formulrio e o componente, que o artigo criar, ter o funcionamento similar ao ToolTip ou ao ImageList e ficar alocado
na parte inferior da IDE, no pertencendo ao layout da janela,
ficando disponvel para que a mesma utilize. Para criar um componente dessa forma, siga os passos ilustrados na Lista 1.

SomenteHora = 2
DataHora = 3
Numerico = 4
End Enum
Public Property Controle() As System.Windows.Forms.Control
Get
Return lControle
End Get

1. Inicie o Visual Studio 2005


2. Crie um projeto do tipo ClassLibrary utilizando a linguagem
Visual Basic

42

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Set(ByVal Value As System.Windows.Forms.Control)


lControle = Value

WWW.FORUMACCESS.COM.BR

.NET
lNomeCampo = lControle.Name
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property ControlesOuExclusivo() As SubControlCollection
Get
Return lControlesOuExclusivo
End Get
End Property

Public Property NomeCampo() As String


Get
Return lNomeCampo
End Get
Set(ByVal Value As String)
lNomeCampo = Value
End Set
End Property
Public Property Requerido() As Boolean
Get
Return lRequerido
End Get
Set(ByVal Value As Boolean)
lRequerido = Value
End Set
End Property
Public Property TipoCampo() As enumTipoCampo
Get
Return lTipoCampo
End Get
Set(ByVal Value As enumTipoCampo)
lTipoCampo = Value
End Set
End Property
Public Property DecimalPlaces() As Byte
Get

Essa classe contm a estrutura de cada controle que ser adicionado ao validador atravs da janela de propriedades do IDE.
Cada item adicionado, receber o controle que ser validado
atravs da propriedade Controle. A propriedade
ControlesOuExclusivo recebe uma coleo de controles que
sero utilizados para esse tipo de validao e, as demais propriedades, configuram o controle passado, que passar a se comportar de acordo com o valor das propriedades. Os enumeradores
so utilizados para auxiliar o trabalho de configurao na janela
de propriedades aps o objeto estar pronto.
Um dos grandes problemas de manter colees de controles
ter que informar como os mesmos sero serializados, seno o
IDE se perde na hora de criar e manter os valores das propriedades. Para que as propriedades sejam mantidas necessrio, em
toda a propriedade que corresponder uma coleo, atribuir um
identificador informando o IDE que a propriedade ser serializada
no cdigo (<DesignerSerializationVisibility(Designer
SerializationVisibility.Content)>). Aps essa identificao, ao
adicionar novos controles dentro da propriedade que estiver
identificada dessa forma, o prprio IDE se encarregar de criar
o cdigo necessrio para persistir essa informao.
A coleo de objetos MyControl representado pela classe
ControlCollection, que herda da classe System.Collections.
CollectionBase. A CollectionBase possui uma interface padro
que a IDE do Visual Studio entende e consegue, atravs da
PropertiesWindow, adicionar itens sem um esforo adicional,
o que facilita muito a criao de controles que possuam colees. Classes que herdam suas caractersticas da
CollectionBase possuem automaticamente os mtodos Add,
Insert, Remove, IndexOf, Item e um objeto interno chamado
List, que nada mais do que uma Collection, onde sero adicionados os controles. Como as caractersticas padres da classe sero alteradas, esses mtodos precisaram ser recodificados.
Para melhor entendimento, dividiremos a classe
ControlCollection em 3 partes. A primeira parte da Classe
ControlCollection est ilustrada na Lista 3.

Return lDecimalPlaces
End Get

Imports System.ComponentModel

Set(ByVal Value As Byte)

<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))>

lDecimalPlaces = Value
End Set

_
Public Class ControlCollection

End Property

Inherits System.Collections.CollectionBase

Public Property CPFCNPJ() As enumCPFCNPJ

Public Sub New()

Get
Return lCPFCNPJ
End Get
Set(ByVal Value As enumCPFCNPJ)

MyBase.New()
End Sub
Default Public ReadOnly Property Item(ByVal index As Int32) As MyControl
Get

lCPFCNPJ = Value
End Set
End Property

Return CType(List.Item(index), MyControl)


End Get
End Property

End Class
Lista 2 Classe MyControl

Public Function Add(ByVal Item As MyControl) As Integer

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

43

.NET.NET
seus eventos atravs da utilizao de Delegates. Isso permite
que eventos sejam pr-codificados a controles em tempo de
execuo. Esses eventos foraro o funcionamento dos controles de acordo com suas caractersticas.
A classe ControlCollection possui ainda os eventos que esto
sendo associados aos controles e esto disponveis na Lista 5.

AssociaControle(Item)
Return List.Add(Item)
End Function
Public Sub Remove(ByVal Item As MyControl)
List.Remove(Item)
End Sub
Public Function IndexOf(ByVal value As MyControl) As Integer

Private Sub NumericKeyPress(ByVal sender As Object, ByVal e As

Return List.IndexOf(value)
End Function

System.Windows.Forms.KeyPressEventArgs)

Public Sub Insert(ByVal index As Integer, ByVal value As MyControl)

Private Sub CurrencyKeyPress(ByVal sender As Object, ByVal e As

AssociaControle(value)

System.Windows.Forms.KeyPressEventArgs)

List.Insert(index, value)

Private Sub OnlyDate_Leave(ByVal sender As Object, ByVal e As


System.EventArgs)

End Sub

Private Sub OnlyTime_Leave(ByVal sender As Object, ByVal e As

Lista 3 Primeira parte da Classe ControlCollection

System.EventArgs)

Para que o IDE do Visual Studio entenda qual objeto est sendo
adicionado na PropertiesWindow necessrio informar o seu
tipo. O comando TypeConverterAttribute serve exatamente para
isso, ou seja, ele expe o tipo do objeto de forma que o Visual
Studio no encontrar problemas em manipul-lo. Para evitar
conflitos, todas as colees tero que ter esse identificador, que
possui uma assinatura padro.
Os mtodos Item, Add, Remove, IndexOf e Insert tiveram que
ser modificados e seus parmetros alterados para receberem
controles do tipo MyControl e para associarem o controle aos
seus respectivos eventos. Isso forar o IDE a expor controles
desse tipo na Properties Windows, permitindo a configurao
de cada um dos controles da coleo.
A Segunda parte da classe ControlCollection est ilustrada na
Lista 4 e contm o cdigo que associa o controle com os eventos necessrios para manter sua integridade.

Private Sub DateTime_Leave(ByVal sender As Object, ByVal e As


System.EventArgs)
Lista 5 Eventos associados

O cdigo completo dos eventos pode ser verificado no arquivo


disponvel para download no site da revista (http://
www.forumaccess.com.br/revista).
Os eventos funcionam e so executados como se pertencessem
ao formulrio onde cada controle que ser validado foi adicionado, e essa a grande mgica da utilizao de delegates.
Existem mais trs classes auxiliares que no sero abordadas
com detalhes no corpo deste artigo e esto explicadas na Tabela 2.
Classe

Descrio

MySubControl

Define como ser exposto o controle do


OuExclusivo. Possui uma propriedade que
representa o controle e outra que representa o seu

Private Sub AssociaControle(ByVal pControle As MyControl)

nome, que ser utilizado para a elaborao da

If pControle.TipoCampo = MyControl.enumTipoCampo.Numerico And

mensagem.

pControle.DecimalPlaces > 0 Then

MySubControlCollection Define a coleo de sub-controles da propriedade

pControle.Controle.Tag = pControle.DecimalPlaces

OuExclusivo. Possui o mesmo objetivo da classe

AddHandler pControle.Controle.KeyPress, AddressOf CurrencyKeyPress

ControlCollection s que direcionado para o

ElseIf pControle.TipoCampo = MyControl.enumTipoCampo.Numerico And

OuExclusivo.

pControle.DecimalPlaces = 0 Then
AddHandler pControle.Controle.KeyPress, AddressOf NumericKeyPress

ValidaCPFCNPJ

Then

Classe que contm as funes de validao de CPF


e de CNPJ.

ElseIf pControle.TipoCampo = MyControl.enumTipoCampo.SomenteData

Tabela 2 Classes do projeto ValidadorWindows

AddHandler pControle.Controle.Leave, AddressOf OnlyDate_Leave


ElseIf pControle.TipoCampo = MyControl.enumTipoCampo.SomenteHora
Then
AddHandler pControle.Controle.Leave, AddressOf OnlyTime_Leave
ElseIf pControle.TipoCampo = MyControl.enumTipoCampo.DataHora Then
AddHandler pControle.Controle.Leave, AddressOf DateTime_Leave
End If
End Sub
Lista 4 Cdigo que associa o controle aos eventos

Os controles passados recebem uma associao dinmica aos

44

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

O cdigo completo de cada uma dessas classes deve ser conferido pelo leitor no exemplo completo disponibilizado pela revista.
Aps termos as classes, que expem o controle e a coleo de
controles, devidamente codificadas, deve-se codificar o componente (a classe inicial, do tipo Component Class, que foi adicionada no incio do artigo) e definir a exposio das propriedades. A classe Validador, para facilitar o entendimento, teve o
seu cdigo dividido em duas partes. A Lista 6 ilustra a primeira
parte do cdigo.

WWW.FORUMACCESS.COM.BR

.NET
Else
Imports System.ComponentModel

NomeCampo = Objeto.Controle.Name

<ToolboxBitmap(GetType(Validador), "ICONEREQ.ICO")> Public Class Validador

End If

Private lControles As New ControlCollection

If lType.Name = "TextBox" Then


If DirectCast(Objeto.Controle, TextBox).Text.Trim = "" Then

Public Event Controle_Requerido(ByVal Controle As Control, ByVal Mensagem

If gExibeMensagem Then

As String)

MsgBox("Preencha o contedo do campo " & NomeCampo & ".",

Public Event CPF_CNPJ_Invalido(ByVal Controle As Control, ByVal Mensagem

MsgBoxStyle.Information, My.Application.Info.ProductName)

As String)

If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

Public Event Controle_Ou_Excluisivo(ByVal Controle As Control, ByVal

End If

Mensgem As String)

RaiseEvent Controle_Requerido(Objeto.Controle, "Preencha o contedo


do campo " & NomeCampo & ".")

<DefaultValue(True), Description("Define se o controle exibir mensagens

Return False

automaticamente!")> Public Property ExibeMensagem() As Boolean

End If

Get

ElseIf lType.Name = "ListControl" Then

Return gExibeMensagem

If DirectCast(Objeto.Controle, ListControl).SelectedIndex = -1 Then

End Get

If gExibeMensagem Then

Set(ByVal value As Boolean)

MsgBox("Selecione um item do campo " & NomeCampo & ".",

gExibeMensagem = True

MsgBoxStyle.Information, My.Application.Info.ProductName)

End Set

If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

End Property

End If

<Description("Define se o controle exibir mensagens automaticamente!"),

RaiseEvent Controle_Requerido(Objeto.Controle, "Selecione um item do

DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>_

campo " & NomeCampo & ".")

Public ReadOnly Property Controles() As ControlCollection

Return False

Get

End If

Return lControles

ElseIf lType.Name = "MaskedTextBox" Then

End Get

Dim mask As String = DirectCast(Objeto.Controle, MaskedTextBox).Mask

End Property

DirectCast(Objeto.Controle, MaskedTextBox).Mask = ""


If DirectCast(Objeto.Controle, MaskedTextBox).Text.Trim = "" Then

Lista 6 Propriedades expostas do ValidadorWindows

If gExibeMensagem Then

O atributo <ToolboxBitmap(GetType(Validador), "ICONEREQ.


ICO")>, que antecede a declarao da classe, define qual ser o
cone que aparecer na caixa de ferramentas e quando o componente for adicionado a um formulrio. No caso, o cone tem
que pertencer ao projeto e estar definido como Embedded
Resource (ser compilado junto com o mesmo). A propriedade
ExibirMensagem utilizada dentro das rotinas de validao e,
se for definida como true, automaticamente o controle informa
ao usurio, atravs de caixas de mensagens, sobre problemas
com os dados. A propriedade Controles recebe os controles que
sero validados atravs da coleo ControlCollection existente.
A Segunda parte da classe est exposta na Lista 7.

MsgBox("Preencha o contedo do campo " & NomeCampo & ".",


MsgBoxStyle.Information, My.Application.Info.ProductName)
If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()
End If
RaiseEvent Controle_Requerido(Objeto.Controle, "Preencha o contedo
do campo " & NomeCampo & ".")
DirectCast(Objeto.Controle, MaskedTextBox).Mask = mask
Return False
End If
DirectCast(Objeto.Controle, MaskedTextBox).Mask = mask
End If
End If
'***************************************************************************
'***************************************************************************

Private Function Valida() As Boolean

'VALIDA CPF/CNPJ digitado no campo

Dim Objeto As MyControl

If Not Objeto.CPFCNPJ = MyControl.enumCPFCNPJ.NaoValida And

Dim NomeCampo As String

Objeto.Controle.Text.Trim <> "" Then

For Each Objeto In lControles


Dim lType As Type = Objeto.Controle.GetType

If Objeto.CPFCNPJ = MyControl.enumCPFCNPJ.Ambos Then


If Not (VALIDACPFCNPJ.ValidaCPFCNPF(Objeto.Controle.Text)) Then

'***************************************************************************

If gExibeMensagem Then

'VERIFICA O CONTEDO OBRIGATRIO DOS CONTROLES


If Objeto.Requerido Then
If Not IsNothing(Objeto.NomeCampo) Then

MsgBox("O CPF/CNPJ informado no vlido. Confira a digitao!",


MsgBoxStyle.Critical, My.Application.Info.ProductName)
If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

NomeCampo = Objeto.NomeCampo

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

45

.NET.NET
ElseIf lType.Name = "MaskedTextBox" Then

End If

If DirectCast(SubObjeto.Controle, MaskedTextBox).Text.Trim <> "" Then

RaiseEvent CPF_CNPJ_Invalido(Objeto.Controle, "O CPF/CNPJ

TotalPreenchidos += 1

informado no vlido. Confira a digitao!")

End If

Return False

If TotalPreenchidos = 0 Then

End If

If gExibeMensagem Then

ElseIf Objeto.CPFCNPJ = MyControl.enumCPFCNPJ.SomenteCPF Then

MsgBox(" necessrio que ao menos um dos controles definidos

If Not (VALIDACPFCNPJ.ValidaCPF(Objeto.Controle.Text)) Then

como Ou Exclusivo, estejam preenchidos!", MsgBoxStyle.Exclamation,

If gExibeMensagem Then

My.Application.Info.ProductName)

MsgBox("O CPF informado no vlido. Confira a digitao!",

If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

MsgBoxStyle.Critical, My.Application.Info.ProductName)

End If

If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

ElseIf TotalPreenchidos > 1 Then

End If

If gExibeMensagem Then

RaiseEvent CPF_CNPJ_Invalido(Objeto.Controle, "O CPF informado no

MsgBox("Existem mais de um controle classificado como Ou exclusivo

vlido. Confira a digitao!")

preenchidos!", MsgBoxStyle.Exclamation, My.Application.Info.ProductName)

Return False

If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

End If

End If

ElseIf Objeto.CPFCNPJ = MyControl.enumCPFCNPJ.SomenteCNPJ Then

RaiseEvent Controle_Ou_Excluisivo(SubObjeto.Controle, "Existem mais

If Not (VALIDACPFCNPJ.ValidaCNPJ(Objeto.Controle.Text)) Then

de um controle classificado como Ou exclusivo preenchidos!")

If gExibeMensagem Then

Return False

MsgBox("O CNPJ informado no vlido. Confira a digitao!",

End If

MsgBoxStyle.Critical, My.Application.Info.ProductName)
If Objeto.Controle.Enabled = True Then Objeto.Controle.Focus()

RaiseEvent CPF_CNPJ_Invalido(Objeto.Controle, "O CNPJ informado

'***************************************************************************
Next

no vlido. Confira a digitao!")

Return True

Return False

End Function

End If

Public Function isValid() As Boolean

End If

If lControles.Count > 0 Then

End If
'***************************************************************************
'***************************************************************************

Return Valida()
End If
Return True

'VERIFICA OS OUs EXCLUSIVOS

End Function

If Objeto.ControlesOuExclusivo.Count > 0 Then

Public Sub HabilitaControles(ByVal Acao As Boolean)

Dim TotalPreenchidos As Short = 0

Dim Objeto As MyControl

If TypeOf Objeto.Controle Is TextBox Then

For Each Objeto In lControles

If DirectCast(Objeto.Controle, TextBox).Text.Trim <> "" Then

Objeto.Controle.Enabled = Acao

TotalPreenchidos += 1

Next

ElseIf TypeOf Objeto.Controle Is ListControl Then


If DirectCast(Objeto.Controle, ListControl).SelectedIndex <> -1 Then

End Sub
Public Sub LimpaControles()

TotalPreenchidos += 1

Dim Objeto As MyControl

ElseIf TypeOf Objeto.Controle Is MaskedTextBox Then


If DirectCast(Objeto.Controle, MaskedTextBox).Text.Trim <> "" Then

For Each Objeto In lControles


If TypeOf Objeto.Controle Is TextBox Then

TotalPreenchidos += 1

Objeto.Controle.Text = ""

End If

ElseIf TypeOf Objeto.Controle Is Label Then

Dim SubObjeto As MySubControl

Objeto.Controle.Text = ""

For Each SubObjeto In Objeto.ControlesOuExclusivo

ElseIf TypeOf Objeto.Controle Is CheckBox Then

Dim lSubType As Type = SubObjeto.Controle.GetType()

DirectCast(Objeto.Controle, CheckBox).Checked = False

If lSubType.Name = "TextBox" Then

ElseIf TypeOf Objeto.Controle Is ListControl Then

If DirectCast(SubObjeto.Controle, TextBox).Text.Trim <> "" Then

DirectCast(Objeto.Controle, ListControl).SelectedIndex = -1

TotalPreenchidos += 1

ElseIf TypeOf Objeto.Controle Is MaskedTextBox Then

ElseIf lType.Name = "ListControl" Then


If DirectCast(SubObjeto.Controle, ListControl).SelectedIndex <> -1 Then
TotalPreenchidos += 1

46

Next
End If

End If

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Objeto.Controle.Text = ""
ElseIf TypeOf Objeto.Controle Is RadioButton Then

WWW.FORUMACCESS.COM.BR

.NET
DirectCast(Objeto.Controle, RadioButton).Checked = False
ElseIf TypeOf Objeto.Controle Is NumericUpDown Then
DirectCast(Objeto.Controle, NumericUpDown).ResetText()
End If
Next
End Sub
Lista 7 Segunda parte da Classe Validador.vb

importante para o leitor entender a funcionalidade da funo


Valida. Ela percorre a coleo de controles passados para o
Validador e verifica se os critrios estabelecidos esto sendo
atendidos. Caso todos os critrios estejam de acordo, ela retorna
true, caso no, false. A funo HabilitaControles e
LimpaControles, percorre toda a coleo executando a funo
por elas expostas, ou seja, habilitando/desabilitando ou limpando a coleo inteira de objetos informados.

UTILIZANDO O COMPONENTE
O objetivo , atravs deste formulrio, demonstrar o potencial
do controle abordado no artigo e como utiliz-lo em um sistema WindowsForms.
Aps o componente estar criado e testado, basta utilizar o mesmo para fazer o que lhe proposto, ou seja, validar as entradas
de dados Windows. Crie um projeto WindowsForms e adicione
a DLL na ToolBox com o ChooseItens (boto direito sobre a
ToolBox Choose Items ...). A partir da ToolBox, adicione o
controle Validador no formulrio, configure-o conforme ilustrado na Figura 1.

Figura 2 Collection Editor do IDE do Visual Studio 2005

Os controles se portaro de acordo com a configurao dos


mesmos. O mtodo isValid, exposto pelo Validador1, executa a
rotina completa de validao. A Lista 8 contm o cdigo dos
botes para executar as operaes propostas por eles.
Private Sub CmdValida_Click(...
If Validador1.isValid Then
'Rotina aps a validao
End If
End Sub
Private Sub CmdLimpa_Click(...
Validador1.LimpaControles()
End Sub
Private Sub CmdHabilita_Click(...
Validador1.HabilitaControles(True)
End Sub
Private Sub CmdDesabilita_Click(...
Validador1.HabilitaControles(False)
End Sub
Lista 8 Executando os Mtodos do Validador

Aps a correta configurao dos controles, utilizar seus mtodos uma tarefa extremamente simples, fornecendo agilidade,
praticidade e confiabilidade no desenvolvimento de crticas de
interface em Windows Forms.

CONCLUSO

Figura 1 Formulrio de exemplo de utilizao do Validador Windows

Aps configurar o formulrio, clique sobre o Validador1(que


representa uma instncia do controle Validador) e clique
no boto que aparecer na propriedade Controles. Aps
clicar, abrir a janela onde os controles sero adicionados
e configurados conforme a ao desejada. O resultado final
da configurao deve ser o ilustrado na Figura 2, onde cada
item da coleo representa um dos controles que sero validados.

Aps ler esse artigo, o leitor, alm de possuir um novo componente que ir auxili-lo no trabalho de validao, adquiriu conhecimento
para a criao de novos controles para agilizar e padronizar sua
codificao. Com toda a certeza, as situaes de validao podem
se expandir para novas necessidades e, caso o leitor venha a identificar novas situaes, j possuir um excelente ponto de partida,
bastando customiz-lo de acordo com suas necessidades.
Mais uma vez, espero ter contribudo com o crescimento profissional do leitor, fica aqui o meu abrao e at o prximo artigo.
* Gabriel Brenner Bacharel em Sistemas de Informao e Ps-Graduado em Anlise, Projeto e Gerncia de Sistemas. Trabalha atualmente como desenvolvedor de
sistemas Windows e WEB pelas Indstrias Nucleares do Brasil S/A e como professor
titular do curso de graduao em Sistemas de Informao da Faculdade de Cincias
Econmicas, Administrativas e da Computao Dom Bosco (http://www.aedb.br).

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

47

.NET

Verses do Visual Studio 2005


Joo Talles Dantas Batista*

Artigo para: Visual Studio 2005

EM NOVEMBRO PASSADO, A MICROSOFT LANOU AS NOVAS VERSES DO VISUAL STUDIO E, COM ISSO MUDOU
UMA SRIE DE CONCEITOS: PASSOU A OFERECER FERRAMENTAS GRATUITAS DE DESENVOLVIMENTO AS EXPRESS
EDITIONS - E, PARA GRANDES EQUIPES E FBRICAS DE
SOFTWARE, FERRAMENTAS PARA GERENCIAMENTO DE TODO
O CICLO DE DESENVOLVIMENTO DE SOFTWARE.
ESTE ARTIGO TEM COMO OBJETIVO APRESENTAR AS VERSES DO VISUAL STUDIO E AS PRINCIPAIS CARACTERSTICAS DE CADA UMA DELAS.

VERSES DO VISUAL STUDIO

Express Editions podem ser uma tima opo como ponto de


partida para desenvolvedores que queiram utilizar a plataforma
.NET.
Inicialmente, as Express Editions estariam disponveis gratuitamente pelo perodo de um ano aps o lanamento. Em 19/04/
2006 a Microsoft anunciou que elas sero gratuitas permanentemente.
Os projetos desenvolvidos com as verses Express podem ser
facilmente migrados para as demais verses do Visual Studio
que sero apresentadas a seguir.
A tabela abaixo demonstra as principais caractersticas das
Express Editions:
Express Edition

A Figura 1 ilustra as verses do Visual Studio 2005.

Caracterstica(s)

Visual WebDeveloper 2005 Express Edition Desenvolvimento de aplicaes


web e web services, utilizando
ASP.NET 2.0.
Visual C# 2005 Express Edition

Desenvolvimento de aplicaes
console, windows e biblioteca de
classes reutilizveis, utilizando
C# como linguagem.

Visual Basic 2005 Express Edition

Desenvolvimento de aplicaes
console, windows e biblioteca de
classes reutilizveis, utilizando
Visual Basic .NET como
linguagem.

Visual C++ 2005 Express Edition

Desenvolvimento de aplicaes
console, windows e biblioteca de
classes reutilizveis, utilizando
C++ .NET como linguagem (MFC
e ATL no esto includas).

Figura 1 - Verses do Visual Studio 2005

Visual J# 2005 Express Edition

Vejamos cada uma delas com mais detalhes.

Desenvolvimento de aplicaes
console, windows e biblioteca de
classes reutilizveis, utilizando J#

EXPRESS EDITIONS

como linguagem.

As Express Editions so ferramentas de desenvolvimento gratuitas indicadas para amadores, estudantes e entusiastas que
querem utilizar a tecnologia .NET como plataforma de desenvolvimento de aplicaes Web e Windows. Vale ressaltar que a
Microsoft no coloca restries quanto ao uso dessas ferramentas por desenvolvedores profissionais, que oferecem total compatibilidade com suas equivalentes pagas. Desta forma, as

48

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

MICROSOFT VISUAL STUDIO 2005 STANDARD EDITION


Esta verso do Visual Studio incorpora as caractersticas de todas as Express Editions em uma nica IDE. Isso significa que
em um nico ambiente podemos desenvolver aplicaes
Windows, Web e mveis, alm de acessar servidores SQL Server
remotos e consumir Web Services. a verso indicada para pro-

WWW.FORUMACCESS.COM.BR

.NET
fissionais no incio de carreira que no
precisam dos recursos mais avanados
oferecidos pelas verses Professional e
Team System.

MICROSOFT VISUAL STUDIO 2005


PROFESSIONAL EDITION
Verso voltada para profissionais ou pequenos times de desenvolvimento. Expande a verso Standard para incluir
integrao com SQL Server 2005, servidores remotos e depurao remota. a
verso equivalente Enterprise Architect
do Visual Studio .NET 2003.

MICROSOFT VISUAL STUDIO 2005


TEAM SYSTEM
A verso Team System do Visual Studio
2005 um conjunto de ferramentas para
o gerenciamento de todo o ciclo de vida
do software (SLC).
A Figura 2 ilustra as edies do Visual Studio Team System.

Figura 3 - Diagrama de aplicao distribuda.

Neste diagrama temos uma soluo composta de diversos sistemas. Para cada um,
podemos especificar restries, tais como
verso do sistema operacional, services
packs e verso do ISS dentre outras. Todas as restries informadas neste momento sero utilizadas para validao junto aos diagramas de distribuio de nossa soluo.

MICROSOFT VISUAL STUDIO 2005 TEAM


EDITION FOR SOFTWARE DEVELOPERS
Esta a edio do Visual Studio voltada
para os desenvolvedores de software. Alm
das habituais ferramentas de desenvolvimento, temos inmeras novidades. Algumas delas so:
Figura 2 - Edies do Visual Studio Team System

MICROSOFT VISUAL STUDIO 2005 TEAM EDITION FOR


SOFTWARE ARCHITECT
Esta a edio do Visual Studio voltada para arquitetos de
software. As principais ferramentas so os diagramas de aplicao distribuda, infra-estrutura lgica, distribuio e classes.
Um recurso muito interessante o da validao de um diagrama com outro (por exemplo: aplicao x infra-estrutura) para
identificar possveis problemas no ambiente onde a aplicao
ser executada. Alm disso, podemos gerar projetos e cdigo a
partir desses diagramas, mantendo tudo sincronizado.
Um exemplo do diagrama de aplicao distribuda pode ser
visualizado na Figura 3.

Anlise de cdigo esttica e dinmica: o Visual Studio analisa o cdigo desenvolvido em busca de padres que no foram atendidos ou possveis problemas de
desempenho. Existem muitas possibilidades, cada uma com
opes de parametrizao. Esses so apenas dois exemplos
do poder que existe por trs desse recurso.
Code Coverage: veja em termos percentuais as linhas de sua
classe que foram executadas. Essa viso pode ser obtida por
mtodos, classes ou namespaces.
Unit Testing: a um clique de distncia, gere unidades de testes
para as suas classes. Com isso, voc poder facilmente testar
os mtodos de sua classe.
A Figura 4 demonstra o recurso Code Coverage em ao.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

49

.NET .NET
MICROSOFT VISUAL STUDIO 2005 TEAM SUITE
uma edio que inclui as verses Architect, Developer
e Tester do Visual Studio Team System. Voltada para
times de desenvolvimento em que uma pessoa desempenha mais de um papel (arquiteto-desenvolvedor ou
desenvolvedortestador, por exemplo).

MICROSOFT VISUAL STUDIO 2005 TEAM


FOUNDATION SERVER
o servidor de toda a equipe de desenvolvimento. O Team
Foundation Server inclui as seguintes caractersticas:

Figura 4 - Recurso de Code Coverage em ao

Atravs do recurso de Code Coverage podemos verificar quais linhas


de cada mtodo foram executadas (em azul) e quais no foram (em
vermelho). Alm disso, tambm temos o percentual de execuo por
namespace, classe e mtodo. Esse um recurso muito interessante
para que se possa identificar o nvel de cobertura de nossos testes.
Microsoft Visual Studio 2005 Team Edition for Software Testers
A edio do Visual Studio para os software testers (testadores) traz uma srie de recursos. Alguns deles so:
Teste de carga: simula usurios navegando pela sua aplicao,
especificando nmero de usurios, tipos de navegadores e tipo
de banda (s para citar algumas das possibilidades). O resultado dos testes pode ser acompanhado atravs de grficos
com os ndices que desejamos medir.
Teste web: teste especfico para aplicaes web que no precisam ser necessariamente desenvolvidas na plataforma .NET.

1. Work Items: representam as tarefas no ciclo de desenvolvimento de software. Toda e qualquer tarefa executa por qualquer pessoa na equipe ser representada por um work item.
2. Documentao: repositrio de documentos da equipe de desenvolvimento visando facilitar a comunicao
entre os membros da equipe. Baseado no Windows
SharePoint Services, o que possibilita o acesso aos documentos atravs da Internet.
3. Reporting: todas as atividades da equipe alimentam ndices
que vo possibilitar a extrao de relatrios diversos sobre o
andamento dos projetos. Baseado no SQL Server 2005
Reporting Services, o que significa que, alm dos relatrios
oferecidos pelo Team Foundation Server, podemos customizar
e/ou criar nossos prprios relatrios.
4. Build: automao dos processos de Build com possibilidade de
efetuar testes e anlise de cdigo no pacote que ser gerado.
5. Controle de verso: uma das melhores caractersticas do Team
Foundation Server. O sistema de controle de verso totalmente
baseado no SQL Server 2005 e no mais em sistema de arquivos como o Visual Source Safe. Alm disso, oferece diversas
novas caractersticas e escalvel at 500 desenvolvedores.

CONCLUSO
Na Figura 5 temos um exemplo de um teste de carga sendo executado em uma aplicao web.

Neste artigo abordei as principais aplicaes de cada uma das


edies do Visual Studio 2005. At breve.
Para se aprofundar
Visual Studio 2005
http://msdn.microsoft.com/vstudio/products/
Express Editions
http://msdn.microsoft.com/vstudio/express/default.aspx
Visual Studio Team System
http://msdn.microsoft.com/vstudio/teamsystem/products/default.aspx

* Joo Talles Dantas Batista (jtdbf@hotmail.com) MCP em


ASP.NET e SQL Server e graduado em Tecnologia em Processamento
de Dados pela UNIFIEO. Tambm lder da clula acadmica na
faculdade FIAP e escritor de artigos para a MSDN Magazine Brasil.
Atualmente trabalha como analista-desenvolvedor no Submarino S/A,
tendo como principais ferramentas de trabalho o Visual Studio 2005
Figura 5 - Teste de carga de uma aplicao web em execuo

50

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

e o Team Foundation Server.

WWW.FORUMACCESS.COM.BR

SQL Server

Investigao avanada de problemas


de locking
Adriano Marques Pereira Brazo *

Artigo para SQL Server 7.0, 2000 e 2005


Pr-requisitos: Conhecimentos de programao T-SQL e administrao
de aplicaes SQL Server

mas de concorrncia, ordenando a execuo de comandos


conflitantes com o travamento (lock) de recursos.
Deste modo, pode-se dizer que os problemas com locks so desvios do comportamento ideal, freqentemente causados por falhas na modelagem da aplicao, cdigo equivocado ou mesmo
falta de indexao adequada.

COMO SABER SE H PROBLEMAS DE LOCKING


O primeiro recurso na investigao a procedure de sistema
sp_who, que denunciar conexes travadas. O spid da conexo
responsvel pelo travamento indicado na coluna blk (bloqueado por) do resultado do sp_who:

EM APLICAES DE BANCOS DE DADOS,


COMUM TESTEMUNHAR PROBLEMAS COM
LOCKING QUE NO SO DIAGNOSTICADOS DE
FORMA IDEAL E ACABAM SE TRANSFORMANDO EM UMA GRANDE DOR DE CABEA. ADMINISTRADORES DA ESTRUTURA DE REDE,
BANCO DE DADOS E APLICAO NO RARO
SE DEBATEM COM O PROBLEMA POR MUITO
TEMPO ANTES DE CHEGAR A UM DIAGNSTICO SATISFATRIO.
UM PROBLEMA GRAVE COM LOCKING PODE SER CONFUNDIDO COM UM SERVIDOR TRAVADO, PROBLEMAS DE REDE OU
PRODUZIR EFEITOS DE DEMORA DE RESPOSTA NA CONEXO
QUE SEJAM SEMELHANTES A UM SERVIDOR QUE ESTEJA COM
DEMANDA DE CPU EM 100%.
A INTENO DESTE ARTIGO DESVENDAR OS POSSVEIS PROBLEMAS DE CONCORRNCIA QUE PODEM ACONTECER EM UMA
BASE DE DADOS E DESMISTIFICAR OS TPICOS RELACIONADOS COM LOCKS E DEADLOCKS NO MICROSOFT SQL SERVER.

PARA QUE SERVEM OS LOCKS


Os locks no so de fato um problema do banco de dados, mas
sim um recurso imprescindvel para permitir que o banco de dados
atenda vrias conexes concorrentes de forma segura e ordenada.
Em um banco de dados multi-usurio, os locks previnem proble-

Figura 1 - Resultado do comando sp_who

No exemplo mostrado, a conexo 53 encontra-se em espera,


sendo bloqueada pela conexo 52. Cabe esclarecer que um problema de locking s estaria realmente instalado se essa situao de travamento fosse excessivamente prolongada e repetitiva.
Devem-se fazer vrias verificaes seguidas para conferir se o
problema realmente tem esse perfil.

O PROBLEMA LOCKING... E AGORA?


Uma vez que a investigao inicial mostrou indcios de um problema de locking, ela pode ser aprofundada para permitir a identificao da causa, uma vez que o locking propriamente dito
normalmente o sintoma e no a causa efetiva do problema.
O prximo passo lgico seria investigar a natureza do lock gerado e o comando responsvel, usando sp_lock e dbcc
inputbuffer.
A procedure DBCC INPUTBUFFER retorna o ltimo comando

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

51

SQL Server
Server
SQL
executado por uma determinada conexo e pode ajudar na tarefa investigativa:
DBCC INPUTBUFFER(52)

Figura 2 - Resultado do comando DBCC INPUTBUFFER

O retorno acima demonstra o comando que gerou o lock ao


qual a conexo 53 espera. Nesse caso, foi intencionalmente
usado um comando select com alguns hints de query
incomuns, que foraram a gerao de um lock exclusivo de
tabela (tablockx holdlock), ajudando a reproduzir de forma fcil o cenrio desejado: um problema de locking.
Outro auxlio na investigao o sp_lock, que nos mostra a
natureza dos locks envolvidos. Na sada desse comando, podese destacar o lock exclusivo de tabela gerado pela conexo 52 e
a contraparte (conexo 53) em status de espera. Os dois tm
como alvo o ObjId (object id) 309576141 (o que poderia ser
desvendado com SELECT OBJECT_NAME (309576141), descobrindo-se assim o nome da tabela envolvida).

J os locks compartilhados so compatveis com outros locks


compartilhados. por essa razo que uma operao de update
extensa faz a conexo de relatrios esperarem. De forma anloga, leituras recorrentes em determinada tabela podem protelar a
execuo de um update na mesma tabela, com
as configuraes default de conexo do servidor.
Esse comportamento a causa de muitos programadores usarem o lock hint NOLOCK aps
o nome da tabela no comando select de relatrios. O comando a seguir no esperaria pelo lock exclusivo demonstrado anteriormente e no geraria um lock compartilhado
para a leitura.
SELECT * FROM Person.Contact WITH(nolock)

Esse recurso, embora til em vrios casos, deve ser utilizado


com cautela e com o conhecimento de que ele ir possibilitar o
que chamado de leitura suja (dirty read) pois possvel ler
um dado que faa parte de uma transao ainda no concluda
(COMMIT ainda pendente) - o que pode ser inadmissvel em
alguns processos.
Tipos de locks suportados pelo SQL Server
Lock

Natureza

Shared (S)

Operaes de leitura, sem modificao de dados.

Update (U)

Gerado durante a fase inicial da operao de update.

Exclusive (X)

Operaes de modificao (INSERT, UPDATE, or DELETE).


No compatvel com nenhum outro lock.

Intent

So gerados automaticamente para definir uma hierarquia,


impedindo locks nas instncias superiores (um lock de
intent para a tabela gerado automaticamente quando um
lock de registro criado).

Schema

No permite que a estrutura de uma tabela seja modificada


durante um SELECT, por exemplo. Podem ser schema

Figura 3 - Resultado do comando sp_lock

modification (Sch-M) e schema stability (Sch-S).

Deve-se notar os campos Type, Mode e Status, que so extremamente


importantes na investigao. A principal preocupao o status WAIT,
que reporta a espera da conexo, e o Type = TAB, que demonstra um
lock de uma tabela inteira de forma exclusiva (Mode = X). Os outros
resultados contm locks compartilhados ou Shared (Mode = S) .
Com o conhecimento dos comandos envolvidos (o que gerou o
lock e o que espera pelo lock) e da natureza do lock, pode-se
avanar mais um passo em direo elucidao do problema e
possvel correo.
As informaes mencionadas esto presentes tambm pela ferramenta Enterprise Manager do SQL e podem ser acessadas em
current activity.

UM POUCO SOBRE A NATUREZA DOS LOCKS: A DIFERENA


ENTRE UM LOCK COMPARTILHADO E UM LOCK EXCLUSIVO
Locks exclusivos normalmente so gerados por operaes de
modificao na base e no so compatveis com outros locks.

52

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Key-range

Protege um intervalo de registros.

Tabela 1 - Tipos de locks gerados pelo SQL Server

CAUSAS RECORRENTES DE PROBLEMAS DE LOCKS EM SERVIDORES


Falta de indexao causando lock escalation
A falta de indexao pode no apenas afetar a performance de
leitura, mas tambm gerar um lock muito acima do necessrio.
Na falta de um ndice, uma operao que normalmente leria (e
geraria lock compartilhado em apenas um registro) pode gerar
uma leitura massiva na tabela e um lock de tabela:
SELECT * FROM Person.Contact WHERE ContactId= 2

Imaginando que a coluna ContactId no fosse indexada, a operao resultante de um table scan geraria o lock compartilha-

WWW.FORUMACCESS.COM.BR

SQL Server
do de tabela, impedindo comandos de update em toda sua extenso,
enquanto durar o comando. Esse aumento na granularidade do lock
normalmente referenciado por lock escalation.
Parmetros discrepantes
Outro problema que pode levar o SQL a gerar um lock com
granularidade maior que a normal so parmetros inconsistentes. Esse comportamento pode ser observado em vrias
circunstncias no SQL 7.0 e SQL 2000 (o SQL 2005 tem um
otimizador de consultas mais avanado que no revela o
mesmo problema). O exemplo a seguir ilustra o problema,
criando equivocadamente uma coluna com tipo decimal com
o atributo identity e fazendo a procura de formas distintas
no campo com dois tipos de parmetros:

CREATE TABLE tb_indxtest (c1 decimal(10,0) identity (1,1),c2 varchar(30))

--Passo 2 : Insere registros(deixe executar por alguns segundos e cancele o


loop em seguida)

SET NOCOUNT ON
WHILE 1=1
INSERT tb_indxtest DEFAULT VALUES

--Passo 3: Cria um ndice no campo c1

CREATE NONCLUSTERED INDEX ix_txt ON tb_indxtest(c1)

Comparando os dois resultados, conclui-se que, mudando o


parmetro da query entre 3 e 3.00 (o equivalente entre um
decimal(10,0) e um decimal(10,2), o otimizador de consultas
do SQL Server reverte o plano de execuo para um table scan,
o que pode ser comprovado pelo plano de execuo e pela
sada das estatsticas de acesso, que apontam para 16 pginas lidas no table scan contra 3 pginas da consulta que utiliza indexao. Deste modo, deve-se ficar atento a problemas
como este, que so de difcil deteco e podem levar o SQL a
aumentar o lock na tabela para table lock de forma absolutamente desnecessria simplesmente porque o otimizador de
consultas no conseguiu gerar um plano de execuo plenamente otimizado quando h converso de tipos de dados nestas circunstncias.
Transaes no concludas corretamente
Muitas vezes tambm possvel que o cdigo da aplicao ou
procedure tenha erros de lgica que impeam o trmino adequado da transao (falta do COMMIT TRAN). Exemplos comuns
so loops infinitos (erro de lgica na clusula de terminao do
loop) ou clusulas IF/ELSE que no fecham a transao em determinados casos.
Nesse caso, convm investigar os comandos que detm
os locks-problema para definir sua localizao no cdigo
fonte da aplicao.

Primeiro teste: utilizando como parmetro 3.00


-- Testa o acesso com o valor 3.00

SET STATISTICS IO ON
SELECT c2 FROM tb_indxtest WHERE c1 = 3.00

Scan count 1, logical reads 16, physical reads 0, read-ahead reads 0.

--Testa o acesso: com o valor 3

SELECT c2 FROM tb_indxtest WHERE c1 = 3

Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0.

--Passo 1: Cria tabela teste

Segundo teste: utilizando parmetro 3

SET STATISTICS IO ON

Relatrios retirados diretamente nas tabelas de produo


Consultas pesadas nas tabelas utilizadas pela aplicao
podem gerar locks compartilhados que concorrem com
operaes de modificao na base e do a impresso de
um servidor irresponsivo. Deve-se pesar a possibilidade
de usar lock hints como o nolock ou definir o isolamento transacional no incio do relatrio para READ
UNCOMMITTED, caso seja admissvel a ocorrncia de dirty
reads (possibilidade de leitura de dados que foram posteriormente apagados por um rollback de transao, pois no se

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

53

SQL Server
Server
SQL
aguarda a finalizao da mesma). Outra considerao seria a
criao de um servidor espelho dedicado para os relatrios ou
mesmo tabelas histricas na mesma base.
Transaes muito grandes
Uma transao de atualizao de registros que envolva toda a
massa de dados de uma tabela, como por exemplo, o clculo e
atualizao de comisses de vendas, pode gerar um lock de tabela por tempo exagerado em horrio de produo, concorrendo com operaes de leitura.
Quebrar transaes grandes em pedaos menores, executando
5% ou 10% do update por vez pode ser um exemplo de tentativa de evitar que o SQL aumente o lock para um lock de tabela.
Esse procedimento poderia ser facilmente implantado em muitos casos controlando-se pela chave primria da tabela ou outras tcnicas.

O QUE SO DEADLOCKS?
Alm dos problemas de lock citados ao longo do artigo,
existe o deadlock, um tipo especial de situao de lock. No
deadlock duas transaes entram em conflito, onde uma
espera a outra avanar e vice-versa, mas nenhuma pode
prosseguir pois esto mutuamente bloqueadas.
Esse estado detectado pelo SQL e, ao invs das conexes
esperarem eternamente pela resoluo do conflito, o prprio
SQL se encarrega de terminar uma das conexes envolvidas
de modo que a restante possa prosseguir (por default terminada a conexo que tem a menor quantidade de trabalho empenhado). Essa uma situao no muito freqente nas aplicaes de banco de dados, porm extremamente grave quando de sua ocorrncia, uma vez que transaes so terminadas
forosamente com gerao do erro correspondente.

Os processos identificados como integrantes do deadlock


devem ser reescritos, preferencialmente modificando o acesso aos recursos para evitar o conflito cruzado de acesso a
recursos, alm dos casos citados ao longo do artigo que
podem favorecer o aparecimento de um deadlock por causa
de um lock escalation, por exemplo.
No SQL 2005 houve uma significantiva melhora na investigao de deadlocks, com a incluso do deadlock graph no
profiler, identificando graficamente a ocorrncia, inclusive
com os objetos envolvidos e tipo de lock.
Msg 1205, Level 13, State 45, Line 1
Transaction (Process ID 51) was deadlocked on lock resources with another
process and has been chosen as the deadlock victim. Rerun the transaction.

CONCLUSO
O conhecimento dos problemas mais comuns relacionados a locks
pode levar ao desenvolvedor de aplicaes a chance de criar aplicaes estveis e com alta performance, mesmo nos cenrios mais
agressivos em relao concorrncia de conexes. Esse objetivo
est de acordo com a inteno de ajudar o leitor a cada vez mais
se destacar pela proficincia de seus sistemas e atuao em seu
campo.
Foram explanadas as principais ferramentas de investigao de forma que o leitor certamente conseguir identificar no apenas os casos citados, mas quaisquer outros que eventualmente surjam em
seu banco de dados. indicado ao final, um link para o artigo clssico da TechNet sobre a resoluo dos problemas de locking.
No novo recurso do SQL 2005 em relao concorrncia, o snapshot
isolation um novo e poderoso aliado na melhoria da concorrncia
de conexes e ser tema de artigos no futuro. At l.

Para se aprofundar:
Books on line:
Transaction Isolation Levels
Locking Hints

INF: Understanding and Resolving SQL Server 7.0


or 2000 Blocking Problems
http://support.microsoft.com/kb/224453/en-us

Edio 57 - Artigo Melhore a performance das consultas do SQL Server (mais informaes sobre tratamento transacional adequado).

* Adriano Marques Pereira Brazo


(adriano@pereirabrazao.com.br) MCSE, MCDBA,
MCIT/MCTS SQL 2005 e Trainer cer tificado
Figura 4 - Profiler 2005 e o Deadlock Graph

54

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

Microsoft e Oracle.

SQL Server

Monitorando aplicaes com o System


Monitor
Adriano Marques Pereira Brazo *

Artigo para SQL Server 7.0, 2000 e 2005


Pr-requisitos: Conhecimentos bsicos programao T-SQL

O USO DE CONTADORES CUSTOMIZADOS DO SQL SERVER


UM RECURSO POUCO EXPLORADO, MAS PODE SER MUITO TIL A EQUIPES DE DESENVOLVIMENTO DE APLICAES
VOLTADAS AO BANCO DE DADOS MICROSOFT SQL SERVER.
ESSE RECURSO PODE SER ADICIONADO S APLICAES
EXISTENTES DE FORMA RELATIVAMENTE SIMPLES E, AO
LONGO DESTE ARTIGO, TEMOS EXEMPLOS DE APLICAES
PRTICAS QUE PODEM SER UTILIZADAS NAS MAIS DIVERSAS TAREFAS DE MONITORAMENTO.
AT MESMO NA FASE DE TESTES DE CARGA E
IMPLEMENTAO DE UMA APLICAO, PODEM SER UTILIZADOS CONTADORES PARA TESTAR A PERFORMANCE E O
FUNCIONAMENTO GERAL DA APLICAO.

O alvo deste artigo, no entanto, no ser o uso dos diversos


contadores de disco, rede ou CPU (ou mesmo os contadores de
recursos do prprio SQL) que so frequentemente usados nas
anlises, mas especificamente o contador de usurio que o SQL
Server disponibiliza.
Ele permite que atravs de programao simples seja definido o
valor de determinado contador que pode ser ento mostrado
no system monitor.
Desse modo, possvel implantar contadores especficos de
aplicao no system monitor, conforme necessidade, dentro das
procedures existentes que rodam processos ou mesmo triggers
(com a devida cautela).

A FERRAMENTA SYSTEM MONITOR DO WINDOWS


O Windows dispe da ferramenta System Monitor para monitorar
diversos aspectos do sistema operacional, servios e aplicativos
instalados. Como exemplo, podem ser escolhidos contadores
de monitoramento de CPU, disco e memria em diversas instncias.
uma ferramenta de fundamental importncia na investigao
de problemas de performance e funcionamento de servidores,
inclusive no caso de banco de dados.
Figura 2 Adicionando um dos 10 contadores disponveis. Boto
+ na barra de ferramentas

MODIFICANDO O VALOR DO CONTADOR


A stored procedure de sistema sp_user_counter utilizada para
se definir o valor de um dos dez contadores disponveis
(sp_user_counter1 at sp_user_counter10). O contador pode
ter seu valor alterado para 100 da seguinte forma:
EXECUTE sp_user_counter1 100

CDIGO EXEMPLO

Figura 1 O System Monitor do Windows

Uma vez que a aplicao deste tipo de cdigo extremamente


ligada situao monitorada, um exemplo genrico do uso do
recurso provido, para que o leitor possa facilmente comprovar o funcionamento do recurso descrito. So usados dois conta-

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

55

SQL Server
Server
SQL
dores utilizando uma frmula matemtica para prover a variao numrica.

Esse cdigo pode ser executado a partir de um job agendado


para 15 minutos de recorrncia, por exemplo.
Funcionamento geral da aplicao:
Pode ser programado um job que rode regularmente e verifique quantos pedidos de produtos foram adicionados tabela
de pedidos no intervalo.

DECLARE @count float


DECLARE @valor float
DECLARE @valorb float
SELECT @count = 0
SELECT @valor = 0

Tempo de operaes crticas:


Usando o horrio de incio e fim de um determinado processo
e, em seguida, atualizando o contador ou uma tabela histrica
que ser lida para atualizao do contador.

SELECT @valorb = 0
WHILE 1=1
BEGIN
SELECT @count = @count + .01
SELECT @valor = cos(@count)* 50 +50

CONTADORES E ALERTAS

SELECT @valorb = cos(@count+1)* 50 +50

importante ressaltar que os contadores descritos podem ser utilizados com alertas do SQL Server Agent, cadastrando-se limites superiores ou inferiores para os valores que, caso ultrapassados, podem gerar uma notificao por e-mail, uma entrada no event viewer
do Windows ou at mesmo a execuo de um job em resposta.

-----------------------------------------EXEC sp_user_counter1 @valor


EXEC sp_user_counter2 @valorb
-----------------------------------------WAITFOR DELAY '00:00:00.050'
IF @count > 99 SELECT @count = 0

CUIDADOS COM O MONITORAMENTO

END

Se por um lado a utilizao dos contadores expostos pode ser


uma maneira fcil e rpida de implementar o monitoramento e
teste de aplicaes, deve-se ter o mximo cuidado para que os
processos adicionados no se tornem um peso maior para o banco
ou para as prprias operaes que esto sendo monitoradas.
Caso sejam utilizados triggers, interessante que o cdigo dos
mesmos seja reduzido e inequvoco, para no atrapalhar as operaes. Nesse caso, operaes que possam ser executadas posteriormente como clculo de mdias, e indicadores podem residir em uma procedure que tambm se encarregar de atualizar o
contador de tempos em tempos, atravs de jobs do SQL.
Cdigo com o lock hint nolock nas leituras deve ser considerado, para minimizar o efeito da concorrncia. no banco de dados
da aplicao.

CONCLUSO

Figura 3 - Resultado do cdigo exemplo

EXEMPLOS DE APLICAES PRTICAS


Nmero de relatrios emitidos:
A cada relatrio emitido, pode-se cadastrar sua execuo em
uma tabela e depois incrementar o contador de acordo, inclusive podendo-se registrar o tempo mdio de espera.
O cdigo a seguir assume que exista a tabela RelExecutados,
que recebe um registro novo toda vez que um relatrio executado, com o nmero de segundos que sua execuo demorou:
DECLARE @relcount,@media
SELECT @relcount = count(*), @media =avg(seg) from RelExecutados

O uso deste recurso praticamente desconhecido pode tornar possvel identificar problemas na aplicao de forma muito rpida,
e assim tomar as devidas providncias com agilidade.
Se bem utilizado, uma fonte adicional de subsdios aos administradores de banco de dados e desenvolvedores para atingir
um de seus principais objetivos: uma aplicao com boa
performance e estabilidade.
Operadores do CPD, administradores e outros profissionais podem utilizar esses contadores em conjunto com os usuais para
garantir este objetivo, com a vantagem de utilizar uma ferramenta que j de seu conhecimento e uso corrente ao invs de
criar uma para o propsito.

with(nolock)

Para se aprofundar:

EXECUTE sp_user_counter1 , @relcount

Books on line: sp_user_counter1

EXECUTE sp_user_counter2 , @media


TRUNCATE TABLE RelExecutados

* Adriano Marques Pereira Brazo (adriano@pereirabrazao.com.br) MCSE,


MCDBA, MCIT/MCTS SQL 2005 e Trainer certificado Microsoft e Oracle.

56

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

WWW.FORUMACCESS.COM.BR

FRUTOS DO SUPORTE

Por Fernando Pessoa *

Exportar para TXT atravs de uma macro


do Access
Como fao para exportar um arquivo atravs de uma macro
arquivo txt? No quero utilizar instrues sql.
Crie uma nova macro no Access. Em Action, selecione
"TransferText". A seguir, ajuste as propriedades conforme a
tabela abaixo:
Nome da propriedade
Transfer Type
File name

Valor
Export Delimited
coloque o nome do arquivo

' Cria a Sesso do Outlook.


Set objOutlook = CreateObject("Outlook.Application")

' Cria uma nova mensagem.


Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

With objOutlookMsg

' adiciona destinatrios da Mensagem.


Set objOutlookRecip = .Recipients.Add("fulano@webmail.com.br")

' Adiciona o assunto, a mensagem do corpo do e-mail e a importncia.

E-mails no Access com HTML incorporado


possvel gerar um e-mail a partir do Access no Microsoft
Outlook, cujo contedo da mensagem seja um html incorporado ao invs de anexado?
Abra um mdulo existente do Access ou crie um novo.
Clique em Ferramentas e escolha o menu Referncias. Adicione as referncias abaixo (X a verso do Office que voc
utiliza):

.Subject = "Relatrio "

Dim strBodyMail As String


' Variavel que contm o condigo fonte do e-mail

strBodyMail = "<h1>Corpo do E-mail em HTML</h1>"

.HTMLBody = strBodyMail

.Importance = olImportanceHigh 'Alta prioridade

Microsoft Office X Object Library


Microsoft Office Outlook View Control
Microsoft Outlook X Object Library

' Trata cada destinatrio


For Each objOutlookRecip In .Recipients

A figura 1 - abaixo ilustra a janela Referncias com as trs


bibliotecas citadas j selecionadas.

objOutlookRecip.Resolve
Next

' Envia o e-mail sem mostrar ...


.Send
End With

Transformar texto em data no Access


Como fao para transformar um campo texto, onde tenho
armazenado dias (05, 06, 07 e assim sucessivamente), em
um campo do tipo data 05/06/2006, 06/06/2006, 07/06/
2006 ... Utilizando uma tabela do access 2000?
Supondo que o campo texto de sua tabela tblExemplo chame-se Dia e o campo data DiaMesAno, voc pode criar uma
consulta do tipo UPDATE. Supondo ainda que o ms ser
junho e o ano 2006, teremos:

Figura 1 - Janela Referncias

A rotina a seguir ilustra como escrever cdigo em VBA e


utilizar automao para envio de e-mail no Outlook a partir
do Access.

UPDATE tblExemplo SET DiaMesAno = DateSerial(2006, 6, Val(Dia))

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

59

Outra forma de se fazer o mesmo utilizar a funo CDate,


que converte um campo para o formato data.

Sabendo desses conceitos, fica


obter a soluo
para*
Porsimples
Fernando
Pessoa
o problema apresentado. Vamos construir a soluo passo
a passo:

UPDATE tblExemplo SET DiaMesAno CDate("06/" & Dia & "/2006")

Neste caso, assumimos que o formato de datas corrente o


americano (ms/dia/ano).

Limitando o nmero de registros em um


formulrio do Access
Tenho um formulrio vinculado a um subformulrio, sendo
o subformulrio feito com base em uma consulta. Quero
que esse subformulrio tenha no mximo 12 registros. Trata-se da formao de turmas para uma escola de ingls. No
formulrio principal esto os dados da turma e no
subformulrio o nmero de alunos.

Abra um planilha do Excel.


Digite 07/2006 na clula A6. O Excel mostrar jul/2006 (julho
de 2006). Voc pode mudar o formato da clula se desejar.
Selecione a clula A6 e note que o Excel interpretou a entrada 07/2006 como sendo a data 01/01/2007.
Na clula B9 digite a frmula =A6 e tecle Enter. Voc ver o
contedo da clula A6 inclusive com a mesma formatao.
Acesse o menu Format/Cells e mude o formato da clula
B9 para dd/mm/aaaa, conforme mostra a figura 2. Clique
em Ok. Veja que a data 01/01/2007 aparece na clula B9.

A propriedade RecordSource do subformulrio define a origem dos registros que ele exibir. Por exemplo, se a consulta que mostra estes dados chama-se qryInscricoes, este
ser o valor definido em Record Source.
Para que sejam exibidos apenas 12 registros, voc pode
utilizar a clusula TOP como mostrado abaixo:
SELECT TOP 12 * FROM qryInscricoes

Voc pode precisar ainda mostrar os registros em ordem


decrescente de data de inscrio, por exemplo, neste caso
utilize algo como:
SELECT TOP 12 * FROM qryInscricoes
ORDER BY DtInscricao DESC

Figura 2 Mudando formato para dd/mm/aaaa

Selecione a clula B10 e escreva a frmula =B9+1. Presione


Enter e veja que a data 02/07/2006 aparece na clula B10.
Selecione agora a clula B10 e posicione o cursor sobre o
canto inferior direito de forma que ele se transforme em
uma cruz preta, como mostra a figura 3.

Manipulao de datas no Excel


Estou fazendo uma planilha de ponto no Excel e tenho a
clula A6 preenchida com o ms de competncia (por exemplo, 07/2006). Como fao para preencher automaticamente
uma coluna com as datas do ms (no exemplo 01/07/2006
a 31/07/2006)? E como fao para mostrar em outra coluna
os dias da semana?
O Excel tem um conjunto de funes especfico para trabalhar com datas, permitindo somar dias, meses, anos, minutos, segundos... Mas, neste caso, a nica operao necessria ser a soma simples. Vale lembrar que uma data no
Excel um nmero. Por exemplo, 01/01/2006 o nmero
38.899, 02/07/2006 o 38.900 e assim por diante. Se uma
clula contendo um nmero receber um formato de data,
veremos uma data, e se uma clula contendo uma data receber um formato de nmero, veremos um nmero.

Figura 3 Selecionando clula B10

Arraste o cursor para baixo at a clula B39 para copiar a


frmula criada em B10. Voc ver a coluna B9 preenchida
com as datas de 01/07/2006 a 31/07/2006.

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

61

Selecione agora a clula C9 e digite a seguinte frmula:


=B9. O Excel mostrar a data 01/07/2007 nesta clula. Atravs do menu Format/Cells, aplique o formato dddd, conforme mostra a figura 4.

Mude a data de competncia


clula A6 para
08/2006 *e
PordaFernando
Pessoa
veja que a planilha automaticamente atualizada.

Finalizando uma tarefa do Windows a


partir do VB
Como fao para finalizar um item da lista de tarefas do
Windows (por exemplo iexplore.exe) a partir de um programa em VB?
Encerrar um programa pode ter conseqencias indesejveis, como o travamento de um computador ou a perda de
dados. Portanto, as rotinas mostradas a seguir devem ser
utilizadas com bastante cautela.
A funo KillApp recebe como parmetro o nome da tarefa
a ser encerrada e retorna um valor booleano (True se conseguiu matar a tarefa com sucesso ou False, caso contrrio). Voc pode utiliz-la da seguinte maneira em seus programas:
Dim strTaskName As String

Figura 4 Aplicando o formato dddd

strTaskName = "iexplore.exe"

Clique em Ok e ver que o Excel mostra o dia da semana


na clula C9 (no nosso exemplo, sbado).
Copie o contedo de C9 para as clulas C10 at C39. Aumente um pouco o tamanho da coluna C e escolha o alinhamento esquerda. A planilha deve se parecer agora
com a figura 5.

If KillApp(strTaskName) Then
MsgBox "A tarefa " & strTaskName & " foi encerrada com sucesso."
Else
MsgBox "No foi possvel encerrar a tarefa " & strTaskName & "."
End If

A ao de KillApp equivale a clicar no boto End Process da


Windows Task Manager do Windows XP, como na figura 6
que mostra o processo iexplore.exe selecionado.

Figura 5 Resultado

62

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

Figura 6 - Processo iexplore.exe selecionado

WWW.FORUMACCESS.COM.BR

Segue o cdigo completo de KillApp que deve ser colocado


em um mdulo do Visual Basic (.bas). A funo totalmente compatvel com VBA, podendo ser utilizada tambm em
mdulos do Access, Word e Excel.

(ByVal lpSystemName As String, _


ByVal lpName As String, _
lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges _
Lib "advapi32" (ByVal TokenHandle As Long, _

Option Explicit
Const MAX_PATH& = 260
Declare Function TerminateProcess _
Lib "kernel32" (ByVal ApphProcess As Long, _
ByVal uExitCode As Long) As Long
Declare Function OpenProcess Lib _

ByVal DisableAllPrivileges As Long, _


NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, _
PreviousState As Any, _
ReturnLength As Any) As Long
Type PROCESSENTRY32
dwSize As Long

"kernel32" (ByVal dwDesiredAccess As Long, _

cntUsage As Long

ByVal blnheritHandle As Long, _

th32ProcessID As Long

ByVal dwAppProcessId As Long) As Long

th32DefaultHeapID As Long

Declare Function ProcessFirst _

th32ModuleID As Long

Lib "kernel32" Alias "Process32First" _

cntThreads As Long

(ByVal hSnapshot As Long, _

th32ParentProcessID As Long

uProcess As PROCESSENTRY32) As Long

pcPriClassBase As Long

Declare Function ProcessNext _

dwFlags As Long

Lib "kernel32" Alias "Process32Next" _


(ByVal hSnapshot As Long, _
uProcess As PROCESSENTRY32) As Long
Declare Function CreateToolhelpSnapshot _
Lib "kernel32" Alias "CreateToolhelp32Snapshot" _
(ByVal lFlags As Long, _
lProcessID As Long) As Long
Declare Function CloseHandle _
Lib "kernel32" (ByVal hObject As Long) As Long
Private Type LUID
lowpart As Long
highpart As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
LuidUDT As LUID
Attributes As Long
End Type
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8

szexeFile As String * MAX_PATH


End Type
''''--------------------------------------Public Function KillApp(myName As String) As Boolean
Const TH32CS_SNAPPROCESS As Long = 2&
Const PROCESS_ALL_ACCESS = 0
Dim uProcess As PROCESSENTRY32
Dim rProcessFound As Long
Dim hSnapshot As Long
Dim szExename As String
Dim exitCode As Long
Dim myProcess As Long
Dim AppKill As Boolean
Dim appCount As Integer
Dim I As Integer
On Local Error GoTo Finish
appCount = 0
uProcess.dwSize = Len(uProcess)
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
rProcessFound = ProcessFirst(hSnapshot, uProcess)
Do While rProcessFound
I = InStr(1, uProcess.szexeFile, Chr(0))

Const SE_PRIVILEGE_ENABLED = &H2

szExename = LCase$(Left$(uProcess.szexeFile, I - 1))

Const PROCESS_ALL_ACCESS = &H1F0FFF

If Right$(szExename, Len(myName)) = LCase$(myName) Then


KillApp = True

Private Declare Function GetVersion _

appCount = appCount + 1

Lib "kernel32" () As Long


Private Declare Function GetCurrentProcess _
Lib "kernel32" () As Long

myProcess = OpenProcess(PROCESS_ALL_ACCESS, False,


uProcess.th32ProcessID)
If KillProcess(uProcess.th32ProcessID, 0) Then

Private Declare Function OpenProcessToken _

''''For debug.... Remove this

Lib "advapi32" (ByVal ProcessHandle As Long, _

End If

ByVal DesiredAccess As Long, _


TokenHandle As Long) As Long

End If

Private Declare Function LookupPrivilegeValue _

rProcessFound = ProcessNext(hSnapshot, uProcess)

Lib "advapi32" Alias "LookupPrivilegeValueA" _

FRUMACCESS

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

63

Loop
Call CloseHandle(hSnapshot)
Exit Function
Finish:

If AdjustTokenPrivileges(hToken, False, tp, 0, ByVal 0&, ByVal 0&) = 0


Then
GoTo CleanUp

MsgBox "Error!"
End Function

End If
End If

'Terminate any application and return an exit code to Windows.


Function KillProcess(ByVal hProcessID As Long, Optional ByVal exitCode
As Long) As Boolean

hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, hProcessID)


If hProcess Then

Dim hToken As Long


Dim hProcess As Long
Dim tp As TOKEN_PRIVILEGES

KillProcess = (TerminateProcess(hProcess, exitCode) <> 0)


'''' close the process handle
CloseHandle hProcess
End If

If GetVersion() >= 0 Then

If GetVersion() >= 0 Then

If OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) = 0 Then
GoTo CleanUp
End If

CleanUp:
If hToken Then CloseHandle hToken

If LookupPrivilegeValue("", "SeDebugPrivilege", tp.LuidUDT) = 0 Then


GoTo CleanUp
End If
tp.PrivilegeCount = 1
tp.Attributes = SE_PRIVILEGE_ENABLED

64

SETEMBRO/OUTUBRO 2006 - REVISTA N 74

'''' under NT restore original privileges


tp.Attributes = 0
AdjustTokenPrivileges hToken, False, tp, 0, ByVal 0&, ByVal 0&

End If
End Function
* Fernando Pessoa (fernando.pessoa@forumaccess.com.br) Analista de Suporte da Revista FrumAccess.

WWW.FORUMACCESS.COM.BR