Inicio.

Nesta continuação iremos construir um relatório simples para o nosso aplicativo, utilizando o Kugar, uma ferramenta de geração de relatórios pertencente ao pacote Koffice do KDE. Existem outras ferramentas de relatórios para Linux, como o Agata Report, mas achei o Kugar por ser nativo do KDE mais fácil de integrar a um aplicativo desenvolvido em Qt.

Obs: Baixe aqui os fontes do aplicativo.

O Kugar gera o relatório em duas etapas, primeiro você cria um modelo no Kugar Designer, que sera a parte gráfica do relatório, depois cria o arquivo de dados que tem de ser no formato XML, obedecendo ao DTD (Document Type Definition) do Kugar. Antes de mais nada voltemos ao nosso aplicativo de exemplo, cadastro, abrindo a tela principal, fClientes_Parent.ui, no Qt Designer:

Abaixo:Nosso aplicativo.(Clique na imagem para ampliar).

>Nosso aplicativo

Vamos adicionar mais um botão para gerar o relatório, de a ele o nome de botao_Relatorio:

Abaixo, Tela do aplicativo com botão do relatório.(Clique na imagem para ampliar).

>Aplicativo + botão de impressão

Podemos agora criar o modelo de nosso relatório no Kugar Designer, lembrando que o Kugar faz parte do Koffice, acredito que todas as distribuições que tenham o KDE tenham também o Koffice, você pode encontrar detalhe de como obter e instalar o Kugar em: http://www.koffice.org/kugar/ , detalhes podem ser obtidos em: http://docs.kde.org/development/pt/koffice/kugar/ . Abra o Kugar Designer:

Abaixo, Kugar Designer.(Clique na imagem para ampliar).

>Kugar Designer

Agora clique na aba general:

Abaixo, Kugar Designer.(Clique na imagem para ampliar).

> Kugar Designer

Escolha o tamanho de pagina que quiser, aqui eu escolhi A4, e clique duas vezes para começarmos:

Abaixo, Kugar Designer, tela principal.(Clique na imagem para ampliar).

>Kugar Designer

Abaixo a esquerda você tem a barra de “bandas” do Kugar Designer, assim como o “Quick Report” do Delphi® , o Kugar é orientado a “bandas” ou faixas ou sessões, como queira. Clique em Rh para adicionarmos uma banda “Report Header” ao relatório:

Abaixo, Kugar Designer com Header.(Clique na imagem para ampliar).

>Kugar Designer com Header

Clique a direita na propriedade height e ajuste para 25, depois clique a esquerda na barra de componentes em “ab” para colocarmos um label no header, clique duas vezes no label para editar o texto e digite “Sistema exemplo QT”, centralize na banda, clique na propriedade “family” e se abrira uma caixa de dialogo de fontes, escolha as opções que achar melhor:

Abaixo, Kugar Designer com Header e label.(Clique na imagem para ampliar).

>Kugar Designer com Header e label

Repita o procedimento e coloque um “Page header” (botão “ph”, embaixo) e mais um label com o texto “Cadastro de clientes”:

Abaixo, Kugar Designer com Page Header.(Clique na imagem para ampliar).

>Kugar Designer com Page Header

Novamente, repita o procedimento agora colocando um “Detail Header” (Dh), ele ira abrir uma pequena janela pedindo para informar o nivel da banda, ele vira com o zero (0) por default, pode deixar e clique ok:

Abaixo, Kugar Designer com Detail Header.(Clique na imagem para ampliar).

>Kugar Designer com Detail Header

Acerte a largura do Detail Header para 25 e coloque dois labels, um para o código do cliente e o outro para o nome, que são os campos da nossa tabela:

Abaixo, Kugar Designer com Detail Header e labels.(Clique na imagem para ampliar).

>Kugar Designer com Detail Header e labels.

Agora coloque uma banda de detalhes, “Detail” ou botão “D” embaixo, novamente se abrira a janela pedindo o nivel, deixe o zero default, depois de acertar a altura da banda, coloque dois campos (“Field”, botão “F”) logo abaixo e alinhados com os dois labels da “Detail Header”, Código e Nome, em cada um deles você ira setar as propriedades “Name” e “Type”, tomando cuidado com a propriedade “name”, pois ela é case-sensitive, ou seja, o nome tem que ser igual ao que esta no banco de dados, se for minúsculo la tem de ser também no Kugar, apesar de o Kugar não se ligar diretamente ao banco. A propriedade “Type” também tem de ser de acordo com o tipo do campo no banco:

Abaixo, Kugar Designer com Detail.(Clique na imagem para ampliar).

>Kugar Designer com Detail

Agora coloque um “Page Footer” que ser o rodapé da pagina, coloque dois “Special Field”, um para data e outro para numero da pagina, isto você seta na propriedade “Type”:

Abaixo, Kugar Designer page Footer.(Clique na imagem para ampliar).

>Kugar Designer page Footer

Esta pronto o nosso modelo, lembrando que ele é extremamente simples, serve somente para iniciantes aprenderem como fazer. Vá ao diretório sistemaqt onde esta nosso projeto e dentro dele crie outro diretório chamado relatórios, salve nosso modelo neste diretório, o Kugar escolhera automaticamente a extensão .ktf. Falta agora criarmos a segunda parte, o segundo arquivo que é o arquivo de dados que tem a extensão .kdf, isto sera feito pelo nosso aplicativo, extraindo os dados do banco de dados e gerando o arquivo .kdf de acordo com o DTD do Kugar, este arquivo é um arquivo XML. Agora abra novamente o projeto no Kdevelop para criarmos o código associado ao botão imprimir que criamos no designer, abra o arquivo cadastro.h e adicione em private slots a seguinte linha: void gera_Relatorio(); Ele ficara assim:


  private slots://Nossas funções de trabalho.
    void grava_na_Tabela();
    void altera_na_Tabela();
    void exclui_na_Tabela();
    void limpa_Tela();
    void gera_Relatorio();



