- PR -

動的に2次元積層棒グラフを作成する方法について

投稿者投稿内容
ガロア
会議室デビュー日: 2004/11/30
投稿数: 8
投稿日時: 2006-12-06 12:53
お世話になります。

ASP.NETで動的にグラフ(2次元積層棒グラフ)を表示したいと考えております。
データベースはOracleで、以下のようなテーブルからデータを取得→配列に入れ、
それを、Chartコントロールに取り込もうとしておりますが、うまくいきません。

-------------------------------------------
伝票No |営業担当 |顧客 |受注金額 |受注月度
-------------------------------------------
000001 |一郎 |XXXX | 100 | 200610
000002 |太郎 |XXXX | 100 | 200602
000003 |一郎 |XXXX | 100 | 200609
000004 |一郎 |XXXX | 150 | 200603
000005 |太郎 |XXXX | 120 | 200605
000006 |一郎 |XXXX | 90 | 200605
000007 |太郎 |XXXX | 30 | 200608
000008 |一郎 |XXXX | 20 | 200611
000009 |一郎 |XXXX | 140 | 200611
000010 |一郎 |XXXX | 170 | 200611
-------------------------------------------
(グラフの完成イメージ)
横軸:月度
縦軸:受注金額(太郎と一郎の受注金額が積層された形)

Public Class rptMainReport2
Inherits ActiveReport

Public Param1(12) As String //受注月度
Public Param2(1, 12) As String //受注金額

(中略)

Private Sub Detail_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles Detail.Format

Dim i As Integer

For i = 0 To 2
x_series.Points(i).XValue = Param1(i) ←ここでエラーが出ます。
x_series.Points(i).YValues.Item(0) = Param2(0, i)
Next

Me.ChartControl.Series.Add(x_series)

Me.ChartControl.ChartAreas(0).Axes(0).Title = "月度"
End Sub
End Class

-------------------------------------------------------------
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index
-------------------------------------------------------------

よくわかっておりませんが、配列の上限を超えているみたいなので、はじめにコレクションオブジェクト?の要素を確定しなくてはいけないのかもしれません。
中途半端で申し訳ございませんが、どなたかアドバイスいただけたら幸いです。
よろしくお願いします。

ガロア
会議室デビュー日: 2004/11/30
投稿数: 8
投稿日時: 2006-12-06 12:59
上記少し訂正させてください。

(中略)

Private Sub Detail_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles Detail.Format

Dim i As Integer
Dim x_series As New DataDynamics.ActiveReports.Chart.Series ←訂正です。上記コピーするときにここが抜けてました。

For i = 0 To 2
x_series.Points(i).XValue = Param1(i) ←ここでエラーが出ます。
x_series.Points(i).YValues.Item(0) = Param2(0, i)
Next

Me.ChartControl.Series.Add(x_series)

Me.ChartControl.ChartAreas(0).Axes(0).Title = "月度"
End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 13:02
引用:

ガロアさんの書き込み (2006-12-06 12:53) より:

x_series.Points(i).XValue = Param1(i) ←ここでエラーが出ます。

インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index

よくわかっておりませんが、配列の上限を超えているみたいなので、はじめにコレクションオブジェクト?の要素を確定しなくてはいけないのかもしれません。


その行で例外が発生しているとして、Param1(i) が原因なのか、
Points(i) が原因なのか切り分けをしていますか?
(例外の内容と宣言部分を見る限り、Param1() が原因ではなさそうですが)

x_series というのが、何者かわかりませんので、回答はここまでですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 13:07
入れ違いでした。

引用:

ガロアさんの書き込み (2006-12-06 12:59) より:

Dim x_series As New DataDynamics.ActiveReports.Chart.Series ←訂正です。上記コピーするときにここが抜けてました。


なるほど、DataDynamics.ActiveReports.Chart.Series だったのですね。
これなら、回答できます。

引用:

x_series.Points(i).XValue = Param1(i) ←ここでエラーが出ます。
x_series.Points(i).YValues.Item(0) = Param2(0, i)


Points コレクションについても、DataDynamics.ActiveReports.Chart.DataPoint をインスタンス化して、
そのインスタンスを Points コレクションに Add しなくてはいけません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ガロア
会議室デビュー日: 2004/11/30
投稿数: 8
投稿日時: 2006-12-06 13:12
じゃんねねっと様

回答ありがとうございます。
x_seriesというのは、以下で宣言しているChartコントロールの一部のようです。
正直自分でも使い方がよくわかっておりません。

Dim x_series As New DataDynamics.ActiveReports.Chart.Series

とりあえずもう少し調べてみます。
ガロア
会議室デビュー日: 2004/11/30
投稿数: 8
投稿日時: 2006-12-06 13:26
じゃんぬねっと様

またまた入れ違いでした。
即答ありがとうございます。
上記のように試してみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 13:31
細かいことですが、

引用:

ガロアさんの書き込み (2006-12-06 13:12) より:

x_seriesというのは、以下で宣言しているChartコントロールの一部のようです。


コントロールではなく、DataDynamics.ActiveReports.Chart.Series 型の変数です。
中には、DataDynamics.ActiveReports.Chart.Series 型のインスタンスが格納されています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ガロア
会議室デビュー日: 2004/11/30
投稿数: 8
投稿日時: 2006-12-06 14:32
(じゃんぬねっと様をはじめ)みなさま

お世話になります。

今回の件、うまく表示することができました。
以下、きれいではないかもしれませんが、サンプルコードです。

-----------------------------------------------------------------------------
Private Sub Detail_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles Detail.Format

Dim i As Integer
Dim j As Integer

For j = 0 To 0←今は意味はないですが、拡張性を持たすつもりです。
Dim x_series As New DataDynamics.ActiveReports.Chart.Series

'凡例テキスト追加
x_series.LegendText = "一郎"
Me.ChartControl.Series.Add(x_series)

For i = 0 To UBound(Param1)

'DataPointをインスタンス化
Dim x_datapo As New DataDynamics.ActiveReports.Chart.DataPoint

'取得したデータをセット
x_datapo.XValue = Param1(i)
x_datapo.YValues.Item(0) = Param2(0, i, 0)

'Chartコントロールに追加
Me.ChartControl.Series(j).Points.Add(x_datapo)
x_datapo = Nothing
Next

x_series = Nothing
Next

Me.ChartControl.ChartAreas(0).Axes(0).Title = "月度"
End Sub
-----------------------------------------------------------------------------

>じゃんぬねっと様
背中を押してくださって、ありがとうございました。
少し前に進むことができました。
今後もお世話になることがあると思いますが、どうぞよろしくお願いします。

スキルアップ/キャリアアップ(JOB@IT)