4

古い 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 レポートを作成するにはどうすればよいですか? (接続文字列/データの場所はコンパイル時にわかりません)

4

2 に答える 2

2

接続の作成:

/// <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
}

次に、フォームに reportviewer コントロールを追加します。

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 は、さまざまなオブジェクトで使用できます。それを動的にバインドするシナリオがある場合は、以下の私の回答を参照してください。次に、新しいデータセットをソリューションに追加するという 1 つのことを行うことができます。データテーブルを作成し、適切なデータ型で必要な列を追加します。クエリまたはテーブル アダプターを追加しないでください。コードからクラス ファイルを追加し、データ テーブル列とまったく同じプロパティを作成します。データテーブルをレポートのソースとして設定し、その列をレポートに追加します。

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;
  }
}

ここで、dtataset 内に作成されたデータテーブルにデータを入力する別の関数を作成します。

public void PopulateDataTable()
{
      DataTable dt = GetEmployee();
      Employee dsEmployee = New DataSet();
      dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable();
      dtEmp = dt;
}
于 2010-08-06T09:58:51.643 に答える
0

私たちは Crystal Reports を使って似たようなことをしていますが、Crystal Reports が本当に嫌いになりました。データベース エキスパートを使用して、データベースへの新しい接続と、使用したい SQL を含む新しいコマンドを作成しました。これにより、Crystal Reports が使用できる列が定義され、レポートを作成できるようになります。次に、レポートを表示するときに次のことを行います。

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

私は 1 つのテーブルでしか実行していないので、DataSet に複数のテーブルがあるとどのように影響するかわかりません。基本的に、データベース エキスパートとコマンドを使用して、レポートの構造を設定します。次に、実行時に実際のデータを上書きします。Crystal Reports がこれを行うためのより堅牢な方法を持っていること、またはそれが存在する場合はそれを理解していることを心から願っています。

于 2010-06-30T19:47:01.433 に答える