2014年1月26日日曜日

【VB.NET】ReportViewer レポートを表示する②

ReportViewerを使ってSQLSereverのデータテーブルの内容をレポートに表示します。
大まかな手順は以下の通りになります。

  1. プロジェクトにデータセットを追加しデータテーブルを用意します。
  2. プロジェクトにレポートファイルを追加しレポートをデザインします。
  3. フォームにReportViewerを配置します。
  4. コードにデータ取得とReportrViewerの処理を記述します
ReportViewerタスクの「新しいレポートをデザインします」を使わない方法です。

使用例:「商品マスタ」「店舗マスタ」「販売テーブル」の結合データを取得しレポートに表示します。      (VS2010による使用例です。VS2008では若干操作が異なります。)

商品マスタのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名商品マスタ物理テーブル名M_ITEM
列定義
No論理名物理名データ型Nullを許容主キー
1商品CDITEM_CDnvarchar(4)NoYes
2商品名ITEM_NMnvarchar(32)No
3単価PRICEnumeric(8,0)No

店舗マスタのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名商品マスタ物理テーブル名M_ITEM
列定義
No論理名物理名データ型Nullを許容主キー
1商品CDITEM_CDnvarchar(4)NoYes
2商品名ITEM_NMnvarchar(32)No
3単価PRICEnumeric(8,0)No

売上データのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名売上データ物理テーブル名T_SALES
列定義
No論理名物理名データ型Nullを許容主キー
1NONOnumeric(8,0)NoYes
2店舗CDSHOP_CDnvarchar(4)No
3商品CDITEM_CDnvarchar(4)No
4売上数UNIT_SALESnumeric(8,0)No
5売上額SALES_AMOUNTnumeric(8,0)No


1.フォームにReportViewerを配置します。

2.ツールバーの「プロジェクト」→「新しい項目の追加」からデータセットを追加します。
  続けてツールボックスからデータセットにデータアダプターを追加します。

3.TeblAdapter構成ウィザードが起動されたらでーた接続を選択します。


4.コマンドの種類を選択します。


4.SQLステートメントを入力します。

5.生成するメッソドを選択します。

6.TableAdapter構成ウィザードを完了します。

7.データセットにTableAdaperが追加されています。

8.プロジェクトにレポートファイルを追加します。
  続けてツールボックスからレポートにテーブルを追加します。

9.データセットのプロパティが起動されるのででデータソースとデータセットを選択します。

10.テーブルに列を追加します。

11.列に表示するアイテムを設定します。

12.ReportViewerタスクのレポートの選択で追加したレポートを選択します。

13.フォームに「データセット」「データアダプター」「バインディングソース」が追加されています。

14.フォームのLoadイベントにはデータ取得とReportViewerの処理が記述されています。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: このコード行はデータを 'DataSet1.DataTable1' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
        Me.DataTable1TableAdapter.Fill(Me.DataSet1.DataTable1)

        Me.ReportViewer1.RefreshReport()
    End Sub
End Class
</ br>15.実行します。</ br>

2014年1月22日水曜日

【VB.NET】ReportViewer レポートを表示する①。

ReportViewerを使ってSQLSereverのデータテーブルの内容をレポートに表示します。
大まかな手順は以下の通りになります。

  1. プロジェクトにデータセットを追加しデータテーブルを用意します。
  2. プロジェクトにレポートファイルを追加しレポートをデザインします。
  3. フォームにReportViewerを配置します。
  4. コードにデータ取得とReportrViewerの処理を記述します
以上の手順をReportViewerタスクの「新しいレポートをデザインします」を使うとウィザードが全て行ってくれます。


使用例:売上データテーブルの内容をレポートに表示します。

売上データのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名売上データ物理テーブル名T_SALES
列定義
No論理名物理名データ型Nullを許容主キー
1NONOnumeric(8,0)NoYes
2店舗CDSHOP_CDnvarchar(4)No
3商品CDITEM_CDnvarchar(4)No
4売上数UNIT_SALESnumeric(8,0)No
5売上額SALES_AMOUNTnumeric(8,0)No

1.フォームにReportViewerコントロールを配置しReportViewerタスクを開き
 「新しいレポートをデザインします」を選択します。

2.データソース構成ウィザードが開くのでデータソースの種類に「データベース」を選択します。
3.データベースのモデルに「データセット」を選択します。

4.データ接続の選択で接続が無い場合は「新しい接続」をクリックします。

5.接続情報を入力します。

6.接続を保存します。
7.表示するデータベースオブジェクトを選択し完了します。

8.レポートウィザード開くのでデータソースとデータセットを選択します。
9.使用できるフィールドから表示したいフィールドをΣ値へをドラグ&ドロップで追加します。
10.レイアウトを選択します。
11.スタイルを選択し完了します。
12.プロジェクトにデータセットとレポートファイルが追加されています。
13.ReportViewerタスクのレポートの選択で追加されたレポートを選択します。
14.フォームに「データセット」「データアダプター」「バインディングソース」が追加されています。

15.フォームのLoadイベントにはデータ取得とReportViewerの処理が記述されています。
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: このコード行はデータを 'SAMPLE_DBDataSet.T_SALES' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
        Me.T_SALESTableAdapter.Fill(Me.SAMPLE_DBDataSet.T_SALES)

        Me.ReportViewer1.RefreshReport()
    End Sub
End Class

16.実行します。
実行結果



2014年1月5日日曜日

