Esse artigo faz parte da revista Clube Delphi edição 5. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Curso

 

Sistema de Bibliotecas: Integridade e Relatório

 

Olá companheiro, estamos de volta com nosso pequeno sistema. Lembrando, todos os nossos cadastros e consultas estão concluídos. Durante nossa jornada, vimos os princípios básicos de construção de um sistema de controle de biblioteca e alguns recursos interessantes como transações, formulários modelo e consultas SQL. Como prometido, nossos próximos passos para conclusão são: o refinamento do controle de integridade dos dados do sistema e os relatórios. Para iniciarmos, vamos analisar as inconsciências do programa e tentar resolvê-las.

         O Paradox, arquivo de dados utilizado em nossa aplicação, já possui o controle de integridade nas próprias definições das tabelas. No início da construção do sistema, não utilizamos estes controles integrados do Paradox, pois apresentam muitos problemas. Como já foi dito, estes funcionam muito bem quando tudo está ok, mas quando algum índice ou alguma tabela relacionada é corrompida, a manutenção torna-se uma tarefa muito mais complexa e demorada. Portanto, todos os nossos controles serão feitos manualmente.

 

Nota: Se estivéssemos utilizando uma base de dados como Oracle, MS SQL Server, MS Access, e outras, o uso do controle de integridades no próprio banco de dados seria o recomendado. Não é o nosso caso.

 

Fazendo o refinamento do controle de Integridade dos Dados

 

         Neste ponto deveremos identificar as telas que estão com alguma inconsistência na integridade relacional, e corrigir o problema. A integridade relacional, ou integridade referencial, é a que garante que o “Modelo Relacional” de um banco de dados. Por exemplo, não poderia existir um empréstimo sem um cliente referente. Também não poderiam haver livros emprestados sem estarem relacionados a um empréstimo.

 

NOta: O caminho que estamos seguindo não é o modo correto de implementar e modelar um sistema real. Em uma situação de análise, todas as integridades e tabelas devem ser definidas antes da elaboração do sistema, e não após, como estamos fazendo. O único motivo de estarmos seguindo este caminho é o fato de este ser melhor para a didática.

 

Figura 1 – Estrutura da tabela de Emprestimos

 

Parte I – Cadastro de Leitores

 

         Esta é para quem nos acompanhou desde o início: a tela de manutenção de leitores foi desenvolvida na primeira edição de nosso jornal. Na época, esta tela foi bem tratada, indicando ao usuário campos em branco ou campos digitados de forma incorreta.

         Agora devemos garantir sua integridade não permitindo a exclusão de leitores que já tenham algum empréstimo efetuado. Para isto, primeiramente, deveremos criar um novo índice na tabela de empréstimos. Abra então o Database Desktop, clique no menu Tools | Utilities | Restructure, e em seguida selecione a tabela de empréstimos para que a estrutura da tabela seja exibida, conforme mostra a figura 1.

         Escolha a opção Secondary Indexes no ComboBox à direita e clique no botão Add, para que a janela Add Index seja mostrada, conforme a figura 2.

 

Figura 2 – Secondary Indexes

 

         Escolha o campo Leitor, e dê um duplo clique sobre ele. Clique no botão ok, e na confirmação do nome do índice, digete IndCodleitor. Dê ok nas janelas remanescentes e volte ao nosso projeto.

         Abra o formulário de leitores e insira um objeto TTable. Configure suas propriedades de acordo com a tabela abaixo:

 

Tabela 1: Objeto TTable

Name

tbEmprestimo

DatabaseName

Biblio

TableName

Emprestimo.db

IndexName

IndCodLeitor

 

Figura 3 – Tela de Leitores

 

         A validação será feita no momento em que o usuário tentar confirmar uma exclusão. Abra então, o evento OnClick do botão Confirmar:

 

procedure TFrmCadLeitor.BtConfirmarClick(Sender: TObject);

begin

    if (tbLeitor.State=dsInsert) or(TbLeitor.State=dsEdit) then

    begin

          if estacorreto then

             tbleitor.post

          else

             Exit;

    end

       else

       begin

            if tbEmprestimo.FindKey ([TbLetor.Fieldbyname('Codigo').asInteger]) then

               ShowMessage ('Este leitor não poderá ser excluído. Permissão inválida.')

            else

                begin

                     TbLeitor.Delete;

                     PanelDados.Enabled:=True;

                end;

       end;

                   ControlaBotoes(TRUE);

