Relatório com dois níveis de dados (mestre-detalhe)
Até agora nossos relatórios de exemplo usaram somente uma banda de dados ("Dados de 1o. Nível" ou "Dados Mestre") para controlar a saída de dados. Isso era adequado para a saída de dados de uma única tabela de BD. FastReport também permite o design de relatórios com até seis níveis de dados, todos na mesma página de design. Além disso, é possível obter um número ilimitado de níveis de dados em relatórios ao usar o objeto "Sub-relatório" – este objeto será abordado mais adiante. Em geral, a maioria dos relatórios precisa de apenas um, dois ou três níveis de dados, e números maiores de níveis de dados são raros.
Vamos ver como fazer o design de um relatório com dois níveis de dados. O relatório irá exibir dados das tabelas de demonstração "Customer" e "Orders". A primeira tabela é uma lista de clientes e a segunda é uma lista de pedidos feitos por esses clientes. As tabelas contêm dados nos seguintes campos:
Customer:
CustNo Company
1221 Kauai Dive Shoppe
1231 Unisco
1351 Sight Diver
...
Orders:
OrderNo CustNo SaleDate
1003 1351 12.04.1988
1023 1221 01.07.1988
1052 1351 06.01.1989
1055 1351 04.02.1989
1060 1231 28.02.1989
1123 1221 24.08.1993
...
Como você pode ver, a segunda tabela contém a lista de todos os pedidos feitos por todos os clientes. Para ver os pedidos da tabela Orders que foram feitos por um cliente da tabela Customers, as duas tabelas são vinculadas no campo "CustNo", que é comum a ambas as tabelas. A saída do relatório desses dados deve ter este aspecto:
1221 Kauai Dive Shoppe
1023 01.07.1988
1123 24.08.1993
1231 Unisco
1060 28.02.1989
1351 Sight Diver
1003 12.04.1988
1052 06.01.1989
1055 04.02.1989
Crie um relatório novo. Coloque duas "Tabelas ADO" na página e configure suas propriedades:
ADOTable1:
TableName = 'Customer'
UserName = 'Customers'
ADOTable2:
TableName = 'Orders'
UserName = 'Orders'
Agora adicione uma banda "Dados Mestre" e uma "Dados de Detalhe" à página:
Observe que a banda "DadosMestre" deve ser colocada acima da banda "DadosDeDetalhe"! Arraste-a para lá se necessário. Se a banda Mestre for colocada embaixo da banda Detalhe, o FastReport irá gerar uma mensagem de erro ao visualizar o relatório.
Se você visualizasse o relatório agora, você veria que a lista de pedidos permaneceria igual para todos os clientes e iria conter todos os registros da tabela "Orders". Isso aconteceria porque a propriedade MasterSource
da tabela "Orders" não foi configurada. Configure "MasterSource – ADOTable1" no componente "ADOTable2". Agora configuramos uma relação 'mestre-detalhe'. Depois disso, selecionamos os campos a serem vinculados. Configure a propriedade MasterFields
do componente "ADOTable2".
Precisamos vincular os campos "CustNo" das duas fontes. Para fazer isso, selecione os campos desejados e clique no botão "Adicionar". A vinculação do campo será exibida no painel inferior. Conclua ao fechar o editor clicando em OK.
Ao criar a visualização, FastReport faz o seguinte. Após a saída de um registro da tabela mestre (Customer), ele configura o filtro na tabela detalhe (Orders). Somente os registros que cumprem a condição 'Orders.CustNo = Customer.CustNo' permanecem na tabela. Isso significa que para cada cliente somente são exibidos na banda detalhe os pedidos que correspondem ao cliente autal. É importante enteder este conceito. Apesar das bandas de dados serem do tipo mestre ou detalhe, elas somente controlam o posicionamento dos dados na página de saída (ordem e número de exibições). Os dados exibidos pelos objetos nas bandas depende dos campos aos quais os objetos estão vinculados e da vinculação externa das duas tabelas.
Esta é a saída final:
É possível construir relatórios com até 6 níveis de dados de maneira similar.