Criando
Aplicações com o
Caché
Versão Demo
Amir Samary
Sobre o Autor
Amir Samary foi aluno do curso de Bacharelado em Matemática com ênfase em Informática da
Universidade do Estado do Rio de Janeiro (UERJ) de 1996 a 2001. Também foi aluno do curso de Ciências da
Computação das Faculdades Associadas de São Paulo (FASP) de 2005 a 2006.
Amir entrou em contato com tecnologia InterSystems por primeira vez em 1997 quando começou a
trabalhar para uma empresa no Rio de Janeiro. Em 2003, Amir foi contratado pela InterSystems Brasil como
Sales Engineer e trabalhou apoiando clientes, universidades e ao processo interno de vendas da InterSystems.
Hoje Amir trabalha para a InterSystems Chile como Arquiteto de Integração e Interoperabilidade e é
responsável pela arquitetura e qualidade de todos os projetos de integração entre sistemas informáticos
implementados com tecnologia InterSystems no Chile.
Quem deve ler este livro?  3
Sumário  4
Quem é a InterSystems
A InterSystems é uma empresa americana localizada em Cambridge, MA. Foi fundada em 1978 e,
atualmente possui cinco produtos:
•
O Caché, Banco de Dados Orientado a Objetos de alta performance com total suporte a SQL.
•
O DeepSee, framework de BI (Business Intelligence) do Caché. A InterSystems apresenta o
DeepSee como um outro produto mas na verdade o DeepSee representa o Engine de BI do Caché
que pode ser utilizado em qualquer instalação do Caché que tenha uma licença de Caché com
DeepSee incluído.
•
O Ensemble, Plataforma de Integração SOA que se baseia e estende o Caché com funcionalidades
específicas para a construção de integrações complexas entre sistemas distintos, usando
tecnologias como BPEL (Business Process Execution Language), filas de mensageria, e etc. A
pesar de estender o Caché, o Ensemble é considerado um outro produto. Tudo o que você estudar
neste livro se aplica também ao Ensemble, mas o Ensemble possui mais funcionalidades
específicas para integrações.
•
O TrakCare, um HIS (Health Information Systems ou Sistema de Gestão Clínica) World Class,
totalmente web e baseado no Ensemble. O TrakCare é capaz de gerenciar de forma integrada
todas as atividades de uma Rede de Saúde composta de vários estabelecimentos como Hospitais,
Clínicas, Ambulatórios, Laboratórios, Farmácias e etc.
•
O HealthShare, Plataforma de Colaboração entre Instituições e Comunidades de Saúde, também
baseada no Ensemble, para implementação de um Registro Eletrônico de Saúde Regional ou
Nacional, de forma que toda informação de interesse possa estar disponível para o médico no ponto
de atendimento, onde quer que este seja.
4  Criando Aplicações com o Caché
Dedicatórias
Minha Esposa, Maira Marques Samary, companheira fiel
e sincera, que sempre me motivou, incentivou e ajudou a completar
todos os meus desafios. Uma mulher maravilhosa que me enche de
alegria e vontade de viver.
Meus Pais, Cláudio e Sandra Faria que tiveram
a
paciência que os bons pais possuem para educar seus filhos.
Introdução  5
Sumário  6
Quem deve ler este livro?
Este livro tem como assunto o Caché, Sistema Gerenciador de Banco de Dados Objeto-Relacional
(SGBDOR) da InterSystems Corporation.
O livro pode ser lido por estudantes, programadores e administradores de bancos de dados com
experiência em programação ou não, que desejam conhecer o Caché em toda a sua extensão. É recomendável
que o leitor já tenha algum conhecimento de conceitos básicos relacionados a programação orientada a objetos
(POO) como Classes, Herança e Polimorfismo, por exemplo. Também se recomenda que o leitor já tenha
conhecimentos básicos de algum outro bancos de dados e da linguagem SQL de consulta a bases de dados.
O livro tentará cobrir lacunas de conhecimento com explicações detalhadas e fará referencias à
documentação do Caché que é bastante rica e completa. Mas pode ser que o leitor tenha que buscar
conhecimento mais específico em outros livros para temas mais complexos ou abstratos. Existem excelentes
livros sobre UML, Orientação a Objetos e etc. Seria extremamente redundante cobrir estes temas neste livro, que
terminaria bastante grande e cansativo.
Se você está folheando este livro em uma livraria e está curioso a respeito do Caché, aconselho a ler
pelo menos o início do primeiro capítulo, que fala um pouco de sua arquitetura diferenciada, que justifica o nome
de Objeto-Relacional. O Caché é um produto único.
Professores de cadeiras como Bancos de Dados, Estruturas de Dados e Tópicos Especiais também
vão encontrar neste livro bastante material interessante para suas aulas. Não nos limitamos, neste livro, a
estudar apenas o Engine SQL e o Engine de Objetos do Caché, mas também o Caché Database Toolkit, a
plataforma sobre a qual estes Engines foram construídos. Esta plataforma prove serviços básicos de
persistência, concorrência, comunicação, dentre outros, além de linguagens de programação dinâmicas como o
Caché Object Script que permitem o acesso direto a estes serviços de forma que o programador possa optar por
construir seu próprio Engine de Banco de Dados se desejarem.
Mostramos ao leitor como o Caché armazena internamente os dados de seus objetos ou registros de
suas tabelas em estruturas multidimensionais (árvores) que podem ser vistas e manipuladas diretamente pelos
alunos como nenhum outro banco de dados permitiria. É possível entender, por exemplo, como os dados, índices
e streams são armazenados de forma distinta em árvores distintas e como isto afeta o desempenho. Os alunos
poderão ver estas estruturas e inclusive manipula-las diretamente.
6  Criando Aplicações com o Caché
Exploraremos também as melhores práticas no desenvolvimento de aplicações Web com o Caché
usando CSP (Caché Server Pages) e Zen. Mas não deixaremos de cobrir o desenvolvimento de aplicações com
outras tecnologias utilizando as suas APIs para Java, .NET e C++, mostrando todos os seus poderosos recursos
para a construção de poderosas aplicações Orientadas a Objetos.
O livro também cobre Administração do Caché e sua Configuração em Arquiteturas Distribuídas,
Business Intelligence, Web Services e XML, entre outros tópicos especiais importantes.
Introdução  7
Índice
1 INTRODUÇÃO
11 1.1 A Arquitetura do Caché _____________________________________________________________ 12 1.2 Obtendo o Caché__________________________________________________________________ 22 2
PREPARANDO O CACHÉ PARA NOSSOS ESTUDOS
25
2.1 O que vamos instalar? ______________________________________________________________
2.2 Sistemas Operacionais Suportados ___________________________________________________
2.3 Instalando o Caché no Windows ______________________________________________________
2.4 Estrutura, Databases e Namespaces __________________________________________________
2.4.1 Namespaces ____________________________________________________________________
2.5 Iniciando e Parando o Caché ________________________________________________________
2.6 Abrindo o Portal Administrativo do Caché _______________________________________________
3
26 30 31 37 39 41 43 CONHECENDO O TERRENO: CRIANDO SUA PRIMEIRA APLICAÇÃO E SE FAMILIARIZANDO COM AS
44
FERRAMENTAS
3.1 Conceitos e Definições necessárias para nossa Primeira Aplicação __________________________
3.2 Caché Studio _____________________________________________________________________
3.2.1 Abrindo o Caché Studio pela Primeira vez _____________________________________________
3.2.2 Verificando o Namespace (Conectando em Outro Namespace com o Caché Studio) ____________
3.2.3 Trabalhando com Projetos (Uma questão de metodologia) _________________________________
3.2.4 Criando Nossa Primeira Classe ______________________________________________________
3.2.5 Usando a Janela de Inspeção _______________________________________________________
3.3 Criando nossos Primeiros Objetos ____________________________________________________
3.3.1 Abrindo o Caché Terminal __________________________________________________________
3.4 Conhecendo o Portal de Administração ________________________________________________
3.4.1 Abrindo o Portal de Administração do Caché ___________________________________________
3.4.2 A Documentação de Nossa Classe ___________________________________________________
3.4.3 Listando os Objetos usando SQL ____________________________________________________
3.5 Criando Nossa Primeira Página Web __________________________________________________
3.5.1 Criando Nossa Primeira Página CSP _________________________________________________
3.5.2 Salvando e Compilando nossa Primeira Página CSP _____________________________________
3.5.3 Alterando a Página para Exibir Nossos Contatos ________________________________________
45 47 47 49 50 55 59 60 60 69 69 70 74 80 80 81 82 Sumário  9
3.5.4 Usando Tags Caché Server Pages Especiais ____________________________________________ 85 3.6 Criando Nossa Primeira Rotina Caché Object Script _______________________________________ 88 3.6.1 Criando nossa primeira Rotina Caché Object Script _______________________________________ 88 3.6.2 Salvando e Compilando nossa Primeira Rotina __________________________________________ 89 3.6.3 Expandindo as Funcionalidades ______________________________________________________ 90 3.7 Criando a sua Primeira página Zen _____________________________________________________ 93 3.7.1 Criando a Classe de Aplicação Zen____________________________________________________ 94 3.7.2 Criando a nossa primeira página Zen __________________________________________________ 97 3.7.3 Incluir, Excluir e Alterar ____________________________________________________________ 102 3.7.4 Conclusão ______________________________________________________________________ 104 3.8 Consultando a Documentação do Caché _______________________________________________ 105 10  Criando Aplicações com o Caché
1 Introdução
Escrever um livro sobre o Caché é uma tarefa complexa, pois envolve tantos assuntos e tecnologias
que fica difícil saber por onde começar. Dizer isto pode levar o leitor a pensar que o Caché é complicado, mas
não é assim. Imagino que seja difícil compreender esta minha dificuldade sem compreender um pouco a
arquitetura básica do Caché e é por isto que a introdução de este livro começa exatamente explicando esta
arquitetura única que, pessoalmente, nunca vi em nenhum outro Sistema Gerenciador de Banco de Dados
(SGBD) ou servidor de aplicações e é esta arquitetura única que torna o Caché, um Sistema Gerenciador Banco
de Dados Orientados Objeto-Relacional, poderoso e versátil.
Neste capítulo vamos:
•
Conhecer a Arquitetura do Caché e onde ele normalmente é usado,
•
Saber como obter uma versão atual do Caché,
Introdução  11
1.1 A Arquitetura do Caché
Conhecer a arquitetura do Caché é essencial para nosso estudo e é por esta razão que este tópico
aparece como primeiro assunto deste livro. Como você pode ver na Figura 1-1, no centro da arquitetura do
Caché, temos o Caché Database Engine que oferece um conjunto completo de serviços como:
•
Isolamento do hardware e sistema operacional subjacente – O Caché Database Engine é uma
máquina virtual disponível em muitas plataformas (combinações de hardwares e sistemas
operacionais).
•
Linguagens – O Caché suporta varias
linguagens de programação como o
Caché Object Script, VBScript, MVBasic,
SQL, TSQL, ISQL, Mumps e etc. Para
suportar este conjunto de linguagens, o
Caché trabalha de forma transparente
com um conjunto de compiladores que
transformam estas linguagens em um
único código objeto que pode ser
executado pelo Caché Database Engine.
•
IO – O Caché permite o Acesso a
Arquivos em Disco, fita, Rede (TCP/IP),
Pipes, etc.
Figura 1-1 – Caché Database Engine
•
Gerenciamento de objetos – O Caché
Database Engine gerência a alocação de memória e instanciação de objetos e traz um garbage
collector que cuida de liberar a memória de objetos que não são mais usados.
•
Persistência – Armazenamento seguro de dados de objetos em disco. Os dados armazenados em
bases de dados Caché sempre permanecerão íntegros enquanto o arquivo de dados está integro. A
única coisa que poderia corromper um arquivo de dados do Caché seria problemas no hardware e a
única maneira de evitar isto (para qualquer banco de dados) é comprando hardware de qualidade,
com redundância (RAID) e etc.
•
Controle de concorrência – Para controlar o acesso concorrente a dados em memória ou em disco
e garantir que processos diferentes não sobrescreverão os dados uns dos outros inadvertidamente
em uma ou mais máquinas.
•
Controle de transações – Para garantir que um conjunto de operações em disco possam ser
executadas dentro dos conceitos que definem uma transação que basicamente significa que: ou
todas as mudanças provocadas por operações são persistidas com sucesso na base de dados ou
nenhuma delas.
•
Controle de processos – Alocação de processos no sistema operacional para os processos
correspondentes no Caché, alocação dinâmica de memória, coleta de lixo, etc.
12  Introdução
A lista de serviços não tem o objetivo de ser completa. Muitos destes serviços são essenciais para a
construção de qualquer sistema gerenciador de banco de dados e formam o que poderíamos chamar de Núcleo
ou Fundação do Caché.
Alguns destes serviços também podem ser encontrados em algumas implementações de Máquinas
Virtuais conhecidas, como Java e .NET. De fato, o Caché Database Engine (ou engine de banco de dados do
Caché) é uma Máquina Virtual como as mencionadas, que se diferencia por implementar serviços específicos
para bancos de dados diretamente em seu runtime,
como os serviços de persistência e controle de
transações locais e distribuídas, que não existem nos
runtimes de outras Máquinas Virtuais mais
conhecidas que, diferente do Caché, normalmente só
implementam uma API a través da qual podem
comunicar-se com um sistema de bancos de dados
externo, delegando esta funcionalidade. Poderíamos
dizer que o Caché é uma máquina Virtual Completa.
Podemos pensar no Caché Database Engine
como um poderoso Database ToolKit ou SDK.
Usando este ToolKit, a InterSystems implementou um
Sistema Gerenciador de Banco de Dados Orientado a
Objetos (SGBDOO), um Sistema Gerenciador de
Figura 1-2 – Arquitetura de Engines do Caché
Banco de Dados SQL1 (SGBDSQL) e toda sua
infraestrutura de Business Intelligence como pode ser observado na Figura 1-2.
Todos estes componentes, na verdade, foram construídos juntos, não só em cima da mesma fundação
(o Caché Database Engine), mas também cooperando uns com os outros.
O Caché Database Engine é a fundação que armazena os dados em uma estrutura neutra hierárquica e
provê todos os serviços já mencionados para todos os Engines de Dados.
O Engine de Objetos foi construído apoiando-se no Caché Database Engine e serve de base para todos
os outros Engines de Dados. Por outro lado, como veremos, o Caché depende de seu Engine SQL para
encontrar seus objetos. Isto é: A linguagem de consulta aos objetos do Caché é a conhecida e consagrada SQL.
Mencionaremos mais sobre isso nos próximos capítulos.
O Engine de SQL foi construído apoiando-se no Caché Database Engine e no Engine de Objetos. Como
veremos nos próximos capítulos, a definição de uma tabela SQL é mantida como uma Classe. Toda vez que
usamos comandos DDL (Data Definition Language), através do Engine de SQL, para manipular a definição desta
tabela, o Engine de SQL altera a definição da classe que a representa.
SQL (Structured Query Language) – Linguagem Estruturada de Consulta criada em 1970 e vem evoluindo sempre, sendo
padronizada tanto pela ISO quanto pela ANSI e hoje é a principal linguagem usada para fazer consultas e manipular os
dados armazenados em sistemas gerenciadores de bancos de dados de diferentes fornecedores.
1
Introdução  13
Figura 1-3 - Armazenamento
O Engine de BI foi construído para dar aos desenvolvedores de aplicações baseadas no Caché recursos
poderosos de BI diretamente associados ao modelo de dados de suas aplicações. Isto significa que se um
desenvolvedor desejar adicionar à sua aplicação recursos de BI poderosos, não precisará comprar outro software
e duplicar seus dados em outro repositório de BI. Ele poderá usar os próprios recursos de BI do Caché, que já
conhecerão seu modelo de dados e, mais importante, terão acesso direto, em tempo real, aos dados
transacionais o que permite ao desenvolvedor oferecer recursos de BI embebidos em sua aplicação e em tempo
real.
O Acesso Direto permite que a aplicação possa acessar os dados armazenados no Caché diretamente,
saltando todos os outros Engines como se pode observar na Figura 1-3. Se o desenvolvedor desejar o máximo
de desempenho e flexibilidade que qualquer sistema gerenciador de banco de dados poderia jamais oferecer, ele
pode optar por acessar seus dados diretamente desta maneira.
Quando estamos usando os outros Engines para inserir um registro via SQL ou criar e salvar um objeto,
o Caché armazena os dados em um mesmo local dentro do Caché Database Engine em estruturas hierárquicas
as quais chamamos de Globais como pode ser visto na figura Figura 1-3. O Acesso Direto permite realizar
operações simples e diretas nestas estruturas de dados internas saltando o peso que o Engine de SQL ou o
Engine de Objetos poderiam naturalmente impor. É um recurso poderoso que, quando bem utilizado, pode ser a
solução para o tratamento de grandes volumes de dados ou para lidar com um processamento de dados muito
14  Introdução
intenso. Sendo estruturas de dados hierárquicas, as globais representam também um modelo alternativo de
dados, flexível, fácil e rápido, para o tratamento de problemas mais complexos.
Desta forma, o desenvolvedor pode escolher quando deseja usar o Modelo Orientado a Objetos de
acesso aos dados ou de construção de sua aplicação ou quando necessita do Modelo SQL de acesso aos dados.
Também pode escolher dar a sua aplicação recursos poderosos de Business Intelligence em Tempo Real ou
acessar os dados diretamente para atender às suas necessidades de desempenho e volume. De fato o
desenvolvedor pode escolher criar uma aplicação com todos estes mecanismos juntos para resolver diferentes
requisitos de arquitetura, interoperabilidade, desempenho e funcionalidade de sua aplicação.
Cada meio de acesso aos dados expõe um conjunto de APIs que permitem que aplicações escritas nas
mais variadas linguagens possam acessar os dados. Se tomamos a linguagem Java como exemplo, podemos
em uma mesma aplicação Java acessar os dados via SQL (JDBC), via Objetos, acesso direto ou de todas as
formas ao mesmo tempo de acordo com as necessidades das diversas partes da aplicação.
Figura 1-4 – Métodos de Acesso aos Dados no Caché
Se o leitor está pensando mais a frente, prevendo que estas múltiplas vias de conexão de uma mesma
aplicação poderiam significar que uma mesma instancia da aplicação estaria abrindo duas ou mais conexões
concorrentes ao Caché está enganado. O driver JDBC da InterSystems e a API de Objetos Java, por exemplo,
compartilham um único protocolo interno de comunicação de maneira que uma aplicação Java pode instanciar
um objeto e fazer uma consulta SQL a través da mesma (única) conexão ao banco de dados de forma
concorrente e segura, garantindo um controle de transações unificado, simples e efetivo. O mesmo é válido para
outros meios de conexão como ADO.NET, Perl, Object C, ou C++ por exemplo.
Introdução  15
Poder escolher e combinar recursos tão poderosos é o que torna o Caché uma plataforma
extremamente atrativa para o desenvolvimento de aplicações modernas e complexas. A Figura 1-5 mostra como
os Engines do Caché traduzem as chamadas às suas APIs a um mesmo conjunto de instruções para gerenciar
os dados diretamente nas globais dentro do Caché Engine e como o acesso direto permite a um programa enviar
as instruções diretamente. Você pode imaginar quão rápido pode ser esta maneira de trabalhar:
Figura 1-5 - Não Importa o Meio de Acesso: Tudo termina em uma Global
A Figura 1-5 também mostra como os Engines de SQL do Caché consegue traduzir um comando SQL
como o INSERT para instruções Caché Object Script internas e como o Engine de Objetos faz o mesmo com os
objetos manipulados a través de qualquer linguagem de programação como o Java, C++, linguagens .NET., etc.
Veremos nos próximos capítulos como o Engine de BI faz o mesmo para a linguagem MDX.
Além disso, como já mencionamos, não existem duas definições para um mesmo objeto de banco de
dados. Uma tabela, por exemplo, quando criada no Caché através do conhecido comando DDL (Data Definition
Language) CREATE TABLE, cria uma classe com toda a definição da tabela. Quando decidimos adicionar uma
nova coluna à tabela também via DDL, o Engine de SQL adiciona uma nova propriedade à classe existente.
O contrário também é verdade: Quando criamos uma classe, esta pode ser enxergada como uma tabela
no Engine SQL. Quando adicionamos ou alteramos uma propriedade de uma classe, a sua imagem SQL
correspondente refletirá estas mudanças em suas colunas. Além disto, não importa se criamos os dados via
16  Introdução
objetos ou via SQL, estes são armazenados na mesma Global (consulte a Figura 1-5 de novo) dentro do Caché
Database Engine. Não existe duplicação de dados ou de definições de maneira alguma.
As vantagens desta arquitetura, de acordo com a documentação do Caché são:
•
Os Engines SQL e Orientado a Objetos falam diretamente com o Caché Database Engine para
trabalhar com os dados de forma extremamente eficiente. Não há qualquer tipo de mapeamento ou
ponte objeto-relacional.
•
A separação lógica da base de dados (Classes/Tabelas) de sua configuração física (globais no
Caché Database Engine) torna possível uma radical reconfiguração da forma como a aplicação foi
instalada, sem qualquer mudança na lógica da aplicação. Esta noção é completamente nova para
muitos expertos em sistemas gerenciadores de bases de dados já que é comum considerar que as
tabelas representam o modelo físico. Podemos continuar com esta mesma noção no Caché mas é
preciso lembrar que o Caché expõe para nós sua estrutura interna de armazenamento enquanto
que outros SGBD a escondem. A maioria dos SGBD permitem definir em que base de dados os
dados de uma tabela poderão estar armazenados. O Caché, por exemplo, vai mais além e permite
reconfigurar completamente como os dados de uma tabela são distribuídos não só em uma, mas
em várias bases de dados diferentes (em discos diferentes se você quiser) para obter o máximo de
desempenho. Podemos, por exemplo, colocar os dados de índices em uma base de dados, os
dados de campos BLOB/CLOB/Streams em outra e os dados em si em uma terceira base de dados,
de forma transparente para o usuário da tabela.
•
O fato de o Caché Database Engine ser aberto, permite que se faça uso direto de seus recursos
quando necessário. Desde construir seu próprio sistema de banco de dados customizado a
implementar otimizações específicas para ter o máximo de performance possível disponível para
aplicações críticas.
•
Uma plataforma planejada para o futuro: A arquitetura do Caché permite que futuras melhorias no
Caché Database Engine sejam feitas sem afetar aplicações existentes. Mudanças de versões são
relativamente simples, mesmo quando mudanças agressivas tenham sido feitas na forma como as
informações são armazenadas. Na medida em que novas tecnologias surgem, o Caché pode
adicionar suporte a elas como componentes nativos, de alta performance com quase nenhum
impacto em aplicações existentes.
O Caché também traz embutido um Servidor de Aplicações Web (Caché Server Pages, ou CSP para
abreviar) que permite a construção de aplicações Web orientadas a objetos, trabalhando em conjunto com todos
os recursos das camadas subjacentes da arquitetura de forma totalmente integrada para o máximo de
simplicidade e desempenho.
Introdução  17
Figura 1-6 – Servidor de Aplicações Web
Com o CSP podemos escrever aplicações Web da mesma forma como escrevemos em JSP (Java
Server Pages) ou ASP.NET (Active Server Pages .NET). Os métodos de acesso externo que o Caché oferece
(ODBC, JDBC, ADO.NET, Java, etc.) não são utilizados quando construímos uma aplicação CSP pois nossas
páginas são compiladas em classes dentro do próprio Caché!
Figura 1-7 - Caché Server Pages x Java Server Pages
18  Introdução
Observe que enquanto a aplicação JSP necessita abrir uma conexão JDBC para conectar-se ao Caché,
a aplicação Caché Server Pages não só não precisa preocupar-se com conexões como também pode optar por
usar o acesso direto e trabalhar diretamente com as globais! Isto não significa que um desenvolvedor Caché usa
acesso direto as globais sempre. Usar objetos e SQL é muito rápido e é essencial por vários motivos e, em
verdade, um desenvolvedor típico de Caché usa objetos e SQL a maior parte do tempo. Mas ter a disposição o
acesso direto é uma grande vantagem em muitas situações.
Desta forma, nossa aplicação CSP não necessita de esforço algum para chegar a seus dados, bastando
com executar uma consulta ou abrir os objetos no banco. Uma aplicação Web CSP não necessita abrir conexões
de Rede ao Caché ou gerenciar pool de conexões. Não existem conexões, e isto faz com que uma aplicação
CSP seja naturalmente mais rápida que uma aplicação Web desenvolvida em outra tecnologia.
A boa notícia é que a InterSystems fez algo parecido para o Java também! Com o Caché eXtreme para
Java, o Caché expõe as suas principais APIs (JDBC, Objetos e Acesso Direto) via JNI, o que permite
comunicação direta com um processo Caché! Parece complicado mas na verdade é bastante simples de usar. Se
você só usa JDBC padrão, ainda assim a sua aplicação poderá beneficiar-se de um grande aumento de
velocidade pois a “conexão JDBC” usando Caché eXtreme é uma conversação direta da sua aplicação Java com
um processo Caché. É claro que com eXtreme, o trabalho via objetos também é muito mais rápido que a través
de uma conexão JDBC/TCP e o acesso direto às globais se torna possível!
A figura abaixo mostra o paralelo entre uma aplicação Java que se conecta ao Caché via uma conexão
JDBC/TCP e outra aplicação Java que se conecta via JDBC/eXtreme:
Figura 1-8 - Caché eXtreme for Java
Introdução  19
Observe que a aplicação Java que usa o Caché via eXtreme tem acesso direto ao Caché via objetos,
SQL e acesso direto às globais! Com esta configuração, o Caché consegue substituir bancos de dados “in
memory” entregando mais velocidade que estes bancos de dados especializados, mas com maior segurança e
recursos.
Além do CSP, desde a versão 2007 do Caché, é possível utilizar o Zen, o framework AJAX
(Asynchronous Javascript And XML) da InterSystems que permite o desenvolvimento de aplicações Web
altamente interativas. O Zen é construído sobre o CSP e o estende com um poderoso framework de objetos
visuais como janelas, painéis, formulários, caixas de seleção, botões, grids e etc. com os recursos de arrastar e
soltar e gerenciamento de eventos no cliente e no servidor.
O Zen permite a construção de aplicações Web profissionais totalmente integradas ao modelo de
objetos do Caché com alta segurança, de forma simples e organizada, em um único ambiente de
desenvolvimento. A diferença entre o Zen e o CSP é que cada página Zen, depois de carregada no navegador do
usuário, interage com o servidor a través de pequenas conexões HTTP para enviar e receber dados, de maneira
transparente para o usuário. Quando o usuário atualiza uma tabela de elementos, por exemplo, a página não é
completamente submetida para o servidor como ocorre normalmente quando usamos CSP, JSP, PHP, etc. Em
lugar disto, o Zen abre uma conexão HTTP invisível para o usuário e solicita os dados atualizados que são
retornados e atualizados na tabela de elementos.
Os componentes de uma página Zen são renderizados como HTML, CSS e JavaScript padrão, de
maneira que não é necessário nenhum plugin para que suas páginas Zen possam ser abertas nos
navegadores dos usuários. Uma página Zen pode ser visualizada da mesma forma no Internet Explorer
ou no Safari em um iPhone, por exemplo.
O Zen é um framework aberto e extensível e sua maior vantagem é que a grande maioria de seus
componentes como formulários, grids, caixas de texto e etc. podem trabalhar conectados aos objetos
persistentes na base de dados poupando o desenvolvedor do trabalho de costurar tecnologias diferentes para
construir aplicações realmente interativas e orientada aos dados armazenados no banco de dados.
Não poderíamos terminar de falar da arquitetura do Caché sem mencionar a sua escalabilidade. Um
banco de dados pode escalar tanto vertical quanto horizontalmente. Escalabilidade vertical é obtida ao adicionar
mais memória e mais CPUs a um único servidor e a escalabilidade horizontal é obtida ao adiciona mais máquinas
para atender em paralelo às requisições dos usuários.
20  Introdução
Figura 1-9 - Escalabilidade Horizontal Massiva com o ECP
O Caché escala muito bem tanto verticalmente quanto horizontalmente. Para escalar horizontalmente, o
Caché permite construir uma configuração de servidores interconectados a través do protocolo ECP (Enterprise
Cache Protocol). A Figura 1-9 mostra varias caixinhas conectadas. As caixinhas “Server” são todas instalações
normais de Caché que estão se comportando como um ator específico (Database Server x Application Server).
Observe que o Caché configurar um cluster de servidores de aplicações conectados via ECP a um cluster de
base de dados espelhado.
Todos os componentes de uma aplicação que se podem executar ou armazenar no servidor como
classes, stored procedures, páginas CSP/Zen compiladas, dados e rotinas estão no servidor de banco dados.
Quando conectamos um servidor de aplicações (inicialmente vazio), via ECP, a um servidor de banco de dados
este servidor de aplicações automaticamente expõe todos estes componentes. Não é preciso fazer nada mais!
Os usuários podem simplesmente conectar-se a qualquer um dos servidores de aplicação e trabalhar
normalmente. Você pode variar o número de servidores de aplicação de acordo com a variação do número de
usuários.
ooo
Introdução  21
1.2 Obtendo o Caché
A melhor maneira de se obter a versão mais atual do Caché é baixando-a do site da própria
InterSystems:
http://www.intersystems.com/cache/downloads/index.html
Você terá que se registrar caso já não tenha um login e senha. A versão que se baixa através deste link
não é igual à versão que se recebe quando se compra o produto: Trata-se de uma versão que não necessita de
licença para funcionar, chamada de “Free Single-user Caché” ou “Caché PC”. No entanto, possui algumas
limitações:
•
Apesar de permitir o uso de qualquer tecnologia de desenvolvimento (CSP, ODBC, JDBC,
ADO.NET, Java Extreme, etc.), esta versão não aceita conexões que venham de outras máquinas.
Isto significa que sua aplicação, independente de sua tecnologia, caso esteja usando esta versão
limitada do Caché, tem que rodar na mesma máquina onde está rodando o Caché.
•
Além disto, esta versão limitada do Caché só permite que um usuário seja usado por vez. Isto é: Se
você estiver construindo uma aplicação Java, esta aplicação poderá rodar na mesma máquina do
Caché e abrir uma conexão (JDBC, por exemplo) ao banco, usando um usuário e senha
específicos. Mas esta mesma aplicação não poderá abrir outra conexão ao Caché usando outro
usuário enquanto o primeiro ainda estiver conectado.
•
Existe, no entanto, um alívio para a restrição acima: O Caché permite que um mesmo usuário abra
até 252 conexões concorrentes (ao mesmo tempo). Ou seja: Esta mesma aplicação Java, acima,
poderia de fato abrir até 25 conexões ao Caché, desde que usasse o mesmo usuário e senha.
•
Apesar de o Caché estar disponível para diversas plataformas, esta versão de avaliação (Caché
PC) só está disponível para Windows 2000, Windows XP, Windows Server 2003, Windows Vista,
Mac OS X, Red Hat Linux, e SuSE Linux. Recomendo baixar a versão para Windows para
acompanhar este livro.
•
A instalação do Caché PC é muito mais simples, com menos perguntas e é feita com uma
configuração de segurança Mínima. Isto significa que todos os serviços estão ativos e rodando e
que você pode conectar-se (ao Caché Terminal, Studio, ou através de qualquer uma das APIs de
conexão) sem informar usuário ou senha (para facilitar a vida para os iniciantes).
As restrições são menos incômodas do que parecem e você pode usar esta versão para criar uma
aplicação de avaliação usando qualquer tecnologia desde que todos os componentes de sua aplicação rodem na
mesma máquina do Caché.
2
Este numero pode mudar para mais ou para menos de acordo com a versão do Caché.
22  Introdução
O fato de ter se registrado para avaliar o Caché lhe dá direito a suporte limitado, via 0800 ou e-mail. Tire
o restante de suas dúvidas sobre a versão de avaliação do Caché (Caché PC) no seguinte site:
http://www.intersystems.com/cache/downloads/cachepcfaq.html
Se as limitações impostas pela versão de avaliação do Caché (Caché PC) dificultam a sua avaliação do
produto, você pode entrar em contato com um escritório local da InterSystems e pedir que lhe enviem um CD
com a versão oficial do produto e uma licença demo que durará alguns meses. Esta licença demo é uma licença
normal, igual a uma licença comercial, de Caché; mas com data de expiração mais curta. Desta forma, nenhuma
das limitações acima se aplicam, pois você estará usando a versão de produção do produto (enviada por CD) e
uma licença válida. Uma lista com todos os escritórios da InterSystems no mundo, com informações de contato,
pode ser encontrada no seguinte endereço:
http://www.intersystems.com/offices/index.html
É importante lembrar que não se deve tentar usar a licença demo enviada pela InterSystems em uma
instalação de Caché PC. O Caché PC não aceita licenças. É preciso instalar a versão de produção,
enviada em CD pela InterSystem para usar a licença demo.
Introdução  23
2 Preparando o Caché para Nossos Estudos
Não é possível começar a aprender nenhum software novo sem instala-lo em nossas máquinas e saber
o mínimo suficiente para por os pés no chão e nos sentir à vontade para usa-lo, certo? Mesmo que você já tenha
instalado o Caché ou já conheça um pouco do processo de instalação, recomendo a leitura deste capítulo, pois
aqui vamos:
•
Aprender um pouco sobre como os componentes server e client do Caché se relacionam.
•
Aprender a instalar o Caché no Windows e saber como responder às poucas perguntas que
são feitas durante o processo de instalação.
•
Conhecer um pouco da organização lógica do Caché e como ele armazena suas informações
em namespaces e databases. Isto será muito útil para todos os capítulos que se seguem.
Preparando o Caché para Nossos Estudos  25
2.1 O que vamos instalar?
A instalação do Caché é um processo relativamente simples em todos os sistemas operacionais
suportados. Antes de seguirmos com o processo de instalação, é importante primeiro entender o que vem no CD
de instalação e o que precisamos instalar de fato. Se você ainda não tem uma cópia de instalação do Caché, a
Introdução deste livro explica como conseguir uma versão de avaliação (Caché PC) ou uma versão completa.
O Caché pode ser dividido em duas grandes partes: A parte server e a parte client:
Máquina Client
Qualquer
Sistema
Operacional
Suportado
Máquina Server
Rede TCP
Qualquer
Sistema
Operacional
Suportado
Figura 2-1 - Componentes de Instalação do Caché
A instalação de Caché para Windows traz as duas partes em um único setup. Desta forma, quando você
for instalar o Caché em sua máquina Windows, o programa de instalação perguntará o que você deseja instalar:
•
Um ambiente de desenvolvimento (server + client),
•
Apenas os componentes server,
•
Apenas os componentes client (como drivers de ODBC, ADO.NET, JDBC, Java Binding, Perl,
Python, o ambiente de desenvolvimento Windows – Caché Studio, além de outros componentes)
•
Apenas os componentes para habilitar um servidor Web para funcionar com o Caché
•
Ou uma instalação customizada onde você pode escolher instalar apenas componentes específicos
do Caché, da parte server ou client.
A instalação do Caché para ambientes Unix/Linux também segue a mesma linha, permitindo que se
escolha quais componentes da parte server e da parte client se deseja instalar. Mas é importante ressaltar que os
componentes da parte client disponíveis para instalação podem variar de acordo com a plataforma onde se
instala. A instalação para Unix/Linux, por exemplo, traz muitos componentes em comum com a instalação para
Windows, mas não traz o plugin ISAPI para o Internet Information Server da Microsoft pois este produto só
funciona em Windows.
Além disto, existe uma instalação de Caché específica para cada combinação de microprocessador e
sistema operacional. Desta forma, se você for pedir para a InterSystems uma versão demo de Caché para uma
máquina qualquer, especifique corretamente o processador (Intel, SPARC, PPC, 32bits/64bits e etc.) e o Sistema
Operacional (Window, RedHat Linux, AIX, HPUX, Mac OS X, Solaris, e etc.). Isto se deve ao fato de que a parte
server do Caché, escrita em ANSI C, Assembly e C++, é recompilada em cada uma das plataformas suportadas,
usando os compiladores específicos destas plataformas, para tirar o máximo do conjunto de instruções do
microprocessador e das otimizações específicas do compilador da plataforma e do sistema operacional
subjacente.
26  Preparando o Caché para Nossos Estudos
Além disto, o ambiente de desenvolvimento do Caché, o Caché Studio, só funciona em ambiente
Windows e, por isto mesmo, somente a instalação do Caché para Windows o traz. É por esta razão que a
InterSystems costuma enviar junto com o CD de instalação do Caché para Unix/Linux, o CD de Instalação do
Caché para Windows. Assim, você pode instalar o Caché em um servidor RedHat Linux e instalar a parte client,
junto com o Caché Studio, nas máquinas Windows dos desenvolvedores.
Figura 2-2 – Caché Studio (Editando uma classe de exemplo)
A parte server não depende da parte client para funcionar. Mas a parte client só é útil se houver um
Caché Server instalado em algum lugar na rede (ou na própria máquina local) onde ela possa se conectar.
É perigoso misturar versões de componentes. Por exemplo, não é recomendável usar o Caché Studio
do Caché 2007 conectado a um servidor rodando Caché 2010 ou vice-versa. Além disto, drivers de
ODBC, JDBC, ADO.NET, Java Binding e etc. também tem restrições de versões de Caché server que
devem ser respeitadas. Mas, normalmente, componentes client de versões superiores (como o driver de
ODBC do Caché 2010) funcionam também com servers de versões inferiores (como com o Caché 2007
ou 2008). A documentação do Caché traz um mapa de compatibilidade de componentes entre as
diversas versões do produto bastante simples de entender.
Preparando o Caché para Nossos Estudos  27
A primeira versão de produção do Caché foi a 2.1.6. Depois seguiram versões numeradas de forma
semelhante como a 3.x, 4.x e 5.x. Mas em 2006 a InterSystems mudou a numeração de suas versões. A
última versão com numeração antiga foi a 5.2.3. Depois desta vieram a 2007.1, 2007.2, 2008.1, e assim
por diante.
Toda a Administração do Caché pode ser feita através de um portal Web (veja Figura 2-3) de forma
que qualquer máquina que possua um navegador (como o Internet Explorer ou o Firefox) é capaz de se conectar
ao Caché Server e administrá-lo independente de ter instalado a parte client nesta máquina ou não.
Figura 2-3 – Portal de Administração do Caché aberto no Internet Explorer
Este portal administrativo oferece ferramentas muito úteis para:
•
Desenvolvedores de aplicações e DBAs - Execução de comandos SQL, Plano de Execução
de comandos SQL, lista de processos em execução e etc.
•
Administradores – Configuração de perfis de usuários, usuários, segurança, criação de
bases de dados, namespaces, instalação de chaves criptográficas (SSL/TLS), configurações
de informações de domínios de segurança, LDAP, e etc.
•
Operadores – Backup, Agendamento de Tarefas, Monitoração, consultas as tabelas de
processos, locks, ao uso da licença e etc.
Caso este portal Web não possa ser acessado por algum motivo qualquer (em uma crise), o Caché
também oferece ferramentas de administração via linha de comando na console do servidor ou via telnet de
forma que em uma emergência, um administrador sempre poderá trabalhar para restaurar o ambiente,
independente do estado do portal.
28  Preparando o Caché para Nossos Estudos
É comum em um ambiente de produção3 que os administradores e operadores responsáveis pelo Caché
não tenham que instalar nada em suas máquinas para administrar o banco, fazer backups, promover
novos componentes para produção e etc. Eles utilizam o portal web de administração e não precisam do
Caché Studio.
Além do Caché Studio e do Portal Administrativo, também são instalados no client outras ferramentas
como o Caché Terminal e a Documentação completa do produto. Vamos explicar o uso de cada um destes
componentes nos capítulos que se seguem, mas é importante saber que todos podem ser facilmente
encontrados no menu Iniciar do Windows ou no Cubo do Caché. O Cubo do Caché, que exploraremos mais
adiante, fica ao lado do relógio, na bandeja de sua barra de tarefas, e tem a aparência de um cubo mesmo: .
Ao clicar no Cubo do Caché, um menu se abre com todas as ferramentas do Caché.
Ambiente de produção – Quando disponibilizamos um sistema de informação para usuários, normalmente reservamos para
ele uma máquina, ou conjunto de máquinas, separadas das máquinas que são normalmente utilizadas para se desenvolver
o sistema (ambiente de desenvolvimento). Estas máquinas costumam ficar em “data centers” ou salas de acesso restrito, e
qualquer alteração no software instalado nestas máquinas passa por um rigoroso processo de auditoria, validação e
autorização de forma a manter a integridade do ambiente.
3
Preparando o Caché para Nossos Estudos  29
2.2 Sistemas Operacionais Suportados
O Caché é suportado em uma série de sistemas operacionais e plataformas de hardware diferentes:
•
Apple Mac OS X 10.6 for x86-64
•
HP HP-UX 11i v2, v3 for Itanium
•
HP HP-UX 11i v2, v3 for PA-RISC-64
•
HP OpenVMS 8.2, 8.3, 8.4 for Alpha
•
HP OpenVMS 8.3, 8.3-1H1, 8.4 for Itanium
•
HP Tru64 UNIX 5.1B for Alpha
•
IBM AIX 5L V5.3, 6.1 for System P-32
•
IBM AIX 5L V5.3, 6.1, 7.1 for System P-64
•
Microsoft Windows XP Pro, Server 2003, Vista, Server 2008, 7 for x86-32
•
Microsoft Windows Server 2003, Vista, Server 2008, 7 for x86-64
•
Microsoft Windows Server 2003, Server 2008 for Itanium
•
Microsoft Windows Server 2008 for Amazon EC2 for x86-64
•
Oracle Enterprise Linux 5 for x86–64
•
Oracle Solaris 10 for SPARC-64
•
Oracle Solaris 10 for x86-64
•
Red Hat Enterprise Linux v.4, 5, 6 Advanced Platform for x86-32
•
Red Hat Enterprise Linux v.4, 5, 6 Advanced Platform for x86-64
•
Red Hat Enterprise Linux v.4, 5 Advanced Platform for Itanium
•
Red Hat Enterprise Linux 5 x86-64 for Amazon EC2
•
SUSE Linux Enterprise Server 10, 11 for x86-32
•
SUSE Linux Enterprise Server 10, 11 for x86-64
•
SUSE Linux Enterprise Server 10, 11 for Itanium
Uma lista atual de todas as plataformas suportadas para todas as versões de Caché pode ser
encontrada em:
http://www.intersystems.com/cache/technology/product-tables/current-prodlist.html
30  Preparando o Caché para Nossos Estudos
2.3 Instalando o Caché no Windows
Neste livro, instalaremos uma versão comercial do Caché 20010.2. Se você estiver instalando uma
versão de demonstração (que pode ser baixada do site da InterSystems gratuitamente), ou estiver instalando
uma versão anterior à versão 2010.24, as telas de instalação serão um pouco diferentes. No entanto, como
estamos explorando as opções mais comuns de instalação, acreditamos que você será capaz de lidar com as
diferenças de telas e responder de acordo.
A instalação do Caché PC (versão limitada do Caché baixada do site da InterSystems) é bem mais
simples que a instalação da versão comercial do Caché. Ela basicamente pede apenas para que você
confirme o local de instalação do software em seu disco. Portanto, não se assuste se a sua instalação
for mais simples do que o que explicamos aqui. Mas não deixe de ler este tópico, pois existem dicas
muito boas para qualquer versão de Caché como, por exemplo, qual é o login e a senha do usuário
administrador criado automaticamente durante a instalação.
Vamos instalar, para nossos estudos, um ambiente de desenvolvimento com ambas as partes client e
server do Caché em nossa máquina Windows.
Para tanto, basta executar o programa de
instalação que pode ser acionado automaticamente,
ao se inserir o CD de instalação do Caché em seu
drive de disco ou através de um duplo clique no
programa de instalação do Caché.
Se você já tiver uma versão anterior do
Caché instalada na sua máquina, a primeira coisa
que o programa de instalação fará é perguntar se
você deseja atualizar a versão que está instalada em
sua máquina ou instalar uma nova instância do
produto como pode ser observado na Figura 2-4
Recomendamos que você escolha a opção de
instalar uma nova instância.
Figura 2-4 – Tela perguntando se desejamos atualizar
Se você está instalando o Caché na sua máquina pela primeira vez, esta tela não aparecerá. Se
aparecer, recomendamos que você instale uma nova instância do Caché, em outra pasta em seu disco.
Se você estiver instalando uma versão anterior à versão 2007.2, considere contactar a InterSystems para obter uma versão
mais recente.
4
Preparando o Caché para Nossos Estudos  31
É possível ter várias instâncias de Caché instaladas na mesma máquina funcionando ao mesmo tempo.
Isto é muito útil quando estamos desenvolvendo algo que terá que funcionar bem em mais de uma versão do
Caché, por exemplo.
Aceitando os Termos do Acordo de Licenciamento
Se você está instalando o Caché pela primeira vez (ou, em caso contrário, seguiu a recomendação de
instalar uma nova instância) a tela seguinte apresenta o acordo de licenciamento comum que todo programa
comercial apresenta durante a instalação. Basta marcar que a opção indicando que você aceita os termos do
acordo e prosseguir para a próxima tela.
Definindo o nome da Instância
A próxima tela do programa de instalação perguntará qual será o nome desta instância. Se você está
instalando o Caché pela primeira vez em sua máquina, a instalação sugerirá o nome “CACHE”.
Quando temos mais de uma instância de Caché instalada, cada instância tem um nome único que a
identifica. Este nome aparecerá em vários lugares (como no Portal Administrativo) para indicar com qual instância
estamos trabalhando. Este nome também poderá ser utilizado para realizar tarefas como parar ou iniciar uma
instância pela linha de comando. Você pode manter o nome sugerido, ou alterá-lo sem problemas.
Definindo a pasta onde o Caché será instalado
A tela seguinte pede para que se confirme a pasta ou diretório onde o Caché deve ser instalado. Se
você está instalando o Caché pela primeira vez, o programa de instalação sugerirá a pasta
“C:\InterSystems\Cache”.
Caso esteja instalando uma nova instância do produto, o programa poderá sugerir a próxima pasta
disponível como “C:\InterSystems\Cache1” ou “C:\InterSystems\Cache2”. Você pode mudar o caminho de
instalação sem problemas. Mais tarde discutiremos os arquivos e pastas que são criados dentro desta pasta.
Definindo os componentes a ser instalados
A próxima tela do programa de instalação (Figura 2-5) é uma das mais importantes, pois é nela que
definimos quais componentes do Caché instalaremos e, por conseguinte que ambiente teremos.
32  Preparando o Caché para Nossos Estudos
Poderemos escolher entre as seguintes opções:
•
Development – Instala tanto a parte server (Caché Engine) quanto a parte client com uma
configuração mínima de segurança.
•
Server – Instala apenas a parte server do Caché e permite que se especifique opções avançadas
de segurança, inicialização e codificação da base de dados.
•
Client– Instala apenas a parte client do Caché de forma que esta máquina possa ser usada para se
trabalhar com um Caché Server em outra máquina. Aqui seriam instalados apenas o cubo do
Caché, o Caché Studio, o Caché Terminal e os drivers de acesso ao banco.
•
Web Server – Instala apenas os componentes necessários para que um web Server como o
Apache ou o IIS possam ser utilizados com um servidor Caché em outra máquina.
•
Custom – Permite que o usuário escolha uma combinação qualquer de componentes do Caché
que ele deseja instalar.
Figura 2-5 – Escolhendo os Componentes a serem instalados
Prosseguiremos instalando com a opção Development que instalará tanto a parte server (Caché
Engine) quanto a parte client do Caché na nossa máquina, criando assim um perfeito ambiente de
desenvolvimento para nossos estudos.
Preparando o Caché para Nossos Estudos  33
Entrando com os dados da licença
Agora estamos quase no final da configuração do programa de instalação e por isto ele nos apresenta
uma tela com o resumo de nossas escolhas como pode ser visto na Figura 2-6.
Figura 2-6 - Resumo da Instalação
Observe que, na parte de baixo desta tela, você pode escolher se deseja entrar com os dados da
licença agora ou depois. Se você já recebeu a licença da InterSystems, deixe a opção marcada. Caso contrário,
desmarque a opção e você poderá seguir instruções para instalar a licença mais tarde.
Se você deixou a opção marcada, um assistente será iniciado para colher os dados da licença. Clique
para prosseguir na primeira tela do assistente de forma que a tela da figura Figura 2-7 apareça.
34  Preparando o Caché para Nossos Estudos
Figura 2-7 – Entrando com uma licença
Esta tela permite que você entre com as informações de sua licença. Estas informações estão presentes
em um documento impresso (ou em um e-mail) enviado pela InterSystems com os dados da licença, que devem
ser digitados corretamente, respeitando-se letras maiúsculas e minúsculas.
Quando a InterSystems envia a licença, ela não só envia o documento com seus detalhes (usado para
preencher o diálogo da Figura 2-7), mas também um arquivo (via e-mail), normalmente chamado
licensekey.txt. Depois do processo de instalação, você pode renomear este arquivo para cache.key e
copiá-lo para a pasta <InstallDir>\Mgr. Para localizar esta pasta, leia o tópico 2.4 - Estrutura, Databases
e Namespaces.
Finalizando
Depois de entrar com a licença, o instalador prosseguirá com a cópia dos arquivos. Quando terminar de
copiar os arquivos, uma tela final será apresentada (Figura 2-8) e você terá a opção de ver uma página de boas
vindas com links para tutoriais, release notes, e etc.
Preparando o Caché para Nossos Estudos  35
Figura 2-8 - Instalação Terminada
Ao clicar no botão de finalização nesta tela final, observe que um cubo
aparecerá na bandeja de seu
Windows, perto da data e da hora no canto inferior direito de sua tela. É através deste cubo que você terá
acesso às diversas ferramentas do Caché. Veremos mais sobre estas ferramentas nos capítulos seguintes.
36  Preparando o Caché para Nossos Estudos
2.4 Estrutura, Databases e Namespaces
Agora que temos o Caché efetivamente instalado em nossa máquina, vamos começar a compreender
um pouco de sua organização lógica e física. Esta compreensão é essencial para todo o resto do livro, mas não
vamos explicar tudo de uma vez aqui. Explicaremos apenas o suficiente para que você compreenda a ideia geral.
Conforme já explicamos, o Caché é, ao mesmo tempo, um Banco de Dados e um Servidor de
Aplicações. Se o desenvolvedor construir uma aplicação em Java (JSP, J2EE, Swing, SWT, etc.), Visual Basic,
PHP, Delphi, .NET e etc. que necessite de uma base de dados para armazenar suas informações, o Caché
estará sendo usado a principio como base de dados para a aplicação.
Figura 2-9 - O Caché como Banco de Dados e Servidor de Aplicações
Mas se o desenvolvedor estiver construindo a sua aplicação usando apenas recursos do Caché como o
CSP (Caché Server Pages) ou o Zen, então ele estará usando o Caché não só como base de dados, mas
também como Servidor de Aplicações. Desta forma, ele não precisará de mais nada, além do próprio Caché,
para construir e executar a sua aplicação e armazenar os seus dados. Um ambiente completamente
independente e unificado.
Esta é uma separação inexata, pois mesmo trabalhando com Visual Basic .NET, por exemplo, o
desenvolvedor pode optar por colocar código no banco de dados na forma de Stored Procedures,
Métodos de Classes (se estiver desenvolvendo de forma orientada a objetos) ou Web Services (o que
caracterizaria mais o Caché como servidor de aplicação). Mas o objetivo aqui é explicar que o Caché
pode ser um ambiente independente para alguns tipos de aplicações (como aplicações Web), atuando
portanto como um servidor de aplicações Web e Banco de Dados ao mesmo tempo!
De uma forma ou de outra, se você está construindo uma aplicação usando o Caché, você estará
usando-o como banco de dados e todo banco de dados guarda informações, em última instância, em arquivos no
disco de seu computador. Portanto, é importante começar a analisar o que foi de fato criado em seu disco em
termos de pastas e arquivos para começar a entender onde ficam nossas aplicações e nossos dados.
Preparando o Caché para Nossos Estudos  37
A Figura 2-10 mostra algumas das principais pastas criadas em seu computador depois do processo de
instalação:
<InstallDir> Bin CSP httpd Mgr Figura 2-10 – Algumas das Principais Pastas criadas pelo Processo de Instalação do Caché
De acordo com as opções de instalação escolhidas, o Caché poderá estar instalado em uma pasta raiz
diferente. Portanto <InstallDir> pode ser algo como “C:\InterSystems\Cache”.
As subpastas dentro de <InstallDir>, por outro lado, terão o mesmo nome que as apresentadas na
Figura 2-10. Nem todas as pastas criadas são mostradas, apenas as mais importantes. A próxima tabela
descreve cada uma delas:
Tabela 2-1 – Pastas criadas pelo Caché no Processo de Instalação
Bin
Nesta pasta estão todos os binários (executáveis) do Caché.
CSP
Nesta pasta, existem subpastas. Cada subpasta representa uma aplicação CSP e contém
os arquivos (páginas) csp que compõem esta aplicação.
Httpd
Nesta pasta estão os binários do Servidor Web Apache que vem embutido no Caché. Este
servidor é de uso exclusivo do Caché e serve para que possamos acessar o seu portal
administrativo e outras aplicações Web do Caché.
Mgr
Nesta pasta, existem subpastas. Cada subpasta representa uma base de dados
(database) do Caché. Em cada subpasta, você encontrará apenas um arquivo chamado
CACHE.DAT que contém todos os dados do database específico.
Por exemplo, o arquivo <InstallDir>\Mgr\SAMPLES\CACHE.DAT
guarda todas as
informações do database chamado SAMPLES.
A pasta Mgr é uma das mais importantes. É abaixo dela que ficam as pastas que representam nossos
databases. Por exemplo, o arquivo <InstallDir>\Mgr\SAMPLES\CACHE.DAT mencionado acima, contém todas as
tabelas (ou classes), registros, índices e etc. do database SAMPLES. Este database vem com o Caché e traz
aplicações de exemplo criadas pela InterSystems para ajudar no aprendizado do Caché.
38  Preparando o Caché para Nossos Estudos
Como outro exemplo, o arquivo <InstallDir>\Mgr\USER\CACHE.DAT guarda todos os dados do
database USER, que também vem com o Caché, mas não traz nenhuma tabela, classe ou aplicação préconstruída como o SAMPLES. Trata-se de um database vazio, usado para testes e estudo (usaremos este
database em breve para criar nossa primeira aplicação no Capítulo 3).
2.4.1 Namespaces
O conceito de database é muito importante, mas o Caché não permite que utilizemos um database
diretamente. Existe uma estrutura lógica muito útil chamada namespace que agrupa um ou mais databases para
criar um “Espaço de Trabalho” lógico, como mostrado na Figura 2-11. Leia com atenção esta seção, pois o seu
conteúdo não é complicado, mas pode ser um pouco confuso para quem nunca trabalhou com bancos de dados
antes.
Namespace
ACME
Database
ACME
Database
CACHELIB
Database
CACHETEMP
Figura 2-11 – Os databases que compõem o namespace ACME
Na figura, podemos ver o namespace ACME como um losango. Todo namespace precisa ter um
database para armazenar seus dados. De fato, podemos especificar mais de um database para compor um
namespace para diversos fins diferentes mas, por enquanto, basta saber que pelo menos um database de dados
é necessário para que um namespace exista e, neste caso, o namespace ACME utiliza como database de dados
o Database ACME.
Enquanto que o Database ACME representa um arquivo CACHE.DAT criado por nós em alguma parte
do disco, os outros dois databases que aparecem na figura, CACHELIB e CACHETEMP são databases que
veem com o próprio Caché.
O database CACHELIB, que vem com o Caché, traz toda uma biblioteca de classes muito úteis para
qualquer aplicação básica que criamos. Portanto, todo namespace criado no Caché automaticamente mapeia,
obrigatoriamente, todas as classes do database CACHELIB.
Além disto, todo namespace usa o database CACHETEMP para armazenamento de informações
temporárias. CACHETEMP é um database muito especial. O Caché sabe que nele só estarão dados temporários
de vários namespaces assim que o Caché evita gravar estes dados em disco, mantendo-os em memória o maior
tempo possível. Nos próximos capítulos deste livro, conheceremos mais sobre o database CACHETEMP.
Preparando o Caché para Nossos Estudos  39
O nome do namespace não precisa ser igual ao nome de seu database. Na maioria das vezes o é, por
pura conveniência. Mas podemos ter dois ou mais namespaces diferentes que usam um mesmo
database, por exemplo. Existem boas razões para isto, mas que fogem a característica introdutória
deste capítulo.
Você verá em outros capítulos que o processo de criar um novo namespace é muito simples. Como todo
namespace usa, internamente, os databases CACHELIB e CACHETEMP, o assistente de criação de
namespaces nem se dá ao trabalho de mencionar qualquer coisa a respeito. Está implícito! A única coisa que
você tem que informar é o database do seu novo namespace. Mas vamos deixar isto para a hora certa.
O Importante é saber que quando trabalhamos com o Caché, trabalhamos em namespaces. Por
exemplo, no próximo capítulo, construiremos uma pequena aplicação no namespace USER que, como dissemos
acima, já vem criado com o Caché e está vazio, o que é perfeito para nossos testes!
40  Preparando o Caché para Nossos Estudos
2.5 Iniciando e Parando o Caché
Este tópico é muito importante por dois motivos: Entender como o Caché é instalado como um serviço
do Windows e que benefícios isto pode nos trazer e, para aqueles que estiverem usando Windows Vista, pode
ser que este tópico ajude a resolver alguns problemas na hora de parar ou iniciar o Caché.
O processo de instalação do Caché configura um Cubo , na
sua bandeja (canto inferior direito de sua tela, ao lado do relógio) que é
a principal interface para se interagir com o Caché. Clicando neste
cubo, você poderá ver opções para Parar o Caché, ver sua
Documentação ou abrir algumas de suas ferramentas como o Caché
Terminal ou o Caché Studio.
Se você quiser se aventurar um pouco, pode começar pela
Documentação do Caché, clicando na opção respectiva no Cubo do
Caché.
Se você resolver parar o Caché, perceberá que, depois de dar
um boot em sua máquina, o Caché poderá estar no ar sozinho
novamente. Isto ocorre porque o processo de instalação do Caché
configurou o Caché como um Serviço5 no Windows.
Figura 2-12- Opções do Cubo do Caché
Você pode averiguar isto abrindo o Painel de Controle de seu Windows, seguindo por Ferramentas
Administrativas e, por fim, clicando em Serviços
. No Windows Vista o caminho é um pouco mais longo e é
mais fácil digitar “serviços” na caixa de busca do botão iniciar. O Windows mostrará o programa de
Serviços.
Ao executar o programa, aparecerá uma lista de todos os serviços existentes na sua máquina. Se você
procurar um pouco, verá que um serviço com o nome “Caché Controller for <NomeDaInstancia>” estará na sua
lista. Como no processo de instalação (Item 2.3 deste Capítulo) recomendamos que se usasse o nome “CACHE”
como nome de instância, sua lista deve mostrar um item de serviço de nome “Caché Controller for CACHE”. Não
tem problema algum se você usou outro nome de instância.
Se você clicar duas vezes no serviço do Caché, uma janela de configuração do serviço aparecerá
(Figura 2-13). Nesta janela você poderá ver várias informações importantes do serviço como, por exemplo, na
Aba Geral (General), o nome do programa executável que ele chama quando deseja iniciar o serviço e o Tipo de
Inicialização (Startup type), que permite que você configure se deseja que o Caché seja iniciado de forma
Automática ou Manual, ou ainda desabilitar o serviço completamente. Você também poderá Parar ou Iniciar o
serviço temporariamente o que é muito útil, principalmente em instalações com Windows Vista, que em alguns
casos bloqueia a opção de Iniciar e Parar o Caché pelo Cubo do Caché. Mas por aqui sempre funciona.
Serviço do Windows – Programa que é iniciado automaticamente com o sistema operacional com privilégios específicos
para cumprir tarefas importantes sem que o usuário tenha que ativá-los manualmente.
5
Preparando o Caché para Nossos Estudos  41
Figura 2-13 - Janela de Configuração do Serviço
Existe outra configuração muito importante nesta janela, na Aba Log On, que permite que você defina
sob qual usuário do sistema operacional o serviço será inicializado e, por conseguinte, que privilégios ele terá na
máquina local e nas outras máquinas da rede. Concluindo:
•
Se você não fizer nada, o Serviço Windows do Caché permanecerá configurado para Inicialização
Automática (Automatic), subindo o Caché automaticamente toda vez que você ligar sua máquina.
Assim, você pode usar o Cubo do Caché para parar o Caché ou reiniciá-lo sempre que quiser.
•
Se você alterar o Serviço Windows do Caché para Inicialização Manual (Manual), o Caché só subirá
quando você clicar em Iniciar o Caché, no Cubo do Caché.
•
Se você alterar o Serviço Windows do Caché para Desabilitado (Disabled), o Caché não poderá
mais subir até que você reconfigure o serviço para Inicialização Automática ou Manual novamente.
Se você, acidentalmente, clicar na opção Sair do Cubo do Caché, não se preocupe. O Caché não
depende do Cubo para funcionar e vai continuar no ar. Você pode abrir o Cubo do Caché novamente
clicando no botão Iniciar de seu Windows, seguindo por Programas, Iniciar (Startup), e aqui você verá
vários programas que são inicializados automaticamente, incluindo o Cubo do Caché. Basta clicar nele
que o seu Cubo voltará!
42  Preparando o Caché para Nossos Estudos
2.6 Abrindo o Portal Administrativo do Caché
Para terminar este capítulo, vamos abrir o portal administrativo do Caché. Este portal é usado para
muitas coisas como executar consultas SQL, criar bases de dados e namespaces, executar backups, fazer
ajustes nas configurações do Caché, etc. Para abri-lo, basta clicar no cubo do Caché e escolher a opção Portal
de Administração do Sistema (ou System Management Portal em inglês).
Figura 2-14 - Portal de Administração do Sistema do Caché
É possível que ao abrir o portal de administração, um usuário e uma senha sejam solicitados. Se você
seguiu as instruções e fez uma instalação de Caché para Desenvolvedores ou instalou o Caché PC, você poderá
entrar com o usuário _SYSTEM e a senha SYS. Este é um usuário muito especial pois é criado automaticamente
pelo Caché e possui privilégios para fazer tudo no Caché, sem restrições.
Se você escolheu uma opção de instalação diferente, o processo de instalação deve haver perguntado
para você a senha do usuário _SYSTEM. Você deve usar esta senha para entrar no portal.
Por agora, isto é tudo. Sinta-se a vontade para explorar o portal de administração. Vamos usá-lo de
verdade no próximo capítulo, junto com o Caché Studio e o Caché Terminal!
Preparando o Caché para Nossos Estudos  43
3 Conhecendo o Terreno: Criando sua primeira
aplicação e se familiarizando com as
ferramentas
Toda vez que estou aprendendo algo novo, gosto de sentir que estou progredindo. É tedioso ser
obrigado a ler páginas e páginas de um livro ou manual para, só depois, conseguir produzir algo interessante e
concreto. Foi por isto que decidi fazer uma aplicação simples com o Caché logo no início. Não se preocupe se
você não conhece conceitos como classe ou objeto. Eu os explicarei resumidamente na medida em que
progredirmos. De fato, não construiremos uma aplicação inteira, mas teremos a chance de conhecer as principais
ferramentas do Caché que seriam usadas para construir uma. É por isto que recomendo a leitura deste capítulo
por todos os leitores. Neste capítulo você:
•
Aprenderá a usar o Caché Studio e suas principais funcionalidades
•
Aprenderá sobre como criar Projetos no Caché Studio e como são importantes para qualquer
metodologia de desenvolvimento de software. Trabalhar com Projetos também nos traz facilidades
para exportar nosso trabalho de forma que possamos guardá-lo ou levá-lo para outro servidor e
importá-lo novamente.
•
Verá uma introdução muito rápida sobre o que é e como criar uma classe simples no Caché usando
o Caché Studio.
•
Aprenderá a criar objetos desta classe em seu banco de dados de forma manual usando o Caché
Terminal.
•
Aprenderá a usar o Portal de Administração do Sistema do Caché para listar os objetos de sua
classe usando comandos SQL (Structured Query Language)
•
Verá como é fácil criar uma Página CSP (Caché Server Pages) e uma página Zen, usando de novo
o Caché Studio para listar os objetos de nossa classe na Web e ver a diferença que existe entre o
CSP e o Zen
•
E, por fim, verá como o Caché permite a criação de rotinas poderosas que podem compor
aplicações inteiras ou nos servir para diversas tarefas úteis no dia-a-dia de desenvolvimento e
manutenção do sistema.
Caché Server Pages: Criando Aplicações Web com o Caché  44
3.1 Conceitos e Definições necessárias para nossa Primeira
Aplicação
Para aprender sobre como usar as principais ferramentas do Caché, vamos criar uma simples Agenda
de Contatos com funções básicas de incluir, listar e excluir contatos. Toda agenda de contatos possui Contatos,
que são na verdade a razão de ser da agenda. Uma agenda sem contatos não é nada mais do que um livro
vazio. No mundo da Orientação a Objetos, um contato teria uma representação básica definida por uma classe.
Isto é: A classe define, entre outras coisas, que todo contado deve ter determinados atributos como nome,
telefone, e-mail, etc.
Se fossemos listar nossos contatos em uma folha de papel, poderíamos colocar cada contato em uma
linha da folha e em cada linha poderíamos teríamos que escrever o valor correspondente a cada um dos atributos
definidos pela classe (como nome, telefone e e-mail). No mundo da orientação a objetos, cada uma destas linhas
na folha seria chamada de um objeto ou instancia da classe contato.
Dedicaremos um capítulo inteiro para detalhar o uso de Classes e Objetos no Caché, mas, por hora,
basta saber que as classes servem para descrever entidades como Contatos, Clientes, Produtos, e tudo o mais
que precisemos usar e guardar em qualquer aplicação que quisermos construir. No nosso caso, como estamos
construindo uma agenda de contatos bem simples, só construiremos uma única classe: A Classe Contato.
Cada linha da nossa folha de papel tinha os mesmos dados: Nome, Telefone e EMail. A estes dados
chamamos de atributos ou propriedades de um contato (de um objeto da classe contato) e estas propriedades
são definidas na classe Contato de forma que cada objeto da classe contato tenha as mesmas propriedades.
Cada contato que criarmos em nossa agenda é um objeto que segue o modelo determinado por sua classe,
tendo assim todos os atributos devidamente preenchidos como pode ser visto na Figura 3-1.
Base de Dados
Classe Contato
(Modelo)
Contato
- Nome
- Telefone
- EMail
1
João da Silva
555-5676
1
[email protected]
João da Silva
1
555-5676
João da Silva
[email protected]
555-5676
[email protected]
Objetos
(Contatos)
Figura 3-1 - A classe como modelo de criação dos objetos
Preparando o Caché para Nossos Estudos  45
Conforme explicamos no Capítulo 1, o Caché é um banco de dados objeto-relacional. É por isto que
vamos falar o tempo inteiro sobre classes e objetos. Mas o Caché também é um Banco de Dados SQL6, podendo
substituir perfeitamente qualquer banco de dados no mercado. Na verdade, é muito comum, no Caché, usar
comandos SQL (Structured Query Language) como SELECT para obter uma listagem de todos os objetos de
uma classe da mesma forma que um desenvolvedor ou analista faria para obter uma listagem de todos os
registros de uma tabela.
Tabela 3-1 – Exemplo de Listagem de objetos da Classe Contato
ID
Nome
Telefone
EMail
1
João da Silva
555-5676
[email protected]
2
Maria Silvina
555-6789
[email protected]
...
...
...
...
Na Tabela 3-1, podemos ver uma listagem tabular de alguns objetos de exemplo de nossa classe
Contato. Cada objeto contato aparece como uma linha da tabela da mesma forma como apareciam em nossa
folha de papel. A propriedade ID, que aparece na listagem, identifica cada objeto de forma inequívoca. Esta
identificação será muito útil como veremos mais tarde e não é necessário especificá-la como propriedade de
nossa classe. Trata-se de uma propriedade que toda classe persistente (cujos objetos podem ser salvos em
disco) possui e está presente também na Figura 3-1.
Para criar esta estrutura, a classe, vamos aprender a usar o Caché Studio, o ambiente de
desenvolvimento do Caché. Trata-se de um tópico muito importante, que fornece dicas muito úteis para o dia-adia de qualquer desenvolvedor Caché.
Se você já conhece um pouco de bancos de dados, especificamente os Bancos de Dados SQL, você
deve estar se perguntando por que dar um novo nome para uma coisa que já existe? No mundo dos
bancos de dados relacionais, chamaríamos a tabela acima, nossa agenda de contatos, de “tabela”, e
não “classe”. Mas você verá nos próximos capítulos que uma classe pode ser muito mais que uma
simples tabela. Estamos tentando manter as coisas simples para quem está vendo estes conceitos pela
primeira vez. No Caché, estes termos são quase intercambiáveis, mas, em verdade, o conceito classe
incorpora o conceito tabela, estendendo-o para algo mais completo.
Eu poderia ter usado a expressão “Banco de Dados Relacional”, mas ela seria imprecisa. O Caché, como todos os bancos
de dados orientado a objetos e relacionais, é apenas mais uma implementação de banco de dados Relacionais, que são
baseados na teoria matemática dos conjuntos. Não podemos confundir a implementação com a teoria base. Relações entre
elementos e conjuntos de elementos existem em qualquer banco de dados SQL e Orientado a Objetos.
6
46  Preparando o Caché para Nossos Estudos
3.2 Caché Studio
3.2.1 Abrindo o Caché Studio pela Primeira vez
Neste capítulo, vamos conhecer o Caché Studio e algumas de
suas principais janelas. Para tanto, primeiramente, tenha a certeza de
que o Caché está funcionando (o cubo do Caché deve estar azul). Clique
no cubo do Caché
na bandeja de seu Windows e selecione a opção
Studio. O Studio lhe perguntará seu Usuário e Senha. Você poderá usar o
usuário _SYSTEM (não esqueça o underscore, ou “sublinha”, na frente).
Este é um usuário especial de sistema criado automaticamente pelo
processo de instalação do Caché. A senha deste usuário dependerá do
tipo de ambiente que você pediu para instalar.
Durante o processo de instalação descrito no capítulo anterior,
sugerimos instalar um ambiente de desenvolvimento (Development). Se você escolheu esta opção de instalação,
o programa de setup automaticamente define a senha “SYS” (tudo maiúsculo para o usuário _SYSTEM). Por
outro lado, caso você tenha escolhido uma instalação Server, o programa de instalação perguntará várias coisas
específicas para um ambiente Server de produção, incluindo a senha para o usuário _SYSTEM.
Figura 3-2 - Caché Studio trabalhando no namespace USER
Preparando o Caché para Nossos Estudos  47
Após ter entrado com o seu usuário e senha, você deverá ver o Caché Studio aberto no namespace
USER conforme a Figura 3-2. Você pode ver em que namespace você está no momento ao olhar a barra de título
da janela do Caché Studio. A barra de título mostra algo parecido com o seguinte:
_SYSTEM – CACHE/USER/Agenda.Contato.cls
Nome do Documento
Namespace
Nome da Instância de Caché
Nome do usuário
Figura 3-3 - Barra de Título do Caché Studio
A única coisa estranha aqui para você no momento deve ser o nome do documento, que exploraremos
logo adiante. Verifique se você está no namespace USER e, se não estiver, o tópico 3.2.2 explica como mudar de
namespaces. Outros pontos importantes a se observar no Studio estão numerados na Figura 3-2 e são melhor
explicados abaixo na Tabela 3-2.
Tabela 3-2 – Descrição de elementos Importantes do Caché Studio
1
2
Janela de Inspeção – Esta janela será muito útil quando estivermos trabalhando com nossa
nova classe e aprenderemos a usá-la em breve.
Janela de Saída – Esta janela sempre mostrará o resultado de uma operação qualquer
como compilar uma classe, fazer uma busca, e etc.
Alt + 1
Alt + 2
Espaço de Trabalho (Workspace) – Esta janela é muito importante, pois nos permite ver as
classes, rotinas e páginas CSP com as quais podemos trabalhar. Se você observar bem, ela
possui três pequenas “abinhas” em sua parte inferior que nos permite especificar o escopo
3
de nossa visão. Por exemplo, se a abinha Namespace estiver selecionada, a janela de
espaço de trabalho estará mostrando acima, todas as classes, rotinas e páginas CSP do
Alt + 3
namespace ao qual estamos conectados. Por outro lado, se a abinha Projeto estiver
selecionado, estaremos vendo apenas as classes, rotinas e páginas de nosso namespace
que pertencem ao nosso projeto atual (explicaremos o que é um projeto em breve).
Janela de Debug – Esta janela é muito importante quando estivermos depurando uma
4
classe, rotina ou página CSP e quisermos ver o resultado de cada passo do processo de
depuração. Falaremos mais sobre depuração em capítulos posteriores.
Alt + 4
Botão “Novo” – É através deste botão que iniciamos todo o processo de criação de classes,
rotinas, páginas CSP e etc. Usaremos este botão em breve. O resultado do processo de criar
5
uma nova classe, rotina ou página CSP é que este novo artefato é aberto para edição na
área descrita pelo item 7 logo abaixo.
48  Preparando o Caché para Nossos Estudos
Ctrl + N
Compilar – Este é um botão muito importante pois nada do que criarmos será útil se não for
6
compilado. É preciso compilar uma classe sempre que a modificarmos. O processo de
compilação inclui o processo de salvar o artefato que está sendo compilado.
Janela de Codificação – É aqui onde escrevemos código. Normalmente, nesta área,
7
8
estaríamos editando uma classe, rotina ou página CSP. Quando criarmos nossa primeira
classe de nosso projeto Agenda, é nesta janela que trabalharemos.
Ctrl + F7
CTRL + Tab (troca de
janela)
CTRL + F4 (fecha a
janela)
Exibir Página Web – Quando estivermos trabalhando com páginas CSP ou páginas Zen,
usaremos este botão para visualizar nossas páginas no navegador padrão do sistema.
É muito importante que você teste agora alguns dos atalhos de teclado mostrados acima, pois eles lhe
darão agilidade na codificação. É claro que você sempre pode recorrer ao seu mouse. Mas uma sequência rápida
de comandos como Alt+1, Alt+2 e Alt+3 pode liberar um bom espaço para sua janela de codificação, que se
expandirá ocupando toda a tela.
3.2.2 Verificando o Namespace (Conectando em Outro Namespace com o
Caché Studio)
Este tópico explica como fazer o
Caché Studio se conectar a outro
namespace. Se por algum motivo o seu
Studio abriu em outro namespace qualquer,
mude de volta para o namespace USER
para que possamos continuar criando nossa
aplicação no lugar certo.
Para fazer com que o seu Studio se
conecte a outro namespace, basta clicar no
menu Arquivo > Mudar Namespace, ou
pressionar F4. A janela da Figura 3-4
aparecerá.
Esta janela permite reconhecer
Figura 3-4 – Conectando a Outro Namespace
uma importante característica do Studio:
Que ele pode se conectar a qualquer namespace de qualquer instância, mesmo que esta instância esteja em
outra máquina na rede (o que é muito comum). Como pudemos constatar isto? Basta olhar, na Figura 3-4, que
um dos campos na janela refere-se ao Servidor que queremos nos conectar e abaixo, podemos ver a lista de
namespaces deste servidor específico.
Como demos o nome de CACHE à nossa instância de Caché, durante o processo de instalação descrito
no Capítulo 2, o campo Servidor mostra que estamos conectados a esta instância específica, que se localiza na
Preparando o Caché para Nossos Estudos  49
nossa própria máquina (localhost7) e está usando a porta TCP/IP 56773, que, em seu caso, pode ter um número
diferente.
Se quisermos, portanto, trabalhar em outro namespace, que esteja em outra instância que não seja a
instância CACHE, bastaria clicar no botão Conectar ao lado do campo Servidor e escolher outra instância na
nossa máquina ou em outra.
Se você clicar no botão Conectar, é provável que veja uma lista de um só item que será a própria
instância que estávamos usando (CACHE), a não ser que você tenha mais de uma instância instalada
em sua máquina ou que alguém tenha configurado instâncias remotas (que estão rodando em outras
máquinas na rede) para você. Veremos como configurar instâncias remotas nos próximos capítulos.
Para este capítulo, tenha a certeza de estar trabalhando no namespace USER, selecionando-o na lista
de namespaces e clicando no botão OK.
3.2.3 Trabalhando com Projetos (Uma questão de metodologia)
Este tópico explica como podemos organizar as coisas que criamos em projetos e trata-se de um tópico
extremamente importante.
Uma vez que você tenha verificado que está no namespace correto (USER), vamos prosseguir criando
nosso primeiro Projeto para abrigar os componentes de nossa aplicação. Aprender a trabalhar com projetos é
essencial para qualquer metodologia de desenvolvimento. Não adotaremos nenhuma metodologia em especial
neste livro, mas daremos várias dicas essenciais que permitirão que qualquer metodologia existente possa ser
usada com o Caché.
Quando você abre o Caché Studio, ele tenta abrir o último projeto em que você estava trabalhando,
assumindo que você vai simplesmente continuar seu trabalho anterior. É possível que você esteja abrindo o
Caché Studio pela primeira vez em sua máquina. Neste caso, o Caché Studio não terá projeto anterior para abrir
e, por isso, criará um novo projeto padrão de nome semelhante ao que mostramos na Figura 3-3 (veja o nome do
projeto na barra de título de seu Caché Studio).
Logo, querendo ou não, sempre estaremos trabalhando com um projeto, seja um criado
automaticamente pelo Studio com um nome qualquer, seja um criado por nós mesmos com um nome mais
adequado ao que estamos fazendo.
Para que serve um Projeto?
Um projeto serve para agrupar um conjunto de classes, rotinas, páginas CSP e outros tipos de
documentos que o Studio pode criar, sob um nome que identifique este grupo de documentos. Na parte de baixo
do Espaço de Trabalho (Workspace - Item 3 da Figura 3-2), existe uma Aba chamada Projeto, que, quando
clicada, mostra todas as classes, rotinas e páginas CSP do projeto atual, ao contrário da Aba Namespace, que
7 Localhost – Trata-se de um endereço que é sempre traduzido para o endereço TCP/IP 127.0.0.1 que chamamos de
endereço de loopback por sempre representar a nossa própria máquina.
50  Preparando o Caché para Nossos Estudos
mostra todas as classes, rotinas e páginas CSP do namespace atual inteiro. Este agrupamento e visualização
restritos são muito úteis em diversas situações muito comuns quando estamos desenvolvendo um sistema:
•
•
Uma aplicação Caché normalmente é constituída por um conjunto de classes, rotinas, páginas CSP
ou Zen. Mas e se estivermos trabalhando com mais de uma aplicação? Como poderíamos separar
as classes de uma aplicação X das classes de outra aplicação Y?
o
Uma alternativa seria criar uma aplicação em cada Namespace. Por enquanto, estamos
trabalhando no namespace USER, que vem com o Caché, mas vamos aprender a criar nossos
próprios namespaces com os nomes que quisermos. Assim, poderíamos criar um novo
namespace para cada aplicação que resolvermos criar.
o
A alternativa acima é interessante em alguns casos específicos e deve ser sempre
considerada. Mas outra alternativa é continuarmos trabalhando em um mesmo namespace e
criar um projeto diferente para cada aplicação nova que criarmos. Assim, poderíamos ter um
“Projeto X” para a nossa aplicação X e um “Projeto Y” para nossa aplicação Y, no mesmo
namespace USER. Esta alternativa é especialmente interessante se as duas aplicações
compartilham classes em comum. Por exemplo, você poderia ter uma classe com utilitários que
as duas aplicações poderiam usar. Logo, esta classe especial estaria com certeza nos dois
projetos X e Y e não estaríamos trabalhando com duas classes diferentes pois mesmo estando
em dois projetos, trata-se da mesma classe pois está em um único namespace.
Você poderia estar construindo uma grande aplicação e cada módulo de sua aplicação poderia
estar em um projeto diferente. Assim, você poderia trabalhar apenas com uma pequena porção de
sua aplicação de cada vez. Enquanto a aplicação inteira poderia ter três mil classes, rotinas e
páginas CSP, um módulo de cadastro de clientes teria apenas as classes, rotinas e páginas usadas
por este módulo e estas estariam agrupadas no projeto de cadastro de clientes.
o
•
Isto é muito útil pois, uma vez que você terminar de trabalhar com aquele módulo específico,
você poderia exportar o módulo inteiro para um arquivo XML (explicaremos isto depois), para
levar para o ambiente de homologação e testes, por exemplo.
Outra situação muito comum que pode ser resolvida com o uso de projetos é a fase de manutenção
de uma aplicação que já esteja pronta. Você pode criar um novo projeto para cada manutenção
(correção de bug, melhoria, criação de nova funcionalidade, etc.), seguindo uma codificação de
nome de sua escolha.
o
Assim, cada classe, rotina ou página CSP que você for modificando ou criando para efetivar
sua manutenção pode ser, antes, adicionada ao novo projeto, para que só então comecemos a
trabalhar com ela. Dia após dia você vai trabalhando neste projeto de manutenção, que só
mostrará as classes, rotinas e páginas que de fato são importantes para você e que você teve
que ajustar, até que a manutenção esteja terminada.
Preparando o Caché para Nossos Estudos  51
o
•
Finalizada a manutenção, você poderá exportar este projeto inteiro para importá-lo em um
ambiente de testes e homologação, por exemplo. Isto de fato ajuda a evitar aquela pergunta
que fazíamos antes: “Será que eu esqueci de trazer alguma classe?”.
Outro motivo para usar projetos igualmente importante, que exploraremos em outro capítulo, é a
integração do Caché Studio com ferramentas de Controle de Versão como o Visual Source Safe e o
CVS. Esta integração normalmente é feita através de Projetos.
Como você pode ver, existem alguns bons motivos para trabalharmos com projetos. E, como afirmamos
no início deste tópico, projetos são base para qualquer metodologia de desenvolvimento que você possa
imaginar. Portanto, vamos aprender a usá-los desde o início.
52  Preparando o Caché para Nossos Estudos
Criando um Novo Projeto
Para criar um novo Projeto, verifique se o seu Caché Studio está
conectado no namespace correto e clique na opção de menu Arquivo > Novo
Projeto. Você poderá verificar na barra de título do seu Caché Studio, o nome
de seu novo projeto. Será algo como Project1. Você também poderá verificar
que o mesmo nome aparece no seu Espaço de Trabalho conforme mostrado na
Figura 3-5. Se você não está vendo o seu Espaço de Trabalho (Workspace),
pressione Alt+3 para exibi-lo ou clique no menu Exibir > Espaço de Trabalho.
Na parte de baixo de seu Espaço de Trabalho, clique na Aba Projeto e veja, na
parte de cima, o nome de seu novo Projeto.
Para dar um nome mais adequado ao nosso novo projeto, basta clicar
no menu Arquivo > Salvar Projeto Como. Uma janela aparecerá
perguntando pelo Nome do Arquivo. Entre com o nome “Agenda” (sem as
aspas) e clique em salvar.
Figura 3-5 - Novo Projeto
Adicionando Documentos ao Projeto
Agora tudo que você criar, automaticamente é adicionado neste
projeto. Se você quiser, no entanto, adicionar algo que já existe, basta clicar
com o botão direito do mouse no item em que você deseja adicionar (Classe,
Rotinas, etc.) e clicar em Adicionar, como na Figura 3-6 ao lado. Uma janela
aparecerá perguntando que tipo de arquivo você quer e seu nome.
Outra opção para se adicionar documentos ao seu projeto é através
do menu Projeto > Adicionar Item. Se você está no namespace USER, é
provável que você não encontre nenhuma classe, rotina ou página CSP para
adicionar em seu novo projeto. Não se preocupe.
Figura 3-6 - Adicionando uma Classe
Existente ao Projeto
Não adicione nada em seu projeto Agenda. Nós vamos criar nossa primeira classe e nossa primeira
página CSP nele em breve.
Preparando o Caché para Nossos Estudos  53
Salvando o Projeto
Para salvar o seu projeto, você pode clicar no menu Arquivo > Salvar Projeto ou clicar no botão da
barra de ferramentas do Studio Salvar Tudo
. Clicar em Salvar Tudo é interessante, pois ele não só salva a
definição de seu projeto como também todas as classes, rotinas e páginas CSP abertas para edição. Se você
estiver salvando o nosso projeto Agenda, então dê o nome Agenda para o projeto.
Exportando o Projeto
Mencionei que projetos podem ser exportados para arquivos XML com muita facilidade. Para fazer
isto, clique no menu Ferramentas > Exportar. Aparecerá uma janela perguntando o que exatamente você deseja
exportar. Você pode usar os botões Adicionar e Remover para adicionar e remover manualmente classes, rotinas
ou páginas CSP na lista de documentos a serem exportados ou você pode clicar no Checkbox Exportar o
Projeto Atual para exportar não só a definição do projeto como também todos os documentos que ele contém.
Uma vez definido o que será exportado, basta definir se você deseja exportar o projeto para um arquivo
no servidor ou para um arquivo local em sua máquina. Lembre-se que o Caché é dividido em duas partes: a parte
cliente e a parte servidor. Isto quer dizer que você pode estar usando seu Caché Studio (cliente) conectado a um
Caché Server (servidor) em outra máquina na rede. É por isto que o Caché Studio lhe pergunta se você deseja
exportar seu projeto para a sua máquina (local) ou para a máquina servidora (remoto). Se o Caché Studio está
conectado a um Caché server na sua própria máquina, esta escolha não faz diferença e, portanto, o único tipo de
exportação permitido será Local.
Depois de decidir em que máquina seu arquivo vai ser gerado, basta dar um nome para ele (com
extensão XML) e clicar em Ok. Se você estiver salvando o nosso projeto de agenda, você pode dar o nome de
Projeto Agenda.xml para seu arquivo.
Importando um Projeto
Se você tem em sua máquina um arquivo
XML resultado da exportação de um projeto Caché
Studio, e deseja importar este projeto em seu
namespace atual, basta abrir o Caché Studio neste
namespace, clicar no menu Ferramentas > Importar
Local, selecionar o seu arquivo XML de projeto e
clicar em Abrir. O Studio mostrará uma lista com
todos os documentos dentro do arquivo XML. Você
pode marcar o que você deseja importar conforme
mostra a Figura 3-7.
Na Figura 3-7 ao lado, você pode ver que
estamos tentando importar o nosso próprio Projeto
Agenda salvo nos tópicos anteriores. Perceba que
a própria definição do projeto aparece na lista de
54  Preparando o Caché para Nossos Estudos
Figura 3-7 - Importando um Projeto
documentos a serem importados. Isto quer dizer que, de acordo com a figura, se você importar tudo, aparecerá
em seu namespace um projeto chamado Agenda, com uma classe chamada Agenda.Contato.
Se um projeto chamado Agenda já existe em seu namespace, ele será sobreposto por este que está
sendo importado. Tenha cuidado.
É claro que você pode desmarcar a importação da definição do projeto Agenda e importar somente a
classe Agenda.Contato, por exemplo. Outra opção muito interessante é o checkbox Adicionar os itens importados
ao projeto que permite que todos os itens importados sejam adicionados automaticamente no projeto atual aberto
no Caché Studio.
Por fim, a opção Compilar os itens importados permite que, após importado os itens, eles sejam
compilados automaticamente para estarem prontos pra uso. É quase sempre uma boa idéia deixar esta opção
ligada, mas existem situações onde você não vai querer compilar as classes importadas. Pode ser que você
esteja importando um projeto com muitas classes e a compilação poderia tomar muito tempo e tudo o que você
quer é dar uma olhada no projeto.
Abrindo um Projeto
Para abrir um projeto, basta clicar no menu Arquivo > Abrir Projeto. Um quadro de diálogo aparecerá
com uma lista de projetos de seu namespace atual. Basta selecionar o projeto desejado e clicar em Abrir.
3.2.4 Criando Nossa Primeira Classe
Para iniciar a criação de nossa primeira classe,
novamente verifique se você está com o Caché Studio
aberto e conectado ao namespace USER e que está com
um projeto apropriado para nosso projeto também aberto.
Clique no botão Novo da barra de ferramentas do Caché
Studio (use a Figura 3-2 da página 47 para localizá-lo na
sua janela). Você verá uma janela que lhe permite
escolher que tipo de novo componente você deseja criar
(Figura 3-8). Na Aba Geral, podemos ver que podemos
escolher criar uma rotina Caché Object Script8, uma
Definição de Classe Caché, e etc.
Para criar a nossa primeira classe, selecione
Definição de Classe Caché e clique no botão Ok. Isto
Figura 3-8 - Janela de Seleção de Novo Artefato
Caché Object Script – Conhecida pela sigla COS no mundo do Caché, é a principal linguagem de desenvolvimento com o
Caché. Usada para escrever rotinas, código de métodos de classes, stored procedures, e etc. Aprenderemos um pouco de
COS neste capítulo e começaremos a nos aprofundar no próximo.
8
Preparando o Caché para Nossos Estudos  55
acionará o assistente de criação de classes do Caché. No primeiro passo do assistente de criação de classes,
temos que informar qual é o pacote da classe e qual é o seu nome. Podemos também informar uma descrição de
nossa classe, de forma que isto vá fazer parte da documentação automática de classes que o Caché mantém.
Pacotes de Classes, como o nome sugere, nos ajudam a organizar as nossas classes em pacotes de
forma que, quando tivermos muitas classes, a coisa não fique muito confusa. Para a nossa aplicação de
exemplo, você pode informar o nome de pacote Agenda, para indicar que as classes que criaremos dentro deste
pacote farão parte de nossa aplicação de agenda de contatos.
É importante desde já adotar uma boa convenção de nomes de pacotes e classes. Como você já deve
ter percebido, uso a convenção de escrever cada primeira letra, de cada palavra que compõe o nome do
pacote ou nome da classe em maiúscula e o restante das letras em minúsculas como em:
AgendaEletronica ou ContatoImportante. A InterSystems adota esta convenção para nomear seus
pacotes e classes, mas esta é uma convenção bastante usada também em outras tecnologias como
.NET da Microsoft. Eu recomendo o uso desta convenção no Caché exatamente por ser a convenção
adotada pela InterSystems. Usar outra convenção fará com que suas classes estejam sempre
dissonantes das outras classes existentes. Isto não causará problemas para você, mas parecerá... feio.
O Nome da Classe é, obviamente, muito importante e deve representar muito bem a que entidade se
refere. No nosso caso, nomearemos nossa primeira classe como Contato. Desta forma, teremos uma classe,
chamada Contato, dentro do pacote Agenda. É muito comum, no entanto, nos referirmos a uma classe pelo seu
nome completo como Agenda.Contato.
Agora que você deu um bom nome para a
nossa primeira classe, você pode entrar com uma boa
descrição para ela no último campo do assistente e
clicar no botão Próximo. O próximo passo do
assistente lhe perguntará que tipo de classe você
deseja criar. Não vamos entrar em detalhes sobre os
diversos tipos de classe que o Caché suporta neste
capítulo. Basta selecionar que você deseja criar uma
classe Persistente e clicar no botão Finalizar (exato,
não precisamos ir para o próximo passo).
Figura 3-9 - Escolhendo o Tipo da Classe
Uma classe Persistente permitirá que criemos
objetos que possam ser salvos no banco de dados e
recuperados mais tarde quando quisermos. Ora, é para isto que um banco de dados serve, não? De fato, este é
um dos tipos de classe que mais criaremos com o Caché. Após ter pressionado o botão Finalizar do assistente, o
Caché Studio abrirá uma janela para que possamos continuar trabalhando no código fonte de nossa nova classe
como pode ser visto na Figura 3-10.
56  Preparando o Caché para Nossos Estudos
No código fonte mostrado na figura, podemos ver que a nossa classe Agenda.Contato é declarada com
a diretiva Class e herda (Extends) da classe %Persistent9. É esta herança que transmite a nossa classe as
habilidades necessárias para que consigamos salvar objetos dela no banco de dados e recuperá-los mais tarde.
Como nossa classe agora possui tais habilidades, dizemos que ela é uma Classe Persistente.
Figura 3-10 - Nossa primeira Classe
Adicionando Propriedades na Classe Contato
Vamos prosseguir com a criação de nossa classe adicionando a ela as propriedades que todo contato
deve ter. Para criar uma propriedade, basta seguir os seguintes passos:
1. Clique com o botão direito de seu mouse em qualquer parte da área
de codificação para fazer aparecer um menu de contexto10. Selecione
a opção Adicionar > Nova Propriedade
.
2. Ao aparecer o Assistente de Criação de Propriedades, informe o
nome da nova propriedade (Telefone, por exemplo) e uma descrição
(opcional).
3. Clique em Finalizar.
Figura 3-11 - Propriedades
da Classe Contato
Execute os três passos acima para cada uma das propriedades da classe contato como pode ser
observado na Figura 3-11.
%Persistent – Falaremos mais das classes que vem com o Caché nos próximos capítulos. O sinal de percentual na frente
do nome da classe significa que a classe é uma classe de sistema, que vem com o Caché e, na verdade, é um atalho para o
pacote %Library de classes de sistema.
10 Menu de Contexto – No ambiente Windows, é comum usarmos o botão direito do mouse para acionar um menu de
contexto que nos permite executar diversas atividades relativas ao contexto em que clicamos. Neste caso, como o contexto
é o código fonte da classe, o menu de contexto mostrará várias atividades relativas a edição e construção de classes.
9
Preparando o Caché para Nossos Estudos  57
O código fonte de sua classe agora deve estar parecido com isto:
/// Contato da Agenda.
Class Agenda.Contato Extends %Persistent
{
Property Nome As %String;
Property Telefone As %String;
Property EMail As %String;
}
Observe que usamos a mesma regra de nomenclatura de nomes de pacotes e de classes para nomes
de propriedades. Eu recomendo fortemente que você siga esta convenção. Você verá que ao trabalhar
com páginas Zen, Java ou .NET junto com o Caché, esta convenção também lhe será bastante útil.
Todas as propriedades são declaradas com a diretiva Property. Como clicamos em Finalizar logo no
início do Assistente de Criação de Classes, para cada propriedade criada, todas foram definidas como Strings11
(As %String). Poderíamos ter usado outros tipos de dados, como inteiros (%Integer), mas vamos deixar a
discussão de tipos de dados do Caché para os próximos capítulos.
Salvando Tudo
Antes de prosseguirmos, é importante parar para salvar nosso trabalho. Para tanto, você pode clicar o
botão Salvar Tudo
na sua barra de ferramentas ou clicar no menu Arquivo > Salvar Todos. Isto não só
salvará tudo que estamos editando (neste caso, apenas a nossa classe Agenda.Contato) como também
perguntará se não queremos salvar também o nosso projeto (já que acabamos de adicionar uma nova classe
nele). É importante cultivar o hábito de salvar o seu trabalho de tempos em tempos.
Compilando a Classe
Chegou a hora de compilar a nossa nova classe. Quando compilamos uma classe, o Caché define todas
as estruturas necessárias para armazenar os dados de nossos futuros objetos. Além disto, o Caché também gera
todo o código necessário para que estes dados possam ser acessados não só via objetos, mas também via SQL
(modelo relacional).
Para compilar a nossa nova classe, basta clicar no botão Compilar
de sua barra de ferramentas ou
clicar no menu Compilar > Compilar. Também é possível usar o atalho de teclado CTRL+F7. Atalhos de teclado
podem agilizar bastante tarefas rotineiras como esta. Veja novamente a Tabela 3-2 na página 48 que mostra uma
lista de atalhos de teclado muito úteis que você pode testar agora.
11
String – Uma string é uma seqüência de caracteres que podem ser letras, números, caracteres de pontuação e etc..
58  Preparando o Caché para Nossos Estudos
Observe que todos os passos da compilação são exibidos na Janela de Saída do Caché Studio como as
linhas abaixo:
Compilation started on 08/16/2007 23:14:50 with qualifiers 'cuk'
Compiling class Agenda.Contato
Compiling table Agenda.Contato
Compiling routine Agenda.Contato.1
Compilation finished successfully in 0.468s.
Qualquer mensagem de erro de compilação aparece na Janela de Saída e você deve prestar atenção
aos resultados que ela mostra. Se tudo estiver bem, você pode usar o atalho de teclado (Alt+2) para esconder de
novo a Janela de Saída e continuar trabalhando com mais espaço na tela.
3.2.5 Usando a Janela de Inspeção
Vamos alterar um pouco a nossa classe Agenda.Contato e configurar melhor a nossa propriedade
Nome, para aceitar um máximo de 100 caracteres. Se não informarmos nada, o tipo de dados %Library.String
(%String) determina 50 como máximo.
Para tanto, abra a sua classe Agenda.Contato e a Janela de
Inspeção (Alt+1). Clique na lista de contexto da Janela de Inspeção e
selecione Property conforme mostra a Figura 3-12 ao lado.
A janela de inspeção mostrará as propriedades da classe
Agenda.Contato. Dê um duplo clique na propriedade Nome. A janela
de inspeção mostrará os parâmetros da propriedade Nome. Procure
pelo parâmetro MAXLEN e mude-o de 50 para 100.
Depois de mudar o valor, clique com o mouse de novo na
Área de Codificação. Você verá que o código fonte de sua classe será
atualizado para refletir a mudança como mostrado abaixo:
Figura 3-12 - Janela de Inspeção
/// Contato da Agenda.
Class Agenda.Contato Extends %Persistent
{
Property Nome As %String(MAXLEN = 100);
Property Telefone As %String;
Property EMail As %String;
}
Agora, nossos contatos poderão ter nomes de até 100 caracteres. Aprender a usar a Janela de
Inspeção é uma ótima maneira de codificar sem escrever código. Depois de usar os Assistentes para inserir as
Preparando o Caché para Nossos Estudos  59
propriedades, basta explorar a Janela de Inspeção para fazer as mudanças que quisermos sem escrever uma
linha de código a mão!
Não se esqueça de compilar a sua classe novamente (CTRL+F7). Acostume-se com esta rotina!
3.3 Criando nossos Primeiros Objetos
Agora que temos a nossa classe Agenda.Contato pronta e compilada, poderemos criar objetos a partir
dela: Nossos Contatos.
Para tanto, vamos aprender a usar outra ferramenta muito importante do Caché, o Caché Terminal. O
Caché Terminal nos permite chegar à interface de linha de comandos (shell ou terminal do Caché).
O Caché Terminal é uma espécie de cliente de Telnet para o Caché12. Mas o Caché também permite
que você use seu client de Telnet preferido para chegar à sua linha de comandos, mas não vamos nos
aprofundar neste assunto agora.
Esta interface via linha de comandos é muito comum em muitos bancos de dados e com o Caché não é
diferente. Ela nos permite emitir comandos que são executados imediatamente pelo banco de dados como, por
exemplo, criar um objeto. Estes comandos normalmente fazem parte de uma linguagem de script suportada pelo
banco de dados que, no caso do Caché, se chama Caché Object Script ou COS, para abreviar.
Veremos bastante do COS no próximo capítulo. Por enquanto, vamos aprender aqui alguns comandos
básicos da linguagem COS que poderão ser usados não somente na linha de comandos do Caché, mas também
para construir rotinas, escrever métodos de classes, stored procedures, páginas CSP e Zen e etc.
3.3.1 Abrindo o Caché Terminal
Para abrir o Caché Terminal, basta clicar no Cubo do Caché > Terminal. A janela da Figura 3-13
aparecerá, perguntando por seu usuário e sua senha. Você pode informar o usuário _system de sistema e a
senha que você escolheu para ele durante o processo de instalação do Caché.
Uma vez que você tenha entrado com um usuário e
senha válidos, o Caché lhe mostrará a sua linha de
comandos (shell) que sempre exibe o nome do namespace
atual seguindo de um sinal de “maior que” (“USER>”) e
estará pronto para os seus comandos. O usuário _system
está configurado para sempre cair no namespace USER
quando se abre o Caché Terminal. É por isto que caímos
diretamente nele e não em outros namespaces como o
SAMPLES.
Figura 3-13 - Janela do Caché Terminal
12 Cliente de Telnet – Telnet é um protocolo padrão de comunicação muito usado para permitir que uma pessoa se conecte
a uma máquina remota na rede e tenha acesso à interface de linha de comandos (shell) do sistema operacional da máquina.
60  Preparando o Caché para Nossos Estudos
Trocando de Namespace
Se, por um acaso, você abriu o Caché Terminal e percebeu que está em outro namespace diferente do
USER, use o comando ZN “Namespace” para trocar para o namespace USER como no exemplo abaixo:
SAMPLES>ZN “USER”
USER>
Um Pouco de Caché Object Script
Agora que estamos em nosso namespace correto podemos aprender alguns comandos básicos de
Caché Object Script que serão muito úteis como o comando Write:
USER>Write “Olá!”
Olá!
USER>
O comando Write simplesmente escreve na tela o que passarmos como parâmetro para ele. Outro
comando muito importante é o comando Set:
USER>Set var = “Olá de Novo!”
USER>Write var
Olá de Novo!
USER>
O comando Set serve para atribuir o resultado de uma expressão a uma variável qualquer que é criada
automaticamente. Neste caso, usamos uma string, mas poderíamos fazer alguns cálculos como:
USER>Set a = 10
USER>Set b = a + 5
USER>Write b
15
USER>
Observe que não é preciso declarar as variáveis com um tipo específico para usá-las. Basta usar o
comando Set para atribuir o valor que queremos à variável, seja um número ou uma string. Isto é uma
característica de linguagens de script como o Caché Object Script, ao contrário de linguagens com “tipagem
forte”, que exigem que se especifique o tipo de dados da variável antes de criá-la e usá-la. Cada tipo de
linguagem tem suas vantagens e desvantagens que fogem ao escopo deste livro. Você vai perceber, ao longo
deste livro, que a linguagem Caché Object Script é muito poderosa e versátil.
O Caché Terminal mantém uma lista com os últimos comandos que você entrou. Você pode usar as
setinhas para cima ou para baixo de seu teclado para navegar na lista de comandos anteriores e
escolher qualquer um deles.
Preparando o Caché para Nossos Estudos  61
Agora que aprendemos como criar variáveis, com o comando Set, e imprimir seu conteúdo na tela, com
o comando Write, vamos aprender como apagamos as variáveis que criamos para liberar a memória ocupada por
elas com o comando Kill.
No exemplo abaixo, criamos uma variável atribuindo a ela o valor 1. Imprimimos o seu conteúdo e
vemos que ela de fato foi criada e que está com o valor que colocamos lá. Finalmente, usamos o comando Kill
para apagar a variável e, para verificar que ela foi apagada, usamos novamente o comando Write para tentar
imprimir seu conteúdo. Veja o que ocorre:
USER>Set a = 1
USER>Write a
1
USER>Kill a
USER>Write a
WRITE a
^
<UNDEFINED> *a
USER>
Perceba que após o último comando Write, o Caché retornou um erro <UNDEFINED> *a que significa
que “A variável a não foi Definida” ou que “a está Indefinida”.
Se você entrar com o comando Kill, sem parâmetros, e der ENTER, todas as variáveis de seu processo
(partição) serão apagadas. Também o comando Write pode ser usado sem parâmetros e imprimirá
todas as variáveis de sua partição.
Toda vez que abrimos uma conexão, de uma máquina A (cliente), ao Caché de uma máquina B
(Servidor), o Caché na máquina B cria um processo para nos atender. Dentro deste processo, existe
uma área de memória local para as variáveis locais e outros dados criados durante o trabalho do
processo. Chamamos esta área de partição. Usamos o termo partição e processo de forma
intercambiável.
Com estes três comandos - Write, Set e Kill -, já estamos prontos para criar nosso primeiro objeto,
preenche-lo e salvá-lo!
62  Preparando o Caché para Nossos Estudos
Criando Alguns Objetos Caché
Quando estávamos criando nossa classe Agenda.Contato, vimos que ela herdava todas as habilidades
necessárias para salvar seus objetos em disco a partir de uma classe de sistema do Caché chamada
%Persistent. Estas habilidades, na verdade, se apresentam na forma de Métodos especiais que nos permitem
criar um novo objeto, salvá-lo, apagá-lo e etc.
Um Método nada mais é do que uma função ou subrotina de uma classe, que executa uma série de
operações codificadas em Caché Object Script. Estes métodos podem ser criados na própria classe ou herdados
a partir de outras classes. A nossa classe Agenda.Contato herda da classe %Persistent muitos métodos
importantes, alguns dos quais estão listados na Tabela 3-3.
Tabela 3-3 – Alguns Métodos Importantes da Classe %Persistent
Método
%New()
%Save()
Descrição
Retorno
Tipo
Permite criar um novo objeto da classe.
O novo Objeto Criado
Método de Classe
Permite salvar um objeto.
1 se foi salvo ou %Status se
houve um erro.
Método de Instância
Permite abrir um objeto através de seu ID.
Se um objeto existe com o ID
passado, o objeto aberto. Caso
contrário, o valor nulo (“”)
Método de Classe
Permite excluir um objeto através de seu
ID.
1 se foi excluído ou %Status se
houve um erro.
Método de Classe.
Retorna o ID de um objeto
Se o objeto já tem um ID, então
retorna o ID. Caso contrário,
retorna o valor nulo (“”)
Método de Instância
%OpenId(id)
%DeleteId(id)
%Id()
Para exemplificar o uso destes métodos, vamos começar criando um novo objeto da classe contato.
Abra o seu Caché Terminal, certifique-se de estar no namespace USER, onde criamos a nossa classe com o
Caché Studio no tópico 3.2.4 deste capítulo, e entre com os seguintes comandos:
1.
USER>Set contato = ##class(Agenda.Contato).%New()
2.
USER>Set contato.Nome = “João da Silva”
3.
USER>Set contato.Telefone = “555-5676”
4.
USER>Set contato.EMail = “[email protected]”
A primeira instrução Caché Object Script acima usa o comando Set, discutido anteriormente, para criar
uma variável chamada contato e atribuir a ela o resultado da expressão depois do sinal de igual, que, neste caso,
será um (novo) objeto da classe Agenda.Contato.
A expressão depois do sinal de igual usa o operador ##class(Nome da Classe), que nos posiciona
dentro do contexto da classe cujo nome foi passado entre parêntesis. Assim, estando no contexto da classe
Preparando o Caché para Nossos Estudos  63
Agenda.Contato, podemos agora usar o operador ponto (“.”) para acionar qualquer método de classe desta
classe. Neste caso, estamos chamando o método %New() que, como pode ser visto na Tabela 3-3, é, de fato, um
método de classe que nos retorna um novo objeto da classe.
O ato de criar um novo objeto de uma classe também é chamado instanciar um objeto, pois
normalmente nos referimos a um objeto de uma classe como uma instância da classe. Lembre-se
destes termos, já que são muito comuns no mundo da orientação a objetos.
Um método de classe é um método que pode ser invocado diretamente a partir da classe. Esta
definição parece ridícula, mas existe outro tipo de método, chamado “método de instância” que só pode ser
invocado a partir de um objeto (uma instância da classe) e é muito importante que você saiba a diferença entre
uma coisa e outra. Vamos voltar a este tema mais adiante.
As outras instruções, das linhas dois, três e quatro usam novamente o operador ponto (“.”), mas agora
no contexto do objeto contato criado anteriormente, para referenciar suas propriedades e preenche-las com
valores string adequados.
Ou seja, o operador ponto (“.”) sempre servirá para referenciar métodos de classe ou propriedades e
métodos de objetos. Enquanto que na primeira linha de código, o contexto era o operador ##class(), uma classe,
nas linhas seguintes o contexto passou a ser a variável contato, um objeto.
É muito importante perceber que, diferente do comando Set da primeira linha, não estamos agora
criando novas variáveis (ex: “contato.Nome”), mas sim preenchendo propriedades de uma única variável
chamada contato, que só aceita o uso do operador ponto (“.”) porque é, de fato, um objeto, que possui
propriedades a serem lidas ou preenchidas.
Seguindo com nosso exercício, precisamos salvar nosso objeto, pois, no momento, tudo que criamos
está em memória (na nossa partição ou processo) e se fechamos o Caché Terminal neste instante, tudo será
perdido. Mas antes de salvar nosso objeto contato, vamos pedir para ver algumas informações a respeito do que
preenchemos para ver se está tudo certo:
5.
USER>Write contato.Nome
6.
João da Silva
7.
USER>Write contato.%Id()
8.
9.
USER>Set status = contato.%Save()
10. USER>Write status
11. 1
12. USER>Write contato.%Id()
13. 1
64  Preparando o Caché para Nossos Estudos
Na linha cinco, usamos o comando Write para imprimir na tela do terminal o conteúdo da propriedade
Nome do objeto contato (usamos novamente o operador ponto). Verificamos que o nome do contato está correto
e, em seguida, pedimos para imprimir na tela o resultado da chamada ao método %Id() do objeto contato, que
retorna nulo pois acabamos de criar o objeto e ainda não o salvamos em disco.
Vale ressaltar que, usamos novamente o operador ponto para invocar o método %Id(), que, como pode
ser visto na Tabela 3-3 é um método de instância.
Um método de instância só pode ser invocado a partir de uma variável de objeto (uma instância).
Normalmente não faz sentido (e não funciona) invocar métodos de instância com o operador ##class(). Por
exemplo, o método %Id() é um método de instância que retorna o ID do objeto em questão. Ou seja: Se não há
objeto, o método perde seu sentido. Na verdade, o Caché simplesmente retorna, dizendo que aquele método não
existe. É uma forma que a orientação a objetos tem de garantir que determinados métodos só possam ser
chamados dentro do contexto certo:
USER>Write ##class(Agenda.Contato).%Id()
WRITE ##CLASS(Agenda.Contato).%Id()
^
<METHOD DOES NOT EXIST> *%Id,Agenda.Contato
USER>
Mas voltando ao nosso exemplo, na linha nove, usamos o comando Set para criar uma nova variável
chamada status, atribuindo a ela o resultado da chamada ao método de instância %Save() do objeto contato.
Como pode ser visto na Tabela 3-3, o método %Save() tentar salvar o objeto contato em disco e retorna o
resultado de sua tentativa. A linha dez imprime o conteúdo da variável status, que, se for igual a “1”, significa que
o objeto foi de fato salvo com sucesso.
Toda vez que um objeto é salvo, o Caché lhe atribui um novo ID único para sua classe, que poderá ser
usado para identificar este objeto de forma inequívoca mais tarde. Um ID nada mais é do que um número inteiro.
Neste caso, como acabamos de criar nosso primeiro objeto de nossa primeira classe, o ID aparece, na linha
treze, como “1” (como trata-se do primeiro objeto que criamos para a classe, o ID assume o valor 1).
Como exercício, tente criar mais um ou dois objetos, salvá-los, e exibir seus IDs como fizemos. Tente
anotar em algum lugar o ID que cada objeto ganhou, associando-o ao Nome ou ao EMail do contato. Assim, os
próximos tópicos ficarão mais interessantes. Lembre-se sempre de usar o método %New() para criar o novo
objeto.
Abrindo Objetos
Agora que você já criou e salvou alguns objetos no Caché, vamos aprender como recuperá-los do disco.
Para começar, entre com o comando Kill, sem parâmetros, para apagar todas as variáveis da memória. Ou
então, simplesmente feche esta sessão do Caché Terminal e abra outra.
Preparando o Caché para Nossos Estudos  65
Agora, vamos usar o método de classe %OpenId() que, conforme vimos na Tabela 3-3, nos permite abrir
um de nossos objetos salvos anteriormente:
1.
USER>Kill
2.
USER>Set obj = ##class(Agenda.Contato).%OpenId(1)
3.
USER>Write obj.EMail
4.
[email protected]
Observe que novamente usamos o comando Set, na segunda linha, para atribuir o resultado da
expressão do lado direito do operador de igualdade à variável obj no lado esquerdo. Usamos o nome de variável
“obj”, ao invés de “contato”, desta vez, para que você veja que o nome da variável pouco importa: Escolha um
nome de variável e siga com ele. Na expressão do lado direito, usamos novamente o operador ##class() para
indicar que queremos trabalhar com a classe Agenda.Contato, seguido do operador ponto (“.”) para podermos
invocar o método %OpenId() que recebe como parâmetro um ID de um objeto previamente salvo.
No exemplo acima, ainda na segunda linha, passamos o ID 1 como parâmetro para o método
%OpenId(), pois sabemos que existe um objeto com este ID salvo em disco resultado de nossos exercícios do
tópico anterior. O método %OpenId() retorna então o objeto aberto e o comando Set termina atribuindo à variável
obj o objeto retornado. Observe, na linha três e quatro, que, de fato, conseguimos imprimir o conteúdo da
propriedade EMail.
Nos próximos capítulos aprenderemos como podemos encontrar um objeto por outros atributos, como
EMail ou Telefone, além do ID.
Se você passar um ID inexistente para o método %OpenId(), o método retornará uma referencia nula.
Assim, sua variável obj conterá uma referencia inválida de objeto como pode ser observado abaixo:
1.
USER>Set obj = ##class(Agenda.Contato).%OpenId(999)
2.
USER>Write obj
3.
4.
USER>Write obj.EMail
5.
6.
WRITE obj.EMail
7.
^
8.
<INVALID OREF>
9.
USER>
No exemplo anterior, tentamos abrir um objeto com um ID que não existe (999). Na linha dois, pedimos
para imprimir o conteúdo da variável obj e vimos, na linha três, que não havia nada nela, como esperado. Mas
mesmo assim prosseguimos e pedimos para imprimir a propriedade EMail do objeto na linha quatro. O Caché
percebe que a variável obj não contém uma referência válida de objeto e determina que cometemos um erro. Ele
reimprime na linha seis o código Caché Object Script que provocou o erro, marcando o comando culpado
66  Preparando o Caché para Nossos Estudos
(circunflexo abaixo do comando Write na linha sete) e descrevendo o problema na linha oito como <INVALID
OREF>13.
Voltando ao nosso exercício, uma vez que você tenha aberto com sucesso um objeto, você pode usar o
comando Set novamente para alterar algumas de suas propriedades e voltar a salvá-lo se quiser.
USER>Set obj2 = ##class(Agenda.Contato).%OpenId(1)
USER>Set obj2.EMail=”[email protected]”
USER>Set status = obj2.%Save()
USER>Write status
1
USER>Write obj2.%Id()
1
No exemplo acima, após salvarmos o objeto com sua propriedade EMail alterada, pedimos, por
curiosidade, para ver de novo o valor do ID dele, chamando novamente o método de instância %Id(). Observe
que o ID não muda.
Uma vez que um objeto tenha ganhado um ID, ele permanece o mesmo durante toda a sua vida. Além
disto, quando apagamos um objeto, o ID que ele usava nunca mais será usado por nenhum outro objeto
da mesma classe.
Como exercício, tente abrir os outros objetos que você criou, passando para o método %OpenId() outros
IDs de objetos que você tenha salvo no tópico anterior. Tente alterar o conteúdo de outras propriedades de seus
objetos e salvá-los.
Excluindo Objetos
Finalmente, vamos aprender agora como podemos excluir alguns dos objetos que criamos. Para tanto,
vamos usar o método de classe %DeleteId() que, conforme vimos na Tabela 3-3, espera o ID do objeto a ser
apagado como parâmetro. Seu funcionamento é muito parecido com o do método %OpenId(), mas ao invés de
abrir e retornar um objeto que tenha determinado ID, o método %DeleteId() tenta apagá-lo e retorna 1 se
conseguiu ou um erro em caso contrário:
USER>Set apagou = ##class(Agenda.Contato).%DeleteId(2)
USER>Write apagou
1
USER>
OREF – Veremos com mais detalhes todos os aspectos de orientação a objetos do Caché, mas OREF é a abreviação
para “Object REFerence” ou referencia para um objeto.
13
Preparando o Caché para Nossos Estudos  67
No exemplo acima, você pode ver que usamos o comando Set para atribuir à variável apagou o
resultado da expressão do lado direito do sinal de igualdade. Neste caso, a expressão novamente usa o operador
##class() para indicar que queremos trabalhar com a classe Agenda.Contato, e, com o operador ponto (“.”)
invocamos o método %DeleteId() de nossa classe, passando-lhe como parâmetro o número do ID que queremos
excluir. Neste caso, passamos o ID de número 2. O método %DeleteId() então retorna o resultado da tentativa de
exclusão, o qual o comando Set atribui à variável apagou. Na linha seguinte, usamos o comando Write para ver
que a variável apagou de fato contem o valor 1, indicando que o resultado da tentativa de exclusão do objeto foi
um sucesso.
Como exercícios, tente:
•
Criar novos objetos e limpar a partição com o comando Kill
•
Recuperar um destes objetos, alterar algumas de suas propriedades, salvá-lo e limpar a partição
novamente com o comando Kill.
•
Excluir um outro objeto e tentar abri-lo novamente para verificar que o método %OpenId() retornará
uma referência nula já que o objeto não existirá mais.
68  Preparando o Caché para Nossos Estudos
3.4 Conhecendo o Portal de Administração
Até agora, usamos duas ferramentas do Caché: O Caché Studio, para criar nossa primeira classe e o
Caché Terminal, para aprender um pouco de Caché Object Script e criar alguns objetos de nossa classe. Neste
tópico vamos conhecer algumas das funcionalidades de mais uma ferramenta do Caché: O Portal de
Administração de Sistema.
Vamos usar o Portal de Administração do Caché para dar uma olhada nos objetos de nossa classe
Agenda.Contato sob outra perspectiva. Vamos ver como o Caché expôs a nossa classe como uma tabela para o
mundo SQL e vamos trabalhar com alguns comandos SQL (Structured Query Language) para obter uma listagem
dos objetos de nossa classe, inserir alguns novos e alterar contatos existentes.
3.4.1 Abrindo o Portal de Administração do Caché
Para abrir o Portal de Administração, clique no Cubo do Caché > Portal de Administração do Sistema. O
Cubo do Caché abrirá um Navegador Internet que mostrará uma página pedindo um usuário e senha. Você pode
entrar com o usuário _system e a senha que você deu para este usuário quando instalou o Caché (ou a senha
padrão “SYS” – sem as aspas).
Se você está usando o Caché PC (a versão de Caché demo baixada do site da InterSystems que não
precisa de licença para funcionar) você não terá que entrar com senha alguma e o portal simplesmente
se abrirá na Home Page abaixo.
Figura 3-14 - Portal de Administração do Sistema do Caché
Ao entrar com a senha correta, o Caché mostrará a página da Figura 3-14. O Portal de Administração do
Sistema do Caché separa suas funcionalidades em três papéis ou perfis muito bem definidos. Como você entrou
com o usuário _system, que é um super usuário, você terá acesso a todas as funcionalidades de todos os três
Preparando o Caché para Nossos Estudos  69
perfis. Veremos em outros capítulos como criar novos usuários e definir seus perfis de forma que determinadas
pessoas só tenham acesso a determinadas funcionalidades do Caché de acordo com a sua função dentro da
empresa.
Os três papéis ou perfis que o Portal de Administração do Sistema do Caché mostra na sua página
principal são fixos e não podem ser mudados. No entanto, aprenderemos nos próximos capítulos a criar
novos papéis para uso em nossas próprias aplicações.
Podemos ver na Figura 3-13, os três perfis principais do Portal de Administração do Sistema do Caché:
•
Administração do Sistema – Que permite configurar todos os parâmetros de funcionamento do
Caché, criar bases de dados, namespaces, usuários, definir parâmetros de backup, segurança,
espelhamento, distribuição de bases de dados e etc. Este perfil, essencialmente só faz uma coisa:
Configura o sistema.
•
Administração dos Dados – Que permite consultar, manipular e exportar todo tipo de objeto
Caché (classes, tabelas, rotinas e globais). Este seria o perfil de quem se preocupa com os dados
armazenados.
•
Operações – Que permite executar todo tipo de tarefa de manutenção e monitoração do Caché. A
este perfil pertencem as pessoas responsáveis pelas tarefas rotineiras: Executar os backups
previamente configurados pelo administrador, executar e verificar as tarefas rotineiras de sistemas,
monitorar a tabela de locks, etc.
Neste capítulo usaremos principalmente o papel de Administração de Dados, do meio da página Figura
3-13.
3.4.2 A Documentação de Nossa Classe
Neste tópico aprenderemos como encontrar e modificar a documentação gerada dinamicamente para
nossa classe Agenda.Contato. Esta documentação pode ser acessada via Web através do Portal de
Administração do Sistema e pode ser usada por desenvolvedores que estejam usando nossa classe e querem
saber exatamente como ela funciona, que propriedades possui, e etc. Trata-se de um recurso muito útil e
importante.
Uma vez que você tenha entrado no Portal de Administração do Sistema do Caché, clique em
Administração de Dados > Classes. Você verá uma tela com a listagem de todas as classes do namespace
%SYS.
Aprenderemos mais sobre o Namespace %SYS nos próximos capítulos. Trata-se de um namespace
especial de administração do Caché. Conseguimos ver seu conteúdo aqui, pois entramos no portal com
o super usuário _system.
70  Preparando o Caché para Nossos Estudos
No lado esquerdo da tela, você verá uma lista de namespaces. Clique no namespace USER para ver a
lista de classes do namespace USER que aparecerá conforme a Figura 3-15.
2 Barra de Navegação
1 Lista de seleção de Namespaces
4 Menu de Contexto
5 Barra de Filtros
3 Lista de classes do Namespace
selecionado com link para
documentação.
Figura 3-15 - Lista de Classes do Namespace User
Agora estamos no contexto do namespace USER. É claro que se você criou outras classes no
namespace USER além da classe Agenda.Contato, estas também aparecerão na listagem. A Tabela 3-4
descreve cada um dos componentes de tela apontados pela Figura 3-15.
Tabela 3-4 – Descrição dos Principais componentes de [Home] > [Classes] do Portal de Administração do Caché
1
Lista de Seleção de Namespaces – Esta seção da tela mostra uma lista com todos os namespaces do Caché.
Tenha sempre o cuidado de observar em qual namespace você está trabalhando. No nosso caso, o namespace
USER.
2
Barra de Navegação – Permite que você possa ver o caminho que você fez para chegar na tela atual. Na figura,
seguimos o caminho [Home] > [Classes]. A qualquer momento, você pode clicar em [Home], por exemplo, para voltar
para a página principal do Portal.
3
Lista de Classes do Namespace Selecionado – Esta seção da tela mostra a lista de classes do namespace
selecionado. A lista ainda pode ser filtrada, caso existam muitas classes no namespace, para que se encontre mais
facilmente a classe com que se deseja trabalhar.
4
Menu de Contexto – Apresenta ferramentas importantes para o contexto atual. Como estamos lidando com classes,
veremos opções para Importar, Exportar e Excluir classes. Estas ferramentas são muito úteis, por exemplo, em um
ambiente de produção onde o uso do Caché Studio não é permitido. Importaríamos classes novas para o ambiente de
produção através do portal Web, que poderia estar sendo usado de uma máquina remota fora do datacenter onde o
servidor do Caché está instalado.
5
Barra de Filtros – Permite impor um filtro a lista para que possamos encontrar as classes que queremos com mais
facilidade. Você pode entrar com máscaras como: Agenda.*, *Contato* ou ?genda* no campo Classes, e clicar em
Exibir para filtrar. O campo Filtro, por outro lado, faz a filtragem em tempo real, sem ir no servidor, trabalhando apenas
com as classes que já estão na tela.
Preparando o Caché para Nossos Estudos  71
Agora que você conhece bem esta seção do Portal de Administração do Caché, encontre a sua classe e
clique no link Documentação relativo à nossa classe Agenda.Contato. Você verá uma página parecida com a da
Figura 3-16. Ela variará um pouco de acordo com a quantidade de documentação que você tenha colocado na
sua classe durante sua criação.
Link para Pesquisar a Documentação de Classes
Figura 3-16 - Documentação da Classe Contato
Para fazer um teste, abra a sua classe Agenda.Contato usando o Caché Studio e modifique a sua
propriedade Nome para ficar assim:
/// Contato da Agenda.
Class Agenda.Contato Extends %Persistent
{
///Nome completo do Contato
Property Nome As %String;
///Telefone do contato. <font color="red">Com DDD!</font>
Property Telefone As %String;
///Email do contato.
Property EMail As %String;
}
Compile a sua classe (CTRL+F7) e volte a abrir a documentação da classe (atualizando a janela do
navegador que mostrava a documentação antes, por exemplo). Ou aproveite que você está no Caché Studio e
aprenda outra forma de se pedir a documentação da classe: Ainda com sua classe Agenda.Contato aberta no
Caché Studio, clique no menu Exibir > Exibir Documentação da Classe.
72  Preparando o Caché para Nossos Estudos
Observe que usamos três barras (“///”) acima do item que desejamos documentar. Por exemplo, acima
da instrução Class e acima da instrução Property. São instruções de comentário especiais para documentação.
Além disto, você também pode
verificar que podemos usar comandos HTML14
na documentação da classe de forma que a
documentação on-line possa se tornar ainda
mais interessante conforme mostrado na Figura
3-17.
Você pode usar duas barras (“//”) ao
invés de três para fazer comentários sobre suas
propriedades e métodos sem que estes
comentários apareçam na documentação online.
Também é possível criar comentários
de várias linhas com os operadores de início de
Figura 3-17 - Documentação da Classe
comentário “/*” e fim de comentário “*/”. Veja
abaixo alguns exemplos de comentários na nossa própria classe Agenda.Contato. Observe que a propriedade
EMail foi comentada e documentada. O comentário não aparecerá na documentação on-line:
/// Contato da Agenda.
Class Agenda.Contato Extends %Persistent
{
// Comentário de uma só linha
Property Nome As %String(MAXLEN = 100);
/// Comentário de documentação
Property Telefone As %String;
/*
Comentário
de várias
linhas.
*/
///Email do contato.
Property EMail As %String;
}
Como exercício, tente documentar um pouco mais a sua classe e ver como a documentação é exibida
na documentação on-line. Tente usar alguns comandos HTML simples como <p>, <br>, <font>, <ol> e <li> e
comentários simples de uma e várias linhas.
HTML – HyperText Markup Language – Linguagem usada para descrever e formatar páginas web. Se você não conhece
um pouco de HTML, recomendo comprar um livro ou buscar um tutorial na Internet sobre o assunto (existem muitos).
14
Preparando o Caché para Nossos Estudos  73
3.4.3 Listando os Objetos usando SQL
Neste tópico, vamos aprender algumas maneiras diferentes de listar os objetos (registros) de nossa
classe (tabela) usando funcionalidades do Portal de Administração do Sistema do Caché. Para tanto, abra o
Portal de Administração e, na página principal (Home), clique em Administração dos Dados > SQL. Nesta seção
do Portal, temos várias usadas no dia-a-dia de qualquer DBA (DataBase Administrator) ou desenvolvedor de
software como pode ser visto na Figura 3-18.
Figura 3-18 - Ferramentas SQL do Portal de Administração do Caché
Observe que no lado esquerdo da tela temos uma lista com todos os namespaces de nossa instância de
Caché. É muito importante que você não se esqueça de clicar no namespace com o qual você gostaria de
trabalhar. No nosso caso, conforme mostrado na Figura 3-18, vamos trabalhar com o namespace USER.
Depois de ter selecionado o namespace correto, clique em
Operações SQL > Exibir Esquemas SQL, como mostrado na Figura 3-19.
Aparecerá uma lista de esquemas.
Um esquema, no mundo relacional, serve para agrupar um
conjunto de tabelas de forma que um banco de dados com muitas tabelas
pode ser melhor organizado em esquemas. Neste momento, é provável que
a lista de esquemas que o seu Caché está exibindo para você seja bem
curta, com apenas um esquema chamado Agenda, equivalente ao pacote
Agenda de nossa classe Contato como exibido na Figura 3-20.
74  Preparando o Caché para Nossos Estudos
Figura 3-19 - Operações SQL
Figura 3-20 - Lista de Esquemas do Namespace USER
Cada esquema listado apresenta um link para que você possa ver as Tabelas nele contidas. Clique no
link do esquema Agenda para ver as tabelas que ele contém.
É possível, quando se está criando uma classe no Caché Studio, informar um nome de tabela e de
esquema diferentes dos nomes dados como nome de classe e pacote, de forma que seja possível
seguir um padrão de nomenclatura no mundo orientado a objetos e outro padrão de nomenclatura no
mundo SQL. Por exemplo, poderíamos ter definido que o nome de tabela e de esquema de nossa
classe
Agenda.Contato
para
que
ela
aparecesse,
para
o
mundo
relacional,
como
AGENDA.AGENDA_CONTATO.
Além do mais, ao contrário de outros bancos de dados, o Caché só usa esquemas para facilitar o
trabalho de organização das tabelas, agrupando-as em grupos de tabelas ou pacotes. Controle de
usuários e autorização não tem relação alguma com esquemas no Caché, por exemplo, como ocorre em
outros bancos de dados. Um esquema não precisa ser criado antes das tabelas que conterá. Basta criar
as tabelas ou classes e os esquemas aparecerão, de acordo com os pacotes das classes ou esquemas
informados nas instruções de criação de tabela (CREATE TABLE). Simples, não?
Agora estamos no contexto do esquema Agenda e no centro da tela, como pode ser visto na Figura
3-21, aparece a lista de tabelas do esquema. Observe também que, do lado esquerdo da tela, o Caché exibe a
lista de esquemas do namespace USER. Como só criamos até agora uma única classe, no pacote Agenda,
apenas o esquema Agenda aparece na lista. Se houvesse mais de um esquema listado, poderíamos clicar nos
esquemas da lista para ver, imediatamente, do lado direito, a lista de tabelas do esquema selecionado.
Preparando o Caché para Nossos Estudos  75
Figura 3-21 - Exibindo as Tabelas do Esquema Agenda
Recordando o que vimos no tópico anterior, onde explicamos como ver a documentação de uma classe
usando o Portal de Administração do Caché, aqui também poderemos pedir a documentação SQL da nossa
tabela Contato. Para tanto, basta clicar no nome da tabela, que é um link para sua documentação, que pode ser
vista na Figura 3-22.
Figura 3-22 - Documentação Relacional da Tabela Agenda.Contato
Estamos agora dentro do contexto da tabela Agenda.Contato. Observe que existe um menu de contexto
com opções diversas como Abrir Tabela, Otimizar Tabela, Reconstruir Índices e etc. Vamos usar a opção Abrir
Tabela em breve. Perceba que, logo abaixo, temos a lista de campos da tabela Agenda.Contato e que existe um
filtro de campos. Pode ser que uma tabela tenha tantos campos que seja necessário fazer uma busca para que
possamos encontrar o campo que queremos. Trata-se de uma documentação viva de tabelas e campos, da
mesma forma que temos para classes! Infelizmente aqui, não são exibidos os comentários de documentação que
colocamos em nossa classe.
Veja que todas as propriedades (EMail, Nome e Telefone) da classe Agenda.Contato, aparecem listadas
como Colunas da tabela Contato. Podemos ver o tipo de dados Orientado a Objetos de cada uma das
76  Preparando o Caché para Nossos Estudos
propriedades na coluna Tipo de Dados e o tipo de dados Relacional da coluna Tipos xDBC15. A propriedade
EMail, por exemplo, que no mundo orientado a objetos do Caché foi definida com o tipo de dados %Library.String
(%String), é exposta para o mundo SQL, automaticamente, como VARCHAR.
Observe também que as propriedades (colunas) EMail e Telefone aceitam um máximo de 50 caracteres
enquanto que a propriedade (coluna) Nome já aceita um tamanho máximo de 100, conforme mudança que
fizemos usando a Janela de Inspeção no tópico 3.2.5 na página 59.
Finalmente, veja que a Barra de Navegação não só nos mostra que estamos vendo uma tabela
específica ([Home] > [SQL] > [Esquemas] > [Tabelas] > [Tabela]), como também nos permite que voltemos para
de onde viemos.
Vamos aproveitar que estamos nesta tela e clicar no link Abrir Tabela para ver uma listagem dos
registros (objetos) de nossa tabela (classe) Agenda.Contato. Uma janela pop-up aparecerá com a listagem
parecida com a da Figura 3-23: Os números de ID poderão ser diferentes no seu sistema já que você
provavelmente criou mais objetos, alterou-os, excluiu-os e etc. Esta é a forma mais simples de se obter uma
listagem dos objetos de uma tabela, sem qualquer critério. Apenas uma parte dos objetos é listada, nunca todos.
Esta opção é só para termos uma ideia do conteúdo da tabela.
Figura 3-23 - Listagem dos Registros da Tabela Agenda.Contato
Se quisermos buscar registros de uma tabela usando critérios e filtros específicos, temos que usar a
linguagem de consulta a banco de dados SQL (Structured Query Language). A SQL é uma linguagem declarativa
que nos permite descrever o que queremos que o banco de dados faça (ao invés de fazer um pequeno programa
para isto). Assim, podemos de fato “pedir por escrito” o que queremos listar usando uma linguagem que o banco
de dados consiga entender e processar. Para tanto, se você ainda estiver com a janela pop-up aberta, exibindo a
listagem de objetos, feche-a. Volte para ver a lista de tabelas de seu esquema (como mostrado anteriormente na
Figura 3-21), clicando em [Tabelas] na sua barra de navegação.
Agora estamos de volta ao contexto do esquema Agenda. A lista de tabelas aparece em baixo e o menu
de contexto em cima. Clique na opção Executar Comando SQL. Você verá uma tela como a da Figura 3-24.
Tenha a certeza de que está no namespace USER, olhando no lado esquerdo de sua tela, o namespace
selecionado.
xDBC – ODBC ou JDBC, que são os dois padrões mais reconhecidos de acesso relacional a banco de dados. Todos os
outros “padrões” são, na verdade, APIs proprietárias dos fornecedores de bancos de dados relacionais, que normalmente
apresentam limitações de portabilidade.
15
Preparando o Caché para Nossos Estudos  77
Figura 3-24 - Executar Comando SQL
Agora podemos digitar no campo texto que aparece no centro da tela o comando SQL abaixo:
Select * From Agenda.Contato
Pressione o botão Executar Consulta para executar o comando SQL. O resultado deve ser parecido com
o mostrado na Figura 3-24. Talvez apareçam mais ou menos registros de acordo com o número de objetos que
você tenha criado nos tópicos anteriores.
O comando SQL acima é bem simples de entender:
Select
Selecionar (Listar)
*
Todas as Colunas
From Agenda.Contato
Da tabela Agenda.Contato
O asterisco é uma máscara que substitui a lista de todas as colunas da tabela. Você pode substituir o
asterisco pelos nomes das colunas que você quer separadas por vírgulas assim:
Select Nome, EMail, Telefone From Agenda.Contato
78  Preparando o Caché para Nossos Estudos
Mas o asterisco é mais fácil não? Mas nem sempre é mais eficiente. Agora imagine que queiramos
saber o telefone do registro (objeto) de ID 1 (um):
Select Telefone From Agenda.Contato Where ID=1
Simples não? Usamos o comando WHERE da linguagem SQL para explicar para o Caché que estamos
interessados apenas no objeto de ID um. Mas e se quiséssemos listar o Telefone de um registro a partir de seu
EMail?
Select Telefone From Agenda.Contato Where EMail = '[email protected]'
Novamente usamos o comando WHERE, mas agora impusemos uma restrição em outra coluna: EMail.
Perceba que usamos aspas simples para envolver o endereço de e-mail. Isto é essencial.
Aprendemos em tópicos anteriores como criar objetos (registros) usando Caché Object Script. Vamos
aprender agora como criar registros (objetos) usando SQL:
Insert Into Agenda.Contato (Nome, Telefone, EMail) Values (‘Carlos Silva’, ‘555-5454’,
‘[email protected]’)
O comando INSERT da linguagem SQL serve, como o nome sugere, para inserir novos registros em
uma tabela (Into Agenda.Contato). Como você pode ver no exemplo, primeiro listamos os nomes das colunas
que queremos preencher no novo registro, separando-as com vírgulas, entre parêntesis. Depois informamos os
valores destas colunas (Values), na mesma ordem, colocando cada valor entre aspas simples, separando-os por
vírgulas.
Depois de executar o comando INSERT acima, você pode tentar executar o comando SELECT
novamente para ver o seu novo registro aparecer na listagem. Perceba que ao lado de cada registro, também
aparece o seu ID. Observe que o seu novo registro também ganhou um novo ID automaticamente.
Como exercício, você pode tentar inserir mais alguns registros usando o comando INSERT da SQL.
Depois você pode usar o comando SELECT para listar seus registros e ver os IDs que eles ganharam. Por fim,
pode escolher um ou mais IDs para abrir os registros de forma orientada a objetos, usando Caché Object Script
através do Caché Terminal, com o método %OpenId() da classe Agenda.Contato como explicamos no Tópico
3.3.1 na página 60.
A esta altura, você já deve ter percebido a natureza híbrida do Caché, que permite que você trabalhe
tanto com o modelo orientado a objetos quanto com o modelo SQL, sem mapeamentos ou sobreposição
de camadas. O acesso aos dados é sempre direto, independente da via que escolhemos.
Preparando o Caché para Nossos Estudos  79
3.5 Criando Nossa Primeira Página Web
Agora que você já conhece a arquitetura do Caché, aprendeu a usar o Caché Studio e o Portal de
Administração do Caché, sabe um pouco de Caché Object Script e SQL, vamos aprender como criar uma página
Caché Server Pages (CSP) e listar todos os nossos contatos de nossa agenda na Web.
Na Figura 3-25, você pode ver uma
variação do diagrama de arquitetura do
Caché que mostramos no início do Capítulo 1.
Observe que a infraestrutura que suporta o
Caché Server Pages se apoia no Caché
Database Engine, no Engine de Objetos do
Caché e no Engine SQL do Caché. Isto
significa que quando desenvolvemos
aplicações usando Caché Server Pages,
podemos ter acesso direto a todos os
recursos do Caché de forma Orientada a
Figura 3-25 - Arquitetura do Caché
Objetos, SQL ou usando diretamente o Caché
Database Engine para tarefas que exigem o máximo de desempenho.
Acima de toda a infraestrutura oferecida pelo Caché Server Pages, como pode ser observado na Figura
3-25, podemos ver o Zen, um framework para construção de aplicações web ultra interativas com tecnologia
AJAX (Asynchronous Javascript And XML). O Zen traz componentes web como formulários, grids, calendários,
etc., prontos para construção rápida de aplicações e portais Web integradas ao banco de dados objeto-relacional
do Caché. Veremos um pouco mais de Zen nos próximos capítulos. Por agora, vamos nos concentrar no Caché
Server Pages (CSP), que não só é a base do Zen, como também permite a construção de aplicações Web
completas por si só. O Zen surgiu com o Caché 2007.1 e, antes disto, dezenas de milhares de aplicações web
foram construídas em Caché somente com o uso de CSP.
3.5.1 Criando Nossa Primeira Página CSP
Para começar a criar nossa primeira página CSP, abra novamente o Caché Studio no namespace
USER. Se o Caché Studio já não abriu o seu projeto automaticamente para você, abra-o, pois vamos adicionar
nossa primeira página CSP como mais um componente do projeto!
Clique no botão Novo, na barra de ferramentas do Caché Studio, ou use a combinação de teclas
CTRL+N. Na janela que aparece, clique na aba CSP, e selecione Caché Server Pages, como mostrado na Figura
3-26, e clique no botão Ok para que o Caché Studio crie uma nova página CSP.
80  Preparando o Caché para Nossos Estudos
Figura 3-26 - Nova Página Caché Server Pages
A primeira página CSP que o Caché Studio cria para nós já vem com um modelo básico de página
HTML que podemos continuar a estender, adicionando mais código, como pode ser visto abaixo:
<html>
<head>
<!-- Put your page Title here -->
<title> Cache Server Page </title>
</head>
<body>
<!-- Put your page code here -->
My page body
</body>
</html>
3.5.2 Salvando e Compilando nossa Primeira Página CSP
Neste momento, já podemos pedir ao Caché Studio para salvar a nossa primeira página Web clicando
no botão Salvar, na barra de ferramentas do Caché Studio ou usando a tecla de atalho CTRL+S. Uma janela
aparecerá perguntando pelo nome que será dado a nossa nova página CSP e a pasta onde ela será salva.
Preparando o Caché para Nossos Estudos  81
No campo, Nome do Arquivo, entre com “contatos.csp” (sem as aspas). Selecione, na lista de pastas
acima do campo, a pasta “csp/user”, dando um duplo clique nela. Esta é uma pasta virtual que está mapeada
para a pasta física em disco <InstallDir>\CSP\user. Portanto, depois que você clicar no botão Salvar, você já
pode abrir o seu Windows Explorer, na pasta física acima mencionada, e verificar que, de fato, um arquivo com o
nome “contatos.csp” foi criado.
Estamos criando nossa nova página no namespace USER, que já vem com o Caché. Mais tarde,
quando aprendermos a criar novos namespaces, veremos como criar novas aplicações CSP e como mapeá-las
para pastas físicas no disco.
Por fim, vamos compilar nossa página CSP, clicando no botão Compilar na barra de ferramentas do
Caché Studio ou usando a tecla de atalho CTRL+F7. Agora sim já podemos tentar dar uma olhada na nossa
página Web clicando no botão de Exibir Página Web
, na barra de ferramentas do Caché Studio, ou através
da mesma opção no menu Exibir > Exibir Página Web. O seu navegador web padrão será aberto. Mas ao invés
de ver diretamente a sua página Web, você verá uma tela de login. Você pode entrar diretamente com o super
usuário _system como sempre.
Lembre-se desta rotina: Alterar a página, salvá-la, compilá-la e, finalmente, pedir para exibi-la em seu
navegador padrão. Se você não compilar a página, não verá as mudanças. Além disto, pode ser que o
Caché não peça por um usuário e senha, se você instalou o Caché PC ou se você fez uma instalação
mínima ou para desenvolvimento.
3.5.3 Alterando a Página para Exibir Nossos Contatos
Agora que aprendemos a criar, editar e compilar uma página Caché Server Pages, e já criamos a nossa
primeira página, vamos fazer com que ela faça algo realmente útil. Neste nosso exemplo, aprenderemos como
usar os mesmos comandos SQL que usamos no Portal de Administração do Sistema, para obter uma lista de
contatos (objetos de nossa base de dados) e exibir algumas de suas informações em uma lista na Web.
Para tanto, vamos abrir a página CSP criada no tópico anterior (se você a fechou) para começar a
adicionar algum código nela. Para abrir a página CSP, basta clicar no menu Arquivo > Abrir. Uma janela
aparecerá perguntando que tipo de arquivo você deseja abrir. Na parte de baixo da janela, no campo Arquivos do
tipo, selecione Caché Server Pages (*.csp, *.csr). Depois, na lista acima, encontre a sua página CSP e clique no
botão Abrir.
Altere a seção body de sua página CSP para que ela se pareça com o código a seguir:
1. <body>
2.
3. <table border="1">
4. <tr>
5.
<td>Nome</td>
6.
<td>Telefone</td>
82  Preparando o Caché para Nossos Estudos
7. </tr>
8.
<script language="cache" runat="server">
9.
Set rs = ##class(%Library.ResultSet).%New()
10. Set status = rs.Prepare("select Nome, Telefone from Agenda.Contato")
11. Set status = rs.Execute()
12. While rs.Next()
13. {
14.
Write "<tr><td>",rs.Get("Nome"),"</td>"
15.
Write "<td>",rs.Get("Telefone"),"</td></tr>"
16. }
17. </script>
18. </table>
19.
20. </body>
Não copie a numeração de linhas. Elas servem apenas para nos ajudar a fazer comentários sobre o
código.
Iniciamos criando uma tabela e definindo uma linha fixa com duas colunas: Nome e Telefone. Em
seguida, na linha oito, usamos a tag <script> para abrir um bloco de código Caché Object Script
(language=”cache”), que vai ser executado no servidor (runat=”server”). Isto faz muito sentido já que a tag
<script> pode ser usada para se enviar código JavaScript ou VBScript para o navegador (cliente) e o que
queremos é um código que vai rodar no servidor, consultando a base de dados e gerando o HTML que vai ser
enviado ao cliente.
Se você não conhece HTML, sugiro procurar um pequeno tutorial na Internet sobre o assunto. Existem
muitos e é realmente muito fácil!
Na linha nove já começamos a escrever código em Caché Object Script. O código que podemos
escrever aqui é o mesmo que escreveríamos na linha de comando do Caché Terminal, só que agora, podemos
escrever os comandos que queremos que sejam executados na ordem que quisermos, um abaixo do outro, e
todos eles serão executados de uma vez quando a página for chamada!
Começamos usando o comando Set para criar um objeto chamado rs (de ResultSet) da classe
%Library.ResultSet. Esta classe possui vários métodos muito úteis para criar e executar comandos SQL no
Caché. Em seguida, na linha dez, usamos novamente o comando Set para atribuir à variável status o resultado
Preparando o Caché para Nossos Estudos  83
da execução do método de instância Prepare do objeto rs, passando como único parâmetro para o método a
instrução SQL que queremos executar que, neste caso, é uma consulta (SELECT).
Vale ressaltar novamente que um objeto da classe %Library.ResultSet pode executar quase todo tipo de
instrução SQL como SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, etc. Basta passar a
instrução para o método Prepare.
Agora nosso objeto rs já preparou a consulta e só espera a ordem para executá-la. Na linha onze,
novamente usamos o comando Set para atribuir à variável status o resultado da chamada ao método de instância
Execute do objeto rs.
Observe que tanto o método Prepare quanto o método Execute, retornam um valor de status,
informando se eles de fato conseguiram fazer o que se propõem ou se tiveram problemas. Por exemplo,
poderíamos ter passado uma instrução SQL inválida, pedindo um nome de coluna de nossa tabela que
não existe. É por isto que usamos o comando Set para chamar estes métodos. Se eles não retornassem
valor algum, poderíamos usar o comando Do, que vamos aprender nos próximos tópicos. De qualquer
forma, não estamos verificando o conteúdo da variável status depois de chamar os métodos e isto é
uma falta gravíssima, que pode fazer com que bugs passem despercebidos. Mas para este exemplo,
vamos tolerar esta falta e seguir em frente. Aprenderemos como escrever código seguro em breve.
Agora que já preparamos e executamos a nossa consulta, o objeto rs contém uma lista de linhas com o
resultado. Para percorrer esta lista, usaremos o método Next, que tenta mover o ponteiro ao longo da lista de
resultados para a próxima linha da lista. Se o método Next conseguiu mover o ponteiro para uma próxima linha
ele retorna 1 (verdadeiro) e em caso contrário ele retorna 0 (falso).
Portanto, para percorrer todas as linhas do resultado de nossa consulta, teríamos que chamar o método
Next várias vezes! Para isto, na linha doze, usamos o comando de repetição While que recebe como parâmetro
uma condição. Se esta condição for verdadeira, o comando While executará o bloco de código entre chaves logo
abaixo. Caso contrário, o comando While desviará a execução para a próxima linha depois do bloco entre
chaves. A condição que passamos para o comando While é a chamada ao método Next do objeto rs. Assim, se o
método Next conseguir mover o ponteiro interno para o próximo item da lista de resultados, ele retornará 1
(verdadeiro), indicando ao comando While que o bloco de código entre chaves pode ser executado. Caso
contrário, o método Next terá chegado ao fim da lista e retornará 0 (falso) e o comando While saberá que não é
mais preciso executar o bloco de código entre chaves. Podemos ler o bloco de código da linha 12 a 16 assim:
ENQUANTO rs.TemMaisUmaLinha FAÇA:
Escreva...
Escreva...
PROXIMO.
84  Preparando o Caché para Nossos Estudos
Agora, podemos escrever o código, dentro do bloco entre chaves, que será executado para cada linha
do resultado de nossa consulta. Este código Caché Object Script deverá gerar o código HTML que será enviado
ao navegador para terminar de desenhar a nossa listagem de contatos na Web.
Para enviar coisas para o navegador, em Caché Object Script, usamos o comando Write. Enquanto que
no Caché Terminal, o comando Write servia para enviar coisas para a nossa própria tela, em um bloco <script>
de uma página Caché Server Pages, o comando Write serve para enviar coisas para o navegador Web.
Começamos, na linha 14, enviando as tags <tr> para abrir uma nova linha na <table> que criamos antes
e, em seguida, a tag <td> para já criarmos a primeira coluna da linha. Em seguida, usamos uma vírgula, para
continuar escrevendo coisas para o navegador:
12. While rs.Next()
13. {
14.
Write "<tr><td>",rs.Get("Nome"),"</td>"
15.
Write "<td>",rs.Get("Telefone"),"</td></tr>"
16. }
O comando Write permite que várias coisas sejam escritas em sequência, separando cada uma delas
com vírgulas. Assim, depois da primeira vírgula, usamos o método de instância Get do objeto rs para obter o
valor da coluna Nome e, por fim, usamos outra vírgula para enviar a tag </td> que fecha a nossa primeira coluna.
Na linha 15, fazemos a mesma coisa com a ressalva de que a linha já está aberta (não precisamos imprimir outro
<tr>). Mas depois de imprimir o valor da coluna Telefone, não temos mais colunas para imprimir assim que
terminamos fechando a linha com a tag </tr>.
Agora compile a sua página e peça para ser visualizada no navegador. Se você quiser melhorar um
pouco a página, pode tentar adicionar a coluna EMail que está faltando e usar um pouco de cores para formatar a
tabela de forma que ela fique mais bonita. Use seus conhecimentos de HTML!
3.5.4 Usando Tags Caché Server Pages Especiais
Podemos fazer a mesma coisa que fizemos no tópico anterior sem usar quase nada de Caché Object
Script. Veja no exemplo abaixo que começamos, na linha dois, com uma tag <script> da mesma forma que no
exemplo anterior, só que agora especificamos SQL como linguagem (language=”sql”). Observe também que
definimos um nome para o consulta (name=”rs”).
De fato, a tag <script>, com esta configuração, usará a consulta SQL que passarmos no seu interior
para criar um objeto da classe %Library.ResultSet, idêntico ao que usamos no tópico anterior, colocando-o na
variável cujo nome foi passado para o atributo name (rs).
Por fim, a tag <script> já executará a consulta, chamando o método Execute do objeto rs
automaticamente para nós, deixando assim tudo pronto para que já possamos percorrer o resultado!
Preparando o Caché para Nossos Estudos  85
Lembre-se: Não copie a numeração de linhas. Elas servem apenas para nos ajudar a comentar o
código.
1.
2.
<script language="sql" runat="server" name="rs">
select ID, Nome, Telefone, EMail from Agenda.Contato
3.
</script>
4.
<table border="1">
5.
<tr>
6.
<td>Id</td><td>Nome</td><td>Telefone</td><td>EMail</td>
7.
</tr>
8.
<csp:while condition="rs.Next()">
9.
<tr>
10.
<td>#(rs.GetData(1))#</td>
11.
<td>#(rs.GetData(2))#</td>
12.
<td>#(rs.GetData(3))#</td>
13.
<td>#(rs.GetData(4))#</td>
14.
</tr>
15.
</csp:while>
16.
</table>
Em seguida, das linhas 5 a 7, imprimimos normalmente os comandos HTML para o cabeçalho de nossa
tabela e, na linha 8, usamos a tag <csp:while> para percorrer o resultado de nossa consulta. A tag <csp:while>
tem uma condição (condition=”rs.Next()”) que indica até quando o seu interior será repetido. Funciona da mesma
maneira que o comando While que usamos no tópico anterior.
No interior da tag <csp:while>, abrimos uma linha com a tag <tr> e abrimos uma coluna para cada
coluna que queremos imprimir de nossa linha atual. Observe que na linha 10 usamos a expressão
#(rs.GetData(1))#. O resultado da expressão que estiver entre #( e )# será simplesmente enviado ao navegador
Web. Isto é equivalente ao comando Write rs.GetData(1).
O método GetData é semelhante ao método Get com a diferença de que, ao invés de esperar o nome
da coluna como o método Get, ele espera o número da coluna: 1 para a primeira, 2 para a segunda e assim por
diante. É só mais uma maneira de se pedir o valor de uma coluna de uma consulta. Você pode optar pela
maneira que você achar melhor (Get() ou GetData()). A vantagem de pedir a coluna pelo numero, com GetData,
é que você não precisa saber o nome da coluna, só que ela está ali.
86  Preparando o Caché para Nossos Estudos
Como exercício, tente alterar a página para mostrar a lista de contatos em ordem alfabética. Para isto,
você precisará alterar o seu comando SQL, adicionando uma cláusula de ordenação como o exemplo abaixo:
<script language="sql" runat="server" name="rs">
Select ID, Nome, Telefone, EMail from Agenda.Contato
Order By Nome
</script>
A cláusula ORDER BY do comando SELECT aceita como parâmetros os nomes das colunas pelas
quais desejamos ordenar a listagem. No exemplo acima, passamos apenas a coluna Nome, mas poderíamos ter
passado mais de uma coluna de ordenação, separando seus nomes por vírgulas, de forma que o Caché
ordenaria primeiro por uma coluna, em seguida pela segunda e assim por diante.
No próximo tópico, vamos seguir com o nosso tour e aprender o que são e como criar rotinas. Depois de
conhecer as rotinas, terminaremos nosso tour aprendendo como construir páginas Web usando Zen!
Preparando o Caché para Nossos Estudos  87
3.6 Criando Nossa Primeira Rotina Caché Object Script
Rotinas Caché Object Script são muito úteis quando queremos escrever pequenos trechos de código ou
utilitários. Poderíamos escrever tudo em métodos de classes (que ainda não aprendemos a criar, só a usar), mas
rotinas representam outra forma de fazê-lo sem a necessidade de criar uma classe só para isso.
Por outro lado, toda vez que compilamos uma Classe no
Caché, o compilador gera uma série de rotinas que, depois, são
transformadas em código objeto para a máquina virtual do Caché.
Mesmo páginas CSP, quando compiladas, são transformadas em
Classes para, em seguida, serem compiladas em rotinas e em
código objeto da máquina virtual do Caché.
Comandos SQL também são compilados em Rotinas
antes de serem executados. Portanto, todo código que
escrevemos no Caché, no fim, vira uma rotina que será compilada
no código objeto para a máquina virtual do Caché.
Figura 3-27 - No fim, sempre temos rotinas!
É por esta razão que é muito importante aprender a criar
e usar rotinas, pois esbarraremos com elas a todo momento. A ideia deste capítulo é praticar um pouco mais de
Caché Object Script ao criar uma rotina que nos permita criar um novo contato em nossa agenda.
3.6.1 Criando nossa primeira Rotina Caché Object Script
Para começar a criar nossa primeira Rotina Caché Object Script, abra novamente o Caché Studio no
namespace USER. Se o Caché Studio já não abriu o seu projeto automaticamente para você, abra-o, pois
vamos adicionar nossa primeira página CSP como mais um componente do projeto!
Figura 3-28 - Nova Rotina Caché Object Script
88  Preparando o Caché para Nossos Estudos
Clique no botão Novo, na barra de ferramentas do Caché Studio, ou use a combinação de teclas
CTRL+N. Na janela que aparece, clique na aba Geral, e selecione Rotina Caché Object Script, como mostrado
na Figura 3-28, e clique no botão Ok para que o Caché Studio crie uma nova Rotina.
A nova Rotina Caché Object Script aparecerá, em branco. Para começar, vamos fazer uma simples
rotina “Olá Mundo!”.
Para digitar o código do exemplo abaixo, tenha certeza de preceder cada linha com um espaço ou com
um TAB. Não se pode escrever código Caché Object Script “colado” na margem esquerda da rotina, pois o
Caché Object Script entende que qualquer texto que comece na margem esquerda está, na verdade, definindo
um Rótulo. Aprenderemos sobre Rótulos no Capítulo 4.
Write !,“Olá Mundo!”
Write !,”Pressione ENTER para terminar.”
Read lixo
Observe que cada linha de comando na rotina possui um TAB antes.
3.6.2 Salvando e Compilando nossa Primeira Rotina
Neste momento, já podemos pedir ao Caché Studio para salvar a nossa primeira Rotina clicando no
botão Salvar, na barra de ferramentas do Caché Studio ou usando a tecla de atalho CTRL+S. Uma janela
aparecerá perguntando pelo nome que será dado a nossa nova Rotina.
No campo Nome do Arquivo entre com “Contatos.MAC” (sem as aspas e cuidado com maiúsculas e
minúsculas).
Observe que nossa rotina tem a extensão “.MAC”. Páginas CSP tem a extensão “.CSP”, classes têm a
extensão “.CLS” e Rotinas tem a extensão “.MAC”. Existem, no entanto, outros tipos de rotinas, com
outros tipos de extensões. No nosso caso, estamos criando o tipo de rotina mais comum. Mas existem,
por exemplo, rotinas Caché Basic, que ao contrário de serem programadas em Caché Object Script,
permitem que se use VBScript e possuem a extensão “.BAS”. No final, uma rotina Caché Basic também
é compilada para o mesmo código objeto interpretável pela máquina virtual do Caché. Além disto,
existem também rotinas de Include (extensão “.INC”) e rotinas intermediárias (“.INT”). Falaremos com
mais detalhes sobre os tipos específicos de rotinas nos próximos capítulos.
Por fim, vamos compilar nossa Rotina, clicando no botão Compilar na barra de ferramentas do Caché
Studio ou usando a tecla de atalho CTRL+F7. Agora podemos abrir o Caché Terminal, no namespace USER, e
usar o comando Do para executar a nossa nova rotina.
Preparando o Caché para Nossos Estudos  89
Veja no exemplo abaixo que precisamos preceder o nome da rotina com o caractere ^ (chapeuzinho,
circunflexo, up arrow, caret ou simplesmente “seta para cima”). Explicaremos a razão disto no próximo capítulo.
Por enquanto, assuma como uma regra:
USER>Do ^Contato
Olá Mundo!
Pressione ENTER para terminar.
Observe que o comando Read, usado na rotina, fez com que a rotina não retornasse imediatamente
para a linha de comando. O comando Read permite que o usuário entre com texto até que a tecla ENTER seja
pressionada. Todo o texto digitado é então armazenado na variável passada como primeiro parâmetro para o
comando. No nosso caso, chamamos a variável de lixo, já que não estamos de fato interessados no que o
usuário digitou, só queríamos fazer uma pausa. No próximo tópico, usaremos o comando Read para obter
informações importantes do usuário.
Lembre-se desta rotina: Alterar a rotina, salvá-la, compilá-la. Se a rotina não for compilada, o novo
código objeto não será gerado e você poderá estar executando ainda a versão antiga da rotina.
3.6.3 Expandindo as Funcionalidades
Agora que já aprendemos a criar, salvar, compilar e testar nossa rotina Caché Object Script, vamos
terminar de ampliar as suas funcionalidades. Se você fechou a sua rotina ou o Caché Studio, abra o Caché
Studio e a sua rotina através da opção de menu Arquivo > Abrir. Aparecerá uma janela perguntando que arquivo
você deseja abrir. Selecione no campo Arquivos do Tipo o tipo de arquivo Rotina Macro (*.mac) e encontre a
sua rotina na lista acima do campo para, então, clicar em Abrir.
Apague a linha onde imprimimos “Olá Mundo” e entre com o código abaixo.
Lembre-se: Não copie a numeração de linhas. Elas servem apenas para nos ajudar a comentar o
código.
1.
Write !,"Entre com os dados do contato:"
2.
Read !,"Nome :", nome
3.
Read !,"Telefone:", tel
4.
Read !,"EMail :" , email
5.
6.
Set contato = ##class(Agenda.Contato).%New()
7.
Set contato.Nome=nome
8.
Set contato.Telefone=tel
90  Preparando o Caché para Nossos Estudos
9.
Set contato.EMail=email
10. Set status = contato.%Save()
11.
12. If status=1
13. {
14.
Write !!,"Contato salvo!"
15. }
16. Else
17. {
18.
Do $System.Status.DisplayError(status)
19. }
Nas linhas 1 a 4, usamos os comandos Write e Read para pedir informações para o usuário. Assim, ao
final da execução deste bloco de comandos, teremos as variáveis nome, tel e email, criadas e preenchidas com o
nome, telefone e e-mail, respectivamente, do novo contato a ser criado.
Observe que a variável passada como parâmetro para o comando Read não precisa existir de antemão.
O comando cria a variável automaticamente com o que foi digitado pelo usuário no Caché Terminal.
Nas linhas de 6 a 10, usamos o já conhecido método %New() da nossa classe Agenda.Contato para
criar um novo objeto na variável contato, e preenchemos cada uma das propriedades do objeto com o conteúdo
das variáveis coletado no bloco anterior. Na linha 13, chamamos o método %Save(), para tentar salvar o nosso
novo objeto.
Na linha 12 usamos o comando If (“se”) para verificar se a variável status, preenchida com o retorno da
chamada ao método %Save(), contém o valor 1 (verdadeiro), indicando que o objeto foi salvo com sucesso e sem
problemas. É a primeira vez que você está vendo o comando If em Caché Object Script, mas a sua estrutura é
muito simples. O único parâmetro esperado pelo comando If é uma expressão. Se o resultado da expressão for
verdadeiro, o bloco de código entre chaves (“{“ e “}”) logo após o comando If é executado. Caso contrário, se
houver um comando Else em seguida, seu bloco de código entre chaves é executado.
No nosso caso, se status for igual a 1, imprimiremos na tela a frase “Contato salvo!”. Caso contrário,
usaremos o método DisplayError, da variável de sistema $System.Status para imprimir na tela a descrição do
problema. Precisamos disto, pois a descrição do problema pode ser complexa, envolvendo vários eventos. É por
isto que o Caché retorna a descrição do problema codificada. E para conseguirmos decodificar o conteúdo da
variável status, precisamos dos métodos do objeto especial de sistema $System.Status. Existem vários outros
métodos ali que aprenderemos a usar depois.
Preparando o Caché para Nossos Estudos  91
A variável de sistema $System dá acesso a vários objetos de sistema. Ela expõe vários métodos úteis
que podemos chamar. No nosso caso, usamos o método $System.Status.DisplayError() para decodificar
e mostrar na tela o conteúdo da variável status passada como primeiro parâmetro. Veremos mais sobre
variáveis de sistema no Capítulo 4.
Agora tente compilar a sua rotina para que possamos testá-la no Caché Terminal. A Figura 3-29 mostra
o resultado da execução da rotina.
Como exercício, tente:
1. Criar alguns novos contatos (comando INSERT) e buscá-los (comando SELECT) usando comandos da
SQL através do Portal de Administração do Caché.
2. Chamar a página CSP para listar os contatos na Web.
3. Tente criar um contato com um EMail com mais de 50 caracteres. Você verá um erro informando que o
valor da propriedade excede os 50 caracteres (O MAXLEN padrão é 50, lembra?).
Figura 3-29 - Exemplo de execução
92  Preparando o Caché para Nossos Estudos
3.7 Criando a sua Primeira página Zen
Agora que já estamos familiarizados com as principais ferramentas do Caché e conhecemos alguns dos
principais conceitos como classes e rotinas, vamos terminar o nosso pequeno tour construindo uma página Zen
para permitir a listagem e edição livre de contatos. Quando pronta, a nossa primeira aplicação Zen terá a
seguinte aparência:
Figura 3-30 A aparência de nossa primeira aplicação Zen
Uma aplicação Web qualquer, é normalmente composta de várias páginas. Uma aplicação Zen não é
diferente: Normalmente criamos várias páginas Zen que, juntas, entregam a funcionalidade completa da
Aplicação. Vamos ver que uma página Zen nada mais é do que uma classe Caché especial, mas além das
páginas Zen, uma aplicação Zen exige que você defina uma classe para representar a aplicação Zen
propiamente dita. Está classe define estilos CSS e javascripts padrão para todas as páginas Zen que façam
referencia a ela:
Figura 3-31 - Uma aplicação Zen
Preparando o Caché para Nossos Estudos  93
É claro que cada página Zen individual pode definir estilos CSS e javascript próprios, mas quando
quisermos definir estilos e scripts que serão usados em todas as páginas, a classe da aplicação é o melhor lugar
para defini-los. Por ser tão essencial, vamos começar criando uma nova classe de aplicação Zen!
3.7.1 Criando a Classe de Aplicação Zen
Abra o Caché Studio e verifique se você está trabalhando no namespace USER e se você está com o
seu projeto aberto. Clique no menu Arquivo > Novo ou pressione CTRL + N. A seguinte janela aparecerá:
Figura 3-32 - Nova Aplicação Zen
Selecione “Nova Aplicação Zen” para iniciar o assistente de criação da classe de Aplicação Zen que
pode ser visto na Figura 3-33. Sendo uma classe, uma aplicação Zen sempre é definida em um pacote. Vamos
criar a nossa classe de aplicação no pacote Agenda.UI, a classe se chamará Application e também estamos
definindo o nome “Agenda de Contatos” como nome de nossa aplicação:
94  Preparando o Caché para Nossos Estudos
Figura 3-33 - Criando uma nova aplicação
Depois de preencher os campos do assistente, basta com pressionar Finalizar para que o assistente crie
a classe de Aplicação para você. A nossa nova classe pode ser vista na Figura 3-34.
Figura 3-34 - A nossa primeira classe de aplicação Zen
Observe que a nossa nova classe Agenda.UI.Application herda de %ZEN.application e que existe um
lugar (bloco XData) para definir as folhas de estilo CSS padrão de toda aplicação. Vamos definir um estilo básico
Preparando o Caché para Nossos Estudos  95
padrão para toda a nossa aplicação imediatamente. Faça com que o XData Style de sua classe de aplicação
fique assim:
/// This Style block contains application-wide CSS style definitions.
XData Style
{
<style type="text/css">
body { background: #eeeeee; font-size: 1em; font-family: Verdana; }
#title {
background: #36393D;
color: white;
font-size: 1.5em;
padding: 10px;
}
fieldSet { color: #D15600; font-weight: bold; }
form { margin: 15px; }
.text {
background: white;
border: 1px solid black;
margin:0 0 10px 5px;
height: 25px;
padding: 5px;
}
.button {
color: white;
background: #3F4C6B;
border: 1px solid black;
padding: 2px;
margin: 5px;
}
table.tpTable tr.tpSelected { background: #c3d9ff;}
</style>
}
Se você não está familiarizado com HTML e CSS (Cascade Style Sheets), não se preocupe. Basta
saber que com os comandos acima, definimos as cores e estilos de varias coisas básicas de nossa aplicação
como o título, fundo da página, etc. Existem muitos tutoriais de CSS na Internet e quando abordemos o Zen em
mais detalhes, vamos fazer uma pequena introdução.
Não deixe de compilar a sua nova classe de Aplicação Zen!
96  Preparando o Caché para Nossos Estudos
3.7.2 Criando a nossa primeira página Zen
Agora que temos uma classe de aplicação Zen básica pronta, podemos continuar e criar a nossa
primeira página Zen. Clique no menu Arquivo > Novo ou pressione CTRL + N. A seguinte janela aparecerá:
Figura 3-35 - Criando a nossa primeira página Zen
Na janela que se abre, selecione Nova Página Zen (New Zen Page) e clique no botão OK para iniciar o
assistente de criação de uma nova página Zen:
Preparando o Caché para Nossos Estudos  97
Figura 3-36 - Assistente de Criação de uma nova página Zen
Conforme explicamos, uma página Zen também é uma classe Caché e por isto temos que informar o
pacote e o nome da classe. Vamos criar a nossa classe Contato no pacote Agenda.UI como pode ser visto na
Figura 3-36. Além disto, também é muito importante definir a qual aplicação esta página Zen pertence
98  Preparando o Caché para Nossos Estudos
(Agenda.UI.Application). Finalmente, defina um nome para a página e o seu domínio conforme mostra a figura.
Explicaremos para que serve o domínio quando abordemos Zen nos próximos capítulos.
Clique no botão próximo (Next) para ver a próxima tela do assistente. Nesta tela, você deve escolher o
estilo geral da página Zen:
Figura 3-37 - Definindo o estilo geral da página
Escolha o estilo Title Page de acordo com o mostrado na Figura e clique no botão Finalizar (Finish). O
assistente de criação de páginas Zen criará uma nova classe no seu projeto com o conteúdo abaixo:
1. /// Created using the page template: Title Page
2. Class Agenda.UI.Contato Extends %ZEN.Component.page
3. {
4.
/// Class name of application this page belongs to.
5.
Parameter APPLICATION = "Agenda.UI.Application";
6.
7.
/// Displayed name of this page.
8.
Parameter PAGENAME = "Agenda de Contatos";
9.
10. /// Domain used for localization.
11. Parameter DOMAIN = "Agenda";
12.
13. /// This Style block contains page-specific CSS style definitions.
14. XData Style
15. {
Preparando o Caché para Nossos Estudos  99
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41. }
<style type="text/css">
/* style for title bar */
#title {
background: #C5D6D6;
color: black;
font-family: Verdana;
font-size: 1.5em;
font-weight: bold;
padding: 5px;
border-bottom: 1px solid black;
text-align: center;
}
</style>
}
/// This XML block defines the contents of this page.
XData Contents [XMLNamespace="http://www.intersystems.com/zen"]
{
<page xmlns="http://www.intersystems.com/zen" title="">
<html id="title">Agenda de Contatos</html>
<vgroup width="100%">
<!-- put page contents here -->
</vgroup>
</page>
}
Como podemos ver na primeira linha, a nossa nova página herda de %ZEN.Component.page e possui
três parâmetros que contém exatamente o que informamos no assistente de criação de páginas Zen: A aplicação
a qual pertence a página, o domínio e o nome da página.
Observe que entre a linha 13 e 29, o assistente incluiu um bloco XData com estilos específicos para esta
página. Não vamos necessitar este bloco assim que você pode exclui-lo completamente ou só apagar o que está
entre as linhas 17 e 27 (o #title).
Finalmente, podemos ver outro bloco XData chamado Contents que é onde está definida a nossa
página. Você pode compilar a página do jeito que está e clicar no menu Ver > Página Web para dar uma olhada
na página em seu navegador. Você verá que ela só mostrará um título e nenhum outro conteúdo, mas observe
como ela já está usando alguns dos estilos CSS definidos na classe da aplicação!
Vamos começar a adicionar alguns componentes a nossa página, começando por uma tabela que
mostrará todos os contatos cadastrados na nossa agenda atualmente. Para tanto, basta com substituir o
comentário na linha 37 por:
1.
2.
3.
4.
5.
6.
XData Contents [XMLNamespace="http://www.intersystems.com/zen"]
{
<page xmlns="http://www.intersystems.com/zen" title="">
<html id="title">Agenda de Contatos</html>
<vgroup width="100%">
<spacer width="5px"/>
100  Preparando o Caché para Nossos Estudos
7.
<tablePane id="myTable" tableName="Agenda.Contato" useKeys="true"
valign="top">
8.
<column colName="ID" hidden="true"/>
9.
<column colName="Nome" header="Nome" filterType="text"/>
10.
<column colName="Telefone" header="Telefone" filterType="text"/>
11.
<column colName="EMail" header="EMail" filterType="text"/>
12.
</tablePane>
13.
</vgroup>
14. </page>
15. }
16. }
Na linha 6, usamos a tag <spacer> para criar um pequeno espaço de 5 pixels e afastar a nossa tabela
um pouco da margem esquerda da página. Em seguida adicionamos à nossa página o componente <tablePane>.
Vamos a referenciar este componente depois e é por isto que definimos um id (myTable) para ele. Em seguida,
também definimos o atributo tableName com o valor “Agenda.Contato” e assim especificamos a origem dos
dados. Compile a página e peça para ve-la novamente no seu navegador. Se você tem registros guardados na
sua classe Agenda.Contato, eles deverão aparecer na tabela.
Ainda no seu navegador, clique no interior da tabela e use as setinhas para cima e para baixo de seu
teclado para navegar nos registros. O atributo useKeys do componente tablePane é que habilita esta
funcionalidade.
Agora que temos a tabela com nossos registros, não seria interessante se pudéssemos clicar em um
deles e modifica-lo? Para fazer isto, precisamos, primeiro, definir um formulário e para isto, coloque logo depois
da tag final do tablePane o seguinte trecho de código:
<spacer width="15px"/>
<dataController id="myController" modelClass="Agenda.Contato" onsave="zenPage.getCom
ponentById('myTable').refreshContents();" ondelete="zenPage.getComponentById('myTabl
e').refreshContents();"/>
<fieldSet legend="Contato:" valign="top" layout="horizontal">
<form controllerId="myController" layout="vertical">
<text dataBinding="Nome" label="Nome:"/>
<text dataBinding="Telefone" label="Telefone:"/>
<text dataBinding="EMail" label="EMail:"/>
</form>
</fieldSet>
Adicionamos um componente dataController que também tem um id (myController) que servirá para
interagir com este componente depois. Em seguida, definimos a classe que a nossa classe Agenda.Contato
servirá de fonte de dados (atributo modelClass) e também definimos implementações para os eventos onsave e
ondelete do controller. Estas implementações definem que toda vez que alguém pedir a este controller para
Preparando o Caché para Nossos Estudos  101
salvar ou para apagar um objeto, temos que atualizar o conteúdo da tabela. É a primeira vez que você vê um
componente fazendo referencia ao outro e, para isto, usamos um pouco de javascript!
No evento onsave, por exemplo, pedimos ao objeto que representa toda a nossa página Zen (objeto
zenPage) que nos devolva o componente myTable (getComponentById) e sobre este componente (myTable),
chamamos o método refreshContents. É simples não? O método getComponentById do objeto zenPage é o
método mais usado em qualquer aplicação Zen!
Além do dataController, também adicionamos um fieldSet, que simplesmente desenha uma caixa ao
redor de nosso formulário e, finalmente, o formulário propriamente dito. Observe que o formulário tem um atributo
controllerId que aponta para o nosso dataController de forma que agora o nosso novo formulário mostrará o que
o componente dataController definir.
Uma vez conectado o formulário ao dataController, podemos definir dentro do formulário os campos que
nos interessam mostrar. Cada campo (componente text) está conectado com uma das propriedades de nossa
classe Agenda.Contato graças à propriedade dataBinding.
Agora temos de um lado o nosso componente tablePane que pode navegar livremente pelos registros
de nossa classe Agenda.Contato e por outro um formulário conectado a um dataController pronto para mostrar os
dados de nossos registros. Como conectamos os dois de forma que ao selecionar uma linha de nossa tabela, os
dados do registro selecionado apareçam no nosso formulário?
Basta com adicionar ao nosso componente tablePane dois novos atributos:
<tablePane id="myTable" tableName="Agenda.Contato" useKeys="true" valign="top"
valueColumn="ID" onselectrow="zenPage.getComponentById('myController').setModelId(ze
nThis.getValue())">
O atributo valueColumn especifica que ao selecionar uma linha da tabela, a coluna que o componente
tomará como dado representativo do registro selecionado é a coluna ID. O atributo onselectrow permite
especificar um código javascript que será executado sempre que o usuário selecionar (com o mousse ou teclado)
uma linha da tabela. Neste caso, escrevemos código para chamar o método setModelId() de nosso dataController
e, para obter o ID do objeto selecionado, pedimos para o componente tablePane o valor atual da tabela (por isto
devemos especificar o atributo valueColumn). Simples não?
Agora está tudo conectado! Você já deveria ser capaz de compilar e executar esta página, selecionar
alguns registros usando o teclado ou o mouse e ver os dados do registro selecionado aparecerem no formulário
automaticamente.
3.7.3 Incluir, Excluir e Alterar
Agora que podemos navegar livremente, vamos implementar a funcionalidade restante para permitir
incluir, excluir e alterar contatos de nossa agenda simples. Para tanto, vamos criar os botões para fazer isto e
código javascript adicional para conectar estes botões ao dataController.
102  Preparando o Caché para Nossos Estudos
Para simplificar e concluir, abaixo segue o código completo da página:
1. /// Created using the page template: Title Page
2. Class Agenda.UI.Contato Extends %ZEN.Component.page
3. {
4.
/// Class name of application this page belongs to.
5.
Parameter APPLICATION = "Agenda.UI.Application";
6.
7.
/// Displayed name of this page.
8.
Parameter PAGENAME = "Agenda de Contatos";
9.
10. /// Domain used for localization.
11. Parameter DOMAIN = "Agenda";
12.
13. /// This Style block contains page-specific CSS style definitions.
14. XData Style
15. {
16.
<style type="text/css">
17.
/* style for title bar */
18.
#title {
19.
background: #C5D6D6;
20.
color: black;
21.
font-family: Verdana;
22.
font-size: 1.5em;
23.
font-weight: bold;
24.
padding: 5px;
25.
border-bottom: 1px solid black;
26.
text-align: center;
27.
}
28.
</style>
29. }
30.
31. /// This XML block defines the contents of this page.
32. XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
33. {
34. <page xmlns="http://www.intersystems.com/zen" title="Agenda de Contatos">
35. <html id="title">Agenda de Contatos</html>
36. <vgroup width="100%">
37. <spacer height="5px"/>
38. <hgroup>
39.
40. <spacer width="5px"/>
41. <tablePane id="myTable" tableName="Agenda.Contato" valueColumn="ID" useKeys=
"true" valign="top" onselectrow="zenPage.getComponentById('myController').set
ModelId(zenThis.getValue())">
42. <column colName="ID" hidden="true"/>
43. <column colName="Nome" header="Nome" filterType="text"/>
44. <column colName="Telefone" header="Telefone" filterType="text"/>
45. <column colName="EMail" header="EMail" filterType="text"/>
46. </tablePane>
47.
48. <spacer width="15px"/>
49.
Preparando o Caché para Nossos Estudos  103
50. <dataController id="myController" modelClass="Agenda.Contato" onsave="zenPag
e.getComponentById('myTable').refreshContents();" ondelete="zenPage.getCompon
entById('myTable').refreshContents();"/>
51.
52. <fieldSet legend="Contato:" valign="top" layout="horizontal">
53. <form controllerId="myController" layout="vertical">
54. <text dataBinding="Nome" label="Nome:"/>
55. <text dataBinding="Telefone" label="Telefone:"/>
56. <text dataBinding="EMail" label="EMail:"/>
57.
58. <hgroup>
59. <button caption="Apagar" onclick="zenPage.deleteButton()"/>
60. <spacer width="50px"/>
61. <button caption="Salvar" onclick="zenPage.getComponentById('myController').sa
ve();"/>
62. <button caption="Novo"
onclick="zenPage.getComponentById('myController'
).createNewObject();"/>
63. </hgroup>
64.
65. </form>
66. </fieldSet>
67. </hgroup>
68. </vgroup>
69. </page>
70. }
71.
72. ClientClassMethod deleteButton() [ Language = javascript ]
73. {
74.
var controller = zenPage.getComponentById('myController');
75.
controller.deleteId(controller.getModelId());
76.
controller.createNewObject();
77. }
Observe que entre as linhas 58 e 63, adicionamos os botões para Apagar, Salvar e criar um Novo
contato em nossa agenda simples. Os eventos onclick dos botões Salvar e Novo são autoexplicativos. O evento
onclick do botão Apagar é diferente pois chama um método que executa todo o trabalho. Este método está
definido entre as linhas 72 e 77. Neste método, obtemos o controller e pedimos a ele que apague o objeto e crie
um novo.
Nada mais é necessário pois o componente dataController atualizará o formulário e a tabela
automaticamente! Poderíamos implementar um pouco mais de código javascript para mostrar algumas
mensagens ao usuário como “Contato excluído!” e etc., mas estes detalhes fogem ao objetivo deste capítulo que
já está bastante extenso.
3.7.4 Conclusão
Só usamos alguns dos componentes do Zen, que possui uma biblioteca bastante vasta, suporte a
gráficos SVG (Scalable Vector Graphics), multi-idiomas, acesso simples e direto à base de dados do Caché
(SQL, Objetos e acesso direto) e é totalmente baseado em padrões W3C e, por isto, não necessita plugins para
104  Preparando o Caché para Nossos Estudos
funcionar em todos os principais navegadores (inclusive navegadores móveis como o Safari para iPad ou
iPhone).
O Zen também permite a construção de relatórios que podem ser abertos como PDF, HTML ou XML e
está totalmente integrado ao modelo de segurança e controle de acesso do Caché que veremos em capítulos
futuros. Em resumo, todos os recursos do Caché estão disponíveis naturalmente para o Zen e tudo isto junto
permite a construção de aplicações corporativas muito rapidamente, sem abdicar de coisas importantes como
desempenho, segurança, flexibilidade e disponibilidade em varias plataformas Web distintas (IE, FireFox, Safari,
Opera, etc.).
3.8 Consultando a Documentação do Caché
Aprendemos bastante coisa neste capítulo. Não só aprendemos bastante sobre como usar as principais
ferramentas do Caché, como também um pouco de Caché Object Script, SQL e Caché Server Pages! Agora que
você já se sente um pouco mais a vontade, é provável que queira saber onde pode conseguir mais informações e
é por isto que vou tomar um tempo para apresentar a documentação on-line do Caché.
Se você clicar no Cubo do Caché > Documentação, verá que um navegador se abrirá mostrando o
índice da documentação on-line do Caché. Abaixo, segue uma lista de tópicos bastante interessante da
documentação que podem ser consultados após a leitura deste capítulo:
Tabela 3-5 – Tópicos de Interesse da Documentação do Caché
Introduction to Caché
Agora que você terminou este capítulo do livro, leia este tópico da documentação para
ter uma visão geral dos vários recursos do Caché. Não é uma leitura obrigatória, mas é
interessante.
Caché Development References
Aqui você vai encontrar
o
A documentação de todos os comandos da linguagem Caché Object Script (Caché
Object Script Reference)
o
A documentação de todos os comandos da linguagem SQL que são suportados
pelo Caché (Caché SQL Reference)
o
A documentação de todos os possíveis erros que o Caché pode emitir, com uma
breve descrição de suas causas (Caché Error Reference)
o
A documentação da linguagem de definição de classes do Caché, usada, por
exemplo, quando definimos nossa classe Agenda.Contato no Caché Studio
(Caché Class Definition Reference)
Caché Tutorials
Trataremos de muitos assuntos neste livro, mas quem sabe você encontre alguns
tutoriais neste tópico que não são cobertos por este livro. Dê uma olhada e veja os
tutoriais que existem!
Preparando o Caché para Nossos Estudos  105
Como você deve ter notado, existe um campo para fazer buscas na documentação. Simplesmente entre
com as palavras que você está buscando e o Caché retornará uma lista de tópicos de toda a documentação que
contenha todas as palavras passadas como argumento da pesquisa.
106  Preparando o Caché para Nossos Estudos
Download

Livro de Caché v5.21 – Versão Demo (tres capítulos)