Relatório dinâmico

Delphi

14/05/2013

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.
Andrey

Andrey

Curtidas 0

Melhor post

Leandro

Leandro

14/05/2013

Concerteza atende.

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

Gabriel Baltazar

14/05/2013

Também tenho interesse no assunto.
GOSTEI 0
Joel Rodrigues

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.
GOSTEI 0
Leandro

Leandro

14/05/2013

Eu usuaria o FastReport.
GOSTEI 0
Andrey

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.
GOSTEI 0
Vennicio Souza

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.
GOSTEI 0
POSTAR