ferramenta para administraÇÃo remota e … · na presente monografia é descrita uma ferramenta...

78
RICARDO JOSÉ LO FEUDO FERREIRA FERRAMENTA PARA ADMINISTRAÇÃO REMOTA E COLABORATIVA DE TABELAS DA AGROREDE FLORIANÓPOLIS 2003

Upload: duonglien

Post on 31-Aug-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

RICARDO JOSÉ LO FEUDO FERREIRA

FERRAMENTA PARA ADMINISTRAÇÃO REMOTA E

COLABORATIVA DE TABELAS DA AGROREDE

FLORIANÓPOLIS

2003

RICARDO JOSÉ LO FEUDO FERREIRA

FERRAMENTA PARA ADMINISTRAÇÃO REMOTA E

COLABORATIVA DE TABELAS DA AGROREDE

Monografia apresentada para obtenção do título

de bacharel em Ciências da Computação da

Universidade Federal de Santa Catarina.

Orientador: Prof. Msc. Antônio Carlos Mariani.

FLORIANÓPOLIS

2003

AGRADECIMENTOS

Agradeço ao professor A. C. Mariani pela prestativa orientação.

À minha família, que tem me apoiado sempre.

À Ana Claudia, pelas dicas de última hora, atenção e carinho.

À professora Edla pela ajuda prestada.

Aos professores do curso, que proporcionaram minha formação.

Aos colegas do projeto AgroREDE, pela ajuda e companherismo.

E a Deus, que possibilitou minha existência e faz deste planeta o local próprio para

nosso crescimento.

ii

SUMÁRIO

1. INTRODUÇÃO .............................................................................................................................................................. 1

2. APLICATIVOS PARA ADMINISTRAÇÃO REMOTA DE TABELAS DE DADOS .............................. 3

2.1. ADMINISTRADORES REMOTOS DE BASE DE DADOS............................................................................................3

2.1.1. PhpMyAdmin................................................................................................................................................... 3

2.1.2. phpPgAdmin.................................................................................................................................................... 4

2.1.3. Zaval Database Front-end............................................................................................................................ 5

2.1.4. FutureSQL....................................................................................................................................................... 6

2.1.5. myLittleAdmin................................................................................................................................................. 6

2.1.6. TableEditoR..................................................................................................................................................... 8

2.1.7. 1 Click DB Pro................................................................................................................................................ 9

2.1.8. MySQL Data Manager................................................................................................................................ 10

2.1.9. MySQL WebClient........................................................................................................................................ 11

2.1.10. IbaseAdmin.................................................................................................................................................. 12

2.1.11. Comparação Entre As Ferramentas Pesquisadas................................................................................ 13

2.2. OUTROS APLICATIVOS...........................................................................................................................................16

2.2.1. TeamWave ..................................................................................................................................................... 16

3. O SISTEMA AGROREDE ....................................................................................................................................... 17

3.1. ESTRUTURA DO SISTEMA ......................................................................................................................................17

3.2. PLATAFORMA DE IMPLEMENTAÇÃO ....................................................................................................................19

4. FERRAMENTA PARA ADMINISTRAÇÃO REMOTA E COLABORATIVA DE TABELAS DA

AGROREDE ..................................................................................................................................................................... 21

4.1. JUSTIFICATIVA.........................................................................................................................................................21

4.2. OBJETIVOS ...............................................................................................................................................................21

4.3. ESTRUTURA DA FERRAMENTA..............................................................................................................................21

4.3.1. Diagrama das Etapas da Ferramenta ..................................................................................................... 21

4.3.2. Tabelas........................................................................................................................................................... 22

4.3.3. Tipos de Dados............................................................................................................................................. 23

4.3.4. Armazenamento de Dados no MySQL ...................................................................................................... 23

4.4. COMO USAR A FERRAMENTA.................................................................................................................................24

5. TRABALHOS FUTUROS ........................................................................................................................................ 30

GLOSSÁRIO.......................................................................................................................................................................32

iii

REFERÊNCIAS .................................................................................................................................................................33

ANEXOS .............................................................................................................................................................................34

iv

LISTA DE TABELAS

TABELA 1 - COMPARATIVO DE FUNCIONALIDADES ENTRE OS ADMINISTRADORES REMOTOS

DE BASE DE DADOS......................................................................................................................................................14

TABELA 2 - COMPARATIVO DE CARACTERÍSTICAS ENTRE OS ADMINISTRADORES REMOTOS

DE BASE DE DADOS......................................................................................................................................................15

v

LISTA DE ILUSTRAÇÕES

FIGURA 1 - EXEMPLO DE CONJUNTO DE GRUPOS DO SISTEMA AGROREDE.....................................17

FIGURA 2 – DIAGRAMA DAS ETAPAS DA FERRAMENTA.............................................................................22

FIGURA 3 – PÁGINA INICIAL DO SISTEMA AGR OREDE................................................................................24

FIGURA 4 – LISTA DE TABELAS CRIADAS. .........................................................................................................25

FIGURA 5 – CRIANDO UMA NOVA TABELA. ......................................................................................................25

FIGURA 6 – ALTERANDO NOME, DESCRIÇÃO E COLUNAS DE UMA TABELA....................................26

FIGURA 7 – NOVA COLUNA FOI INSERIDA .........................................................................................................27

FIGURA 8 – VISUALIZANDO DADOS DE UMA TABELA .................................................................................28

FIGURA 9 – VISUALIZANDO DADOS DE UMA TABELA. NOVA LINHA FOI INSERIDA.....................28

vi

RESUMO

Na presente monografia é descrita uma ferramenta para administrar remota e

colaborativamente tabelas de dados. Esta ferramenta tem como público alvo usuários

leigos, de forma a apresentar uma interface simples e compreensível, porém robusta e

expansível em sua funcionalidade, dado o conhecimento do usuário.

Está inserida no sistema AgroREDE, que visa a auxiliar e fomentar o processo de

articulação dos atores rurais do meio rural familiar de Santa Catarina.

É apresentado, também, um quadro comparativo entre diferentes administradores

remotos de banco de dados, visando uma compreensão geral sobre as funcionalidades

apresentadas nestes aplicativos.

Palavras-chave : Tabelas de Dados, Agrorede, Agricultura Familiar

vii

ABSTRACT

In the present monograph a tool to remotely and cooperatively manage data tables is

described. This tool has as target group lay users, therefore, it has a simple and

understandable interface. However it’s robust and expandable in functionality.

It is inserted in the AgroREDE system, which aims to assist and to foment the

process of joint of the agricultural familiar actors of Santa Catarina.

It is presented, also, a comparative picture between different database remote

administration tools, aiming at a general understanding over the functionalities presented in

these tools.

Key-words : Data Tables, Agrorede, Familiar Agriculture

viii

1.Introdução

No meio rural de Santa Catarina, há uma quantidade de famílias que desenvolvem

uma produção pequena, para consumo próprio e comercialização de todo o excedente

produzido nas proximidades.

Algumas destas famílias desenvolvem produtos que tem durabilidade a ponto de

poderem ser vendidos em lugares mais longínquos. Para tal, um contato direto com o

consumidor tende a melhorar a renda do agricultor, na medida em que ele pode negociar

seu preço diretamente com o consumidor final.

Nestas famílias é comum encontrarmos pessoas que pararam seus estudos em

decorrência da necessidade de trabalhar. Por isso, infelizmente, no meio rural encontram-se

geralmente pessoas com pouca escolarização, e com, com dificuldades ao acesso à

informação. A informática pode proporcionar a agilização do acesso à informação e a

expansão da capacidade de atingir os consumidores. Entretanto esta tecnologia constitui-se

muitas vezes distante da acessibilidade de algumas pessoas, em alguns casos devido ao

pouco tempo de estudo, e em outros à adaptação de uma nova realidade tecnológica.

Sem a atualização dos conhecimentos sobre suas atividades de trabalho, o produtor

posiciona-se numa situação competitiva inferior à aquele que se atualiza. O rendimento e

lucro sobre o produto torna-se reduzido com o passar do tempo, pois com o advento de

novas técnicas e com o desenvolvimento de novas máquinas o processo produtivo

caracteriza-se por um aumento qualitativo e quantitativo.

O projeto AgroREDE tem como objetivo principal a implantação e estruturação de

uma rede de serviços de telemática de maneira a proporcionar uma maior integração entre

pessoas e instituições ligados à agricultura de Santa Catarina. Também visa agir na

educação sobre o uso efetivo desta rede.

Este objetivo implica, conforme [11] :

?? implantar em núcleos comunitários, centro fornecedores de serviços de

telemática;

?? alfabetizar tecnologicamente pessoas do meio rural;

?? desenvolver ou adaptar métodos pedagógicos para a alfabetização tecnológica;

?? desenvolver ou adaptar tecnologia da informação ao perfil do público alvo;

?? avaliar continuamente o impacto dos centros ao público alvo.

O sistema AgroREDE é um sistema computacional remoto e colaborativo, que

possibilita a interação entre seus usuários através de ferramentas que possibilitam a troca e

o armazenamento de informações. O público alvo do sistema são as pessoas ligadas à

agricultura de Santa Catarina, as quais são leigas com relação à informática.

Antes da construção do sistema AgroREDE, pensou-se em utilizar outros

aplicativos já conhecidos pelo mercado, para prover as funcionalidades requeridas pelo

projeto AgroREDE. Seu uso esbarrou, contudo, em questões diversas, a saber:

complexidade de administração da ferramenta, chegando em alguns casos, a exigir cursos

de formação específica, com custos incompatíveis com a realidade do projeto AgroREDE;

dificuldade de adaptação da ferramenta ás características dos usuários do projeto

AgroREDE; problema de integração de diferentes ferramentas (chat, grupos de discussão,

e-mail, biblioteca, etc) em um todo coerente, fato que confunde o usuário. Optou-se então

por desenvolver uma ferramenta própria e direcionada para a realidade da comunidade

usuária (esta ferramenta/sistema é descrita no capítulo 3).

A ferramenta para administração de tabelas é uma das ferramentas do sistema

AgroREDE. Esta ferramenta proporciona o armazenamento colaborativo de dados, porque

permite a mais de um usuário editar uma ou mais tabelas de dados. As tabelas podem ser

alteradas em sua estrutura, assim como, em seu conteúdo. Nas tabelas de dados é possível

inserir informações como funcionários de uma empresa, relação de atividades de um grupo,

ata de reunião, mobília de residência ou escritório, etc. Esta ferramenta é explicada no

capítulo 4.

No capítulo 2, descreve-se dez administradores remotos de banco de dados, os quais

foram analisados com o objetivo de conhecer suas funcionalidades, suas soluções em

termos da acessibilidade de dados e para elucidar o desenvolvimento da ferramenta de

administração remota e colaborativa de tabelas.

2

2.Aplicativos para administração remota de tabelas de dados

Com o objetivo de obter maior embasamento para a ferramenta proposta, estudei

dez administradores remotos de base de dados. O critério de escolha foram o seguinte:

funcionalidade, apresentação e (em alguns casos) estatísticas de uso no site do Source

Forge (sourceforge.net).

Todas as ferramentas pesquisadas possuem demonstrações de seu funcionamento

via Internet. Os endereços das demonstrações estão informados no capítulo de cada

ferramenta.

A pesquisa não trouxe mudanças visíveis para a ferramenta desenvolvida. Mas

proporcionou o entendimento do funcionamento, conhecimento de características técnicas e

funcionalidades disponíveis neste tipo de aplicativo. Portanto, durante o desenvolvimento

da ferramenta proposta, pude estar ciente do que poderia ou não implementar.

Foi analisado o aplicativo TeamWave, que é uma ferramenta para trabalho

colaborativo. Nesta ferramenta há um construtor de tabelas, em conjunto com outros

utilitários disponíveis. O objetivo de analisar este aplicativo, foi de entender seu

funcionamento e utilizar algumas idéias para a ferramenta desenvolvida.

2.1.Administradores Remotos de Base de Dados

2.1.1. 1 Click DB Pro

1 Click DB Pro é um servidor web para administração de banco de dados MS

Access, SQL Server e Oracle [1].

AccessHelp.net Custom Solutions comercializa esta ferramenta através do endereço:

<http://1clickdb.com/>. É cobrado uma taxa por servidor, para um número de usuários e

bancos de dados ilimitado. O código fonte é também disponibilizado, porém por taxa

adicional. A empresa disponibiliza outra ferramenta parecida, chamada 1 Click DB Free. É

um projeto de código aberto (open source), porém não contém todas as funcionalidades que

a versão paga.

3

Funcionalidades

Conforme a página na Internet da ferramenta [1], as funcionalidades são :

?? importar dados de diversos bancos de dados;

?? administrar a execução de consulta SQL, seja texto ou por arquivo;

?? criar e modificar tabelas, campos, visões, indices, stored procedures e chaves

estrangeiras;

?? procurar, exportar, adicionar, editar e remover funções.

Pré-requisitos

?? Servidor Internet Information Server (IIS) ou Personal Web Server (PWS 4 ou

superior) para Windows 95/98/NT/2000/XP.

?? Data Access Components (MDAC 2.1 ou superior).

2.1.2.FutureSQL

FutureSQL é uma ferramenta de administração de banco de dados com código

aberto (grátis). FutureSQL é escrita em Perl e usa o banco de dados MySQL. Usa um

dicionário de dados, arquivos de configuração e modelos de html.

É muito flexível e possui um conjunto extenso de opções. Pode ser usado para

funções administrativas, mas pode ser também modificado para permitir que usuários da

Internet pesquisem em tabelas de dados (sem poder alterá-las). Ainda, um

administrador/programador pode adaptá-lo para realizar um conjunto grande de funções,

provendo uma interface particular para diferentes sites da Internet.

FutureSQL foi desenvolvido por Peter F. Brown1. A versão aqui analisada é a 2.4,

lançada em 30 de outubro de 2001.

Esta ferramenta é distribuída sob a licença GNU GPL.

1 [email protected]

4

Funcionalidades

Conforme [2], FutureSQL pode :

?? alterar facilmente arquivos de configuração para ver, editar, remover e processar

registros de um banco de dados MySQL;

?? permitir o pré-processamento e pós-processamento em campos, registros e

operações;

?? permitir múltiplos arquivos de configuração para prover visões diferentes a um

mesmo conjunto de dados.

Pré-requisitos

?? Servidor de banco de dados MySQL instalado.

2.1.3.IbaseAdmin

IbaseAdmin é uma ferramenta de administração de banco de dados Interbase para a

Internet. Basea-se nos aplicativos phpMyAdmin e phpPgAdmin. Esta ferramenta é

desenvolvida pelo projeto FBT na universidade de Wageningen, um projeto com o objetivo