end;

 

         Conforme pode ser observado, é feito um FindKey na tabela de empréstimos, e caso o leitor possua algum empréstimo efetuado, este não poderá mais ser excluído.

 

Parte II – Tela de Livros

 

         O controle da tela de livros será muito parecido com o de leitores. A tela de livros foi construída em nossa edição número 2, e pode ser visualizada na figura 4.

 

Figura 4:Tela de Livros

 

         Aqui, não permitiremos que seja excluído um livro que esteja participando de algum empréstimo. Precisaremos agora, de um novo índice na tabela de LivrosEmp. No Database Desktop, selecione o menu Tools | Utilities | Restructure e escolha a tabela desejada para reestruturá-la, conforme exibido na figura 5.

 

Figura 5: Tabela LivrosEmp.db

 

         No ConboBox à direita, selecione a opção Secondary Indexes. Clique no botão Add, e na janela New Index, selecione os campos CodLivro e Serie, dando um clique duplo sobre eles. Dê ok para fechar a janela New Index e digite IndLivroSerie, como nome do índice. Clique novamente sobre o botão Add, para adicionarmos um outro índice. Desta vez, selecione somente o campo CodLivro, e dê ok, digitando IndLivro como nome do índice. Confirme a alteração e volte ao nosso projeto, no Delphi.

         Abra o formulário de Livros, e insira 2 (dois) objetos TTable. Estes objetos servirão para verificar se o livro ou exemplar atual já participaram de algum empréstimo. Configure suas propriedades de acordo com as tabelas 2 (dois) e 3 (três):

         Temos duas situações de crítica: na exclusão de um livro e na exclusão de um exemplar. Vamos à exclusão dos livros através do evento OnClick do botão Confirmar:

 

procedure FrmCadastro.btConfirmarClick(Sender:TObject);

begin

if (opc=’I’) or (opc=’A’) then

Tblivro.post

else begin

if TbLivrosEmpIndlivro.FindKey(Tblivro.

Fieldbyname(‘CodLivro’).asinteger]) then

ShowMessage(‘Não é possível excluir este livro.

Acesso negado.’);

else begin

TbExemplar.Last;

while not tbExemplar.Eof do begin

TbExemplar.Delete;

TbLivro.Delete;

end;

end;

ControlaBotoes(TRUE);

end;

 

Tabela 2: Objeto TTable

DatabaseName

tbLeitor

Name

tblivrosEmpIndLivro

TableName

LivrosEmp.db

IndexName

IndLivro

 

Tabela 3: Objeto TTable

DatabaseName

tbLeitor

Name

tblivrosEmpIndLivroSerie

TableName

LivrosEmp.db

IndexName

IndLivroSerie

 

         E a segunda situação a ser tratada, é na tentativa de exclusão de um exemplar, que é processada no evento OnClick do botão btExcluirExemplar:

 

procedure TfrmCadLivro.

btExcluirExemplar

(Sender:Tobject);

begin

if tbLivrosEmpIndLivroSerie.

