Cadastros e relatórios dinâmicos em Delphi

Neste artigo é apresentada uma solução que permite aos programadores deixar o usuário criar sozinho um novo cadastro no sistema em Delphi, bem como uma listagem associada a esse cadastro.

Fique por dentro
Empresas que estão ligadas ao desenvolvimento de software preocupam-se cada vez mais em construir softwares que sejam robustos e atendam a todas as necessidades de seus clientes. Sistemas de gestão empresarial, ERP (Enterprise Resource Planning), sempre têm a necessidade de novos módulos, ou adequações para atender um maior público.

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. "

[...] continue lendo...

Artigos relacionados