de criar conteúdo educacional usando tecnologia da Internet.

IbaseAdmin não requere arquivos de configuração para armazenar senhas. É feito

uma comparação entre o banco de dados indicado pelo usuário e a senha digitada, portanto

a segurança depende completamente sobre o servidor Interbase.

Esta ferramenta é licenciada sob os termos da GNU GPL. A versão analisada foi a

0.2.

5

Funcionalidades

De acordo com [3], este aplicativo pode :

?? criar e remover bancos de dados;

?? criar e modificar tabelas;

?? visualizar, remover e editar dados em tabelas;

?? adicionar e remover restrições (constraints), triggers, índices e geradores;

?? realizar cópias (backup);

?? fornecer o SQL de definição das tabelas.

Pré-requisitos

?? PHP4 (PHP3 não testado) com módulos do Interbase.

?? Servidor Interbase (somente InterBase 6 foi testado).

2.1.4.MyLittleAdmin

MyLittleAdmin é uma ferramenta de administração de banco de dados SQL Server

baseado em páginas da Internet. Permite o gerenciamento de bancos de dados mesmo

quando não puder usar o MS Enterprise Manager [4].

Esta ferramenta é distribuída comercialmente e pode ser adquirida para um único

servidor ou para uso ilimitado. Foi desenvolvida por Elian Chrebor. A versão analisada foi

a 1.5a.

Funcionalidades

Conforme a página do aplicativo na Internet [4], myLittleAdmin possui um kit para

tradução e pode :

?? criar, remover, alterar, copia e renomeia tabelas;

?? criar e remover índices;

6

?? adicionar, remover e alterar campos;

?? criar, remover e mostrar stored procedures;

?? criar, remover e mostrar gatilhos;

?? criar, remover e mostrar visões;

?? criar, remover e mostrar objetos;

?? adicionar, remover, modificar e duplicar registros;

?? executar qualquer comando SQL (incluindo stored procedures);

?? construir um comando SQL de seleção usando um auxiliar;

?? exportar o resultado de uma pesquisa em banco de dados como um arquivo CSV;

?? exportar o resultado de uma pesquisa em banco de dados como um arquivo

XML;

?? mostrar, exportar e pesquisar o conteúdo de visões.

Pré-requisitos

?? Windows NT 4.0 ou Windows 98.

?? IIS 4.0 ou Personal Web Server.

2.1.5.MySQL Data Manager

MySQL Data Manager é um aplicativo para a Internet e designado para

gerenciamento, desenvolvimento e suporte de banco de dados MySQL.

A ferramenta é desenvolvida pela empresa Edatanew.com e a versão analisada é a

1.41.

Sua distribuição é comercializada pela Internet através do endereço:

<http://www.edatanew.com/order/index.html>. Pode ser adquirido uma licença ou um

volume com várias licenças.

7

Funcionalidades

De acordo com [5], as funcionalidades são :

?? criar, salvar e editar comandos SQL, contendo múltiplas consultas;

?? criar e alterar tabelas e índices;

?? procurar por registros usando critérios múltiplos de pesquisa;

?? importar dados de arquivos texto;

?? exportar consultas, resultados de pesquisas, tabelas inteiras em arquivos texto,

para o MS Excel e MS Word;

?? administrar funções;

?? realizar e recupera cópias;

?? gerar páginas de dados para impressão;

?? permitir o ajuste da interface, alterando cores e formas.

Pré-requisitos

Servidor:

?? Qualquer servidor para Internet.

?? Perl 5 e modulos DBI e DBD::mysql.

Cliente:

?? Qualquer navegador para Internet, habilitado a usar cookies.

2.1.6.MySQL WebClient

MySQL WebClient é uma ferramenta para desenvolvimento de banco de dados

MySQL, e constitui-se de um único arquivo php. Foi desenvolvida por Virtual Internet

Developments e é licenciada sob os termos da GNU GPL, disponibilizada livremente

através da Internet. A versão analisada é a 0.0.1. Foi testada somente com os navegadores

Netscape/4.0 e Internet Explorer com habilitação a JavaScripts [6].

8

A ferramenta pode ser localizada em <http://www.vidwest.net/webclient/>.

Funcionalidades

Conforme [6], esta ferramenta :

?? permite acesso a tabelas, possibilitando configuração estrutural, entrada e saída

de dados;

?? faz a validação das consultas ao servidor no lado do cliente, minimizando a

interação com o servidor;

?? ajuda na construção de comandos SQL e executa comandos em seqüência.

Pré-requisitos

?? Servidor para Internet Apache/1.3.14 ou superior (Win32).

?? MySQL 3.23.32 ou superior.

2.1.7.PhpMyAdmin

PhpMyAdmin foi criado por Tobias Ratschiller2 e desenvolvido por ele até 2000. É

dirigido atualmente pelo phpMyAdmin devel team, em que administram: Marc Delisle,

Loïc Chapeaux e Olivier Mueller. O endereço da ferramenta na Internet é:

<http://www.phpmyadmin.net/> [7].

PhpMyAdmin pode gerenciar um servidor MySQL inteiro, mas também um único

banco de dados. Para utilizar o phpMyAdmin, será preciso criar um usuário no MySQL,

que pode ler e gravar o banco de dados desejado. A configuração do MySQL fica a cargo

do usuário.

PhpMyAdmin é distribuído sob a licença GNU GPL.

2 [email protected]

9

Funcionalidades

Conforme [7], esta ferramenta permite :

?? criar e excluir banco de dados;

?? criar, copiar, excluir e alterar tabelas;

?? adicionar, editar e excluir campos;

?? executar qualquer consulta SQL, e até consultas em seqüência;

?? gerenciar chaves primárias e estrangeiras em campos;

?? carregar arquivos de texto em tabelas;

?? criar e ler tabelas temporárias;

?? administrar múltiplos servidores e também um único banco de dados;

?? verificar integridade referencial;

?? criar pesquisas complexas, automaticamente conectando as tabelas desejadas;

?? criar gráficos em PDF da estrutura do banco de dados;

?? comunicar em mais de 41 linguagens diferentes.

Pré-requisitos

?? PHP versão 3 ou 4. phpMyAdmin usa largamente a função php “str_replace()”

que foi adicionada na versão 3.0.6, mas tinha algumas falhas até a versão 3.0.8.

Então, phpMyAdmin não deve funcionar corretamente sobre uma versão 3 inferior à

3.0.8. Php precisa ter suporte ao banco de dados MySQL;

?? banco de dados MySQL (versão 4.1.0 ou inferior);

?? um aplicativo para navegar na internet (browser).

2.1.8.phpPgAdmin

PhpPgAdmin é uma ferramenta para administrar banco de dados PostgreSQL. Pode-

se usar para criar e manter múltiplos banco de dados e também múltiplos servidores. Dan

Wilson foi o criador. A página principal da ferramenta é:

10

<http://phppgadmin.sourceforge.net/?page=home>. PhpPgAdmin é distribuído sob a

licença GNU GPL [8].

O demonstrador tem endereço na Internet em:

<http://phppgadmin.kattare.com/phpPgAdmin>. Entre com o nome do usuário (username) :

phppgadmin, e senha (password) : webdb.

Funcionalidades

De acordo com [8], o phpPgAdmin pode :

?? criar e excluir banco de dados;

?? criar, copiar, excluir e alterar tabelas, visões, seqüências, funções, indices e

triggers;

?? adicionar e editar campos;

?? executar qualquer consulta SQL, e também consultas em seqüências;

?? gerenciar chaves primárias e estrangeiras;

?? criar e ler tabelas temporárias;

?? administrar um único banco de dados;

?? administrar múltiplos servidores;

?? administrar usuários e grupos para banco de dados PostgreSQL.

Pré-requisitos

?? PHP versão 3. Sugere-se versão 4;

?? PostgreSQL versão 7 ou superior;

?? Servidor web habilitado a PHP;

?? Navegador de internet que suporta frames e Javascript;

11

2.1.9.TableEditoR

TableEditoR é uma ferramenta para administração remota de banco de dados

MSAccess, DSN e SQL Server 2000, escrita em ASP. Está sendo distribuído em versão

beta, porém é uma ferramenta funcional para muitas das necessidades dos administradores

de banco de dados.

Está sendo administrada e desenvolvida por uma comunidade (open source)

específica para esta ferramenta. Os maiores contribuintes foram Rami Kattan3 e Jeff

Wilkinson4 [9].

A versão analisada é 0.81. A ferramenta é distribuída gratuitamente, por constituir-

se de um projeto open source.

Funcionalidades

TableEditoR pode [9] :

?? realizar e armazenar pesquisas SQL;

?? adicionar, editar e remover registros;

?? acessar, pesquisar, criar, editar e remover tabelas;

?? exportar para XML;

?? exportar para o Excel;

?? criar e remover stored procedures.

Pré-requisitos

Servidor para Internet configurado.

3 http://www.kattanweb.com/webdev/ 4 [email protected]

12

2.1.10.Zaval Database Front-end

Zaval Database Front-end promove acesso a qualquer banco de dados que tenha

drivers JDBC, através de uma interface baseada em páginas de Internet, para realizar uma

série de tarefas para gerenciamento de banco de dados. Na verdade, é mais como uma

ferramenta de linha de comando, mas a saída é mais natural e fácil de usar. É muito

customizável também, pois suporta múltiplas linguagens, autenticação via https. Possibilita

qualquer execução de consulta SQL, e é limitada somente pelo SQL do banco de dados

usado [10].

Esta ferramenta pode ser usada como um componente de administração remota de

banco de dados, em quase todos os projetos na Internet baseados em java.

Esta ferramenta é do Zaval CE Group5. A página principal da ferramenta é:

<http://www.zaval.org/products/db-front-end/>. Esta ferramenta é distribuída sob a licença

GNU GPL.

Funcionalidade

Executa de todo tipo de pesquisa SQL.

Pré-requisitos

Servidor para Internet (Web Server) JSP 1.2 instalado.

2.1.11.Comparação Entre As Ferramentas Pesquisadas

Segue-se duas tabelas comparativas entre os administradores remotos de banco de

dados. A tabela abaixo é sobre as funcionalidades das ferramentas. Estão listados no início

os itens de funcionalidade mais comuns e mais ao final encontra-se alguns itens específicos.

5 [email protected]

13

Consultas ao banco

de dados por SQL X X X X X X X X X X

Administra

múltiplos bancos de

dados

X X X X X X X X

Cria, remove banco

de dados (sem SQL)X X X X X

Cria, remove, edita

tabela (sem SQL) X X X X X X X X X

Cria e remove

visões (sem SQL) X X X

Cria stored

procedures (sem

SQL)

X X X X

Cria índices (sem

SQL) X X X X X X X

Cria triggers (sem

SQL) X X X

Configura chave

primária X X X X X X X X X

Configura chave

estrangeira X X X X X X

Faz importação de

dados X X

Faz exportação de

dados X X X X

Cria consultas a

tabelas sem SQL X X X X X X X

Aplicativos

Itens de funcionalidade

14

Comunica em mais

de uma linguagem X X

Administra usuários X X X X X X X X X

A tabela a seguir concerne às características dos administradores remotos de base de

dados. Os seguintes itens foram listados: sistema operacional para instalação, linguagem

em que foi implementado e os bancos de dados que pode administrar.

Ferramenta sistema operacional

(instalação)

Linguagem em que foi

implementado

Banco de dados que

pode administrar

PhpMyAdmin - php mySQL

PhpPgAdmin - php PostgreSQL

Zaval Database Front-

End

- Jsp qualquer JDBC

FutureSQL Linux Perl MySQL

My Little Admin Windows Asp SQL Server

TableEditoR Windows Asp Microsoft Access

DSN

SQL Server

1 Click DB Pro Windows Asp Microsoft Access

SQL Server

Oracle

MySQL

MySQL Data Manager - Perl MySQL

MySQL WebClient Windows php mySQL

IbaseAdmin Linux php Interbase

Tabela 1 – comparativo de funcionalidades entre os administradores remotos de base de dados.

Tabela 2 – comparativo de características entre os administradores remotos de base de dados.

15

2.2.Outros Aplicativos

2.2.1.TeamWave

É um ambiente para trabalho colaborativo. Neste ambiente pode haver uma ou mais

salas, podendo, os usuários, trafegar entre elas. Tem algumas ferramentas para uso dos

usuários: caderno de endereços, caixa virtual para armazenar idéias, mapa conceitual, banco

de dados, elemento de porta para sair da sala, mantenedor de arquivo, visualizador de

arquivos, imagem para quadro branco, assistente para organizar reuniões, quadro de

mensagens, quadro para recados (PostIt), assistente para organizar uma lista de atividades,

mantenedor de endereço de página da Internet, assistente para votação de idéias e um

navegador de páginas da Internet. Para cada ferramenta que é utilizada, há algumas funções

disponíveis: remover, ver versões salvas, ver permissões, salvar versão, copiar para outra

sala, copiar para outro servidor e exportar para arquivo texto.

No fundo do aplicativo há um quadro branco para desenho e escrita, que

corresponde a uma sala. Há também um espaço para conversa via texto, entre os presentes

na sala.

A ferramenta de banco de dados, cria uma tabela a cada vez que seleciona-se a

ferramenta. Para cada tabela pode-se editar os campos para inserir dados. Há três tipos

possíveis para os campos: Text, Choice e Boolean.

O tipo Text corresponde a um tipo em que se permite qualquer texto. Com o tipo

Choice, deve-se digitar os valores possíveis para seleção. Com este tipo, o campo somente

receberá um dos valores que foram previamente informados. Já o tipo Boolean, permitirá a

seleção dos valores verdadeiro ou falso.

Após a configuração dos campos, pode-se adicionar os dados nas caixas localizadas

abaixo da tabela.

Mudando a permissão de uma tabela para uso de toda a sala, os dados armazenados

poderão ser compartilhados e alterados entre todos os usuários presentes na sala.

Entretanto, pode-se negar a permissão de uso para outros usuários.

As tabelas são fixas na sala em que foram criadas. Portanto, se o usuário sair da

sala, ele não verá mais a tabela, mas ao retornar ela reaparece.

O aplicativo pode ser encontrado em: <http://www.teamwave.com/>.

16

3.O Sistema AgroREDE

3.1.Estrutura do Sistema

Um grupo no sistema AgroREDE, é um ponto de encontro de pessoas que tem pelo

menos um objetivo em comum. Nele estarão disponíveis meios para que possa haver a

interação entre seus membros.

Os grupos são construídos e associados entre si de acordo com uma estrutura

hierárquica. Grupos mais genéricos, que abrangem uma quantidade maior de assuntos e

