Passar DataTable dinâmico para o DataSet do Crystal Report (.NET)

Pessoal,

Fiz um relatório no Crystal, o problema que não vejo uma solução para um DataTable dinâmico, minha aplicação gera um DataTable em tempo de execução, devo mandar esse DataTable para o DataSet do Crystal para impressão em tela em PDF.

Alguém sabe uma solução, tutorial ou etc para uma caso desse onde é gerado o DataTable dinâmicamente, com colunas e linhas geradas dinâmicamente, passar isso para o DataSet do Crystal para impressão de PDF em tela?

Abs
Rodrigo Santik

Oi, rsantik!

Bom, cara, esse é o jeito que eu faço, normalmente:

1. Como gerar um DataTable em tempo de execução?
Você vai gerar de um banco de dados? Você pode criar sua consulta e, usando um objeto DataAdapter, criar seu DataTable.

[code]public DataTable RecuperarTabelaDeAlunos()
{
DataTable datatableAlunos = new DataTable();
string sentencaAlunos = “SELECT ID, NOME, TURMA FROM ALUNOS”;
OracleConnection connectionAlunos = new OracleConnection(/* String de conexão */);
OracleDataAdapter dataadapterAlunos = new OracleDataAdapter(sentencaAlunos, connectionAlunos);

dataadapterAlunos.Fill(datatableAlunos);
datatableAlunos.TableName = "TABELAALUNOS";

return datatableAlunos;                                                                                                                                                                                             

}
[/code]

Agora, como você quer passar isso para um relatório:

[code]ReportDocument entidadeReport = new ReportDocument();

// caso o seu relatório esteja em uma pasta específica…
entidadeReport.Load(@Request.PhysicalApplicationPath + @"\Alunos\Relatorios\RelatorioAlunos.rpt");

DataTable datatableAlunos = RecuperarTabelaDeAlunos();
entidadeReport.SetDataSource(datatableAlunos);
entidadeReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, “”);
[/code]

Então Nicolas, até aí blz, já estou gerando um DataTable e passando para Crystal…

O problema é que o DataTable pode ter um numero de colunas variado, isto é, dependendo do que vem do banco, o DataTable pode ter 3 colunas, 4 colunas, 10 colunas e etc…

Quando vou passar esse DataTable para o Crystal… como vou saber, lá no Crystal, quantas colunas o DataTable tem?

Eu configurei tudo certinho no DataSet, montei o DataTable do rpt, mas o problema é que esse DataTable deve ser de acordo, em número de colunas, com o DataTable que a aplicação envia para o rpt.

Resumindo, o problema é que o número de colunas é variável, como o relatório vai saber quantas colunas o DataTable tem?

Que tal fazer assim:

  1. No seu relatório, crie uma conexão com o seu banco de dados no Database Expert;
  2. Lá, você adiciona a conexão com o seu banco e seleciona a tabela a qual você quer procurar ou a view na qual quer pesquisar.

Assim, você passa uma consulta do tipo “SELECT * FROM TABELA”, e ele reconhecerá.
A medida em que os campos forem mudando, você seu relatório vai reconhecendo, já que tem uma conexão direta com a tabela ou a view.
Que tal?