Array
(
)

Como montar um report no Crystal passando como fonte de dados um metodo de classe?

Daniel Vieira
   - 25 nov 2009

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

Bruno Vigidio
   - 25 nov 2009

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
    }