pessoas terão grupos mais específicos e menos populosos. Desta maneira, podemos

imaginar um conjunto de grupos como é demonstrado na figura abaixo.

Grupo nível Zero

Grupo nível Um

Grupo nível Dois

Grupo nível Três

Grupo nível n

Figura 1 – exemplo de conjunto de grupos do sistema AgroREDE [12].

17

Quanto à administração de um grupo, dependerá dos membros do grupo a decisão

de quais pessoas terão a função de administrar. É possível também fazer com que todas as

pessoas do grupo tenham todas as permissões, tornando-os todos administradores.

Na criação de um grupo é preciso definir o nome do grupo e quais serão os

administradores.

Na configuração de um grupo será necessário definir os papéis dos participantes.

“Um papel é um subconjunto de permissões selecionada de uma lista de prerrogativas pré-

existentes” [12].

Algumas das possíveis permissões, conforme [12], são as seguintes:

- permissão para administrar : criar e excluir grupos filhos, definir papéis, incluir

e excluir membros;

- permissão para interagir : ter acesso aos recursos do sistema podendo interagir

com pessoas e com o ambiente;

- permissão para observar : ter acesso aos recursos do sistema mas não podendo

interagir com pessoas e com o ambiente.

Cada participante do sistema AgroREDE tem a sua disposição um espaço pessoal,

onde ele pode se apresentar, informando seu nome, endereço, fotos, motivação pessoal,

entre outras informações. Neste espaço ele encontra também os grupos a que pertence, seus

papéis nestes grupos, seu histórico de participação nos grupos, entre outros [12].

O sistema AgroREDE inclui uma série de ferramentas associada aos grupos, que

visam facilitar e incrementar a participação dos usuários no sistema. Estas ferramentas

podem não ser obrigatoriamente utilizadas por todos os grupos. Há ferramentas para troca

de informações, armazenamento de dados, agendamento de atividades, dentre outras.

As ferramentas, conforme [12], são as seguintes:

- Sala de Café : constitui-se de uma sala para conversação no estilo das salas de

chat.

- E-mail : é uma ferramenta que permite a troca de mensagens entre os

participantes de um grupo.

18

- Lista de Discussão : é um meio para troca de informações via e-mail sobre um

determinado assunto.

- Mural : consiste de uma ferramenta para dispor informações em forma de um

quadro, para serem lidas por outros membros.

- Tabelas de dados : consistem de tabelas com uma determinada estrutura de

colunas, para inserção de informações.

- Planilhas de Cálculo : ferramenta que permite realizar cálculos sobre um

conjunto de dados, como média, soma, máximo, ordenação, etc.

- Agenda : é um meio para inserir informações sobre as atividades do grupo na

hora e no dia em que estão agendadas.

- Biblioteca de Documentos : é um local para guardar documentos pertencentes ao

grupo. Os documentos podem ser organizados em uma estrutura hierárquica de

pastas.

3.2.Plataforma de Implementação

Para implementação deste sistema estabeleceu-se uma plataforma, consistindo de

linguagens de programação, servidor de HTTP e banco de dados, que pudessem ser

utilizada sem custos financeiros.

As linguagens de programação escolhidas foram JSP e Java, as quais proporcionam

portabilidade de código fonte, são linguagens atuais e muito usadas mundialmente. JSP ou

Java Server Pages, é uma linguagem do tipo script, que é inserida sobre páginas de

hipertexto (Internet) escritas em HTML (ou sobre suas variantes). O JSP é executado

quando a página em que ele está inserido é carregada. Através dos seus scripts6 contendo

estruturas de controle e repetição, ele permite alteração do código HTML final. Com o

Java, foram criadas classes que são instanciadas para representação das entidades do

sistema. Ao entrar na página principal do sistema, é executado o código JSP existente nela,

que por sua vez acionará a criação de classes Java.

6 trechos de código fonte

19

O servidor de HTTP usado foi o Apache. Este servidor proporciona o acesso às

páginas do sistema através da Internet.

O banco de dados escolhido foi o mySQL, o qual é muito usado em todo o mundo

pois tem vantagens como: velocidade de execução de consultas e código fonte aberto a

todos, que o torna gratuito.

20

4.Ferramenta para administração remota e colaborativa de tabelas de dados

Esta ferramenta foi idealizada para proporcionar a construção e edição de tabelas de

dados. Foi baseada na condição de ser simples de usar, pois o público alvo do projeto, em

sua maioria, não tem experiência de uso com computadores e com sistemas de telemática.

4.1.Justificativa

O convívio com grupos que são parceiros do projeto AgroREDE, e portanto

potenciais usuários do sistema, mostra que estes grupos têm conjuntos de informações a

controlar. Exemplos destes tipos de informações são: lista de trabalhadores da instituição

ou centro que pertence, lista de tarefas, objetos, animais, compras, vendas, etc.

Percebe-se então a necessidade de uma ferramenta que possibilite,

colaborativamente, a criação, edição e consulta destas informações.

4.2.Objetivos

?? Permitir a criação, alteração e remoção das colunas de tabelas de dados.

?? Permitir a inserção, alteração e remoção de linhas em tabelas.

?? Construir uma interface simples de entender e usar.

4.3.Estrutura da Ferramenta

4.3.1.Diagrama das Etapas da Ferramenta

No uso da ferramenta, pode-se descrever uma série de etapas que ocorrem em

seqüência. Observando num contexto geral estas etapas, é possível construir um diagrama

das etapas da ferramenta (figura 2).

21

O estado inicial é representado pela lista das tabelas, entretanto, para chegar até esta

página é preciso percorrer outras etapas no sistema AgroREDE, as quais não cabem serem

descritas por esta monografia.

A transição de etapas ocorre quando o usuário interage com o sistema, realizando

uma ação de modificação ou consulta dos dados.

Figura 2 – diagrama das etapas da ferramenta.

4.3.2.Tabelas

Para cada tabela do sistema AgroREDE há uma tabela correspondente no banco de

dados mySQL.

Uma tabela é estruturada em colunas e linhas. As colunas representam

características do conjunto de informações armazenado. Cada coluna tem uma

característica especial que consiste no tipo de informação que ela permite armazenar. As

linhas são unidades de informação em uma tabela. Nelas poderão ser inseridas informações

de acordo com cada coluna da tabela.

Lista de tabelas

Editando uma tabela

Visualizando uma tabela

Remover tabela

Ver tabela

Editar tabela

Editar tabela Ver tabela

Ver outras linhas da tabela

Adicionar uma coluna Remover uma coluna

Incluir uma linha

Excluir uma linha

Criar tabela

22

4.3.3.Tipos De Dados

Há um conjunto extenso de tipos de dados disponíveis nos sistemas de banco de

dados como mySQL, Interbase, Oracle, Access, PostgreSQL, etc. Destes tipos apenas uma

parte pode ser disponibilizada no sistema AgroREDE. Os tipos escolhidos vêm de encontro

com os conjuntos de informações que os usuários do projeto AgroREDE detêm.

Os tipos são: número, texto, linha de texto, lista de opções, moeda, sim/não e data.

4.3.4.Armazenamento De Dados No MySQL

Foram criadas no banco de dados mySQL duas tabelas de controle: Tabela e

TabelaCampos. A tabela de nome “Tabela” armazena características de todas as tabelas

criadas pela ferramenta. Guarda informações como: código do grupo, nome interno, nome

externo, descrição, data de criação e código da pessoa criadora. A tabela de nome

“TabelaCampos” mantém informações sobre as colunas das tabelas criadas pela ferramenta.

Guarda informações como: código da tabela, nome externo do campo, nome interno do

campo, tipo do campo, valores de enumeração, ordem de apresentação, tamanho e se

permite valores repetidos.

Cada tabela criada na ferramenta de administração de tabelas tem uma

correspondente no banco de dados. Estas recebem o nome de “TabelaUsuarioX”, em que o

X é um número que é fornecido de acordo com a ordem de criação da tabela. Nestas tabelas

há sempre um campo chamado “cod”, que consiste na chave primária da tabela, e há um

campo para cada coluna da tabela.

23

4.4.Como Usar A Ferramenta

Ao abrir a página inicial do sistema AgroREDE, o usuário necessita digitar o e-mail

e a senha para ter acesso aos serviços.

Com a confirmação de e-mail e senha corretos, uma nova página é aberta. No lado

direito desta página há acesso as três seções do sistema: administração, área pessoal e

serviços. Clicando sobre o item de serviço Tabela, abre à direita uma página com a lista de

tabelas criadas.

Figura 3 – página inicial do sistema AgroREDE

24

Com a lista de tabelas, é possível acessar uma tabela clicando sobre o nome dela ou

sobre o botão de título “Ver”. Pode-se alterar e remover clicando sobre os botões

correspondentes. Nesta página é possível criar uma nova tabela, clicando sobre o botão de

título “Criar Tabela”. Ao clicar sobre este botão, abre uma página (figura 5) contendo um

campo para nome e outro para a descrição da tabela.

Figura 4 – lista de tabelas criadas

Figura 5 – criando uma nova tabela 25

Clicando sobre o botão de título “Criar Tabela”, abre uma página para adição de

colunas na tabela (figura 6), que na realidade é a página para alterar uma tabela.

Figura 6 – alterando nome, descrição e colunas de uma tabela.

Na imagem acima, a tabela de nome “Máquinas do LSC” contém 3 colunas num

formato de tabela. As linhas são precedidas pelas características das colunas : nome, tipo,

valores, tamanho e permite valor repetido. A característica “valores” serve somente para

colunas do tipo “Lista de Opções” e a característica “tamanho”, para colunas de tipo “Linha

de Texto”.

Sobre cada coluna há duas setas em sentidos opostos. Servem para alterar a ordem

de apresentação das colunas, quando na visualização dos dados da tabela.

Abaixo de cada coluna há um botão para remover a coluna.

Todas as características das colunas podem ser alteradas, porém a alteração do tipo

(e ainda outros) requere uma validação para impedir a inconsistência dos dados. Esta

validação não foi implementada e está listada como trabalho futuro.

26

Para inserir uma nova coluna (figura 7), deve-se clicar no botão de título “Inserir

Coluna”.

Figura 7 – nova coluna foi inserida.

No botão de título “Ver Conteúdo” (figura 7), ter-se-á acesso aos dados da tabela.

Na imagem abaixo é mostrada a página de acesso aos dados de uma tabela (figura

8). No botão de título “Alterar Colunas”, ter-se-á acesso a alteração da estrutura da tabela.

Vê-se que cada coluna, como tem um tipo diferente do outro, tem amostragem visual

também diferente. A coluna “Nome da máquina”, como tem tipo “Linha de Texto”, é

amostrada em uma caixa de texto simples. A coluna “Data de Aquisição”, com o tipo

“Data”, possui três caixas de texto com divisórias, restringindo o formato dos dados. Já a

coluna “Origem” tem tipo “Lista de Opções”, então é mostrada como uma caixa de seleção.

Abaixo dos dados da tabela é informado qual o período das linhas a serem

amostradas. As setas, também abaixo, permite o acesso a outras linhas, já que o limite por

página é de dez linhas.

27

Figura 8 – visualizando dados de uma tabela.

Clicando no botão de título “Inserir nova linha”, abre uma nova linha abaixo da

última (figura 9).

Figura 9 – visualizando dados de uma tabela. Nova linha foi inserida.

28

Para salvar as alterações realizadas, clica-se no botão “Salvar alterações”. Os dados

amostrados na página são salvos no banco de dados e a página é atualizada no navegador.

Ao lado direito de cada linha de dados há um botão cujo título é “remover”, que tem

a função de remover a linha associada.

29

5.Trabalhos futuros

Há uma série de funcionalidades que poderão ser adicionadas à ferramenta, a saber:

?? Filtro de dados : esta funcionalidade deve fazer uma pesquisa em uma tabela de

dados, retornando um conjunto que reponde verdadeiramente à uma ou mais

condições imposta pelo filtro. Ex.: Pessoas.idade >= 21. Isto é: esta condição

restringe o conjunto de dados de retorno, para que sejam buscadas somente as

pessoas com idade maior ou igual a 21.

?? Relatório : monta um documento esteticamente preparado para impressão, a

partir de uma tabela ou de um filtro.

?? Adição de novos tipos de dados : os tipos existentes tendem a não atender a todas

as necessidades de armazenamento dos usuários. A seguir estão descritos alguns

tipos de dados para serem implementados no futuro. Para cada tipo, deve-se usar

uma interface específica para características do tipo de dados.

??números reais : possibilitando armazenar números fracionados, como

valores de distâncias, pesos, larguras, tempo (em segundos, minutos ou

horas), temperatura, umidade relativa, pressão atmosférica, entre outros;

??imagem : arquivos de imagem como Jpeg, Gif e Bmp. Por exemplo:

imagens de animais, objetos, pessoas, logos, etc;

??hora : deve guardar horas e minutos. Útil para guardar a hora de uma

reunião, da chegada de aeronaves, de alteração climática, do nascimento de

animais, etc;

??arquivo : possibilitando o armazenamento de qualquer arquivo, como:

relatórios, artigos, planilhas de cálculo, documentos descritivos sobre

técnicas, entre outros.

?? Ordenação ascendente e descendente de uma tabela : a ordenação de uma tabela

consiste na organização das linhas de tabelas conforme uma ordem seqüencial

ditada por um ou mais colunas. Com esta funcionalidade, o usuário poderá mais

facilmente localizar uma informação desejada.

30

?? Importação de dados : para que o usuário não tenha trabalho desnecessário para

inserir as informações que já detém, vê-se essencial uma função de importação de

dados de documentos de texto e planilhas de cálculo.

?? Exportação de dados : uma outra funcionalidade importante é a de exportação de

dados das tabelas para documentos de texto e planilhas de cálculo. Pois é comum a

necessidade da troca de documentos e planilhas de cálculo com outras pessoas e

entidades.

?? Função de cópia de dados de uma coluna para outra : a alteração de tipos das

colunas não é possível, pois poderia causar uma inconsistência de dados, caso a

tabela contivesse dados. Por exemplo: se uma coluna tem tipo texto e é alterada para

número, os textos existentes não poderão ser convertidos para número, e então os

dados serão perdidos. Portanto, uma função de cópia de dados de uma coluna para

outra é necessária para possibilitar que o usuário crie uma nova coluna com o tipo

de dados que gostaria de alterar, e copie os dados da coluna antiga para a nova.

?? Análise ergonomica da interface : consistiria de um trabalho em que se testasse a

ferramenta com usuários reais ou potenciais em laboratório, verificando a

ergonomia da ferramenta. De acordo com a reação dos usuários com o

posicionamento dos elementos visuais nas interfaces, a seqüência de interfaces e os

