A linguagem de programação Delphi, ou Turbo Pascal, se tornou um ponto de partida para muitos desenvolvedores. Graças à sintaxe simples e clara e à capacidade de escrever em um estilo procedural, acabou sendo muito fácil de aprender. Muitos o comparariam com o Visual Basic, mas no auge de sua popularidade o Delphi deu muito mais oportunidades graças aos componentes para o trabalho com bancos de dados e seu próprio banco de dados - Interbase.
Apesar de C# e a plataforma .Net terem substituído Delphi e VCL, ainda existe um grande número de seus adeptos. Mesmo aplicativos antigos escritos nesta linguagem podem ser facilmente atualizados usando bibliotecas modernas, por exemplo, o gerador de relatórios FastReport 6 VCL. Por exemplo, sistemas de contabilidade automatizados precisam de relatórios.
Um sistema automatizado de contabilidade de vendas deve permitir a formação de documentos de pagamento, como um recibo de venda. Neste artigo, veremos como criar e imprimir um recibo de venda a partir de um aplicativo Delphi. Usaremos o gerador de relatórios FastReport VCL para criar o próprio recibo e um aplicativo de usuário para imprimi-lo. Além de imprimir, você pode simplesmente exibir seu recibo na janela de exibição de relatório, na qual você pode imprimir o recibo, salvá-lo em um dos formatos de documento mais comuns, enviá-lo por e-mail ou carregá-lo para armazenamento em nuvem.
Para criar um recibo de venda, precisamos das informações sobre: pedido, cliente, vendedor e conteúdo do pedido.
Neste exemplo, usaremos o banco de dados demo.mdb da distribuição FastReport VCL.
Para criar a aplicação, usaremos o ambiente de desenvolvimento Delphi 7.
Vamos adicionar dois botões ao formulário: um para executar o designer de relatório, outro para exibir ou imprimir o relatório concluído. Adicione o componente OpenDialog ao formulário também - isso nos permitirá selecionar o arquivo de relatório desejado para abrir.
Agora, vamos prosseguir para a criação de uma fonte de dados para o relatório - recibo de venda. Conforme mencionado acima, utilizamos o banco de dados demo.mdb, ou mais precisamente as tabelas: Pedidos, Clientes, Itens, Peças e Funcionário. Usaremos o componente ADOConnection para conectar ao banco de dados e os componentes ADOTable para obter dados de cada tabela. A tabela Pedidos está vinculada às tabelas Clientes, Itens e Funcionários. Portanto, precisamos configurar essas conexões. Para isso, adicione um componente DataSource para cada ADOTable e para disponibilizar todas essas tabelas no relatório, adicione o componente frxBDDataSet para cada tabela.
Assim, para trabalhar com uma tabela, devemos obter três componentes: ADOTable, DataSource, frxDBDataSet.
Em ADOConnection, crie uma conexão com o banco de dados demo.mdb a partir da entrega do FastReport VCL.
As configurações desses componentes (para cada uma das cinco tabelas) estão abaixo.
Tabela Orders:
1. Para ADOTable, set as propriedades:
− Connection – ADOConnection1;
− Name – Orders;
− TableName – orders.
2. Para DataSource, set as propriedades:
− DataSet – Orders.
3. Para frxDBDataSet, set as propriedades:
− DataSet – Orders;
− UserName – Orders.
Tabela Customers:
1. Para ADOTable, set as propriedades:
− Connection – ADOConnection1;
− Name – Customer;
− IndexFieldnames – CustNo;
− MasterSource – DataSource1;
− MasterFields - CustNo
− TableName – customer.
2. Para DataSource, set as propriedades:
− DataSet – Customer.
3. For frxDBDataSet, set the properties:
− DataSet – Customer;
− UserName – Customer.
Tabela Items:
1. Para ADOTable, set as propriedades:
− Connection – ADOConnection1;
− Name – Items;
− IndexFieldnames – OrderNo;
− MasterSource – DataSource1;
− MasterFields - OrderNo
− TableName – items.
2. Para DataSource, set as propriedades:
− DataSet – Items.
3. Para frxDBDataSet, set as propriedades:
− DataSet – items;
− UserName – Items.
Tabela Parts:
1. Para ADOTable, set as propriedades:
− Connection – ADOConnection1;
− Name – Parts;
− TableName – parts.
2. Para DataSource, set as propriedades:
− DataSet – Parts.
3. Para frxDBDataSet, set as propriedades:
− DataSet – Parts;
− UserName – Parts.
Tabela Employee:
1. Para ADOTable, set as propriedades:
− Connection – ADOConnection1;
− Name – Employee;
− IndexFieldnames – EmpNo;
− MasterSource – DataSource1;
− MasterFields - EmpNo
− TableName – employee.
2. Para DataSource, set as propriedades:
− DataSet – Employee.
3. Para frxDBDataSet, set as propriedades:
− DataSet – Employee;
− UserName – Employee.
As tabelas Customer, Items e Employee têm uma relação com DataSource1 (a primeira tabela - Pedidos). Eles são vinculados por chave de forma que para um registro na tabela Pedidos os registros correspondentes dessas tabelas sejam selecionados.
A tabela Itens contém informações sobre os itens do pedido. Não há dados específicos sobre o item - apenas um link para a tabela de peças. Vamos adicionar dois campos da tabela Peças - Preço e Descrição - à tabela ADOT para a tabela Itens. Portanto, não precisamos usar a tabela de peças no futuro.
Para adicionar os campos computáveis à tabela de Itens, clique duas vezes no objeto ADOTable e veja uma janela com os campos da tabela. Inicialmente está vazio, mas você pode carregá-los a partir do menu de contexto selecionando Adicionar campos…:
Os campos Price e Description serão obtidos da tabela parts.
Select New field… no menu content e acrescente o campo Price:
Acrescente a descrição do produto (campo Description) tda mesma forma:
Agora, assim que criamos a fonte de dados e configuramos os relacionamentos entre as tabelas, vamos adicionar alguns botões ao formulário. Como você deve se lembrar, o primeiro botão inicia o designer de relatório e o segundo exibe o relatório.
Não se esqueça de adicionar o componente frxReport ao formulário.
Adicione um evento de clique para cada um dos botões. Aqui está o código do manipulador de eventos para exibir o designer de relatório:
1 |
frxReport1.DesignReport();
|
Para imprimir o relatório finalizado, você pode adicionar a caixa de diálogo Abrir Arquivo ao formulário para selecionar o relatório criado no designer. O código para imprimir o relatório será assim:
1 2 3 4 5 6 7 8 |
OpenDialog1.Filter := 'FastReport VCL (*.fr3)|*.FR3'; OpenDialog1.Execute(); if Length(OpenDialog1.FileName)>0 then begin frxReport1.LoadFromFile(OpenDialog1.FileName); frxReport1.PrepareReport(); frxReport1.Print(); end |
Se você precisar visualizar o relatório, pode substituir a função Imprimir pela exibição do Relatório:
1 |
frxReport1.ShowReport();
|
Agora você pode executar o aplicativo, clique no botão Projetar relatório e prossiga para a criação do relatório.
Em primeiro lugar, selecione os datasets.
Não precisamos da tabela Partes neste relatório, portanto, não há necessidade de selecioná-la. Vamos prosseguir para a criação do modelo. Existem duas bandas de dados em nosso relatório: MasterData e DetailData. Na primeira banda de dados, geramos as informações sobre o client:
…e de customer:
Esta banda está vinculada à tabela Pedidos. As informações de conteúdo do pedido serão exibidas em uma faixa de dados subordinada: nome do produto, quantidade, preço do item, preço para a quantidade especificada.
Totais - como o valor líquido total, taxa de imposto, valor final incluindo imposto - serão exibidos no rodapé.
Os subtotais do total da linha são calculados multiplicando a quantidade e o preço do item como parte de uma única entrada da tabela:
[<Items."Qty">*<Items."Price">]
Os subtotais líquidos são calculados pela fórmula:
∑(item quantity * item price)
[SUM(<Items."Qty">*<Items."Price">)]
Valor total do imposto:
∑(item quantity* item price * tax rate)
[SUM(<Items."Qty">*<Items."Price">)*0.05]
Total devido:
∑(item quantity * item price)+ ∑( item quantity * item price * tax rate)
[SUM(<Items."Qty">*<Items."Price">) + SUM(<Items."Qty">*<Items."Price">)*0.05]
Além disso, o método de pagamento é refletido no rodapé da base de dados. Espera-se que seja especificado ao imprimir um recibo de venda manualmente.
Aqui podemos dizer que nosso relatório está pronto para exibição. Salve-o no armazenamento local e feche o designer de relatórios. Usando o segundo botão no formulário, selecione o relatório salvo e imprima (se você usou a opção de impressão no código) ou visualize-o se você escolheu a opção de visualização do relatório - ShowReport().
É isso. Com pouco esforço, você pode implementar funcionalidades úteis para seu sistema de contabilidade. Agora, na janela de visualização do relatório, você pode imprimi-lo ou salvá-lo em um dos formatos de documento populares: PDF, DOCS, XLSX, XML, RTF e muitos outros.