Adicione na sessão de declaração de classes as seguintes linhas:

class Qfile;
class QProcess;

Ela ficara assim:
class QSqlQuery;
class QSqlQueryModel;
class QFile;
class QProcess;

Depois vá até a sessão private: e acrescente as declarações:

QFile* arquivo; //Para gerar o arquivo do relatório.

//Para charmar o Kugar e verificar a existencia de arquivos anteriores.
QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;

Ela ficara assim:

private:
  QSqlQuery* query_Clientes;//Nossa query de trabalho.
  QSqlQueryModel* model_Clientes;

QFile* arquivo;

QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;

Agora abra cadastro.cpp, vá até a sessão de includes e coloque:

#include <QFile>// Para gerar o relatório.
#include <QProcess> //Para chamar o Kugar
#include <QTextStream>//Para escrever no arquivo.

Depois vá ao final do constructor de fCad_Clientes e instancie os objetos declarados em cadastro.h:

arquivo=new QFile(this);

chama_Kugar=new QProcess(this);
exclui_Arquivo=new QProcess(this);
cria_Arquivo=new QProcess(this);
Abaixo crie a linha para conectar o SLOT gera_Relatorio() ao SIGNAL clicked() do botão botao_Relatorio:

connect(botao_Relatorio,SIGNAL(clicked()),this,SLOT(gera_Relatorio()));

lembrando que o constructor é a parte do arquivo onde esta a declaração de inicio:

fCad_Clientes::fCad_Clientes(QWidget *parent, const char *name)

Lembre-se de que para cada objeto instanciado com new você deve colocar um delete, va para o destructor de fCad_Clientes e coloque os delete:

fCad_Clientes::~fCad_Clientes()
{
  delete query_Clientes;
  delete model_Clientes;
  delete chama_Kugar;
  delete exclui_Arquivo;
  delete cria_Arquivo;
  delete arquivo;
}

Agora, vá até o final e acrescente a definição de gera_Relatorio();


void fCad_Clientes::gera_Relatorio()
{
  //Verifica a existencia de arquivos anteriores, se não, cria um novo arquivo de dados vazio.
  if (arquivo->exists("/home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf"))
  {
    exclui_Arquivo->start("rm /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
    exclui_Arquivo->waitForFinished();
    cria_Arquivo->start("/usr/bin/touch /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
    cria_Arquivo->waitForFinished();
  }
  else
  {
    cria_Arquivo->start("/usr/bin/touch /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
    cria_Arquivo->waitForFinished();
  }
  QSqlQuery* query_rel=new QSqlQuery;// A query do relatório
  query_rel->exec(" select * from clientes order by nome");

  //Seta o objeto arquivo para o arquivo no disco e escreve nele.
  arquivo->setFileName("/home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
  if (arquivo->open(QIODevice::WriteOnly | QIODevice::Text))
  {
    //Aqui é de acordo com o DTD do Kugar.
    QTextStream out(arquivo);
    out <<"<?xml version="<<QChar(34)<<"1.0"<<QChar(34)<<" encoding="<<QChar(34)<<"UTF-8"<<QChar(34)<<"?>"<<"\n";
    out <<"\n";
    out <<"<!DOCTYPE KugarData ["<<"\n";
    out <<" <!ELEMENT KugarData (Row* )>"<<"\n";
    out <<" <!ATTLIST KugarData"<<"\n";
    out <<" Template CDATA #REQUIRED>"<<"\n";
    out <<"\n";
    out <<" <!ELEMENT Row EMPTY>"<<"\n";
    out <<" <!ATTLIST Row "<<"\n";
    out <<" level CDATA #REQUIRED"<<"\n";
    out <<" codigo CDATA #REQUIRED"<<"\n";
    out <<" nome CDATA #REQUIRED>"<<"\n";
    out <<"]>"<<"\n";
    out <<"\n";
    out <<"<KugarData Template="<<QChar(34)<<"relatorio_clientes.ktf"<<QChar(34)<<">"<<"\n";
    while (query_rel->next())
    {
    out <<"<Row level="<<QChar(34)<<"0"<<QChar(34)<<" codigo="<<QChar(34)<<query_rel->value(0).toString()<<QChar(34)<<" nome="<<QChar(34)<<query_rel->value(1).toString()<<QChar(34)<<" />"<<"\n";
         
     }
     out <<"</KugarData>"<<"\n";
     //Aqui chama o Kugar para mostrar o relatório.
    chama_Kugar->start("kugar /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
  }
  delete query_rel;
}



Compile, rode o aplicativo e clique no botão de gerar relatório:

Abaixo, o relatório pronto.(Clique na imagem para ampliar).

>relatório pronto

O relatorio com preview:

Abaixo, relatorio com preview.(Clique na imagem para ampliar).

>relatorio com preview

Obs: Baixe aqui os fontes do aplicativo.


Tutorial anterior: Desenvolvendo um aplicativo cliente/servidor em C++ Qt/Kdevelop
Próximo Tutorial: Integrando o Agata Report a um aplicativo Qt

Pagina inicial


Comentários:


Nenum comentário

Deixe seu comentário:


 *
 *

 *
  Campos marcados com * são obrigatórios.