elementos textuais, seria diagnosticado os problemas que atrapalhariam ou

confundiriam os usuários durante o uso da ferramenta.

31

GLOSSÁRIO

Aplicativos open source : aplicativos de código fonte aberto, aplicativos que são livres e

passíveis de modificação.

Cookie : arquivo com informações de acesso à Internet.

Ftp : protocolo para transferencia de arquivos através da Internet.

GNU GPL : general public licence - é uma licença pública que permite o uso, distribuição e

modificação de maneira gratuita.

Html : Hipertext Markup Language - linguagem para páginas de Internet.

Http (HyperText Transfer Protocol) : protocolo de transferência de hipertexto.

Https : é a utilização do protocolo HTTP (HyperText Transfer Protocol) em conjunto com o

protocolo SSL (Secure Sockets Layer), que é um protocolo proposto por um grupo liderado

pela Netscape Communications, pela Verisign e pela Sun.

Interbase : sistema de gerência de banco de dados.

MS Enterprise Manager : aplicativo para administração de banco de dados SQL Server.

MS Internet Explorer : navegador de páginas da Internet.

MySQL : sistema de gerencia de banco de dados.

Perl : linguagem de programação.

Php : linguagem de programação para a Internet.

Scripts : são trechos de códigos em uma linguagem imbutidos em código de outra

linguagem (principal).

Sítio de Internet : local na Internet, endereço em que se localiza um conjunto de páginas da

Internet (www).

Stored procedures : conjunto de instruções Transact-SQL que são executadas dentro do

banco de dados.

32

REFERÊNCIAS

[1] AccessHelp.net CS. 1 Click DB Pro. Disponível em: <http://1clickdb.com/> Acesso

em: 20 dezembro de 2002.

[2] Brown, P. FutureSQL – The Rad Web Database Tool. Disponível em:

<http://worldcommunity.com/opensource/futuresql/> Acesso em: 14 dezembro 2002.

[3] Olivier. IbaseAdmin. Disponível em: <http://pkedu.fbt.eitn.wau.nl/ibaseadmin/>

Acesso em: 3 janeiro 2003.

[4] Chrebor, E. My Little Admin – SQL Server version.

Disponível em: <http://www.mylittletools.net/scripts/en/mla_sql/default.asp> Acesso

em: 14 dezembro 2002.

[5] Edatanew.com. MySQL Data Manager. Disponível em:

<http://www.edatanew.com/> Acesso em: 3 janeiro 2003.

[6] [email protected]. MySQL WebClient. Disponível em:

<http://www.vidwest.net/webclient/> Acesso em: 3 janeiro 2003.

[7] phpMyAdmin devel team. The phpMyAdmin project. Disponível em:

<http://www.phpmyadmin.net/documentation/> Acesso em: 12 dezembro 2002.

[8] Winson, D. phpPgAdmin -- Web-bases PostgreSQL Administration. Disponível

em: <http://sourceforge.net/projects/phppgadmin/> Acesso em: 12 dezembro 2002.

[9] Kattan, Rami; Wilkinson, Jeff. TableEditoR – the legendary database tool.

Disponível em: <http://www.2enetworx.com/dev/projects/tableeditor.asp> Acesso em:

20 dezembro de 2002.

[10] Zaval CE Group. Zaval Database Front-end. Disponível em:

<http://www.zaval.org/products/db-front-end/> Acesso em: 14 dezembro 2002.

[11] Ramos, E. M. F. Versao final PSPPG.doc. BSCW do Laboratório de Sistemas de

Conhecimento - UFSC. Florianópolis, 22 janeiro 2002. 176 kbytes. Microsoft Word

97.

[12] Ramos, Prof. Dra. Edla Maria Faust. Descrição o preliminar do ambAR - ambiente

AgroREDE.doc. BSCW do Laboratório de Sistemas de Conhecimento - UFSC.

Florianópolis, 22 janeiro 2002. 56 kbytes. Microsoft Word 97.

33

ANEXOS

ANEXO 1 - ARTIGO

Ferramenta para Administração Remota e Colaborativa de Tabelas da

Agrorede

Ricardo José Lo Feudo Ferreira [email protected]

Universidade Federal de Santa Catarina - UFSC

Curso de Bacharelado em Ciências da Computação - CCO Cx.P. 476 Fone: +55 048 331-9739 - Fax: +55 048 331-9770

http://www.inf.ufsc.br/ CEP: 88040-970 Florianópolis-SC

Resumo

Neste artigo é descrita uma ferramenta para administrar remota e colaborativamente tabelas de dados. Esta ferramenta tem como público alvo usuários leigos, de forma a apresentar uma interface simples e compreensível, porém robusta e expansível em sua funcionalidade, dado o conhecimento do usuário.

Está inserida no sistema AgroREDE, que visa a auxiliar e fomentar o processo de articulação dos atores rurais do meio rural familiar de Santa Catarina.

É apresentado, também, um quadro comparativo entre diferentes administradores remotos de banco de dados, visando uma compreensão geral sobre as funcionalidades apresentadas nestes aplicativos. Palavras-chave : Tabelas de Dados, Agrorede, Agricultura Familiar

Abstract

In the present article a tool to remotely and cooperatively manage data tables is described. This tool has as target group lay users, therefore, it has a simple and understandable interface. However it’s robust and expandable in functionality.

It is inserted in the AgroREDE system, which aims to assist and to foment the process of joint of the agricultural familiar actors of Santa Catarina.

It is presented, also, a comparative picture between different database remote administration tools, aiming at a general understanding over the functionalities presented in these tools. Key-words : Data Tables, Agrorede, Familiar Agriculture

34

1.Introdução

No meio rural de Santa Catarina, há uma quantidade de famílias que desenvolvem uma produção pequena, para consumo próprio e comercialização de todo o excedente produzido nas proximidades.

Algumas destas famílias desenvolvem produtos que tem durabilidade a ponto de poderem ser vendidos em lugares mais longínquos. Para tal, um contato direto com o consumidor tende a melhorar a renda do agricultor, na medida em que ele pode negociar seu preço diretamente com o consumidor final.

O projeto AgroREDE tem como objetivo principal a implantação e estruturação de uma rede de serviços de telemática de maneira a proporcionar uma maior integração entre pessoas e instituições ligados à agricultura de Santa Catarina. Também visa agir na educação sobre o uso efetivo desta rede.

Este objetivo implica, conforme [11] : - implantar em núcleos comunitários, centro fornecedores de serviços de

telemática; - alfabetizar tecnologicamente pessoas do meio rural; - desenvolver ou adaptar métodos pedagógicos para a alfabetização tecnológica; - desenvolver ou adaptar tecnologia da informação ao perfil do público alvo; - avaliar continuamente o impacto dos centros ao público alvo.

O sistema AgroREDE é um sistema computacional remoto e colaborativo, que

possibilita a interação entre seus usuários através de ferramentas que possibilitam a troca e o armazenamento de informações. O público alvo do sistema são as pessoas ligadas à agricultura de Santa Catarina, as quais são leigas com relação à informática (este sistema é descrito no capítulo 2).

A ferramenta para administração de tabelas é uma das ferramentas do sistema AgroREDE. Esta ferramenta proporciona o armazenamento colaborativo de dados, porque permite a mais de um usuário editar uma ou mais tabelas de dados. As tabelas podem ser alteradas em sua estrutura, assim como, em seu conteúdo. Nas tabelas de dados é possível inserir informações como funcionários de uma empresa, relação de atividades de um grupo, ata de reunião, mobília de residência ou escritório, etc. Esta ferramenta é explicada no capítulo 3. 2.A Estrutura do Sistema AgroREDE

Um grupo no sistema AgroREDE, é um ponto de encontro de pessoas que tem pelo

menos um objetivo em comum. Nele estarão disponíveis meios para que possa haver a interação entre seus membros.

Os grupos são construídos e associados entre si de acordo com uma estrutura hierárquica. Grupos mais genéricos, que abrangem uma quantidade maior de assuntos e pessoas terão grupos mais específicos e menos populosos. Desta maneira, podemos imaginar um conjunto de grupos como é demonstrado na figura abaixo.

Quanto à administração de um grupo, dependerá dos membros do grupo a decisão de quais pessoas terão a função de administrar. É possível também fazer com que todas as pessoas do grupo tenham todas as permissões, tornando-os todos administradores.

35

Na criação de um grupo é preciso definir o nome do grupo e quais serão os administradores.

Na configuração de um grupo será necessário definir os papéis dos participantes. “Um papel é um subconjunto de permissões selecionada de uma lista de prerrogativas pré-existentes” [12].

Algumas das possíveis permissões, conforme [12], são as seguintes: - permissão para administrar : criar e excluir grupos filhos, definir papéis, incluir

e excluir membros; - permissão para interagir : ter acesso aos recursos do sistema podendo interagir

com pessoas e com o ambiente; - permissão para observar : ter acesso aos recursos do sistema mas não podendo

interagir com pessoas e com o ambiente. Cada participante do sistema AgroREDE tem a sua disposição um espaço pessoal,

onde ele pode se apresentar, informando seu nome, endereço, fotos, motivação pessoal, entre outras informações. Neste espaço ele encontra também os grupos a que pertence, seus papéis nestes grupos, seu histórico de participação nos grupos, entre outros [12].

O sistema AgroREDE inclui uma série de ferramentas associada aos grupos, que visam facilitar e incrementar a participação dos usuários no sistema. Estas ferramentas podem não ser obrigatoriamente utilizadas por todos os grupos. Há ferramentas para troca de informações, armazenamento de dados, agendamento de atividades, dentre outras.

As ferramentas, conforme [12], são as seguintes: - Sala de Café : constitui-se de uma sala para conversação no estilo das salas de

chat. - E-mail : é uma ferramenta que permite a troca de mensagens entre os

participantes de um grupo. - Lista de Discussão : é um meio para troca de informações via e-mail sobre um

determinado assunto. - Mural : consiste de uma ferramenta para dispor informações em forma de um

quadro, para serem lidas por outros membros. - Tabelas de dados : consistem de tabelas com uma determinada estrutura de

colunas, para inserção de informações. - Planilhas de Cálculo : ferramenta que permite realizar cálculos sobre um

conjunto de dados, como média, soma, máximo, ordenação, etc. - Agenda : é um meio para inserir informações sobre as atividades do grupo na

hora e no dia em que estão agendadas. - Biblioteca de Documentos : é um local para guardar documentos pertencentes ao

grupo. Os documentos podem ser organizados em uma estrutura hierárquica de pastas.

3.Ferramenta para administração remota e colaborativa de tabelas de dados

Esta ferramenta foi idealizada para proporcionar a construção e edição de tabelas de dados. Foi baseada na condição de ser simples de usar, pois o público alvo do projeto, em sua maioria, não tem experiência de uso com computadores e com sistemas de telemática.

36

3.1.Justificativa O convívio com grupos que são parceiros do projeto AgroREDE, e portanto

potenciais usuários do sistema, mostra que estes grupos têm conjuntos de informações a controlar. Exemplos destes tipos de informações são: lista de trabalhadores da instituição ou centro que pertence, lista de tarefas, objetos, animais, compras, vendas, etc.

Percebe-se então a necessidade de uma ferramenta que possibilite, colaborativamente, a criação, edição e consulta destas informações.

3.2.Objetivos ?? Permitir a criação, alteração e remoção das colunas de tabelas de dados. ?? Permitir a inserção, alteração e remoção de linhas em tabelas. ?? Construir uma interface simples de entender e usar.

3.3.Estrutura da Ferramenta

3.3.1.Diagrama das Etapas da Ferramenta No uso da ferramenta, pode-se descrever uma série de etapas que ocorrem em

seqüência. Observando num contexto geral estas etapas, é possível construir um diagrama das etapas da ferramenta (figura 1).

O estado inicial é representado pela lista das tabelas, entretanto, para chegar até esta página é preciso percorrer outras etapas no sistema AgroREDE, as quais não cabem serem descritas por esta monografia.

A transição de etapas ocorre quando o usuário interage com o sistema, realizando uma ação de modificação ou consulta dos dados.

37

Figura 1 – diagrama das etapas da ferramenta.

3.3.2.Tabelas

Para cada tabela do sistema AgroREDE há uma tabela correspondente no banco de dados mySQL.

Uma tabela é estruturada em colunas e linhas. As colunas representam características do conjunto de informações armazenado. Cada coluna tem uma característica especial que consiste no tipo de informação que ela permite armazenar. As linhas são unidades de informação em uma tabela. Nelas poderão ser inseridas informações de acordo com cada coluna da tabela.

3.3.3.Os Tipos de Dados

Há um conjunto extenso de tipos de dados disponíveis nos sistemas de banco de dados como mySQL, Interbase, Oracle, Access, PostgreSQL, etc. Destes tipos apenas uma parte pode ser disponibilizada no sistema AgroREDE. Os tipos escolhidos vêm de encontro com os conjuntos de informações que os usuários do projeto AgroREDE detêm.

Os tipos são: número, texto, linha de texto, lista de opções, moeda, sim/não e data.

Lista de tabelas

Editando uma tabela

Visualizando uma tabela

Remover tabela

Ver tabela

Editar tabela

Editar tabela

Ver tabela

Ver outras linhas da tabela

Adicionar uma coluna Remover uma coluna

Incluir uma linha

Excluir uma linha

Criar tabela

38

3.3.4.Armazenamento de Dados no MySQL

Foram criadas no banco de dados mySQL duas tabelas de controle: Tabela e TabelaCampos. A tabela de nome “Tabela” armazena características de todas as tabelas criadas pela ferramenta. Guarda informações como: código do grupo, nome interno, nome externo, descrição, data de criação e código da pessoa criadora. A tabela de nome “TabelaCampos” mantém informações sobre as colunas das tabelas criadas pela ferramenta. Guarda informações como: código da tabela, nome externo do campo, nome interno do campo, tipo do campo, valores de enumeração, ordem de apresentação, tamanho e se permite valores repetidos.

Cada tabela criada na ferramenta de administração de tabelas tem uma correspondente no banco de dados. Estas recebem o nome de “TabelaUsuarioX”, em que o X é um número que é fornecido de acordo com a ordem de criação da tabela. Nestas tabelas há sempre um campo chamado “cod”, que consiste na chave primária da tabela, e há um campo para cada coluna da tabela.

39

