Relatório dinâmico
Bom dia.
Pessoal, estou pesquisando algum gerador de relatórios para o Delphi XE2, que o próprio usuário possa definir quais os campos que ele gostaria que tivesse no relatório, criar agrupamentos, etc.
Já vi um sistema de BI que é feito um SQL, e tem um módulo de gerador de relatórios, que lê este SQL, traz todos os atributos contidos no SQL p/ que o usuário possa arrastar para o preview do relatório, os campos, definindo a posição, o tamanho, cor, negrito, etc. Também é possível inserir fórmulas, agrupamentos, novas bandas no relatório, etc.
Alguém saberia me dizer se tem algum gerador de relatórios que possa realizar essas atividades e que possa ser desenvolvido c/ Delphi XE2 ??
Obrigado.
Pessoal, estou pesquisando algum gerador de relatórios para o Delphi XE2, que o próprio usuário possa definir quais os campos que ele gostaria que tivesse no relatório, criar agrupamentos, etc.
Já vi um sistema de BI que é feito um SQL, e tem um módulo de gerador de relatórios, que lê este SQL, traz todos os atributos contidos no SQL p/ que o usuário possa arrastar para o preview do relatório, os campos, definindo a posição, o tamanho, cor, negrito, etc. Também é possível inserir fórmulas, agrupamentos, novas bandas no relatório, etc.
Alguém saberia me dizer se tem algum gerador de relatórios que possa realizar essas atividades e que possa ser desenvolvido c/ Delphi XE2 ??
Obrigado.
Andrey
Curtidas 0
Melhor post
Leandro
14/05/2013
Concerteza atende.
ai tem um codigo que monta um relatorio com base em uma DBGrid.
qualquer coisa me add no skype
silva.leandroo
Grato.
procedure TFRelTelefone.ShowFastReportGrid(AGrid: TLSDBGrid);
procedure CriarComponente(AComponent : TfrxComponent; AColumn : TColumn; ALeft, ATop : Integer);
var
lMemo: TfrxMemoView;
begin
if AComponent is TfrxPageHeader then
begin
lMemo := TfrxMemoView.Create(TfrxPageHeader(AComponent));
lMemo.Parent := TfrxPageHeader(AComponent);
if AColumn.Field.DataType in [ftFloat, ftBCD, ftFMTBcd] then
lMemo.HAlign := haRight
else
lMemo.HAlign := haLeft;
lMemo.CreateUniqueName;
lMemo.Font.Size := 8;
lMemo.Font.Name := 'Tahoma';
lMemo.Memo.Add(AColumn.Field.DisplayLabel);
lMemo.SetBounds(ALeft, ATop, AColumn.Width, 16);
lMemo.DisplayFormat.FormatStr := '';
lMemo.DisplayFormat.Kind := fkText;
lMemo.AutoWidth := False;
end
else
if AComponent is TfrxMasterData then
begin
lMemo := TfrxMemoView.Create(TfrxMasterData(AComponent));
lMemo.Parent := TfrxMasterData(AComponent);
lMemo.HAlign := haLeft;
lMemo.CreateUniqueName;
lMemo.Font.Size := 8;
lMemo.Font.Name := 'Tahoma';
lMemo.DataSet := frxReportConsulta.DataSets[0].DataSet;
lMemo.DataField := AColumn.FieldName;
lMemo.SetBounds(ALeft, ATop, AColumn.Width, 16);
lMemo.DisplayFormat.FormatStr := '';
lMemo.DisplayFormat.Kind := fkText;
lMemo.AutoWidth := False;
if AColumn.Field.DataType in [ftFloat, ftBCD, ftFMTBcd] then
begin
lMemo.DisplayFormat.FormatStr := '%2.2n';
lMemo.DisplayFormat.Kind := fkNumeric;
lMemo.HAlign := haRight;
end;
end
else
if AComponent is TfrxReportSummary then
begin
if AColumn.Field.DataType in [ftFloat, ftBCD, ftFMTBcd] then
begin
lMemo := TfrxMemoView.Create(TfrxReportSummary(AComponent));
lMemo.Memo.Add('[SUM(<frxDBDatasetGrid."'+AColumn.FieldName+'">,MasterData1,3)]');
lMemo.Parent := TfrxReportSummary(AComponent);
lMemo.Font.Size := 8;
lMemo.Font.Name := 'Tahoma';
lMemo.Font.Style := [fsBold];
lMemo.SetBounds(ALeft, ATop, AColumn.Width, 16);
lMemo.AutoWidth := True;
lMemo.HAlign := haRight;
lMemo.DisplayFormat.FormatStr := '%2.2n';
lMemo.DisplayFormat.Kind := fkNumeric;
lMemo.HAlign := haRight;
lMemo.CreateUniqueName;
end;
end;
end;
var
lPageHeader : TfrxPageHeader;
lDataBand: TfrxMasterData;
lLine : TfrxLineView;
lReportSummary : TFrxReportSummary;
i, lLeft, lTop : Integer;
lHeightHeader : Extended;
begin
frxDBTelefones.DataSet := CdsDados;
// Buscar Cabeçalho da pagina
lPageHeader := TfrxPageHeader(frxReportConsulta.FindObject('PageHeader1'));
lPageHeader.Clear;
// Buscar MasterData da pagina
lDataBand := TfrxMasterData(frxReportConsulta.FindObject('MasterData1'));
lDataBand.Clear;
// Buscar Sumario da pagina
// lReportSummary := TfrxReportSummary(frxReportConsulta.FindObject('ReportSummary1'));
// lReportSummary.Clear;
//Cria Linha na parte superiro do sumario
// lLine := TfrxLineView.Create(lReportSummary);
// lLine.Align := baWidth;
// lLine.CreateUniqueName;
// lLine.Top := 0;
lHeightHeader := 19.90;
lDataBand.Height := lHeightHeader;
lPageHeader.Height := lHeightHeader;
lLeft := 0;
lTop := 0;
for i := 0 to AGrid.Columns.Count -1 do
begin
if not AGrid.Columns[i].Visible then
begin
Continue;
end;
// Ajusta Altura das Bandas de acordo com a quantidade de campos.
if (i > 0) and ((lLeft+AGrid.Columns[i].Width) > 1046.93) then
begin
lHeightHeader := lHeightHeader + 19.90;
if lPageHeader.Height <> lHeightHeader then
begin
lPageHeader.Height := lHeightHeader;
lDataBand.Height := lHeightHeader;
end;
lLeft := 0;
lTop := lTop + 18;
end;
//Cria Componentes
CriarComponente(lPageHeader, AGrid.Columns[i], lLeft, lTop);
CriarComponente(lDataBand, AGrid.Columns[i], lLeft, lTop);
//CriarComponente(lReportSummary, AGrid.Columns[i], lLeft, lTop);
lLeft := lLeft + AGrid.Columns[i].Width;
end;
//Cria Linha na parte inferior do cabeçalho
lLine := TfrxLineView.Create(lPageHeader);
lLine.Align := baBottom;
lLine.Align := baWidth;
lLine.CreateUniqueName;
lLine.Top := lPageHeader.Height;
ShowFastReport(frxReportConsulta);
end;
ai tem um codigo que monta um relatorio com base em uma DBGrid.
qualquer coisa me add no skype
silva.leandroo
Grato.
GOSTEI 2
Mais Respostas
Gabriel Baltazar
14/05/2013
Também tenho interesse no assunto.
GOSTEI 0
Joel Rodrigues
14/05/2013
Rapaz, creio que o ReportBuider faz boa parte disso. Usei há muito tempo no Delphi 7, na empresa onde eu trabalhei, tinha um sistema que disponibilizava um módulo onde o usuário podia criar seus próprios relatórios.
Se existe para XE2, não sei, nunca mais usei mesmo. Mas vale a pena pesquisar.
Se existe para XE2, não sei, nunca mais usei mesmo. Mas vale a pena pesquisar.
GOSTEI 0
Leandro
14/05/2013
Eu usuaria o FastReport.
GOSTEI 0
Andrey
14/05/2013
Pesquisando na Net, vi alguns comentários, indicando o Fastreport e até alguns tutorias de como utiliza-lo (Devmedia), e falando que seria possível fazer relatórios dinâmicos.
Leandro, vc já utilizou o FastReport c/ esse propósito (relatório dinâmico). Se já, vc sabe se ele atende as minhas necessidades, do que postei inicialmente. ??
Obrigado.
Leandro, vc já utilizou o FastReport c/ esse propósito (relatório dinâmico). Se já, vc sabe se ele atende as minhas necessidades, do que postei inicialmente. ??
Obrigado.
GOSTEI 0
Vennicio Souza
14/05/2013
Boa Noite
Estou tentando gerar um relatório dinâmico de uma consulta de dados em um DBGrid e não estou conseguindo pois não entendi a parte do seu código por nao saber qual procedure se refere ShowFastReport :
ShowFastReport(frxReportConsulta);
E nestes dois aparecem um erro: List index ou of bounds (0)
CriarComponente(lDataBand, AGrid.Columns[i], lLeft, lTop);
CriarComponente(lReportSummary, AGrid.Columns[i], lLeft, lTop);
Gostaria que se você pudesse me ajudar desde já agradeço.
Estou tentando gerar um relatório dinâmico de uma consulta de dados em um DBGrid e não estou conseguindo pois não entendi a parte do seu código por nao saber qual procedure se refere ShowFastReport :
ShowFastReport(frxReportConsulta);
E nestes dois aparecem um erro: List index ou of bounds (0)
CriarComponente(lDataBand, AGrid.Columns[i], lLeft, lTop);
CriarComponente(lReportSummary, AGrid.Columns[i], lLeft, lTop);
Gostaria que se você pudesse me ajudar desde já agradeço.
GOSTEI 0