Como montar um report no Crystal passando como fonte de dados um metodo de classe?
25/11/2009
0
Amigos, o titulo ja diz tudo:
Como montar um report no crystal utilizando um metodo de classe?
Eu quero montar um metodo que le a tabela com Linq2Entities, e me devolve um IQueryable.
Como posso fazer isso?
Obrigado
Como montar um report no crystal utilizando um metodo de classe?
Eu quero montar um metodo que le a tabela com Linq2Entities, e me devolve um IQueryable.
Como posso fazer isso?
Obrigado
Daniel Vieira
Curtir tópico
+ 0
Responder
Posts
25/11/2009
Bruno Vigidio
Daniel eu tive um problema parecido que resolvi da seguinte maneira convertendo para DataSet através de alguns métodos que eu inclui na minha classe Utils.
Funcionou aqui no meu caso, espero que ajude.
Segue inicialmente o evento do botão que chama o relatório:
private void btnVisualizarRelatorio_Click(object sender, RoutedEventArgs e)
{
try
{
this.Cursor = Cursors.Wait;
IEnumerable<TB_PRODUTO> o = null;
o = from p in ndc.TB_PRODUTOs
where p.DT_FIM_VENDA > DateTime.Today || p.DT_FIM_VENDA == null
select p;
if (o == null)
return;
ExibirRelatorio(o);
}
catch (Exception ex)
{
Utilities.MessageBoxError("Não foi possível exibir o relatório.");
Utilities.LogError(ex);
}
finally
{
this.Cursor = Cursors.Arrow;
}
}
Segue o método ExibirRelatorio:
private static void ExibirRelatorio(IEnumerable<TB_PRODUTO> o)
{
Relatorios.rptQtdePreco rpt = new Livraria.UI.WPF.Relatorios.rptQtdePreco();
DataSet ds = Utilities.ToDataSet(o, "dsRelatQtdePreco");
rpt.SetDataSource(ds.Tables[0]);
winRelatorios frm = new winRelatorios();
frm.MyCrystalReportViewer.ReportSource = rpt;
frm.ShowDialog();
}
E abaixo vou colocar toda a minha classe Utilities:
public static class Utilities
{
public static void LogInformation(string message)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(message), EventLogEntryType.Information);
}
public static void LogError(Exception ex)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(ex.ToString()), EventLogEntryType.Error);
}
public static void LogError(string message)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(message), EventLogEntryType.Error);
}
public static string StrMessage(string message)
{
if (message.Length > 32766)
{
return message.Substring(0, 32766);
}
else
{
return message;
}
}
public static MessageBoxResult MessageBoxError(string message)
{
return MessageBox.Show(message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
}
public static MessageBoxResult MessageBoxWarning(string message)
{
return MessageBox.Show(message, "Atenção", MessageBoxButton.OK, MessageBoxImage.Warning);
}
public static MessageBoxResult MessageBoxInformation(string message)
{
return MessageBox.Show(message, "Informação", MessageBoxButton.OK, MessageBoxImage.Information);
}
public static MessageBoxResult MessageBoxQuestion(string message, MessageBoxButton buttons)
{
return MessageBox.Show(message, "Confirmar", buttons, MessageBoxImage.Question);
}
#region Converter collection para dataset
public static DataSet ToDataSet<T>(this IEnumerable<T> collection, string dataTableName)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
if (string.IsNullOrEmpty(dataTableName))
{
throw new ArgumentNullException("dataTableName");
}
DataSet data = new DataSet("NewDataSet");
data.Tables.Add(FillDataTable(dataTableName, collection));
return data;
}
private static DataTable FillDataTable<T>(string tableName, IEnumerable<T> collection)
{
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable dt = CreateDataTable<T>(tableName,
collection, properties);
IEnumerator<T> enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
dt.Rows.Add(FillDataRow<T>(dt.NewRow(),
enumerator.Current, properties));
}
return dt;
}
private static DataRow FillDataRow<T>(DataRow dataRow, T item, PropertyInfo[] properties)
{
foreach (PropertyInfo property in properties)
{
dataRow[property.Name.ToString()] = property.GetValue(item, null);
}
return dataRow;
}
private static DataTable CreateDataTable<T>(string tableName, IEnumerable<T> collection, PropertyInfo[] properties)
{
DataTable dt = new DataTable(tableName);
foreach (PropertyInfo property in properties)
{
dt.Columns.Add(property.Name.ToString());
}
return dt;
}
#endregion
}
Funcionou aqui no meu caso, espero que ajude.
Segue inicialmente o evento do botão que chama o relatório:
private void btnVisualizarRelatorio_Click(object sender, RoutedEventArgs e)
{
try
{
this.Cursor = Cursors.Wait;
IEnumerable<TB_PRODUTO> o = null;
o = from p in ndc.TB_PRODUTOs
where p.DT_FIM_VENDA > DateTime.Today || p.DT_FIM_VENDA == null
select p;
if (o == null)
return;
ExibirRelatorio(o);
}
catch (Exception ex)
{
Utilities.MessageBoxError("Não foi possível exibir o relatório.");
Utilities.LogError(ex);
}
finally
{
this.Cursor = Cursors.Arrow;
}
}
Segue o método ExibirRelatorio:
private static void ExibirRelatorio(IEnumerable<TB_PRODUTO> o)
{
Relatorios.rptQtdePreco rpt = new Livraria.UI.WPF.Relatorios.rptQtdePreco();
DataSet ds = Utilities.ToDataSet(o, "dsRelatQtdePreco");
rpt.SetDataSource(ds.Tables[0]);
winRelatorios frm = new winRelatorios();
frm.MyCrystalReportViewer.ReportSource = rpt;
frm.ShowDialog();
}
E abaixo vou colocar toda a minha classe Utilities:
public static class Utilities
{
public static void LogInformation(string message)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(message), EventLogEntryType.Information);
}
public static void LogError(Exception ex)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(ex.ToString()), EventLogEntryType.Error);
}
public static void LogError(string message)
{
if (!EventLog.SourceExists("LivrariaCEMA"))
{
EventLog.CreateEventSource("LivrariaCEMA", "LivrariaCEMA_Log");
}
EventLog myLog = new EventLog();
myLog.Source = "LivrariaCEMA";
myLog.WriteEntry(StrMessage(message), EventLogEntryType.Error);
}
public static string StrMessage(string message)
{
if (message.Length > 32766)
{
return message.Substring(0, 32766);
}
else
{
return message;
}
}
public static MessageBoxResult MessageBoxError(string message)
{
return MessageBox.Show(message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
}
public static MessageBoxResult MessageBoxWarning(string message)
{
return MessageBox.Show(message, "Atenção", MessageBoxButton.OK, MessageBoxImage.Warning);
}
public static MessageBoxResult MessageBoxInformation(string message)
{
return MessageBox.Show(message, "Informação", MessageBoxButton.OK, MessageBoxImage.Information);
}
public static MessageBoxResult MessageBoxQuestion(string message, MessageBoxButton buttons)
{
return MessageBox.Show(message, "Confirmar", buttons, MessageBoxImage.Question);
}
#region Converter collection para dataset
public static DataSet ToDataSet<T>(this IEnumerable<T> collection, string dataTableName)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
if (string.IsNullOrEmpty(dataTableName))
{
throw new ArgumentNullException("dataTableName");
}
DataSet data = new DataSet("NewDataSet");
data.Tables.Add(FillDataTable(dataTableName, collection));
return data;
}
private static DataTable FillDataTable<T>(string tableName, IEnumerable<T> collection)
{
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable dt = CreateDataTable<T>(tableName,
collection, properties);
IEnumerator<T> enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
dt.Rows.Add(FillDataRow<T>(dt.NewRow(),
enumerator.Current, properties));
}
return dt;
}
private static DataRow FillDataRow<T>(DataRow dataRow, T item, PropertyInfo[] properties)
{
foreach (PropertyInfo property in properties)
{
dataRow[property.Name.ToString()] = property.GetValue(item, null);
}
return dataRow;
}
private static DataTable CreateDataTable<T>(string tableName, IEnumerable<T> collection, PropertyInfo[] properties)
{
DataTable dt = new DataTable(tableName);
foreach (PropertyInfo property in properties)
{
dt.Columns.Add(property.Name.ToString());
}
return dt;
}
#endregion
}
Responder
Clique aqui para fazer login e interagir na Comunidade :)