ANEXO 2 – CÓDIGO FONTE Classe ModuloTabela.java package org.agrorede; import java.sql.*; import java.util.ArrayList; import java.util.Vector; public class ModuloTabela { private ModuloMembroGrupo modulo; public void setModuloMembroGrupo( ModuloMembroGrupo modulo ) { this.modulo = modulo; } public ModuloTabela() throws ExcecaoAgrorede { } protected void finalize() throws ExcecaoAgrorede{ modulo = null; } public Connection getConexao(){ return modulo.getConexao(); } private Pessoa getPessoa(){ return modulo.getPessoa(); } private Grupo getGrupo(){ return modulo.getGrupo(); } public boolean temPermissaoPara(String verbo, String objeto) { return modulo.temPermissaoPara(verbo, objeto); } // -------------------------------------------------------------------------------------------- public int criaTabela(String nomeExternoTabela, String descricao, int codigoGrupo) throws ExcecaoAgrorede { /* Cria uma tabela */ if (!this.temPermissaoPara("Criar","Tabela")) { throw new ExcecaoAgrorede("Sem Permissão para Criar Tabela"); } try { Tabela tab = new Tabela(); tab.setNomeExterno( nomeExternoTabela ); tab.setDescricao( descricao ); if (codigoGrupo == -1) { tab.setCodigoGrupo( this.getGrupo().getCodigo() ); } else { tab.setCodigoGrupo( codigoGrupo ); } //falta o codigo da pessoa criadora tab.insert( modulo.getConexao() );

40

return tab.getCodigo(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void alteraTabela(int codigoTabela, String nomeExternoTabela, String descricao, Vector campos) throws ExcecaoAgrorede { /* Altera características de uma tabela */ if ( ! this.temPermissaoPara("Alterar", "Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para Alterar Tabela"); } try { //atualiza o nome e descrição da tabela Tabela tab = this.tabelaDadoCodigo( codigoTabela ); tab.setNomeExterno( nomeExternoTabela ); tab.setDescricao( descricao ); tab.update( modulo.getConexao() ); for (int i=0;i<campos.size();i++) { tab.updateCampo( modulo.getConexao(), (Vector) campos.get(i) ); } } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void removeTabela(int codigoTabela) throws ExcecaoAgrorede { /* Remove uma tabela */ if ( ! this.temPermissaoPara("Remover", "Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para Remover Tabela"); } try { Tabela tab = this.tabelaDadoCodigo(codigoTabela); tab.remove(modulo.getConexao()); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void insereRegistro(int codigoTabela) throws ExcecaoAgrorede { /* Insere um registro em uma tabela */ //if ( ! this.temPermissaoPara("InserirRegistro","Tabela") ) { // throw new ExcecaoAgrorede("Sem Permissão para inserir linhas."); //} Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); umaTabela.insertRegistro( modulo.getConexao() ); } public void alteraRegistro(int codigoTabela, int codigoRegistro, Vector vetorRegistro) throws ExcecaoAgrorede { /* Atualiza o registro */ if ( ! this.temPermissaoPara("AlterarRegistro","Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para alterar linhas."); } Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); umaTabela.updateRegistro( modulo.getConexao(), codigoRegistro, vetorRegistro ); } public void removeRegistro(int codigoTabela, int codigoRegistro) throws ExcecaoAgrorede { /* Remove um registro em uma tabela */

41

if ( ! this.temPermissaoPara("RemoverRegistro","Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para remover linhas."); } Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); try { PreparedStatement sql = modulo.getConexao().prepareStatement( "DELETE FROM `"+umaTabela.getNomeInterno()+"` WHERE cod = ?" ); sql.setInt( 1, codigoRegistro ); sql.execute(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void insereCampo(int codigoTabela) throws ExcecaoAgrorede { /* Insere um campo na tabela */ if ( ! this.temPermissaoPara("InserirCampo","Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para inserir colunas."); } Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); umaTabela.insertCampo( modulo.getConexao() ); } public void removeCampo(int codigoTabela, String nomeCampo) throws ExcecaoAgrorede { /* Remove um campo na tabela */ if ( ! this.temPermissaoPara("RemoverCampo","Tabela") ) { throw new ExcecaoAgrorede("Sem Permissão para remover colunas."); } Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); umaTabela.removeCampo( modulo.getConexao(), nomeCampo ); } public void alteraOrdemCampo(int codigoTabela, String nomeCampo, int orientacao) throws ExcecaoAgrorede { /* Altera a ordem de amostragem de um campo */ Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); umaTabela.updateOrdemCampo( modulo.getConexao(), nomeCampo, orientacao ); } //-------------------------------------------------------------------------------------------- public ArrayList tabelasDadaExpressaoSql(String expressaoSql) throws ExcecaoAgrorede { try { Statement sql = modulo.getConexao().createStatement(); ResultSet resultado = sql.executeQuery(expressaoSql); ArrayList tabelas = new ArrayList(); while(resultado.next()){ tabelas.add(new Tabela(resultado)); } return tabelas; } catch ( SQLException e ) { throw new ExcecaoAgrorede(e.getMessage()); } } public ResultSet registrosDadaExpressaoSql(String expressaoSql) throws ExcecaoAgrorede { try { Statement sql = modulo.getConexao().createStatement();

42

ResultSet resultado = sql.executeQuery(expressaoSql); return resultado; } catch ( SQLException e ) { throw new ExcecaoAgrorede(e.getMessage()); } } public Tabela tabelaDadoCodigo(int codigoTabela) throws ExcecaoAgrorede { ArrayList tabelas = tabelasDadaExpressaoSql( "SELECT * FROM `Tabela` WHERE codigo = " + codigoTabela ); if (tabelas.size() == 0){ throw new ExcecaoAgrorede("Não foi encontrado a tabela: " + codigoTabela); } else { return (Tabela)tabelas.get(0); } } public Tabela tabelaDadoNome(String nomeTabela) throws ExcecaoAgrorede { ArrayList tabelas = tabelasDadaExpressaoSql( "SELECT * FROM `Tabela` WHERE nome = '" + nomeTabela + "'"); if (tabelas.size() == 0){ throw new ExcecaoAgrorede("Não foi encontrado a tabela: " + nomeTabela ); } else { return (Tabela)tabelas.get(0); } } public ArrayList tabelas() throws ExcecaoAgrorede{ return tabelasDadaExpressaoSql("SELECT * FROM Tabela ORDER BY codigo"); } public ResultSet registrosDadoTabela( int codigoTabela, int inicioPeriodo, int fimPeriodo ) throws ExcecaoAgrorede { Tabela umaTabela = this.tabelaDadoCodigo( codigoTabela ); return umaTabela.registros( modulo.getConexao(), inicioPeriodo, fimPeriodo ); } public ResultSet camposDadaTabela(int codigoTabela) throws ExcecaoAgrorede { try { Tabela umaTabela = this.tabelaDadoCodigo(codigoTabela); return umaTabela.campos( modulo.getConexao() ); } catch (ExcecaoAgrorede e) { throw new ExcecaoAgrorede(e.getMessage()); } } public Vector valoresEnumeracaoCampo(int codigoTabela, String nomeInternoCampo) throws ExcecaoAgrorede { try { Vector valores = new Vector(); ResultSet campos = this.camposDadaTabela(codigoTabela); while (campos.next()) { if (campos.getString("nomeInternoCampo").equals(nomeInternoCampo)) { String textoValores = campos.getString("valoresEnumeracao"); int i = 0; int j = 0; while (i < textoValores.length()) { if (textoValores.charAt(i) == ',') {

43

valores.add( textoValores.substring( j, i ).trim() ); j = i+1; } i = i+1; } valores.add( textoValores.substring( j, i ).trim() ); } } return valores; } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public Vector ultimoPeriodoDe(int codigoTabela) throws ExcecaoAgrorede { Vector periodo = new Vector(); int quantReg = this.quantRegistros(codigoTabela); int i = quantReg/10; if (i == 0) { periodo.add( String.valueOf(1) ); } else { periodo.add( String.valueOf(i*10) ); } periodo.add( String.valueOf(quantReg) ); return periodo; } public int quantRegistros(int codigoTabela) throws ExcecaoAgrorede { Tabela umaTabela = this.tabelaDadoCodigo(codigoTabela); return umaTabela.quantRegistros(modulo.getConexao()); } public Vector verificaPeriodoDe(int codigoTabela, int inicioPeriodo, int fimPeriodo) throws ExcecaoAgrorede { Vector periodo = new Vector(); int quantReg = this.quantRegistros(codigoTabela); int i = quantReg/10; if (i == 0) { periodo.add( String.valueOf(1) ); periodo.add( String.valueOf(quantReg) ); } else { if (inicioPeriodo > quantReg) { periodo.add( String.valueOf(i*10) ); periodo.add( String.valueOf(quantReg) ); } else { if (fimPeriodo > quantReg) { periodo.add( String.valueOf(inicioPeriodo) ); periodo.add( String.valueOf(quantReg) ); } else {//inicioPeriodo < quantReg < fimPeriodo periodo.add( String.valueOf(inicioPeriodo) ); periodo.add( String.valueOf(fimPeriodo) ); } } } return periodo; } public Vector dezAnterioresDe(int codigoTabela, int inicioPeriodo, int fimPeriodo) throws ExcecaoAgrorede { Vector periodo = new Vector(); int quantReg = this.quantRegistros(codigoTabela); int i = quantReg/10; if (i == 0) {

44

periodo.add( String.valueOf(1) ); periodo.add( String.valueOf(quantReg) ); } else { if (inicioPeriodo == 1) { periodo.add( String.valueOf(1) ); periodo.add( String.valueOf(10) ); } else { if ((inicioPeriodo-10) > quantReg) { periodo.add( String.valueOf(i*10) ); periodo.add( String.valueOf(quantReg) ); } else { periodo.add( String.valueOf(inicioPeriodo-10) ); periodo.add( String.valueOf(fimPeriodo-10) ); } } } return periodo; } public Vector proximosDezDe(int codigoTabela, int inicioPeriodo, int fimPeriodo) throws ExcecaoAgrorede { Vector periodo = new Vector(); int quantReg = this.quantRegistros(codigoTabela); int i = quantReg/10; if (i == 0) { periodo.add( String.valueOf(1) ); periodo.add( String.valueOf(quantReg) ); } else { if (inicioPeriodo > quantReg) { periodo.add( String.valueOf(i*10) ); periodo.add( String.valueOf(quantReg) ); } else { if (fimPeriodo > quantReg) { periodo.add( String.valueOf(inicioPeriodo) ); periodo.add( String.valueOf(quantReg) ); } else { if ((fimPeriodo+10) > quantReg) { periodo.add( String.valueOf(inicioPeriodo+10) ); periodo.add( String.valueOf(quantReg) ); } else { periodo.add( String.valueOf(inicioPeriodo+10) ); periodo.add( String.valueOf(fimPeriodo+10) ); } } } } return periodo; } public int tamanhoResultSet(ResultSet rs) throws SQLException { int tamanho = 0; rs.beforeFirst(); while (rs.next()) { tamanho += 1; } rs.beforeFirst(); return tamanho; } public boolean haTipoEmAlgumCampoDaTabela( int codigoTabela, String tipoExterno ) throws ExcecaoAgrorede { try { Tabela umaTabela = this.tabelaDadoCodigo(codigoTabela);

45

ResultSet rs = umaTabela.campos( modulo.getConexao() ); boolean haTipo = false; while (rs.next()) { if (rs.getString("tipoCampo").equals(tipoExterno)) { haTipo = true; } } return haTipo; } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public String tipoDeCampoDeTabela( int codigoTabela, String nomeInternoCampo ) throws ExcecaoAgrorede { try { Tabela umaTabela = this.tabelaDadoCodigo(codigoTabela); ResultSet rs = umaTabela.campos( modulo.getConexao() ); String tipo = ""; while (rs.next()) { if (rs.getString("nomeInternoCampo").equals(nomeInternoCampo)) { tipo = rs.getString("tipoCampo"); } } return tipo; } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } //--------------------------------------------------------------------------------------------- } Classe Tabela.java package org.agrorede; import java.sql.*; import java.sql.Date; import java.util.Vector; public class Tabela { public static String TIPOEXTERNO_DATA = "Data"; public static String TIPOEXTERNO_LINHADETEXTO = "Linha de Texto"; public static String TIPOEXTERNO_LISTADEOPCOES = "Lista de Opções"; public static String TIPOEXTERNO_MOEDA = "Moeda"; public static String TIPOEXTERNO_NUMERO = "Número"; public static String TIPOEXTERNO_SIMNAO = "Sim/Não"; public static String TIPOEXTERNO_TEXTO = "Texto"; public static String TIPOINTERNO_DATA = "DATE"; public static String TIPOINTERNO_LINHADETEXTO = "VARCHAR"; public static String TIPOINTERNO_LISTADEOPCOES = "VARCHAR"; public static String TIPOINTERNO_MOEDA = "DECIMAL"; public static String TIPOINTERNO_NUMERO = "INT"; public static String TIPOINTERNO_SIMNAO = "INT"; public static String TIPOINTERNO_TEXTO = "TEXT"; public Tabela() {

46

} public Tabela(ResultSet resultadoSQL) throws SQLException { this.setCodigo(resultadoSQL.getInt("codigo")); this.setCodigoGrupo(resultadoSQL.getInt("codigoGrupo")); this.setNomeInterno(resultadoSQL.getString("nomeInterno")); this.setNomeExterno(resultadoSQL.getString("nomeExterno")); this.setDescricao(resultadoSQL.getString("descricao")); this.setDataCriacao(resultadoSQL.getDate("dataCriacao")); this.setCodigoPessoaCriador(resultadoSQL.getInt("codigoPessoaCriador")); } public boolean equals(Object tab) { if (! (tab instanceof Tabela) ) { return false; } return ((Tabela)tab).getCodigo() == this.getCodigo(); } public int hashCode() { return this.getCodigo(); } //--------------------------------------------------------------------------------------------- public void insert(Connection db) throws SQLException { //insere o registro em Tabela, com as informações da nova tabela PreparedStatement sql = db.prepareStatement( "INSERT INTO `Tabela` (`codigo`, `codigoGrupo`, `nomeInterno`, `nomeExterno`,"+ "`descricao`, `dataCriacao ,̀ `codigoPessoaCriador`)" + " VALUES ('', ?, ?, ?, ?, ?, ? )"); sql.setInt(1,this.codigoGrupo); this.setNomeInterno( "TabelaUsuario" ); sql.setString(2,this.nomeInterno); sql.setString(3,this.nomeExterno); sql.setString(4,this.descricao); sql.setDate(5,new Date( (new java.util.Date()).getTime() )); sql.setInt(6,this.codigoPessoaCriador); sql.execute(); //atualiza o nome interno da tabela no registro em Tabela sql = db.prepareStatement( "SELECT codigo FROM `Tabela` WHERE nomeExterno = ? AND codigoGrupo = ? "); sql.setString(1,this.nomeExterno); sql.setInt(2,this.codigoGrupo); sql.execute(); ResultSet resultado = sql.getResultSet(); resultado.next(); setCodigo( resultado.getInt("codigo")); this.setNomeInterno( "TabelaUsuario"+this.getCodigo() ); this.update( db ); //cria a tabela fisicamente no banco de dados sql = db.prepareStatement( "CREATE TABLE `"+this.getNomeInterno()+"` ("+ "`cod` INT NOT NULL AUTO_INCREMENT PRIMARY KEY);" ); sql.execute(); }

47

public void update(Connection db) throws SQLException { PreparedStatement sql = db.prepareStatement( "UPDATE `Tabela` "+ "SET nomeExterno = ?, descricao = ?, codigoGrupo = ?, nomeInterno = ? " + "WHERE codigo = ?"); sql.setString(1,this.nomeExterno); sql.setString(2,this.descricao); sql.setInt(3,this.codigoGrupo); sql.setString(4,this.nomeInterno); sql.setInt(5,this.codigo); sql.execute(); } public void remove(Connection db) throws SQLException { PreparedStatement sql = db.prepareStatement( "DELETE FROM `Tabela` WHERE codigo = ?"); sql.setInt(1,this.codigo); sql.execute(); sql = db.prepareStatement("DROP TABLE "+this.getNomeInterno()); sql.execute(); } public ResultSet campos(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "SELECT * FROM `TabelaCampos` WHERE codigoTabela = ? ORDER BY ordemApresentacaoCampo" ); sql.setInt( 1, codigo ); return sql.executeQuery(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public int quantCampos(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "SELECT COUNT(*) AS NumCampos FROM `TabelaCampos` WHERE codigoTabela = ?" ); sql.setInt( 1, codigo ); ResultSet rs = sql.executeQuery(); rs.next(); return rs.getInt("NumCampos"); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public int quantRegistros(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "SELECT COUNT(*) AS NumRegistros FROM `"+this.getNomeInterno()+"`" ); ResultSet rs = sql.executeQuery(); rs.next(); return rs.getInt("NumRegistros"); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } }

48

public void insertCampo(Connection db) throws ExcecaoAgrorede { try { //insere o registro do novo campo em TabelaCampos PreparedStatement sql = db.prepareStatement( "INSERT INTO `TabelaCampos` "+ "(`codigoTabela`, `nomeInternoCampo`,`ordemApresentacaoCampo`, `tipoCampo` ) VALUES ( ?, ?, ?, ? )" ); String nomeInternoCampo = this.getProximoNomeCampo(db); sql.setInt( 1, this.getCodigo() ); sql.setString( 2, nomeInternoCampo ); sql.setInt( 3, this.getProximoValorApresentacaoCampo(db) ); sql.setString( 4, TIPOEXTERNO_LINHADETEXTO ); sql.execute(); //altera o campo no banco de dados sql = db.prepareStatement( "ALTER TABLE `"+this.getNomeInterno()+"` ADD `"+nomeInternoCampo+"` VARCHAR(50) NOT NULL" ); sql.execute(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void updateCampo(Connection db, Vector vetorCampo) throws ExcecaoAgrorede { try { //atualiza dados do campo PreparedStatement sql = db.prepareStatement( "UPDATE `TabelaCampos` "+ "SET nomeExternoCampo = ?, tipoCampo = ?, valoresEnumeracao = ?,"+ " tamanhoCampo = ?, permiteRepetido = ? "+ "WHERE nomeInternoCampo = ? "+ " AND codigoTabela = ?" ); sql.setString( 1, (String) vetorCampo.get(1) ); String tipo = ((String) vetorCampo.get(2)).trim(); sql.setString( 2, tipo ); if (((String) vetorCampo.get(2)).equals(TIPOEXTERNO_LISTADEOPCOES)) { sql.setString( 3, (String) vetorCampo.get(3) ); } else { sql.setString( 3, "" ); } String tamanho = ""; if (vetorCampo.get(4) == null) { sql.setInt( 4, 0 ); } else { tamanho = (String) vetorCampo.get(4); if (tamanho.equals("")) { sql.setInt( 4, 0 ); } else { sql.setInt( 4, Integer.parseInt(tamanho) ); } } sql.setString( 5, (String) vetorCampo.get(5) ); String nomeInternoCampo = (String) vetorCampo.get(0); sql.setString( 6, nomeInternoCampo ); sql.setInt( 7, this.getCodigo() ); sql.execute(); //altera o campo no banco de dados

49

if (tipo.equals(TIPOEXTERNO_LINHADETEXTO)) { //se o tamanho for vazio ou zero, deve ser igual a 50 if ((tamanho.equals("")) | (tamanho.equals("0"))) { tamanho = "50"; } sql = db.prepareStatement( "ALTER TABLE `"+this.getNomeInterno()+"` CHANGE `"+nomeInternoCampo+ "` `"+nomeInternoCampo+"` "+this.getTipoInternoDe(tipo)+"("+tamanho+")" ); } if (tipo.equals(TIPOEXTERNO_LISTADEOPCOES)) { sql = db.prepareStatement( "ALTER TABLE `"+this.getNomeInterno()+"` CHANGE `"+nomeInternoCampo+ "` `"+nomeInternoCampo+"` "+this.getTipoInternoDe(tipo)+"(50)" ); } if ((!tipo.equals(TIPOEXTERNO_LINHADETEXTO)) & (!tipo.equals(TIPOEXTERNO_LISTADEOPCOES))) { sql = db.prepareStatement( "ALTER TABLE `"+this.getNomeInterno()+"` CHANGE `"+nomeInternoCampo+ "` `"+nomeInternoCampo+"` "+this.getTipoInternoDe(tipo) ); } sql.execute(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void removeCampo(Connection db, String nomeInternoCampo) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "DELETE FROM `TabelaCampos` WHERE nomeInternoCampo = ?"); sql.setString( 1, nomeInternoCampo ); sql.execute(); sql = db.prepareStatement("ALTER TABLE `"+this.getNomeInterno()+"` DROP `"+nomeInternoCampo+"`" ); sql.execute(); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void updateOrdemCampo(Connection db, String nomeInternoCampo, int orientacao) throws ExcecaoAgrorede { try { //busca a ordem do campo que se quer trocar (1) PreparedStatement sql = db.prepareStatement( "SELECT ordemApresentacaoCampo FROM `TabelaCampos` "+ "WHERE nomeInternoCampo = ?"+ " AND codigoTabela = ?" ); sql.setString( 1, nomeInternoCampo ); sql.setInt( 2, this.getCodigo() ); sql.execute(); ResultSet resultado = sql.getResultSet();

50

resultado.next(); int ordemCampo1 = resultado.getInt("ordemApresentacaoCampo"); if (((orientacao==0) & (ordemCampo1>1)) | ((orientacao==1) & (ordemCampo1<this.quantCampos(db)))) { //busca o nome do outro campo (2), que será trocado, com o valor da orientação (0=acima;1=abaixo) sql = db.prepareStatement( "SELECT nomeInternoCampo FROM `TabelaCampos` "+ "WHERE ordemApresentacaoCampo = ?"+ " AND codigoTabela = ?" ); if (orientacao==0) { sql.setInt( 1, ordemCampo1-1 ); } else { sql.setInt( 1, ordemCampo1+1 ); } sql.setInt( 2, this.getCodigo() ); sql.execute(); resultado = sql.getResultSet(); resultado.next(); String nomeCampo2 = resultado.getString("nomeInternoCampo"); //atualiza o campo 1 sql = db.prepareStatement( "UPDATE `TabelaCampos` "+ "SET ordemApresentacaoCampo = ? "+ "WHERE nomeInternoCampo = ?"+ " AND codigoTabela = ?" ); if (orientacao==0) { sql.setInt( 1, ordemCampo1-1 ); } else { sql.setInt( 1, ordemCampo1+1 ); } sql.setString( 2, nomeInternoCampo ); sql.setInt( 3, this.getCodigo() ); sql.execute(); //atualiza o campo 2 sql = db.prepareStatement( "UPDATE `TabelaCampos` "+ "SET ordemApresentacaoCampo = ? "+ "WHERE nomeInternoCampo = ?"+ " AND codigoTabela = ?" ); sql.setInt( 1, ordemCampo1 ); sql.setString( 2, nomeCampo2 ); sql.setInt( 3, this.getCodigo() ); sql.execute(); } } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public void insertRegistro(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "INSERT INTO `"+this.getNomeInterno()+ "` ( `cod` ) VALUES ( '' )" ); sql.execute(); } catch (SQLException e) {

51

throw new ExcecaoAgrorede(e.getMessage()); } } public void updateRegistro(Connection db, int codigoRegistro, Vector vetorRegistro) throws ExcecaoAgrorede { ResultSet campos = this.campos(db); String textoSql; try { Statement sql = db.createStatement(); textoSql = "UPDATE `"+this.getNomeInterno()+"` SET "; for (int i=0;i<vetorRegistro.size();i++) { textoSql = textoSql+"`"+(String)((Vector)vetorRegistro.get(i)).get(0)+"` = '"+ (String)((Vector)vetorRegistro.get(i)).get(1)+"'"; if (i < (vetorRegistro.size()-1)) { textoSql = textoSql+","; } } textoSql = textoSql + " WHERE `cod` = "+codigoRegistro; sql.executeQuery( textoSql ); } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public String getTipoInternoDe(String tipoExterno) { if (tipoExterno.equals(TIPOEXTERNO_DATA)) { return TIPOINTERNO_DATA; } if (tipoExterno.equals(TIPOEXTERNO_LINHADETEXTO)) { return TIPOINTERNO_LINHADETEXTO; } if (tipoExterno.equals(TIPOEXTERNO_LISTADEOPCOES)) { return TIPOINTERNO_LISTADEOPCOES; } if (tipoExterno.equals(TIPOEXTERNO_MOEDA)) { return TIPOINTERNO_MOEDA; } if (tipoExterno.equals(TIPOEXTERNO_NUMERO)) { return TIPOINTERNO_NUMERO; } if (tipoExterno.equals(TIPOEXTERNO_SIMNAO)) { return TIPOINTERNO_SIMNAO; } if (tipoExterno.equals(TIPOEXTERNO_TEXTO)) { return TIPOINTERNO_TEXTO; } return ""; } public String getProximoNomeCampo(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement("SELECT * FROM `TabelaCampos` WHERE codigoTabela = ?"); sql.setInt( 1, this.getCodigo() ); sql.execute(); ResultSet resultado = sql.getResultSet(); int cont = 0; while (resultado.next()) { cont += 1; } return "campo"+String.valueOf(cont+1);

52

} catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public int getProximoValorApresentacaoCampo(Connection db) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement("SELECT MAX(ordemApresentacaoCampo) AS Maximo FROM `TabelaCampos` WHERE codigoTabela = ?"); sql.setInt( 1, this.getCodigo() ); sql.execute(); ResultSet resultado = sql.getResultSet(); resultado.next(); int ultimo = resultado.getInt("Maximo"); ultimo = ultimo + 1; return ultimo; } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } public ResultSet registros(Connection db, int inicioPeriodo, int fimPeriodo) throws ExcecaoAgrorede { try { PreparedStatement sql = db.prepareStatement( "SELECT nomeInterno FROM Tabela WHERE codigo = ?" ); sql.setInt( 1, this.getCodigo() ); ResultSet resultado = sql.executeQuery(); resultado.first(); sql = db.prepareStatement( "SELECT * FROM "+resultado.getString("nomeInterno")+" LIMIT "+String.valueOf(inicioPeriodo-1)+", "+String.valueOf(fimPeriodo) ); resultado = sql.executeQuery(); return resultado; } catch (SQLException e) { throw new ExcecaoAgrorede(e.getMessage()); } } //--------------------------------------------------------------------------------------------- public int getCodigo() { return codigo; } private void setCodigo(int codigo) { this.codigo = codigo; } public int getCodigoGrupo() { return codigoGrupo; } public void setCodigoGrupo(int codigoGrupo) { this.codigoGrupo = codigoGrupo; } public int getCodigoPessoaCriador() {

53

return codigoPessoaCriador; } private void setCodigoPessoaCriador(int codigoPessoaCriador) { this.codigoPessoaCriador = codigoPessoaCriador; } public Date getDataCriacao() { return dataCriacao; } private void setDataCriacao(Date dataCriacao) { this.dataCriacao = dataCriacao; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getNomeExterno() { return nomeExterno; } public void setNomeExterno(String nomeExterno) { this.nomeExterno = nomeExterno; } public String getNomeInterno() { return nomeInterno; } private void setNomeInterno(String nomeInterno) { this.nomeInterno = nomeInterno; } //--------------------------------------------------------------------------------------------- /** * auto_increment * @rdbPhysicalName codigo * @rdbNotNull * @rdbSize 11 * @rdbDigits 0 * @rdbLogicalType INTEGER * @rdbPrimaryKey */ private int codigo; /** * * @rdbPhysicalName codigoGrupo * @rdbNotNull * @rdbSize 11 * @rdbDigits 0 * @rdbLogicalType INTEGER */ private int codigoGrupo; /**

54

* * @rdbPhysicalName nomeInterno * @rdbNotNull * @rdbSize 50 * @rdbDigits 0 * @rdbLogicalType VARCHAR */ private String nomeInterno; /** * * @rdbPhysicalName nomeExterno * @rdbNotNull * @rdbSize 50 * @rdbDigits 0 * @rdbLogicalType VARCHAR */ private String nomeExterno; /** * * @rdbPhysicalName descricao * @rdbSize 200 * @rdbDigits 0 * @rdbLogicalType VARCHAR */ private String descricao; /** * * @rdbPhysicalName dataCriacao * @rdbNotNull * @rdbSize 10 * @rdbDigits 0 * @rdbLogicalType DATE */ private Date dataCriacao; /** * * @rdbPhysicalName codigoPessoaCriador * @rdbNotNull * @rdbSize 11 * @rdbDigits 0 * @rdbLogicalType INTEGER */ private int codigoPessoaCriador; } //--------------------------------------------------------------------------------------------- Arquivo alteraOrdemCampo.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.util.Vector" %> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" />

55

<% String campo = request.getParameter("campo"); String orientacao = request.getParameter("orientacao"); moduloTabela.alteraOrdemCampo( Integer.parseInt(tabela), campo, Integer.parseInt(orientacao) ); %> <jsp:forward page="../index.jsp?objeto=Tabela&acao=Alterar" /> Arquivo alteraTabela.jsp <%@ page import="java.sql.ResultSet" %> <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="objeto" class="java.lang.String" scope="session" /> <jsp:useBean id="acao" class="java.lang.String" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% boolean podeIncluirCampo = moduloTabela.temPermissaoPara("IncluirCampo", "Tabela"); boolean podeAlterarCampo = moduloTabela.temPermissaoPara("AlterarCampo", "Tabela"); boolean podeRemoverCampo = moduloTabela.temPermissaoPara("RemoverCampo", "Tabela"); Tabela umaTabela; if (request.getParameter("tabela") != null) { session.setAttribute("tabela", request.getParameter("tabela")); umaTabela = moduloTabela.tabelaDadoCodigo(Integer.parseInt(request.getParameter("tabela"))); } else { umaTabela = moduloTabela.tabelaDadoCodigo(Integer.parseInt(tabela)); } %> &nbsp; <center> <h1> <%=umaTabela.getNomeExterno()%></h1> </center> <form action="index.jsp?objeto=Tabela&acao=SalvarCampos" method="post"> <table> <tr> <th><p align="right">Nome : </p></th> <td><input type="edit" name="nomeTabela" value="<%=umaTabela.getNomeExterno()%>"></td> </tr> <tr> <th><p align="right">Descrição : </p></th> <td><textarea name="descricaoTabela" rows="5" cols="100"><%=umaTabela.getDescricao()%></textarea></td> </tr> <% ResultSet campos = moduloTabela.camposDadaTabela(umaTabela.getCodigo()); int tamanho = moduloTabela.tamanhoResultSet(campos); if (tamanho > 0) { %> <tr> <th><br><p align="right">Colunas : </p></th> <td></td> </tr> <% } %>

56

</table> <% if (tamanho > 0) { %> <table border="0"> <colgroup align="left" width="100"> <% for (int i=1;i<=tamanho;i++) { %> <colgroup align="left" width="100"> <% } %> <tr> <th></th> <% campos.beforeFirst(); while (campos.next()) { %> <td bgcolor="#CCCCCC"> <center> <button type="button" name="alteraOrdemCampo_acima" value="acima" onclick="alteraOrdemCampoParaCima('<%=campos.getString("nomeInternoCampo")%>')"><img src="Tabela/seta_esquerda.bmp" alt="Movimenta o campo para frente"></button> &nbsp; <button type="button" name="alteraOrdemCampo_abaixo" value="abaixo" onclick="alteraOrdemCampoParaBaixo('<%=campos.getString("nomeInternoCampo")%>')"><img src="Tabela/seta_direita.bmp" alt="Movimenta o campo para trás"></button> </center> </td> <% } %> </tr> <tr> <th bgcolor="#CCCCCC"><p align="left">Nome</p></th> <% campos.beforeFirst(); while (campos.next()) { %> <td bgcolor="#CCCCCC"> <input type="text" name="nomeCampo_<%=campos.getString("nomeInternoCampo")%>" value="<%=campos.getString("nomeExternoCampo")%>"> </td> <% } %> </tr> <tr> <th bgcolor="#CCCCCC"> <p align="left">Tipo</p> </th> <% campos.beforeFirst(); while (campos.next()) { %> <td bgcolor="#CCCCCC"> <select name="tipoCampo_<%=campos.getString("nomeInternoCampo")%>" dir="ltr"> <option value="Data" <% if (campos.getString("tipoCampo").equals("Data")) {%>selected<% } %> >Data</option> <option value="Linha de Texto" <% if (campos.getString("tipoCampo").equals("Linha de Texto")) {%>selected<% } %> >Linha de Texto</option> <option value="Lista de Opções" <% if (campos.getString("tipoCampo").equals("Lista de Opções")) {%>selected<% } %> >Lista de Opções</option> <option value="Moeda" <% if (campos.getString("tipoCampo").equals("Moeda")) {%>selected<% } %> >Moeda</option> <option value="Número" <% if (campos.getString("tipoCampo").equals("Número")) {%>selected<% } %> >Número</option> <option value="Sim/Não" <% if (campos.getString("tipoCampo").equals("Sim/Não")) {%>selected<% } %> >Sim/Não</option> <option value="Texto" <% if (campos.getString("tipoCampo").equals("Sim/Não")) {%>selected<% } %> >Texto</option>

57

</select> </td> <% }%> </tr> <% if (moduloTabela.haTipoEmAlgumCampoDaTabela( umaTabela.getCodigo(), Tabela.TIPOEXTERNO_LISTADEOPCOES )) {%> <tr> <th bgcolor="#CCCCCC"><p align="left">Valores *</p></th> <% campos.beforeFirst(); while (campos.next()) {%> <td bgcolor="#CCCCCC"> <% if (moduloTabela.tipoDeCampoDeTabela( umaTabela.getCodigo(), campos.getString("nomeInternoCampo") ).equals( Tabela.TIPOEXTERNO_LISTADEOPCOES )) {%> <input type="text" name="valoresEnumCampo_<%=campos.getString("nomeInternoCampo")%>" value="<%=campos.getString("valoresEnumeracao")%>"> <% }%> </td> <% }%> </tr> <% } if (moduloTabela.haTipoEmAlgumCampoDaTabela( umaTabela.getCodigo(), Tabela.TIPOEXTERNO_LINHADETEXTO )) {%> <tr> <th bgcolor="#CCCCCC"><p align="left">Tamanho</p></th> <% campos.beforeFirst(); while (campos.next()) {%> <td bgcolor="#CCCCCC"> <% if (moduloTabela.tipoDeCampoDeTabela( umaTabela.getCodigo(), campos.getString("nomeInternoCampo") ).equals( Tabela.TIPOEXTERNO_LINHADETEXTO )) {%> <input type="text" name="tamanhoCampo_<%=campos.getString("nomeInternoCampo")%>" value="<%=campos.getString("tamanhoCampo")%>"> <% }%> </td> <% } %> </tr> <% }%> <tr> <th bgcolor="#CCCCCC"><p align="left">Permite valor repetido</p></th> <% campos.beforeFirst(); while (campos.next()) { %> <td bgcolor="#CCCCCC"> <p align="center"> <input type="radio" name="permiteRepetidoCampo_<%=campos.getString("nomeInternoCampo")%>" value="Sim" <% if (campos.getString("permiteRepetido").equals("Sim")) {%>checked<% } %> >Sim</input> <input type="radio" name="permiteRepetidoCampo_<%=campos.getString("nomeInternoCampo")%>" value="Não" <% if (campos.getString("permiteRepetido").equals("Não")) {%>checked<% } %> >Não</input> </p> </td> <% } %> </tr> <tr> <th></th> <% campos.beforeFirst(); while (campos.next()) { %> <td bgcolor="#CCCCCC">

58

<% if (podeRemoverCampo) {%> <p align="center"> <button type="button" name="removeCampo_<%=campos.getString("nomeInternoCampo")%>" value="remover a coluna" onclick="removeCampo('<%=campos.getString("nomeInternoCampo")%>')">remover</button> </p> <% }%> </td> <% }%> </tr> </table> <i> <br> * Deve estar entre vírgulas. </i> <% } %> <table border="0" width="100%"> <tr align="right"> <td> <p align="right" > <input type="submit" name="salvar" value="Salvar alterações"> </form> </p> </td> <% if (podeIncluirCampo) {%> <td width="7%"> <p align="right" > <form action="index.jsp?objeto=Tabela&acao=InserirCampo" method="post"> <input type="submit" name="criarColuna" value="Inserir Coluna"> </form> </p> </td> <% }%> <td width="7%"> <p align="right" > <form action="index.jsp?objeto=Tabela&acao=VisualizarRegistros&tabela=<%=umaTabela.getCodigo()%>&inicioPeriodoTabela=1&fimPeriodoTabela=10" method="post"> <input type="submit" name="listaTabelas" value="Ver Conteúdo"> </form> </p> </td> </tr> </table> <script language="JavaScript"> function alteraOrdemCampoParaCima(nomeCampo) { location = "index.jsp?objeto=Tabela&acao=AlteraOrdemCampo&campo="+nomeCampo+"&orientacao=0"; } function alteraOrdemCampoParaBaixo(nomeCampo) { location = "index.jsp?objeto=Tabela&acao=AlteraOrdemCampo&campo="+nomeCampo+"&orientacao=1"; } function removeCampo(nomeCampo) { location = "index.jsp?objeto=Tabela&acao=RemoverCampo&campo="+nomeCampo; } </script>

59

Arquivo criaTabela.jsp <form action="index.jsp?objeto=Tabela&acao=SalvarNovaTabela" method="post"> <center> <p>&nbsp; <h2>Criando Tabela</h2> <p>&nbsp; <table> <tr> <th bgcolor="#CCCCCC">Nome : </th> <td bgcolor="#CCCCCC"><input type="edit" name="nomeTabela" value="" size="50"></td> </tr> <tr> <th bgcolor="#CCCCCC">Descrição : </th> <td bgcolor="#CCCCCC"><textarea name="descricaoTabela" rows="5" cols="100"></textarea></td> </tr> </table> <p>&nbsp; <p>&nbsp; <input type="submit" name="criar" value="Criar Tabela" /> </center> </form> Arquivo insereCampo.jsp <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% moduloTabela.insereCampo( Integer.parseInt(tabela) ); %> <jsp:include page="alteraTabela.jsp" /> Arquivo insereRegistro.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.util.Vector" %> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% moduloTabela.insereRegistro( Integer.parseInt(tabela) ); Vector periodo = moduloTabela.ultimoPeriodoDe( Integer.parseInt(tabela) );%> <jsp:include page="visualizaTabela.jsp?inicioPeriodoTabela=<%=(String) periodo.get(0)%>&fimPeriodoTabela=<%=(String) periodo.get(1)%>" /> Arquivo listaTabelas.jsp <%@ page import="java.util.ArrayList"%>

60

<%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session"/> <jsp:useBean id="objeto" class="java.lang.String" scope="session" /> <jsp:useBean id="acao" class="java.lang.String" scope="session" /> <% Tabela tabela; boolean podeCriar = moduloTabela.temPermissaoPara("Criar", "Tabela"); boolean podeRemover = moduloTabela.temPermissaoPara("Remover", "Tabela"); boolean podeAlterar = moduloTabela.temPermissaoPara("Alterar", "Tabela"); %> <center> <p>&nbsp; <h2>Lista de Tabelas</h2> <table border="0"> <tr> <th>Nome</th> <th>Descrição</th> <th></th> <% if (podeAlterar){ %><td></td><% } %> <% if (podeRemover){ %><td></td><% } %> </tr> <% ArrayList tabelas = moduloTabela.tabelas(); for(int i = 0 ; i < tabelas.size() ; i++){ tabela = (Tabela)tabelas.get(i); %> <tr> <td bgcolor="#CCCCCC" nowrap="nowrap"> <a href="index.jsp?objeto=Tabela&acao=VisualizarRegistros&tabela=<%=tabela.getCodigo()%>&inicioPeriodoTabela=1&fimPeriodoTabela=10"> <%=tabela.getNomeExterno()%> </a> </td> <td bgcolor="#CCCCCC" nowrap="nowrap"><%=tabela.getDescricao()%></td> <td bgcolor="#CCCCCC"> <button type="button" name="verTabela_<%=tabela.getCodigo()%>" value="ver tabela" onclick="verTabela('<%=tabela.getCodigo()%>')">ver</button> </td> <% if (podeAlterar){%> <td bgcolor="#CCCCCC"> <button type="button" name="alterarTabela_<%=tabela.getCodigo()%>" value="alterar tabela" onclick="alteraTabela('<%=tabela.getCodigo()%>')">alterar</button> </td> <% }%> <% if (podeRemover){%> <td bgcolor="#CCCCCC"> <button type="button" name="removerTabela_<%=tabela.getCodigo()%>" value="remover tabela" onclick="removeTabela('<%=tabela.getCodigo()%>')">remover</button> </td> <% }%> </tr> <% }%> </table> </center> <% if (podeCriar) {%> <P align="right" > <form action="index.jsp?objeto=Tabela&acao=Criar" method="post">

61

<input type="submit" name="inscrever" value="Criar Tabela" /> </form> <% }%> <script language="JavaScript"> function verTabela(codigoTabela) { location = "index.jsp?objeto=Tabela&acao=VisualizarRegistros&tabela="+codigoTabela+"&inicioPeriodoTabela=1&fimPeriodoTabela=10"; } function alteraTabela(codigoTabela) { location = "index.jsp?objeto=Tabela&acao=Alterar&tabela="+codigoTabela; } function removeTabela(codigoTabela) { location = "index.jsp?objeto=Tabela&acao=Remover&tabela="+codigoTabela; } </script> Arquivo removeCampo.jsp <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% moduloTabela.removeCampo( Integer.parseInt(tabela), request.getParameter("campo") );%> <jsp:include page="alteraTabela.jsp" /> Arquivo removeRegistros.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.sql.ResultSet" %> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% moduloTabela.removeRegistro(Integer.parseInt(tabela), Integer.parseInt(request.getParameter("registro")));%> <jsp:forward page="../index.jsp?objeto=Tabela&acao=VisualizarRegistros"/> Arquivo removeTabela.jsp <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <% moduloTabela.removeTabela( Integer.parseInt( request.getParameter("tabela") ) );%> <jsp:forward page="../index.jsp?objeto=Tabela&acao=Visualizar" />

62

Arquivo salvaCampos.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.util.Vector" %> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <% Vector vetorCampos = new Vector(); ResultSet campos = moduloTabela.camposDadaTabela(Integer.parseInt(tabela)); while (campos.next()) { Vector subVetorCampos = new Vector(); String nomeInterno = campos.getString("nomeInternoCampo"); if (!request.getParameter("nomeCampo_"+nomeInterno).equals("")){ subVetorCampos.add( nomeInterno ); subVetorCampos.add( request.getParameter("nomeCampo_"+nomeInterno) ); subVetorCampos.add( request.getParameter("tipoCampo_"+nomeInterno) ); subVetorCampos.add( request.getParameter("valoresEnumCampo_"+nomeInterno) ); subVetorCampos.add( request.getParameter("tamanhoCampo_"+nomeInterno) ); subVetorCampos.add( request.getParameter("permiteRepetidoCampo_"+nomeInterno) ); vetorCampos.add( subVetorCampos ); } } moduloTabela.alteraTabela( Integer.parseInt(tabela), request.getParameter("nomeTabela"), request.getParameter("descricaoTabela"), vetorCampos ); %> <jsp:include page="alteraTabela.jsp" /> Arquivo salvaNovaTabela.jsp <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <% String tabela; tabela = String.valueOf( moduloTabela.criaTabela( request.getParameter("nomeTabela"), request.getParameter("descricaoTabela"), -1 )); session.setAttribute("tabela", tabela); %> <jsp:include page="alteraTabela.jsp" /> Arquivo salvaRegistroTabela.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.util.Vector" %> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" />

63

<jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <jsp:useBean id="inicioPeriodoTabela" class="java.lang.String" scope="session" /> <jsp:useBean id="fimPeriodoTabela" class="java.lang.String" scope="session" /> <% ResultSet registros = moduloTabela.registrosDadoTabela(Integer.parseInt(tabela), Integer.parseInt(inicioPeriodoTabela), Integer.parseInt(fimPeriodoTabela)); while (registros.next()) { Vector vetorRegistro = new Vector(); String cod = registros.getString("cod"); ResultSet campos = moduloTabela.camposDadaTabela(Integer.parseInt(tabela)); while (campos.next()) { Vector subVetorRegistro = new Vector(); String nomeInterno = campos.getString("nomeInternoCampo"); subVetorRegistro.add( nomeInterno ); if (campos.getString("tipoCampo").equals("Data")) { subVetorRegistro.add( request.getParameter("campo_ano_"+nomeInterno+"_"+cod)+"-"+ request.getParameter("campo_mes_"+nomeInterno+"_"+cod)+"-"+ request.getParameter("campo_dia_"+nomeInterno+"_"+cod) ); } if (campos.getString("tipoCampo").equals("Lista")) { subVetorRegistro.add( request.getParameter("campo_"+nomeInterno+"_"+cod) ); } if ((!campos.getString("tipoCampo").equals("Data")) & (!campos.getString("tipoCampo").equals("Lista"))) { subVetorRegistro.add( request.getParameter("campo_"+nomeInterno+"_"+cod) ); } vetorRegistro.add( subVetorRegistro ); } moduloTabela.alteraRegistro( Integer.parseInt(tabela), Integer.parseInt(cod), vetorRegistro ); } %> <jsp:include page="visualizaTabela.jsp" /> Arquivo trataTabelas.jsp <%@ page import="org.agrorede.*"%> <jsp:useBean id="moduloMembroGrupo" class="org.agrorede.ModuloMembroGrupo" scope="session"/> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="objeto" class="java.lang.String" scope="session" /> <jsp:useBean id="acao" class="java.lang.String" scope="session" /> <% moduloTabela.setModuloMembroGrupo( moduloMembroGrupo ); boolean podeCriar = moduloTabela.temPermissaoPara("Criar", "Tabela"); boolean podeAlterar = moduloTabela.temPermissaoPara("Alterar", "Tabela"); boolean podeRemover = moduloTabela.temPermissaoPara("Remover", "Tabela");

64

boolean podeVisualizar = moduloTabela.temPermissaoPara("Visualizar", "Tabela"); boolean podeInserirRegistro = moduloTabela.temPermissaoPara("InserirRegistro", "Tabela"); boolean podeRemoverRegistro = moduloTabela.temPermissaoPara("RemoverRegistro", "Tabela"); boolean podeAlterarRegistro = moduloTabela.temPermissaoPara("AlterarRegistro", "Tabela"); boolean podeInserirCampo = moduloTabela.temPermissaoPara("InserirCampo", "Tabela"); boolean podeRemoverCampo = moduloTabela.temPermissaoPara("RemoverCampo", "Tabela"); boolean podeAlterarCampo = moduloTabela.temPermissaoPara("AlterarCampo", "Tabela"); String tabela = request.getParameter("tabela"); %> <% if ( acao.equals("Criar") && podeCriar ){ %> <jsp:include page="criaTabela.jsp" /> <% } %> <% if ( acao.equals("Alterar") && podeAlterar ){ %> <jsp:include page="alteraTabela.jsp?tabela=<%=tabela%>" /> <% } %> <% if ( acao.equals("Remover") && podeRemover ){ %> <jsp:include page="removeTabela.jsp?tabela=<%=tabela%>" /> <% } %> <% if ( acao.equals("Visualizar") && podeVisualizar ){ %> <jsp:include page="listaTabelas.jsp" /> <% } %> <% if ( acao.equals("SalvarNovaTabela") ){ %> <jsp:include page="salvaNovaTabela.jsp" /> <% } %> <% if ( acao.equals("InserirRegistro") && podeInserirRegistro ){ %> <jsp:include page="insereRegistro.jsp" /> <% } %> <% if ( acao.equals("RemoverRegistro") && podeRemoverRegistro ){ %> <jsp:include page="removeRegistros.jsp" /> <% } %> <% if ( acao.equals("AlterarRegistro") && podeAlterarRegistro ){ %> <jsp:include page="alteraRegistroTabela.jsp" /> <% } %> <% if ( acao.equals("VisualizarRegistros") && podeVisualizar ){ %> <jsp:include page="visualizaTabela.jsp" /> <% } %> <% if ( acao.equals("SalvarRegistro") ){ %> <jsp:include page="salvaRegistroTabela.jsp?tabela=<%=tabela%>" /> <% } %> <% if ( acao.equals("SalvarNovoRegistro") ){ %> <jsp:include page="salvaNovoRegistroTabela.jsp?tabela=<%=tabela%>" /> <% } %> <% if ( acao.equals("InserirCampo") && podeInserirCampo ){ %> <jsp:include page="insereCampo.jsp" />

65

<% } %> <% if ( acao.equals("RemoverCampo") && podeRemoverCampo ){ %> <jsp:include page="removeCampo.jsp" /> <% } %> <% if ( acao.equals("AlterarCampo") && podeAlterarCampo ){ %> <jsp:include page="alteraCampo.jsp" /> <% } %> <% if ( acao.equals("SalvarCampos") && podeAlterarCampo ){ %> <jsp:include page="salvaCampos.jsp" /> <% } %> <% if ( acao.equals("SalvarNovoCampo") && podeInserirCampo ){ %> <jsp:include page="salvaNovoCampo.jsp?tabela=<%=tabela%>" /> <% } %> <% if ( acao.equals("AlteraOrdemCampo") && podeAlterarCampo ){ %> <jsp:include page="alteraOrdemCampo.jsp" /> <% } %> Arquivo visualizaTabela.jsp <%@ page import="org.agrorede.*"%> <%@ page import="java.sql.ResultSet"%> <%@ page import="java.util.Vector"%> <jsp:useBean id="moduloTabela" class="org.agrorede.ModuloTabela" scope="session" /> <jsp:useBean id="objeto" class="java.lang.String" scope="session" /> <jsp:useBean id="acao" class="java.lang.String" scope="session" /> <jsp:useBean id="tabela" class="java.lang.String" scope="session" /> <jsp:useBean id="inicioPeriodoTabela" class="java.lang.String" scope="session" /> <jsp:useBean id="fimPeriodoTabela" class="java.lang.String" scope="session" /> <% boolean podeAlterar = moduloTabela.temPermissaoPara("Alterar", "Tabela"); boolean podeIncluirRegistro = moduloTabela.temPermissaoPara("IncluirRegistro", "Tabela"); boolean podeAlterarRegistro = moduloTabela.temPermissaoPara("AlterarRegistro", "Tabela"); boolean podeRemoverRegistro = moduloTabela.temPermissaoPara("RemoverRegistro", "Tabela"); if (request.getParameter("tabela") != null) { tabela = request.getParameter("tabela"); session.setAttribute("tabela", tabela ); } Tabela umaTabela = moduloTabela.tabelaDadoCodigo(Integer.parseInt(tabela)); if (request.getParameter("inicioPeriodoTabela") != null) { inicioPeriodoTabela = request.getParameter("inicioPeriodoTabela"); session.setAttribute("inicioPeriodoTabela", inicioPeriodoTabela ); } if (request.getParameter("fimPeriodoTabela") != null) { fimPeriodoTabela = request.getParameter("fimPeriodoTabela"); session.setAttribute("fimPeriodoTabela", fimPeriodoTabela ); } %> <p>&nbsp;

66

<h1><%=umaTabela.getNomeExterno()%></h1> <h2><%=umaTabela.getDescricao()%></h2> <% if (podeAlterar){ %> &nbsp;&nbsp; <form action="index.jsp?objeto=Tabela&acao=Alterar&tabela=<%=umaTabela.getCodigo()%>" method="post"> <input type="submit" name="alterar" value="Alterar Colunas"> </form> <% }%> <br> <br> <center> <form action="index.jsp?&objeto=Tabela&acao=SalvarRegistro&inicioPeriodoTabela=<%=inicioPeriodoTabela%>&fimPeriodoTabela=<%=fimPeriodoTabela%>" method="post"> <% ResultSet campos = moduloTabela.camposDadaTabela(umaTabela.getCodigo()); int quantCampos = moduloTabela.tamanhoResultSet(campos);%> <table border="0"> <% for (int i=1;i<=quantCampos;i++) { %> <colgroup align="left" width="100"> <% } %> <thead valign="top"> <tr> <% campos.beforeFirst(); while (campos.next()) { String nomeExternoCampo = campos.getString("nomeExternoCampo"); if (nomeExternoCampo.equals("")) { nomeExternoCampo = "(sem nome)"; }%> <th bgcolor="#CCCCCC"><b><%=nomeExternoCampo%></b></th> <% } if (podeRemoverRegistro) {%> <th></th> <% }%> </tr> <tbody> <% ResultSet registros = moduloTabela.registrosDadoTabela(umaTabela.getCodigo(), Integer.parseInt(inicioPeriodoTabela), Integer.parseInt(fimPeriodoTabela)); int contRegistros = 0; while (registros.next()) { String cod = registros.getString("cod"); campos.beforeFirst();%> <tr> <% while (campos.next()) { if (!campos.getString("nomeInternoCampo").equals("cod")) {%> <td bgcolor="#CCCCCC"> <% if (campos.getString("tipoCampo").equals(Tabela.TIPOEXTERNO_LISTADEOPCOES)) { Vector valores = moduloTabela.valoresEnumeracaoCampo( umaTabela.getCodigo(), campos.getString("nomeInternoCampo") );%> <select name="campo_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" dir="ltr"> <% for (int k=0;k<valores.size();k++) {%> <option value="<%=(String) valores.get(k)%>" <% if (registros.getString(campos.getString("nomeInternoCampo")).equals((String) valores.get(k))) {%>checked<% } %> ><%=(String) valores.get(k)%></option> <% }%> </select> <% } if (campos.getString("tipoCampo").equals(Tabela.TIPOEXTERNO_DATA)) {

67

String dado = registros.getString(campos.getString("nomeInternoCampo")); String dia = ""; String mes = ""; String ano = ""; if (!dado.equals("")) { dia = dado.substring(8,10); mes = dado.substring(5,7); ano = dado.substring(0,4); }%> <input type="text" name="campo_dia_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" value="<%=dia%>" size="2"> &nbsp;/&nbsp; <input type="text" name="campo_mes_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" value="<%=mes%>" size="2"> &nbsp;/&nbsp; <input type="text" name="campo_ano_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" value="<%=ano%>" size="4"> <% } if ((!campos.getString("tipoCampo").equals(Tabela.TIPOEXTERNO_DATA)) & (!campos.getString("tipoCampo").equals(Tabela.TIPOEXTERNO_LISTADEOPCOES))) {%> <input type="text" name="campo_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" value="<%=registros.getString(campos.getString("nomeInternoCampo"))%>"> <% }%> </td> <% } } contRegistros += 1; if (podeRemoverRegistro) {%> <td> <button type="button" name="removeRegistro_<%=campos.getString("nomeInternoCampo")%>_<%=cod%>" value="remover a linha" onclick="removeRegistro('<%=cod%>')">remover</button> </td> <% }%> </tr> <% }%> </table> <!-- Barra de navegação--> <% if (contRegistros > 0) { Vector periodo;%> <button type="button" name="visualizaPrimeirasDez" value="Primeiras dez linhas" onclick="visualizaPrimeirasDez()"> <img src="Tabela/setadupla_esquerda.bmp" alt="Primeiras dez linhas"> </button> <% periodo = moduloTabela.dezAnterioresDe(umaTabela.getCodigo(), Integer.parseInt(inicioPeriodoTabela), Integer.parseInt(fimPeriodoTabela));%> <button type="button" name="visualizaDezAnteriores" value="Dez linhas anteriores" onclick="visualizaDezAnteriores('<%=(String)periodo.get(0)%>', '<%=(String)periodo.get(1)%>')"> <img src="Tabela/seta_esquerda.bmp" alt="Dez linhas anteriores"> </button> <% periodo = moduloTabela.verificaPeriodoDe(umaTabela.getCodigo(), Integer.parseInt(inicioPeriodoTabela), Integer.parseInt(fimPeriodoTabela));%> Mostrando linhas de <%=(String)periodo.get(0)%> até <%=(String)periodo.get(1)%>.

68

<% periodo = moduloTabela.proximosDezDe(umaTabela.getCodigo(), Integer.parseInt(inicioPeriodoTabela), Integer.parseInt(fimPeriodoTabela));%> <button type="button" name="visualizaProximasDez" value="Próximas dez linhas" onclick="visualizaProximasDez('<%=(String)periodo.get(0)%>', '<%=(String)periodo.get(1)%>')"> <img src="Tabela/seta_direita.bmp" alt="Próximas dez linhas"> </button> <button type="button" name="visualizaUltimasDez" value="Últimas dez linhas" onclick="visualizaUltimasDez()"> <img src="Tabela/setadupla_direita.bmp" alt="Últimas dez linhas"> </button> <% } %> </center> <br> <table border="0" width="100%"> <tr align="right"> <td> <p align="right" > <input type="submit" name="salvar" value="Salvar alterações"> </form> </p> </td> <td width="7%"> <p align="right" > <form action="index.jsp?objeto=Tabela&acao=InserirRegistro" method="post"> <input type="submit" name="inserirNovaLinha" value="Inserir nova linha"> </form> </p> </td> </tr> </table> <script language="JavaScript"> function visualizaPrimeirasDez() { location = "index.jsp?objeto=Tabela&acao=VisualizarRegistros&inicioPeriodoTabela=1&fimPeriodoTabela=10"; } function visualizaDezAnteriores(inicio, fim) { location = "index.jsp?objeto=Tabela&acao=VisualizarRegistros&inicioPeriodoTabela="+inicio+"&fimPeriodoTabela="+fim; } function visualizaProximasDez(inicio, fim) { location = "index.jsp?objeto=Tabela&acao=VisualizarRegistros&inicioPeriodoTabela="+inicio+"&fimPeriodoTabela="+fim; } function visualizaUltimasDez() { location = "index.jsp?objeto=Tabela&acao=VisualizarRegistros&inicioPeriodoTabela=1&fimPeriodoTabela=10"; } function removeRegistro(registro) { location = "index.jsp?objeto=Tabela&acao=RemoverRegistro&registro="+registro; } </script>

69