Módulos como financeiro, administrativo e tantos outros, geralmente possuem seus cadastros e movimentos, e normalmente possuem uma grande quantidade de campos. Por esses e tantos outros motivos, há vários relatórios, com campos diversificados, afim de tornar esses cadastros e movimentos mais eficientes. Este artigo apresenta uma forma de permitir aos próprios usuários a criação de cadastros e relatórios, tornando o sistema muito dinâmico e eficiente em diversos aspectos.
Partindo da ideia que um sistema inteligente é aquele que pode ser customizado de acordo com a necessidade do cliente, hoje em dia não temos muitos sistemas inteligentes. Há diversos sistemas grandes, que são construídos com base em um ramo de negócio.
Porém, quando é necessário fazer uma simples mudança em um relatório ou em um cadastro, os clientes recebem a reposta que o sistema está estável e que diversas outras empresas usam o mesmo sem problemas. Mas a resposta ideal à sua solicitação seria: vamos adequar, vamos fazer tais mudanças e alterações.
Sendo assim é hora de pensar, será que realmente meu negócio está competitivo? Como deve ser a estrutura, da modelagem de dados? Meus cadastros, relatórios e gráficos necessitam constantemente de mudanças?
Então por que não fazer um sistema mais inteligente, ou adicionarmos um módulo ao nosso sistema que permita ao próprio cliente, customizar e criar seus próprios relatórios e ainda indo um pouco mais longe, por que não dar a possibilidade de ele mesmo criar cadastros. Veremos uma forma de como um cliente pode criar cadastros e relatórios personalizados.
Para isso usaremos como banco de dados o Firebird, a ferramenta de relatório será o FastReport, e a parte de conexão de dados usaremos unidac. Lembrando que qualquer que seja o banco de dados, ou qualquer que seja a empresa, seu negócio tem que ser inteligente para que tenha uma maior competitividade.
FastReport
O FastReport era uma suíte unicamente externa para geração de relatórios em Delphi. Essa suíte passou a ser incorporada como ferramenta oficial de desenvolvimento de relatórios a partir do Delphi XE2, possuindo uma versão própria para essa finalidade.
O FastReport possui algo muito interessante que é a conversões de relatórios Quick Report, Rave Reports e Report Builder por meio de units. É considerado por muitos uma ótima ferramenta de geração de relatórios.
Com ele podemos criar desde relatórios simples até os mais complexos. A suíte disponibiliza também o FastScript que permite a criação de scripts em várias linguagens de programação, o FastReport Exports que permite a exportação de relatórios do FastReport para diversos formatos como XLS, HTML, CSV entre outros. Dentre seus vários recursos, da sua versão comercial, usaremos o cross-tab, para criarmos esses relatórios personalizados.
Unidac
O UniDAC provê suporte e acesso a diversos servidores de banco de dados como Oracle, Firebird, InterBase, Microsoft SQL Server, PostgreSQL, MySQL, entre outros. Atende a diversas ferramentas (Delphi, C++ Builder, Lazarus e Free Pascal) em diferentes plataformas (Windows, Mac OS, iOS, Linux e FreeBSD).
Pode se dizer que a estrutura do Unidac é composta por dois elementos. O primeiro deles seria uma engine, ou seja, seu motor que provê ao desenvolvedor uma interface de programação comum e unificada, receptível aos diversos bancos suportados. Já o segundo elemento é a sua parte fundamental, que é a sua camada de acesso a dados.
Esse acesso a dados é composto pelos provedores (providers), que irão fazer a interação entre a engine e o servidor de banco de dados. Cada provider fica então responsável por trabalhar com um servidor de banco de dados específico. Por exemplo, o TOracleUniProvider para Oracle, TInterBaseUniProvider para InterBase, TPostgreSQLUniProvider para PostgreSQL.
Funcionamento da aplicação
A aplicação permitirá ao usuário criar novos cadastros simples e relatórios simples no sistema sem solicitar uma alteração do sistema ao seu programador. Através de um cadastro o usuário poderá criar a tela, quais campos serão utilizados, etc. Será uma aplicação até relativamente simples. Teremos uma tela principal e teremos um menu, de título Procedimentos, com os seguintes itens: Criar Cadastros, Excluir Cadastros, Sair. Na Tabela 1 vemos as funcionalidades dos menus.
Menu |
Funcionalidade |
Criar Cadastro |
Irá chamar a tela onde o usuário criará os seus cadastros. Informando o nome da tabela, os seus campos e quais campos irão aparecer em relatório. Terá imagens e textos informando ao usuário como fazer todo o procedimento de criação. |
Excluir Cadastro |
Irá chamar a tela onde terá uma lista dos cadastros criados. Para que o usuário possa selecionar um cadastro a ser excluído. |
Sair |
Fecha a nossa aplicação. |
Tabela 1. Funcionalidades dos menus
Ao lado deste menu Procedimento teremos um outro menu, Cadastros, e obviamente os itens deste menu, serão os cadastros criados. Por exemplo, caso sejam criados dois cadastros: Clientes e Ordem de Serviço, então esses seriam os itens deste menu.
Ao clicar sobre um menu desses, abrirá a tela do referente cadastro. Nesta tela terá uma grade de dados utilizando um DbGrid, onde será feita a inclusão, alteração e exclusão de dados. Para facilitar toda manipulação de dados, será utilizado um DbNavigator. Também haverá o botão imprimir, que chamará o relatório que foi criado junto com o cadastro, escolhendo quais campos serão impressos.
Enfim, será um cadastro com relatório, com várias consistências, verificações de erros e tudo mais, para que possa ter uma boa usabilidade.
Criando o banco de dados
Para começar, vamos fazer a criação do banco de dados da nossa aplicação. Como é possível ver na Figura 1, teremos uma modelagem de dados simples baseada em apenas duas tabelas.
A tabela TABELA_USUPER é onde são cadastradas todas as tabelas que o usuário criou. Já a tabela TAB_CAMPOS, é onde são cadastradas todas as informações das tabelas.
Informações como nome do campo, apelido do campo, se irá aparecer na grade de dados e no relatório, qual o tipo do campo (Texto, Número, Moeda, Data, Hora, Data e Hora, Observação), e se o campo deverá ou não aparecer no relatório. Para essa tabela criamos também um Generator e uma Trigger, que serão os responsáveis para incrementar o campo código a cada novo registro.
Figura
1. Tabelas do Banco de Dados
Para o nosso banco de dados foi adotada a versão 2.1 do Firebird. O script SQL para a criação do banco encontra-se exibido na Listagem 1.
Listagem 1. Script de criação do banco de dados
SET SQL DIALECT 3;
SET NAMES WIN1252;
CREATE DATABASE '<DIRETÓRIO DO BANCO DE DADOS>\ARTBI.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1252;
CREATE GENERATOR GEN_TAB_CAMPOS;
CREATE TABLE TAB_CAMPOS (
CODIGO INTEGER NOT NULL,
TABELA VARCHAR(40) NOT NULL,
CAMPO VARCHAR(30) NOT NULL,
COLUNA VARCHAR(30),
TIPO VARCHAR(15),
RELATORIO CHAR(1)
);
CREATE TABLE TABELA_USUPER (
TABELA VARCHAR(40) NOT NULL,
APELIDO VARCHAR(40)
);
ALTER TABLE TABELA_USUPER ADD CONSTRAINT PK_TABUSERCODIGO PRIMARY KEY (TABELA);
ALTER TABLE TAB_CAMPOS ADD CONSTRAINT PK_TABCODIGO PRIMARY KEY (CODIGO);
ALTER TABLE TAB_CAMPOS ADD CONSTRAINT FK_CAMCODIGO FOREIGN KEY (TABELA)
REFERENCES TABELA_USUPER (TABELA) ON DELETE CASCADE ON UPDATE CASCADE;
SET TERM ^ ;
CREATE TRIGGER NEW_TAB_CAMPOS FOR TAB_CAMPOS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
IF (NEW.CODIGO IS NULL) THEN
NEW.CODIGO = GEN_ID(GEN_TAB_CAMPOS, 1);
end
^
SET TERM ; ^
Criamos uma estrutura no banco de dados para armazenar de forma adequada os dados de novos cadastros. Temos a tabela TAB_CAMPOS que armazena os campos de uma determinada tela e suas características e a tabela TABELA_USUPER que armazena as tabelas que precisarão ser criadas no banco de dados para armazenar os dados do novo cadastro.
Criando a aplicação
No Delphi criamos um novo projeto Win32 e salvamos a unit principal com o nome de Unt_Principal.pas e o formulário como Frm_Principal. O projeto salvamos como CriarCadastro ou conforme o gosto.
Adicionamos a seguir um novo formulário, salvando-o como Unt_CriaCadastro e o nomeando-o como Frm_CriaCadastro. Agora repetindo o processo, adicionamos mais um formulário e salvamos como Unt_ExcCadastro e o nomeamos como Frm_ExcCadastro.
Finalizando a criação dos formulários, adicionamos o último formulário e sa ...