Как заполнить Crystal Reports с помощью SQL - PullRequest
4 голосов
/ 30 июня 2010

Поскольку, похоже, нет никакого способа загрузить старые отчеты VB6 (ActiveReports) в .Net, мне нужно воссоздать десятки отчетов в .Net.Я хотел бы сделать это как можно менее болезненным.

В VB6 авторы оригинала просто делали что-то подобное для каждого отчета:

adoConn.ConnectionString = globalConnectionObject.ConnectionString
adoConn.Source = ReportFunctions.GetAllUsers()

GetAllUsers() возвращает SQLстрока, которая выбирает группу полей;эти поля затем используются в отчете.

Сейчас:
Как сделать что-то подобное в .Net (используя встроенные Crystal Reports или встроенные "Microsoft Reporting Technology" )?

Мне не удается заставить «Эксперт по базам данных» распознать globalConnectionObject (объект ADODB.Connection);и если я заполняю набор данных и выполняю

report.SetDataSource(dataSet)

Он сообщает мне «В отчете нет таблиц.»

Как заполнить отчет Crystal Reports !? (строка соединения / местоположение данных не известны во время компиляции)

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Создание соединения:

/// <summary>
/// Sets the connection.
/// </summary>
public void SetConnection()
{
    _connection = new SqlConnection(Settings.Default.connectionString);
    if (_connection.State == System.Data.ConnectionState.Open)
    {
        _connection.Close();
    }
    _connection.Open();
}

/// <summary>
/// Closes the connection.
/// </summary>
public void CloseConnection()
{
    if (_connection.State == System.Data.ConnectionState.Open)
    {
        _connection.Close();
        _connection.Dispose();
    }
}

с использованием вышеуказанного соединения Заполните набор данных вручную или добавьте набор данных в свое решение, чтобы получить данные без записи кодов подключения.Скажем, вы добавили Employee.XSD.Добавьте табличный адаптер в XSD, который поможет вам извлекать данные из базы данных, автоматически генерируя запросы и таблицы данных.После всего этого.Создайте метод где-нибудь в своем проекте,

Public DataTable GetAllEmployees()
{
    Employee.EmployeeTableAdapter adapt = New Employee.EmployeeTableAdapter();
    DataTable dt = New DataTable();
    dt =    adapt.GetData();   // you can also use fill based on your criteria.
    return dt;   //your datatable with data
}

Теперь в вашей форме добавьте элемент управления просмотра отчетов.

ReportViewer1 rpt = New ReportViewer();
ReportDocument rptDoc = new ReportDocument();
rptDoc.Load("path of rpt file");
rptDoc.SetDataSource(GetAllEmployees());
rpt.Document =  rptDoc;
rpt.Refresh();

Перед этим Из Crystal Report добавьте поля таблицы в отчет согласно вашему требованию.

Другой способ достижения

Crystal Reports можно использовать над различными объектами.Если у вас есть сценарий для его динамического связывания, смотрите мой ответ ниже. Тогда вы можете сделать одну вещь: добавить новый набор данных в решение.Создайте таблицу данных и добавьте необходимые столбцы с соответствующим типом данных.НЕ добавляйте запрос или табличный адаптер.Теперь из вашего кода добавьте файл класса и создайте свойства, точно такие же, как столбцы данных.Теперь установите источник данных в качестве источника для отчета и добавьте его столбец в отчет.

For example , if you have columns
ID - integer
EmpName - string
Salary - double
Department - string

Создайте класс

public class Employee
{
  private SqlConnection _connection;
  public int ID {get;set;}
  public string EmpName {get;set;}
  public double Salary {get;set;}
  public string Department  {get;set;}



/// <summary>
/// Sets the connection.
/// </summary>
public void SetConnection()
{
    //assuming connection string is placed in settings file from Project Properties.
    _connection = new SqlConnection(Settings.Default.connectionString);
    if (_connection.State == System.Data.ConnectionState.Open)
    {
        _connection.Close();
    }
    _connection.Open();
}

/// <summary>
/// Closes the connection.
/// </summary>
public void CloseConnection()
{
    if (_connection.State == System.Data.ConnectionState.Open)
    {
        _connection.Close();
        _connection.Dispose();
    }
}


  public DataTable GetEmployees()
  {
       DataTable dt = new DataTable("Employee");
       // using above connection
       SetConnection();
      using(SqlCommand command = new SqlCOmmand("commandText",_connection))
      {
         using(SqlDataReader reader = command.ExecuteReader())
         {
              dt.Load(reader);
         }
      }
       return dt;
  }
}

Теперь создайте другую функцию, которая будет заполнять таблицу данных, созданную внутри набора данных.,

public void PopulateDataTable()
{
      DataTable dt = GetEmployee();
      Employee dsEmployee = New DataSet();
      dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable();
      dtEmp = dt;
}
0 голосов
/ 30 июня 2010

Мы делаем что-то подобное, используя Crystal Reports, и это заставило меня действительно не любить Crystal Reports.Используя эксперта по базе данных, я создал новое соединение с базой данных и новую команду с SQL, который я хочу использовать.Это определяет столбцы, которые Crystal Reports может использовать, и позволяет вам создавать отчет.Затем при отображении отчета мы делаем:

ReportDocument rd = new ReportDocument();
rd.Load(MapPathSecure("NameOfMyReport.rpt"));
rd.SetDataSource(dataSet.Tables[0]);

Я сделал это только с одной таблицей, поэтому я не знаю, как это повлияет на наличие нескольких таблиц в наборе данных.По сути, вы устанавливаете структуру отчета с помощью эксперта по базам данных и команды.Затем вы перезаписываете фактические данные во время выполнения.Мне бы очень хотелось, чтобы у Crystal Reports был более надежный способ сделать это, или чтобы я понял это, если он существует.

...