【VB.NET】ADO.NET トランザクション処理

トランザクション処理によりデータベースの更新を完了またはキャンセルします。

トランザクションの実行手順
  1. トランザクションを開始する
  2. SqlCommand.Transactionnにトランザクションを割り当てる。
  3. トランザクションを実行またはキャンセルする。
トランザクションを実行した場合、データベースの更新は完了します。
トランザクションをキャンセルした場合はトランザクションを開始してからキャンセルの直前までのデータベースの更新処理は実行されません。


使用例:Nullを許容しない列にNullを入れ例外を発生させ、例外発生以前のデータベースの更新処理をキャンセルします。

商品マスタのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名商品マスタ物理テーブル名M_ITEM
列定義
No論理名物理名データ型Nullを許容主キー
1商品CDITEM_CDnvarchar(4)NoYes
2商品名ITEM_NMnvarchar(32)No
3単価PRICEnumeric(8,0)No

商品マスタのテーブルデータ


売上データのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名売上データ物理テーブル名T_SALES
列定義
No論理名物理名データ型Nullを許容主キー
1NONOnumeric(8,0)NoYes
2商品CDITEM_CDnvarchar(4)No
3売上数UNIT_SALESnumeric(8,0)No
4売上額SALES_AMOUNTnumeric(8,0)No

売上データ












Imports System.Data.SqlClient
 
Module Module1
 
    Sub Main()
        Dim con As New SqlConnection
 
        'DB接続
        con.ConnectionString = "Data Source=localhost\SQLEXPRESS;Initial Catalog=SAMPLE_DB;Integrated Security=True"
        con.Open()
 
        'トランザクションの開始
        Dim tran As SqlTransaction = Nothing
        tran = con.BeginTransaction
 
        'SqlDataAdapter
        Dim da As New SqlDataAdapter()
 
        Try
            'SelectComman設定
            da.SelectCommand = New SqlCommand
            da.SelectCommand.Connection = con
            da.SelectCommand.CommandText = "SELECT NO, T_SALES.ITEM_CD AS ITEM_CD, ITEM_NM, PRICE, UNIT_SALES, SALES_AMOUNT " _
                                   + "FROM M_ITEM INNER JOIN T_SALES ON M_ITEM.ITEM_CD = T_SALES.ITEM_CD"
            'トランザクションの設定
            da.SelectCommand.Transaction = tran
 
            'InsertCommand設定
            da.InsertCommand = New SqlCommand
            da.InsertCommand.Connection = con
            da.InsertCommand.CommandText = "INSERT INTO T_SALES(ITEM_CD, UNIT_SALES, SALES_AMOUNT) VALUES (@ITEM_CD, @UNIT_SALES, @SALES_AMOUNT)"
            'パラメータ設定
            da.InsertCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD")
            da.InsertCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES")
            da.InsertCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT")
            'トランザクションの設定
            da.InsertCommand.Transaction = tran
 
            'UpdateCommand設定
            da.UpdateCommand = New SqlCommand
            da.UpdateCommand.Connection = con
            da.UpdateCommand.CommandText = "UPDATE T_SALES SET ITEM_CD = @ITEM_CD, UNIT_SALES = @UNIT_SALES, SALES_AMOUNT = @SALES_AMOUNT WHERE NO = @NO"
            'パラメータ設定
            da.UpdateCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD")
            da.UpdateCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES")
            da.UpdateCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT")
            da.UpdateCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO")
            'トランザクションの設定
            da.UpdateCommand.Transaction = tran
 
            'DeleteCommand設定
            da.DeleteCommand = New SqlCommand
            da.DeleteCommand.Connection = con
            da.DeleteCommand.CommandText = "DELETE FROM T_SALES WHERE NO = @NO"
            'パラメータ設定
            da.DeleteCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO")
            'トランザクションの設定
            da.DeleteCommand.Transaction = tran
 
            'DataSet
            Dim ds As New DataSet
 
            'データを取得
            da.Fill(ds, "T_SALES")
 
            'テーブルを取得
            Dim dt As DataTable = ds.Tables("T_SALES")
 
            'レコード変更
            dt.Rows(0)("SALES_AMOUNT") = 11111
            dt.Rows(1)("SALES_AMOUNT") = 11111
            dt.Rows(2)("SALES_AMOUNT") = 11111
            dt.Rows(3)("SALES_AMOUNT") = DBNull.Value '例外を発生
            dt.Rows(4)("SALES_AMOUNT") = 11111
            dt.Rows(5)("SALES_AMOUNT") = 11111
            dt.Rows(6)("SALES_AMOUNT") = 11111
            dt.Rows(7)("SALES_AMOUNT") = 11111
 
            'データ更新
            da.Update(ds, "T_SALES")
 
            'トランザクションの実行
            tran.Commit()
 
            
            Console.WriteLine("データを更新しました")
 
        Catch ex As Exception
 
            Console.WriteLine(ex.ToString)
 
            'トランザクションをキャンセル
            If tran IsNot Nothing Then
                tran.Rollback()
            End If
 
            Console.WriteLine("データの更新を取消しました")
 
        Finally
 
            '接続を閉じる
            If Not con.State = ConnectionState.Closed Then
                con.Close()
            End If
 
            'リソースの解放
            da.Dispose()
            tran.Dispose()
            con.Dispose()
 
        End Try
        
    End Sub
 
End Module
実行結果:データは変更されていない