FindKey([tbExemplar.

Fieldbyname(‘CodLivro’).

asInteger,Tbexemplar.

Fieldbyname(‘serie’).

asInteger then

ShowMessage(‘Este exemplar

não pode ser excluído.

Acesso negado’)

else

TbExemplar.Delete;

end;

 

         Ou seja, os livros e exemplares que já participaram de algum empréstimo não poderão ser excluídos. Isto irá garantir que nosso sistema fique consistente e que nossos relatórios funcionem corretamente. Veremos agora como implementá-los.

 

Implementando Relatórios no Sistema

 

         Estamos iniciando aqui nossos últimos passos na aplicação, através do controle de relatórios. No Delphi, são várias as possibilidades de criação de relatórios. Veja a seguir a descrição das principais:

 

Figura 6: Gerador de Relatórios – Crystal Reports

 

Gerador de Relatórios

 

         Geradores de relatório são programas que possibilitam a fácil construção de relatórios, sem a necessidade de extensa programação e geralmente sem interferir no código fonte. Existem vários geradores de relatórios compatíveis com o Delphi no mercado. Vamos citar por exemplo o caso do Crystal Reports, famosa ferramenta. Você constrói o relatório no Crystal, sem interferir no seu programa Delphi. Os relatórios podem ser salvos em arquivos, e a partir daí, os arquivos podem ser abertos para visualização pelo próprio Crystal ou pelo Delphi, através de um componente OCX disponibilizado pelo fabricante. Neste caso, um Run-Time ou uma versão reduzida do gerador deverá ser instalada na máquina cliente, junto com o seu programa.

         É desta forma que a maioria dos geradores de relatório funcionam. Como vantagem, eles apresentam uma velocidade de construção muito grande, devido as facilidades e os inúmeros recursos já prontos pela ferramenta. Como desvantagem encontra-se a necessidade de instalação de uma parte do gerador juntamente com o aplicativo, e também as limitações impostas pelo software, pois nenhum gerador permitirá criar todas a situações possíveis, em contrapartida ao desenvolvimento manual do relatório. Dentre os principais geradores do mercado, podemos encontrar o Crystal Reports, o Report Smith (que acompanhava as primeiras versões do Delphi), o ReportFX e outros.

         Esta parte do curso não irá explorar nenhum gerador, pois isto não é uma opção padrão e poderá ser discutida com mais detalhes em futuras edições.

 

Desenvolvimento Manual

 

         O Delphi também permite a criação manual de relatórios (como no Clipper – indicando cada linha a ser impressa). O objeto TPrinter é o responsável por disponibilizar o acesso à impressora. Este objeto contém todos os métodos e propriedades necessárias, como por exemplo: PaperSize, LineTo e Draw. A vantagem de utilizar o objeto TPrinter é que este dá total liberdade ao programador, já que todo o relatório deverá ser codificado. Os pontos negativos são vários: a criação do relatório é muito mais trabalhosa, assim como a manutenção do mesmo. Novamente este tópico não será abordado, e servirá como matéria para nossas próximas edições.

 

Criação através de componentes

 

         A Criação de relatórios através de componentes provavelmente é a mais utilizada dentre os programadores Delphi. Existem vários fornecedores de componentes para criação de relatórios, como o Report Buider e o QuickReport. O QuickReport já acompanha o Delphi, e por este motivo, será nosso escolhido.

         A elaboração de relatórios através de componentes unifica os dois métodos citados anteriormente. O desenvolvedor possui bastante flexibilidade de programação, assim como a facilidade do desenvolvimento RAD de aplicações. Vejamos a seguir como construir um relatório através do QuickReport.

 

Criando o relatório de listagem de leitores

 

         Iniciaremos com nosso relatório mais simples, porém, necessário: a listagem de leitores. Para iniciarmos, crie uma opção de menu no formulário principal, e chame-a de Relatórios. Abaixo, crie uma opção chamada Listagem de Clientes, que atenderá esta primeira situação.

 

Figura 7: Menu Relatórios

 

Figura 8: Repositório de Objetos

 

         Para iniciar a construção do relatório, deveremos criar um objeto de classe TQuiCkreport. Para isto, vá no menu File | New, para abrir o Object Repository. No Object Repository, selecione o ícone Report, e clique duas vezes sobre o mesmo.

         Repare que o nosso objeto TQuickRep se parece muito com um formulário. Este funcionará como uma forma para montarmos visualmente o nosso relatório. Quando a aplicação for executada, este formulário não será exibido, e o que veremos será uma janela padrão do QuickReport com opções de navegação pelo relatório. Salve a aplicação e chame esta nova unidade de RelListagemClientes.pas. Altere a propriedade Name do objeto TQuickRep para qrListagemClientes.

 

Figura 9: Relatório de Listagem de Leitores

 

Inserindo um título no relatório

 

         Vamos começar inserindo um cabeçalho em nosso relatório. Selecione, então, o objeto TQRBand, encontrado na palheta QuickReport. Este objeto representará as “bandas”, que são as áreas do relatório. Por exemplo, um cabeçalho, um rodapé, a área de dados, o título das colunas, todos são considerados bandas, e deverão ser representados através do objeto TQRBand.

         Especificamos que tipo de área esta banda irá representar, através da propriedade bandType. Escolha rbPageHeader para a propriedade Bandtype, que definirá esta banda como um cabeçalho de página. Altere também a propriedade Name, e chame esta banda de qrBandTitulo. Veja abaixo uma descrição resumida dos possíveis valore para a propriedade BandType:

 

rbTitle – Título do relatório. Esta banda aparece uma única vez em todo o relatório, no início da primeira página.

rbColummHeader – Cabeçalho das colunas. Em um relatório colunado, o título das colunas poderia aparecer nesta banda.

rbPageHeader – Cabeçalho de página. Esta banda aparece no início de todas as páginas.

rbPageFooter – Rodapé da página – Esta banda aparece no final de cada página do relatório.

rbDetail – Área de dados do relatório. Onde os dados da tabela irão aparecer.

rbSubDetail – Este valor não é mais utilizado – Foi substituído pelo objeto TQRSubDetail.

rbGroupHeader – Não mais utilizado. Representa o cabeçalho de um grupo, foi substituído pelo objeto TQRGroup.

rbGroupFooter – Rodapé de um grupo (GroupHeader).

rbSummary – Esta banda aparece uma única vez no relatório, no final de todos os dados. Pode ser utilizada para exibir cálculos somatórios.

rbOverlay – Esta banda representa uma camada background no relatório. É muito utilizado para imprimir logotipos ao fundo do relatório, ou mensagens identificadoras, como por exemplo “Confidencial”.

 

         Com nossa banda configurada para rbPageHeader, precisaremos dos objetos para compor o título do relatório. Veja na tabela 5 uma descrição resumida de todos os objetos da palheta QuickReport, para nos familiarizarmos.

         Voltando ao nosso relatório, nosso título ficará parecido com o relatório mostrado na figura 9.

         Para inserir o título, usaremos o objeto TQRLabel. Selecione e insira um TQRLabel, dentro do objeto qrBandTitulo, e posicione-o de acordo com a figura 9. Configure suas propriedades de acordo com a tabela abaixo:

 

Tabela 4: Objeto TQRLabel

Caption

Listagem de Leitores

Alignment

taCenter

AligntoBand

True

 

         Para garantir que o título fique centralizado no papel, devemos configurar as propriedades Alignment e AlignToband, conforme especificado na tabela. A propriedade Alignment representa como o texto será alinhado dentro da própria área do objeto TQRLabel.

 

Tabela 5: Descrição dos componentes da palheta QuickReport

Item

Descrição

Item

Descrição






 

 

 

 

 

 

 

TQuickRep Este é o objeto principal do QuickReport, representa o papel e a área de impressão;

TQRSubDEtail Serve para criar relatórios do tipo Master-Detail;

TQRBand Representa as bandas do relatório;

TQRChildBand Permite criar bandas que se ajustam automaticamente ao tamanho dos controles;

TQRGroup Este componente permite agrupar o relatório;

TQRLabel Representa um label dentro do relatório, ou seja, um texto não linkado com o banco de dados;

TQRDBText Um label linkado com o banco de dados; Este label é usado na banda Detail do relatório, para exibir os dados da tabela;

TQRExpr Permite a inserçõ de expressões matemáticas ou lógicas dentro do relatório;

TQRSysData Exibe informações como número de página, número do grupo, data, hora e outras;

TQRMemo Um memo (não linkado) dentro do relatório;

 

 

 

 

 

 

 

 

 

TQRRichText Um Memo com texto formatado dentro do relatório;

TQRDBRichText Um memo com texto formatado, e linkado com o banco de dados;

TQRShape Permite a inserção de figuras geométricas dentro do relatório;

TQRImage Permite a inserção de um arquivo de figura dentro do relatório;

TQRDBImage Similar ao TqrImage, permite a inserção de figuras provenientes de um banco de dados;

TQRCompositeReport Permite agregar vários relatórios em um;

TQRPreview Com este objeto é possível customizar a tela de preview oferecido pelo quickreport;

TQRTextFilter Este componente permite a exportação do relatório no formato arquivo texto;

TQRCSVFilter Este componente permite a exportação do relatório no formato de arquivo CSV.

TQRHTMLFilter Permite a exportação do relatório no formato HTML.

TQRChart Disponibiliza a  criação de gráficos estatísticas dentro do relatório.

 

Já a propriedade AlignToBand faz com que o funcionamento da propriedade Alignment se estenda para a área do objeto TQRBand. Ou seja, se Alignment for taCenter, o texto estará centralizado dentro do TQRLabel. Quando AlignToBand for igual a TRUE, o texto será centralizado dentro da banda.

         Como pode ser visualizado na figura 9, nosso relatório também terá o número da página, no canto superior direito. Para isto, utilizaremos o objeto TQRSysData. Selecione este objeto e insira-o na banda de título, posicionando-o de acordo com a figura 9. Configure a propriedade Data para qrPageNumber. A propriedade data, especifica que tipo de informação (do sistema) será exibida pelo objeto.

         Nosso próximo passo é definir a área de dados do relatório. Estes dados serão provenientes da tabela de leitores. Para que o relatório possa extrair os dados desta tabela, devemos inserir um objeto TTable. Configure as propriedades do objeto TTable conforme especificado na tabela abaixo:

 

Tabela 6: Objeto TTable

Name

tbLeitor

DatabaseName

Biblio

TableName

Leitor.db

 

         E configure a propriedade DataSet, do objeto TQuickrep (o próprio formulário), para tbLeitor. Este processo irá criar um link entre o relatório e a tabela.

         Insira agora mais um objeto TQRBand, que será a área de dados. Configure sua propriedade BandType para rbDetail e sua propriedade Name para qrBandDetalhe. Altere seu tamanho de acordo com a figura 9.

         Nesta área, teremos primeiramente uma linha que irá separar os clientes no relatório. Para criar esta linha, usaremos o objeto TQRShape. Insira um objeto TQRShape na banda de detalhe, e configure sua propriedade Shape para qrsHorLine. Esta propriedade indica qual será o formato assumido pelo objeto TQRShape. Posicione e altere o tamanho do objeto de acordo com a figura 9.

         E agora iremos inserir os label’s indicativos. Insira 8 objetos TQRLabel, e configure suas propriedades de acordo com as tabelas abaixo:

 

Tabela 7: Objeto QRLabel2

Caption

Código

Font.Size

11

Font.Style

fsBold

 

Tabela 8: Objeto QRLabel3

Caption

Nome

Font.Size

11

Font.Style

fsBold

 

Tabela 9: Objeto QRLabel4

Caption

Endereço

 

Tabela 10: Objeto QRLabel5

Caption

Telefone

 

Tabela 11: Objeto QRLabel6

Caption

CPF

 

Tabela 12: Objeto QRLabel7

Caption

Nascimento

 

Tabela 13: Objeto QRLabel8

Caption

Estado Civil

 

 

Tabela 14: Objeto QRLabel9

Caption

Escolaridade

 

         Posicione os objetos de acordo com o modelo apresentado na figura 9.

         E em seguida, devemos colocar os Label’s linkados ao lado de seus indicadores correspondentes. Iremos então inserir 8 objetos TQRDBText, que exibirão os dados provenientes da tabela. Configure suas propriedades de acordo com as tabelas abaixo:

 

Tabela 15: Objeto QRDBText1

DataSet

tbLeitor

Datafield

Código

Font.Size

11

Font.Style

fsBold

 

Tabela 16: Objeto QRDBText2

DataSet

tbLeitor

Datafield

Nome

Font.Size

11

Font.Style

fsBold

 

Tabela 17: Objeto QRDBText3

DataSet

tbLeitor

Datafield

Endereço

 

Tabela 18: Objeto QRDBText4

DataSet

tbLeitor

Datafield

Telefone

 

Tabela 19: Objeto QRDBText5

DataSet

tbLeitor

Datafield

CPF

 

Tabela 20: Objeto QRDBText6

DataSet

tbLeitor

Datafield

Nascimento

 

Tabela 21: Objeto QRDBText7

DataSet

tbLeitor

Datafield

Estado Civil

 

Tabela 22: Objeto QRDBText8

DataSet

tbLeitor

Datafield

Escolaridade

 

         E posicione os objetos de acordo com a figura 9. Ok. Nosso relatório já está pronto, com praticamente nenhum esforço. Vamos agora linká-lo à aplicação:

         Abra o formulário principal e selecione a opção de menu criada para este relatório. Em seu evento OnClick, digite:

 

procedure TfrmPrincipal.

Listagemporcliente1Click(Sender:

TObject);

begin

qrListagemPorCliente.tbLeitor.Open;

qrListagemPorCliente.Preview;

end;

 

         Primeiramente abrimos a tabela de leitor, e em seguida, chamamos o método Preview, do objeto TQuickRep. O método Preview irá exibir o relatório na tela, numa janela padronizada. Caso o usuário queira imprimir o relatório, basta clicar no ícone da impressora. Caso o desenvolvedor queira criar uma interface para mandar o relatório direto para a impressora, basta chamar o método Print.

         E Ok! Em poucos minutos construímos um relatório no QuickReport.

 

Definindo máscara para o campo ‘EstadoCivil’

 

         Repare que no banco de dados, o campo EstadoCivil é composto apenas por um caracter. Podemos formatar este campo para que exiba a palavra completa, dando um refinamento ao relatório. Podemos criar um campo virtual para esta tarefa, e associar este campo ao relatório. Vejamos como criar um campo virtual:

         Dê um clique duplo no objeto tbLeitor, e na janela subseqüente, clique com o botão inverso do mouse, selecionando a opção Add All Fields. Dê ok na janela Add All Fields, para adicionar todos os campos. Novamente, clique com o botão direito na janela, e desta vez, selecione Add New Field.

         A janela Add New Field, que já foi utilizada para criarmos campos do tipo LookUp, também permite a criação de campos virtuais. Configure os dados de acordo com a tabela abaixo:

 

Tabela 23: Campos da Janela Add New Field

Name

EstadoCivilVirtual

Type

String

Size

20

 

Janela New Field

 

         Devemos agora criar a rotina para preencher o novo campo com seus devidos valores. O Delphi provê um evento para a atribuição de campos virtuais. Selecione, no Object Inspector, o evento OnCalcFied, do componente tbLeitor, para criar a rotina de inicialização do campo, como mostra a listagem a seguir:

 

procedure TQRListagemporCliente.

tbLeitorCalcFields(DataSet:

TDataSet);

begin

if tbLeitor.FieldByName(‘Estado

Civil’).AsString=’S’ then

TbLeitor.FieldByName

(‘EstadoCivilVIRTUAL’).

AsString :=’Solteiro’;

 

if tbLeitor.FielByName(‘Estado

Civil’).AsString=’C’ then

TbLeitor.FieldByName

(‘EstadoCivilVIRTUAL’).

AsString :=’Casado’;

 

if tbLeitor.FielByName(‘Estado

Civil’).AsString=’D’ then

TbLeitor.FieldByName

(‘EstadoCivilVIRTUAL’).

AsString :=’Desquitado’;

 

if tbLeitor.FielByName(‘Estado

Civil’).AsString=’O’ then

TbLeitor.FieldByName

(‘EstadoCivilVIRTUAL’).

AsString :=’Outros’;

end;

 

         A rotina é muito simples, resumindo-se apenas a uma seqüência de comparações. O valores possíveis para o campo EstadoCivil foram definidos na edição nº 1 do nosso jornal.

         E não podemos esquecer de inserir a atribuição à este campo no relatório. Selecione o objeto qrDBText7 e altere sua propriedade DataField de ‘EstadoCivil’ para o novo campo ‘EstadoCivilVirtual’. Salve o projeto e execute, para visualizar a nova saída do campo no relatório.

 

 

Criando Grupos no Relatório

 

         Vamos criar mais um relatório em nossa aplicação, desta vez com grupos. Para este relatório devemos criar mais um índice em nossa tabela de leitores, ordenando o campo Escolaridade. Abra o Database Desktop, e insira um índice para o campo ‘Escolaridade’, na tabela de leitores. Chame-o de IndEscolaridade, e salve as alterações na tabela.

         No Delphi, crie uma nova opção de menu no formulário principal, abaixo de relatório. Chame esta opção de ‘Listagem de Clientes por Escolaridade’. Crie um novo objeto da classe TQuickRep, usando o Object Repository. Salve o projeto e chame esta nova unidade de RelListagemClientePorEsc.

         Este relatório ficará parecido com a imagem mostrada na figura 10.

         Iniciemos inserindo uma banda de título. Configure as propriedades do objeto TQRBand de acordo com a tabela abaixo:

 

Tabela 1: Objeto TQRBand

Name

bandTitulo

BandType

rbPageHeader

 

         Insira um objeto TQRLabel, e configure suas propriedades:

 

Tabela 1: Objeto QRLabel

Caption

Relação de Clientes por Escolaridade

Alignment

taCenter

AlignoBand

True

Font.Size

18

 

         E um objeto TQRSysData, para exibir o número da página. Insira um objeto QRSysData, modifique sua propriedade Data para PageNumber, e posicione-o de acordo com a figura 10.

         Insira agora um objeto TTable, e configure suas propriedades de acordo com a tabela:

 

Tabela 1: Objeto TTable

DatabaseName

Biblio

Name

tbLeitor

TableName

Leitor.db

IndexName

IndEscolaridade

 

         Link o relatório com a tabela, definindo a propriedade DataSet do objeto TQuickRep para tbLeitor.

 

Figura 10 – Relatório com quebra por escolaridade

 

         O próximo passo é inserir a banda de dados. Insira um objeto TQRBand e mude sua propriedade BandType para rbDetail. Altere seu tamanho de acordo com a figura 10. Insira dois objetos TQRLabel, e configure suas propriedades de acordo com as tabelas abaixo:

 

Tabela 1: Objeto QRLabel2

Caption

Código

 

Tabela 1: Objeto QRLabel3

Caption

Nome

 

         Posicione os objetos de acordo com a figura 10. Insira mais dois objetos TQRDBText, e configure suas respectivas propriedades de acordo com a descrição abaixo:

 

Tabela 1: Objeto QRDBText1

DataSet

tbLeitor

Datafield

Código

 

Tabela 1: Objeto QRDBText2

DataSet

tbLeitor

Datafield

Nome

 

         E em seguida devemos criar a quebra. Selecione o objeto TQRGroup (repare que ele aparece antes da banda de detalhe, assumindo automaticamente a posição de cabeçalho do grupo. Devemos especificar qual será a condição da quebra através da propriedade Expression. Selecione esta propriedade e clique no botão ‘...’, para abrir a janela Expression Wizard.

 

Nota: A janela Expression Wizard é diferente para cada versão do delphi, mas como em todas as versões, ela é bastante intuitiva e qualquer dúvida consulte o Help OnLine do Delphi pressionando F1.

 

         Na janela de construção de expressões, deveremos inserir nossa cláusula de grupo. Na janela de edição, digite “tbLeitor.Escolaridade”, que é a nossa condição de quebra. Dê ok para fechar a janela de expressões.

         Insira um objeto TQRDBText, dentro do objeto TQRGroup, para identificar os grupos. Altere sua propriedade DataSet para tbLeitor, e a propriedade DataField para Escolaridade.

         E pronto! Vamos ao formulário principal chamar este relatório, e executar a aplicação.

         No evento OnClick da opção de menu ‘Listagem de leitores por escolaridade’, digite:

 

procedure TfrmPrincipal.

Listagemdeclientesporescolaridade1Click(Sender: TObject);

begin

QrListagemClientePorEsc.

TbLeitor.Open;

QrListagemClientePorEsc.

Preview;

end;

 

         Pronto! Você acaba de construir seu segundo relatório no Delphi!

 

Conclusão

 

         Nesta penúltima parte do curso você aprendeu os conceitos e princípios básicos de construção de relatório com o QuickReport. Na próxima edição iremos finalizar nosso curso, com a segunda parte sobre relatórios no Delphi. Veremos recursos mais avançados do QuickReport, e finalizaremos os outros relatórios da aplicação. Para quem nos acompanhou desde o princípio já conhece todo o poder de desenvolvimento RAD do Delphi, e já percebeu como é prático e rápido construir aplicações nesta ferramenta. Espero você na próxima!