Fórum Mestre x Detalhe no Quick Report #239964

26/06/2004

0

Pessoal

Estou com um problema em confeccionar um relatório Master x Detail no Quick Report

Alguem poderia me ajudar?

Tenho duas tabelas onde uma e de Contas a Pagar e outra de Fornecedor
Preciso relacionar no relatório todas as duplicatas a pagar do fornecedor x e no final dele soma-las e exibir o resultado com quebra de página a cada fornecedor

Se alguem tiver um exemplo, poderia me mandar
Desde já agradeço

[]´s

Marcos


Marcosmp

Marcosmp

Responder

Posts

27/06/2004

Cfino

Eu normalmente faço uma query que faz a seleção dos registros e depois os exibo no relatório.

Exemplo de Select SQL mestre/detalhe:
select For.*, Con.* from Fornecedor For, Contas Con where For.Codfor=Con.Codfor


Pode ser isso,
Cfino.


Responder

Gostei + 0

27/06/2004

Marcelo_mileris

Ai vai um exemplo de como fazer o Master X Detail com o quickreport. Espero que ajude.


A tabela 1 (MasterTable) possui a descrição de todos os clientes da empresa e a tabela 2 (DetailTable) possui os dados de todas as compras realizadas por cada cliente. Temos neste caso uma relação 1:N. O objetivo deste exemplo é produzir um relatório com o formato abaixo descrito:



Nome: Paulo Ramos

Endereço: Rua N. S. Copacabana, 123

Telefone: 432-4455

Itens comprados:

4 pares de Sapatos

3 calças

Nome: Marcel Waintraub

Endereço: Rua das Acácias 22, apto 1105

Telefone:

Itens comprados:

1 gravata

2 meias

A tabela MasterTable será a tabela com o nome dos clientes e a tabela DetailTable com as compras . Devemos então escolher no menu do Delphi, File/New/Forms e selecionar o formulário QuickReport Master/Detail. O formulário inicial é apresentado abaixo:

Este formulário é composto de 5 bandas, 2 componentes Table e 1 DataSource (MasterDS). Na banda Detail são colocados os componentes, por exemplo, QRDBText e QRLabel referentes a tabela MasterTable e na banda Subdetail os componentes referentes a tabela Detailtable.

É importante verificar se a propriedade DataSet do formulário foi inicializada corretamente para MasterTable . A propriedade DataSet da Banda SubDetail tem que ser alterada para DetailTable. Repare que o QuickReport inicializa erroneamente o valor desta propriedade para MasterTable.

Para cada tabela inicializa-se as propriedades DataBaseName com seu alias, a propriedade TableName com o nome das tabelas e a propriedade Active para true.

Para a tabela DetailTable estabelecemos a relação um para muitos. Para isto, devemos nos certificar que a propriedade MasterSource está atribuida com o Datasource MasterDS referente a tabela MasterTable.

Tendo feito isto é hora de se estabelecer de fato a ligação um para muitos entre as duas tabelas. Para isto, seleciona-se a tabela DetailTable e seleciona-se a propriedade MasterField (dá-se um click com o mouse no botão do lado direitro desta propriedade (...)).

Para se efetuar a ligação 1:N seleciona-se os campos de ligação entre as duas tabelas.

Depois, coloca-se os componentes em suas respctivas bandas. Por exemplo, colocamos dois componentes QRLabel na banda Detail e alteramos as suas propriedades Caption para Nome e Endereço do cliente. A seguir, coloca-se dois componentes QRDBText logo abaixo (ou do lado) dos componentes QRLabel. Para cada um deles a propriedade DataSet é inicializada com MasterTable e a propriedade DataField com os campos da tabela Nome e Endereco.

Na banda SubDetail são colocados os itens relacionados as compras dos clientes. Coloca-se componentes QRDBText com a propriedade DataSet sendo inicializada como DetailTable e a propriedade DataField com os campos da tabela DetailTable, campo Descrição.

Ao final temos aproximadamente :

Para vizualizar de imediato o resultado deste trabalho, damos um click com a outra tecla do mouse em cima do relatório. É apresentado um menu e escolhemos a opção Preview. Que resulta em.

Quando houver necessidade de um relatório mais sofisticado, por exemplo, com várias relações 1:N, podemos partir de um relatório MasterDetail, acrescentar bandas SubDetails com suas respectivas tabelas.

Como foi visto no exemplo anterior, os cabeçalhos do banda SubDetail foram postos na banda Detail. Mas como ficaria se colocassemos mais uma banda SubDetail?

O primeiro passo é colocar uma banda (terceiro componente do QuikReport), depois estabeleça que a propriedade HeaderBand da nova banda do SubDetail seja igual ao nome desta nova banda (QRBand1). Para finalizar coloque os componentes QRLabel na banda QRBand1 para servirem como cabeçalhos do nova relação um para muito.

Dicas
1.Caso se queira que o relatório apresente cada cliente separadamente atribua a propriedade ForceNewPage da banda Detail para true;

2.Para o caso de só imprimir um cliente quando ele tiver efetuado uma compra, coloca-se o seguinte código no evento BeforePrint da banda Detail

PrintBand:=DetailTable.RecordCount>0;
3.Para ativar impressão do formulário a um evento OnClick, coloca-se a seguinte codificação:

QRMDForm.Print;
4.Para se inicializar campos antes da apresentaçãodo formulário, coloca-se a codificação no evento ONStartPage do Formulário, Por exemplo:

procedure TDoseaciForm.DoseaciFormStartPage(Sender: TQuickRep);

5. begin
QRLabel4.Caption:=nome_serv;
MasterTable.filter:=´Id=´+InttoStr(id_serv);
MasterTable.filtered:=true;
QRLabel18.Caption:=Form23.Edit2.text;
QRLabel18.Left:=doseaciForm.width div 2- QRLabel18.width div 2;
try
QRMemo1.Lines.LoadFromFile(´prelat.txt´);
QRImage1.Picture.loadfromfile(simbolo);
finally
end;
end;


6.Para ativar o formulário a um evento OnClick, coloca-se a seguinte codificação:

QRMDForm.Preview;


Responder

Gostei + 0

27/06/2004

Mariocanel

hey cara tenta migrar para o rave que vc sairá melhor e quanto ao mestre/detalhe, use uma query e só depois use qualquer ferramenta de relatório


Responder

Gostei + 0

20/03/2007

Marcelorm

marcelo_mileris,

cara, e se eu quiser colocar, após cada cliente que listar, um rodapé para totalizar as vendas para este cliente, como faço??

Estarei aguarando.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar