バージョン

ドリルダウン チャートの作成(3/5)

このトピックは、 ドリルダウン チャートの作成(2/5)の続きです。

BuildChart メソッドはエンティティの値を表す文字列を受け付け、これは適切なチャート データをフェッチする SQL クエリーを構築するために使用されます。パラメータの値はドリル レベルによって異なるさまざまなエンティティそれぞれからのフィールドを表します。

たとえば、レベル 1 では、すべての顧客が表示されるので値は不要です。レベル 2 では、その顧客に関連するすべての発注を表示するために Customer ID をメソッドに渡す必要があります。レベル 3 では、その発注に関連するすべての発注の詳細を表示するために Order ID をメソッドに渡す必要があります。

各レベルは、どのようなエンティティ属性をパラメータによって表すのかを明確に定義する必要があります。コードでは、パラメータ値だけでなくドリル レベルを使用して、適切なデータベース テーブルからデータをフェッチするクエリーをビルドします。

Visual Basic の場合:

Private Sub BuildChart(ByVal FieldValue As String)
    Dim theCommand As SqlCommand = New SqlCommand
    theCommand.Connection = Me.sqlConnection1
    theCommand.CommandType = CommandType.Text
    Dim s As String = String.Empty
    Select Case _currDrill
Case 1 'theChartInfo はこのレベルでは null でなければなりません
'コマンドをビルドします
          s += " select TOP 10 a.customerID as 'Customer', count(b.OrderID) as 'Order Count' "
          s += " FROM "
          s += " Customers a, Orders b "
          s += " WHERE a.CustomerID = b.CustomerID "
          s += " GROUP BY a.CustomerID "
          s += " ORDER BY 2 DESC "
          theCommand.CommandText = s
'このドリル レベルのために Chart プロパティを設定します
          Me.ultraChart1.ChartType = ChartType.BarChart3D
          Me.ultraChart1.Legend.Visible = True
'DataSource を設定します
          Me.ultraChart1.Data.DataSource = Me.GetChartData(theCommand)
'このレベルのためにリンク ラベルを設定します
          Me.lnk1.Text = "Root"
          Me.lnk1.Enabled = False
          Me.lnk1.Visible = True
          Me.lnk2.Enabled = False
          Me.lnk2.Visible = False
          Me.lnk3.Enabled = False
          Me.lnk3.Visible = False
'このレベルのために UI ラベルを設定します
          Me.lbl1.Enabled = True
          Me.lbl2.Enabled = False
          Me.lbl3.Enabled = False
     'レベル 2:実際の Orders PER 顧客を取得できます
    Case 2
'コマンドをビルドします
          s += " select TOP 10 CONVERT(VARCHAR(10), a.OrderID) as 'Order ID',
                 count(b.OrderID) as 'Line Items' "
          s += " FROM Orders a, [Order Details] b "
          s += " WHERE a.OrderID = b.OrderID AND "
          s += " a.CustomerID = @CustomerID "
          s += " group by a.OrderID order by 2 DESC "
          theCommand.CommandText = s
          theCommand.Parameters.Add("@CustomerID", FieldValue)
'このドリル レベルのために Chart プロパティを設定します
          Me.ultraChart1.ChartType = ChartType.PieChart3D
          Me.ultraChart1.Legend.Visible = True
'DataSource を設定します
          Me.ultraChart1.Data.DataSource = Me.GetChartData(theCommand)
'このレベルのためにリンク ラベルを設定します
          Me.lnk1.Enabled = True
          Me.lnk1.Visible = True
          Me.lnk2.Text = FieldValue
          Me.lnk2.Enabled = False
          Me.lnk2.Visible = True
          Me.lnk3.Enabled = False
          Me.lnk3.Visible = False
'このレベルのために UI ラベルを設定します
          Me.lbl1.Enabled = False
          Me.lbl2.Enabled = True
          Me.lbl3.Enabled = False
'コマンドをビルドします
    Case 3
          s += " select a.ProductName as 'Product', b.Quantity as 'Quantity' "
          s += " FROM Products a, [Order Details] b WHERE a.ProductID = b.ProductID "
          s += " AND b.OrderID = @OrderID ORDER BY b.Quantity ASC"
          theCommand.CommandText = s
          theCommand.Parameters.Add("@OrderID", FieldValue)
'このドリル レベルのために Chart プロパティを設定します
          Me.ultraChart1.ChartType = ChartType.CylinderColumnChart3D
          Me.ultraChart1.Legend.Visible = True
'DataSource を設定します
          Me.ultraChart1.Data.DataSource = Me.GetChartData(theCommand)
'このレベルのためにリンク ラベルを設定します
          Me.lnk1.Enabled = True
          Me.lnk1.Visible = True
          Me.lnk2.Enabled = True
          Me.lnk2.Visible = True
          Me.lnk3.Text = FieldValue
          Me.lnk3.Enabled = False
          Me.lnk3.Visible = True
'このレベルのために UI ラベルを設定します
          Me.lbl1.Enabled = False
          Me.lbl2.Enabled = False
          Me.lbl3.Enabled = True
    Case Else
          Throw New ApplicationException("Unhandled Drill Level")
    End Select
End Sub

C# の場合:

private void BuildChart(string FieldValue)
{
    SqlCommand theCommand = new SqlCommand();
    theCommand.Connection = this.sqlConnection1;
    theCommand.CommandType = CommandType.Text;
    string s = string.Empty;
    switch (_currDrill)
    {
        case 1:// theChartInfo はこのレベルでは null でなければなりません
// コマンドをビルドします
	   s += " select TOP 10 a.customerID as 'Customer', count(b.OrderID) as 'Order Count' ";
	   s += " FROM ";
	   s += " Customers a, Orders b ";
	   s += " WHERE a.CustomerID = b.CustomerID ";
	   s += " GROUP BY a.CustomerID ";
	   s += " ORDER BY 2 DESC ";
	   theCommand.CommandText = s;
	   // このドリル レベルのために Chart プロパティを設定します
	   this.ultraChart1.ChartType = ChartType.BarChart3D;
	   this.ultraChart1.Legend.Visible = true;
	   // DataSource を設定します
	   this.ultraChart1.Data.DataSource = this.GetChartData(theCommand);
	   // このレベルのためにリンク ラベルを設定します
	   this.lnk1.Text = "Root";
	   this.lnk1.Enabled = false;
	   this.lnk1.Visible = true;
	   this.lnk2.Enabled = false;
	   this.lnk2.Visible = false;
	   this.lnk3.Enabled = false;
	   this.lnk3.Visible = false;
	   // このレベルのために UI ラベルを設定します
	   this.lbl1.Enabled = true;
	   this.lbl2.Enabled = false;
	   this.lbl3.Enabled = false;
	   break;
       case 2:// レベル 2:実際の Orders PER 顧客を取得できます
	   // コマンドをビルドします
	   s += " select TOP 10 CONVERT(VARCHAR(10), a.OrderID) as 'Order ID',
	          count(b.OrderID) as 'Line Items' ";
	   s += " FROM Orders a, [Order Details] b ";
	   s += " WHERE a.OrderID = b.OrderID AND ";
	   s += " a.CustomerID = @CustomerID ";
	   s += " group by a.OrderID order by 2 DESC ";
	   theCommand.CommandText = s;
	   theCommand.Parameters.Add("@CustomerID", FieldValue);
	   // このドリル レベルのために Chart プロパティを設定します
	   this.ultraChart1.ChartType = ChartType.PieChart3D;
	   this.ultraChart1.Legend.Visible = true;
	   // DataSource を設定します
	   this.ultraChart1.Data.DataSource = this.GetChartData(theCommand);
	   // このレベルのためにリンク ラベルを設定します
	   this.lnk1.Enabled = true;
	   this.lnk1.Visible = true;
	   this.lnk2.Text = FieldValue;
	   this.lnk2.Enabled = false;
	   this.lnk2.Visible = true;
	   this.lnk3.Enabled = false;
	   this.lnk3.Visible = false;
	   // このレベルのために UI ラベルを設定します
	   this.lbl1.Enabled = false;
	   this.lbl2.Enabled = true;
	   this.lbl3.Enabled = false;
	   break;
       case 3:
	   // コマンドをビルドします
	   s += " select a.ProductName as 'Product', b.Quantity as 'Quantity' ";
	   s += " FROM Products a, [Order Details] b WHERE a.ProductID = b.ProductID ";
	   s += " AND b.OrderID = @OrderID ORDER BY b.Quantity ASC";
	   theCommand.CommandText = s;
	   theCommand.Parameters.Add("@OrderID", FieldValue);
	   // このドリル レベルのために Chart プロパティを設定します
	   this.ultraChart1.ChartType = ChartType.CylinderColumnChart3D;
	   this.ultraChart1.Legend.Visible = true;
	   // DataSource を設定します
	   this.ultraChart1.Data.DataSource = this.GetChartData(theCommand);
	   // このレベルのためにリンク ラベルを設定します
	   this.lnk1.Enabled = true;
	   this.lnk1.Visible = true;
	   this.lnk2.Enabled = true;
	   this.lnk2.Visible = true;
	   this.lnk3.Text = FieldValue;
	   this.lnk3.Enabled = false;
	   this.lnk3.Visible = true;
	   // このレベルのために UI ラベルを設定します
	   this.lbl1.Enabled = false;
	   this.lbl2.Enabled = false;
	   this.lbl3.Enabled = true;
	   break;
       default:
	   throw new ApplicationException("Unhandled Drill Level");
      }
}