Skip to content
daisuke nishino edited this page Oct 17, 2018 · 2 revisions

Open 棟梁チュートリアル (2 層 C/S アプリケーション (VB) 編)

2014年11月27日

はじめに

本ドキュメントの目的

本チュートリアルでの演習に沿ってサンプルプログラムを開発することで、Open 棟梁を用いた場合の開発の流れ・クラスの作成方法・各種定義ファイルの作成方法・ツールの使用方法・実行結果の確認方法等を習得することを目的としています。

本ドキュメントの対象

Open 棟梁を用いた 2 層 C/S アプリケーション開発を検討している SE・開発者

本ドキュメントの概要

本チュートリアルでは、Open 棟梁テンプレート・ベース (Visual Studio 2015 用) に付属のサンプルプログラムを題材とし、Open 棟梁を用いた場合の開発の流れを、順を追って説明します。

他社所有名称に対する表示

本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。

ライセンス

本ドキュメントは、クリエイティブ・コモンズ CC BY 2.1 JP ライセンスの下で利用可能です。

目次

1. Open棟梁の概要

2. 環境設定

3. 本チュートリアルでの演習課題について

4. 演習

1. Open棟梁の概要

Open 棟梁は、.NET 用のアプリケーションフレームワークです。Open 棟梁は、.NET Framework 4.6 以上を対象に、C/S(Windows Forms, WPF)、Web(ASP.NET)、RIA(Silverlight) など、さまざまなアプリケーションで利用できます。

Open棟梁のクラス構成図を図 1-1 に示します。

図 1-1 Open棟梁のクラス構成図

本チュートリアルでは、図 1-1 のクラス構成図に従い、開発者が実装する画面クラス・業務ロジッククラス・DB アクセスクラスの作成方法を、順を追って説明します。

2. 環境設定

本チュートリアルでは、以下の環境を前提としています。

  • 開発環境
    • IDE
      • Visual Studio 2015 (Express Edition も利用できます)
    • アプリケーション フレームワーク
      • Open 棟梁テンプレート・ベース (Visual Studio 2015 用)
  • 実行環境
    • ランタイム
      • .NET Framework 4.6
    • DB
      • SQL Server Express 2008 R2
  • その他
    • OS
      • Windows 7
    • 開発言語
      • Visual Basic

あらかじめ、マイクロソフトのサイトなどを参考に、Visual Studio をインストールしておいてください。

次に、Open 棟梁テンプレート・ベース、データベースをセットアップします。

  1. GitHub で [Download ZIP] ボタンを押下して OpenTouryoTemplates.zip を入手し、これを解凍して Open 棟梁テンプレート・ベース (Visual Studio 2015 用) を取得します。

  2. root_VS2015 フォルダにある Readme.md の手順に従って、Open 棟梁テンプレート・ベースとサンプルデータベースのセットアップを行います。

3. 本チュートリアルでの演習課題について

本チュートリアルでは、Open 棟梁テンプレート・ベースに付属のサンプルプログラムに、画面・ロジックを追加する形で演習を行っていきます。サンプルプログラムの構成を図 3-1 に、チュートリアルの画面遷移図を図 3-2 に示します。

図 3-1 サンプルプログラムの構成

本チュートリアルでは、DB アクセスクラス (DAO: Data Access Object) として、以下に示す 3 種類のクラスを作成します。各クラスの詳細については、Open 棟梁の利用ガイド(ベターユース、FAQ 編)をご覧ください。

DB アクセスクラス 説明
自動生成 DAO Open 棟梁付属の D 層自動生成ツールにより生成する DAO クラス。テーブル・ビューに対する単純な CRUD 処理を行う場合に利用する。
共通 DAO Open 棟梁提供の DAO クラス。複数テーブルを結合した結果を取得する場合など、D 層自動生成ツールで自動生成できない処理を行う場合に利用する。
DAO 集約クラス D 層部分のファサードクラス。1 トランザクションで複数 DAO クラスを利用する場合に、B 層からのリクエストを集約させる場合に利用する。

図 3-2 サンプルプログラムの画面遷移図

4. 演習

Open 棟梁を用いた開発の流れを、順を追って説明します。

4.1 Visual Studio の起動

  1. C:\root\programs\VB\Samples\2CS_sample\2CSClientWin_sample\2CSClientWin_sample.sln を開きます。

  2. Visual Studio が起動し、Open 棟梁テンプレート・ベース(Visual Studio 2015 用)に付属のサンプルプログラムが開かれていることを確認してください。

4.2 P層(画面デザイン)の作成

4.2.1 注文情報一覧画面の作成

  1. Visual Studio のツールバーから、「プロジェクト(P)」-「Windows フォームの追加(F)」を選択します。

  2. OrdersForm.vb という名前の、新しい Windows フォームを追加します。

  3. OrdersForm.vb に、以下の図のように Button コントロールと DataGridView コントロールを追加します。

    追加した Button と DataGridView には、それぞれ以下のようにプロパティを設定します。

    • Button
      • Name: btnShowOrderDetail
      • Text: 注文情報の詳細を表示する
    • DataGridView
      • AllowUserToAddRows: false
      • AllowUserToDeleteRows: false

    【注意】コントロール名のプレフィックス (”btn” など) を適切に設定しないと、Open 棟梁からコントロールが正しく認識されません。(詳しくは Open 棟梁の利用ガイド (纏め者編) をご覧ください)

4.2.2 注文詳細情報画面の作成

  1. 4.2.1 項と同じように、注文の詳細情報を表示する Windows フォームを作成します。ここでは、フォームの名前は OrderDetailsForm.vb としてください。

  2. OrderDetailsForm.vb に、以下の図のように Label コントロールを 2 つ、DataGridView コントロールを 2 つ、Button コントロールを 1 つ追加します。

    追加したコントロールには、それぞれ以下のようにプロパティを設定します。

    • Label (上部)
      • Text: 注文情報 (サマリ)
    • Label (下部)
      • Text: 注文情報 (明細)
    • Button
      • Name: btnUpdateOrder
      • Text: 修正内容を反映
    • DataGridView (2 つとも)
      • AllowUserToAddRows: false
      • AllowUserToDeleteRows: false

4.3 引数クラス・戻り値クラスの作成

4.3.1 引数クラスの作成

  1. Visual Studio のソリューション エクスプローラーで Common フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. OrderParameterValue.vb という名前のクラスを追加します。

  3. 以下のコードを OrderParameterValue.vb に追加し、Open 棟梁が提供するクラスをインポートします。

    Imports Touryo.Infrastructure.Business.Util
    Imports Touryo.Infrastructure.Business.Common
  4. OrderParameterValue クラスの宣言部分を以下のように修正し、Open 棟梁の「引数親クラス 2」を継承させます。

    Public Class OrderParameterValue
      Inherits MyParameterValue
  5. OrderParameterValue クラスのコンストラクタを以下のように修正します。

    Public Sub New(screenId As String, controlId As String, methodName As String, actionType As String, user As MyUserInfo)
      MyBase.New(screenId, controlId, methodName, actionType, user)
    End Sub
  6. 画面から業務ロジックに渡す値として、OrderParameterValue クラスに以下のフィールドを追加します。

    ''' <summary>注文 ID</summary>
    Public OrderId As String
    
    ''' <summary>注文情報(サマリ)</summary>
    Public Orders As System.Data.DataTable
    
    ''' <summary>注文情報(明細)</summary>
    Public OrderDetails As System.Data.DataTable

4.3.2 戻り値クラスの作成

  1. 4.3.1 項と同じように、Common フォルダに、OrderReturnValue.vb という名前のクラスを追加します。

  2. 以下のコードを OrderReturnValue.vb に追加し、Open 棟梁が提供するクラスをインポートします。

    Imports Touryo.Infrastructure.Business.Common
  3. OrderReturnValue クラスの宣言部分を以下のように修正し、Open 棟梁の「戻り値親クラス 2」を継承させます。

    Public Class OrderReturnValue
      Inherits MyReturnValue
  4. 画面に返す値として、OrderReturnValue クラスに以下のフィールドを追加します。

    ''' <summary>注文情報(サマリ)</summary>
    Public Orders As System.Data.DataTable
    
    ''' <summary>注文情報(明細)</summary>
    Public OrderDetails As System.Data.DataTable

4.4 共通例外処理の実装

  1. Visual Studio のソリューション エクスプローラーから、Program.vb ファイルを開きます。

  2. 以下のコードを Program.vb に追加し、Open 棟梁が提供するクラスをインポートします。

    Imports Touryo.Infrastructure.Framework.RichClient.Business
  3. サンプルプログラムでは、共通例外ハンドラとして Application_ThreadException メソッドが用意されています。ここに、共通例外処理として、データベース トランザクションをロールバックする処理を追記します。

    Public Shared Sub Application_ThreadException(sender As Object,  e As ThreadExceptionEventArgs)
      ' DB のトランザクションをロールバックする (DB に接続していない場合は何もしない)
      BaseLogic2CS.RollbackAndClose()
      ShowErrorMessage(e.Exception, "Application_ThreadExceptionによる例外通知です。")
    End Sub

4.5 D 層の作成

4.5.1 ツールによる自動生成

テーブル・ビューに対する単純な CRUD 処理を行うデータアクセスクラス、SQL ファイルについては、Open 棟梁付属の D 層自動生成ツールで自動生成が可能です。

  1. C:\root\programs\C#\Frameworks\DaoGen_Tool\bin\Debug\DaoGen_Tool.exe を実行し、D 層自動生成ツールを起動します。

  2. 以下のように値を設定し、「取得」ボタンをクリックします。

    • データプロバイダ: SQL Server Client
    • 接続文字列: Data Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=true;
    • プルダウン: 概要情報
  3. 接続文字列等の情報に誤りがなければ、「DBMSのスキーマ情報の表示(概要情報)ダイアログ」が表示されます。

    本ダイアログが表示されたことを確認し、「閉じる」ボタンをクリックして、ダイアログを閉じます。

  4. 「テーブル一覧の取得」ボタンをクリックします。

    テーブル名称に関する注意を促すダイアログが表示されますが、「OK」ボタンをクリックして閉じてください。

  5. Northwind データベース内のテーブル/ビューがリストに表示されます。本チュートリアルでは Orders テーブルと Order Details テーブルのみ使用しますので、Orders テーブル、Order Details テーブル以外を選択して、「削除」ボタンをクリックします。

  6. リスト内の項目が、Orders テーブルと Order Details テーブルのみになったことを確認し、「ロード」ボタンをクリックします。

  7. 「D層定義情報を生成」ボタンが活性化されますので、出力エンコーディングとして「utf-8」を選択し、「D層定義情報を生成」ボタンをクリックします。

    D 層定義情報ファイルの保存ダイアログが表示されますので、C:\root\Info.csv にファイルを保存します。

  8. D 層定義情報ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。

  9. 「STEP2へ遷移」ボタンをクリックします。

  10. 「ステップ2」画面が表示されますので、以下のように値を設定し、「プログラムを生成する」ボタンをクリックします。

    • 言語: VB
    • D 層定義情報ファイル: C:\root\Info.csv
    • ソーステンプレートフォルダ: C:\root\files\tools\DGenTemplates
    • 出力ファイル: C:\root
    • 上記以外はデフォルトのまま
  11. Dao、SQL ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。

  12. C:\root フォルダ以下に、Dao ファイル、SQL ファイルが生成されていることを確認します。

    【注意】Open 棟梁では、SQL ファイルとして、拡張子が .sql のファイルと、.xml のファイルがある。(詳しくは Open 棟梁の説明書をご覧ください)

  13. 自動生成した Dao クラスをサンプルプログラムに含めるため、Visual Studio でサンプルプログラムを開き、Dao フォルダを選択し、ツールバーの「プロジェクト(P)」-「既存の項目の追加(G)」を選択します。

  14. 既存項目の追加ダイアログで、C:\root\DaoOrders.vbC:\root\DaoOrder_Details.vb ファイルを選択し、「追加(A)」ボタンをクリックします。

  15. C:\root フォルダ直下に生成された SQL ファイル・XML ファイルを、C:\root\files\resource\Sql フォルダに移動します。

  16. D 層自動生成ツールを終了します。

4.5.2 SQL ファイルの作成

D 層自動生成ツールでは、単純な CRUD 処理を行う Dao クラスや SQL ファイルを生成できます。しかし、複数のテーブルを結合 (JOIN) させる SQL など、単純な CRUD 処理ではない SQL は、個別に作成する必要があります。

  1. C:\root\files\resource\Sql フォルダに、SelectOrders.sql ファイルを作成します。

  2. SelectOrders.sql に、以下の SQL 文を記述します。

    SELECT
      Orders.OrderID, Customers.CompanyName, Customers.ContactName, Employees.LastName As EmployeeLastName, Employees.FirstName As EmployeeFirstName, Orders.OrderDate
    FROM
      Orders
        INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
        INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID

4.5.3 DAO 集約クラスの作成

本チュートリアルでは、以下の 3 つの Dao クラスを使用します。

  • DaoOrders
    • Orders テーブルへのアクセス用
  • DaoOrder_Details
    • Order Details テーブルへのアクセス用
  • CmnDao (Open 棟梁の共通 Dao)
    • 4.5.2 項で作成した SQL ファイルを使用したアクセス用

これらの Dao クラスの呼び出しを制御し、業務ロジッククラス (B 層クラス) に対する窓口 (ファサード) となる、DAO 集約クラスを作成します。

  1. Visual Studio のソリューション エクスプローラーで、Dao フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. ConsolidatedLayerD.vb という名前のクラスを追加します。

  3. 以下のコードを ConsolidatedLayerD.vb に追加し、Open 棟梁が提供するクラス、および 4.3 節で作成した引数・戻り値クラスをインポートします。

    '  Open棟梁
    Imports Touryo.Infrastructure.Business.Dao
    Imports Touryo.Infrastructure.Public.Db
    
    ' 引数・戻り値クラス
    Imports _2CSClientWin_sample.Common
  4. ConsolidatedLayerD クラスの宣言部分を以下のように修正し、Open 棟梁の「DAO 集約親クラス」を継承させます。

    Public Class ConsolidatedLayerD
      Inherits BaseConsolidateDao
  5. ConsolidatedLayerD クラスに、以下のようにコンストラクタを作成します。

    Public Sub New(dam As BaseDam)
      MyBase.New(dam)
    End Sub
  6. ConsolidatedLayerD クラスに、注文情報一覧を取得する GetOrders メソッドを作成します。

    Public Function GetOrders(orderParameter As OrderParameterValue) As OrderReturnValue
      ' 戻り値クラスを作成する
      Dim returnValue As New OrderReturnValue()
    
      ' 共通 DAO を作成する (SQL ファイルとして、4.5.2 項で作成したファイルを使用する)
      Dim dao As New CmnDao(Me.Dam)
      dao.SQLFileName = "SelectOrders.sql"
    
      ' 結果格納用の DataTable
      Dim table As New System.Data.DataTable()
    
      ' DB から注文情報一覧を取得し、DataTable に格納する
      dao.ExecSelectFill_DT(table)
    
      ' 戻り値クラスに注文情報一覧を格納し、B 層クラスに返す
      returnValue.Orders = table
      Return returnValue
    End Function
  7. 同様に、注文 ID をもとに、注文情報の詳細を取得する GetOrderById メソッドを作成します。

    Public Function GetOrderById(orderParameter As OrderParameterValue) As OrderReturnValue
      ' 戻り値クラスを作成する
      Dim returnValue As New OrderReturnValue()
    
      ' 自動生成した D 層クラスのインスタンスを生成する
      Dim orderDao As New DaoOrders(this.Dam)
      Dim orderDetailsDao As New DaoOrder_Details(this.Dam)
    
      ' 注文情報、注文詳細情報を格納するための DataTable
      Dim orderTable As New System.Data.DataTable()
      Dim orderDetailsTable As New System.Data.DataTable()
    
      ' パラメータを設定する
      orderDao.PK_OrderID = orderParameter.OrderId
      orderDetailsDao.PK_OrderID = orderParameter.OrderId
    
      ' 注文 ID をもとに注文情報を検索する
      orderDao.D2_Select(orderTable)
      orderDetailsDao.D2_Select(orderDetailsTable)
    
      ' 戻り値クラスに結果セットを格納し、B 層クラスに返す
      returnValue.Orders = orderTable
      returnValue.OrderDetails = orderDetailsTable
      Return returnValue
    End Function
  8. 同様に、画面で入力した注文情報を DB に反映する UpdateOrder メソッドを作成します。

    Public Function UpdateOrder(orderParameter As OrderParameterValue) As OrderReturnValue
      ' 戻り値クラスを作成する
      Dim returnValue As New OrderReturnValue()
    
      ' 自動生成した D 層クラスのインスタンスを生成する
      Dim orderDao As New DaoOrders(Me.Dam)
      Dim orderDetailsDao As New DaoOrder_Details(Me.Dam)
    
      ' 注文情報、注文詳細情報を格納するための DataTable
      Dim orderTable As System.Data.DataTable = orderParameter.Orders
      Dim orderDetailsTable As System.Data.DataTable = orderParameter.OrderDetails
    
      ' レコードの状態を確認し、修正されていたら DB を更新する
      If orderTable.Rows(0).RowState = System.Data.DataRowState.Modified Then
        ' 注文情報(サマリ)更新用のパタメータを設定する
        orderDao.PK_OrderID = orderTable.Rows(0)("OrderId")
        orderDao.Set_OrderDate_forUPD = orderTable.Rows(0)("OrderDate")
        orderDao.Set_RequiredDate_forUPD = orderTable.Rows(0)("RequiredDate")
        orderDao.Set_ShippedDate_forUPD = orderTable.Rows(0)("ShippedDate")
        orderDao.Set_ShipVia_forUPD = orderTable.Rows(0)("ShipVia")
        orderDao.Set_Freight_forUPD = orderTable.Rows(0)("Freight")
        orderDao.Set_ShipName_forUPD = orderTable.Rows(0)("ShipName")
        orderDao.Set_ShipAddress_forUPD = orderTable.Rows(0)("ShipAddress")
        orderDao.Set_ShipCity_forUPD = orderTable.Rows(0)("ShipCity")
        orderDao.Set_ShipRegion_forUPD = orderTable.Rows(0)("ShipRegion")
        orderDao.Set_ShipPostalCode_forUPD = orderTable.Rows(0)("ShipPostalCode")
        orderDao.Set_ShipCountry_forUPD = orderTable.Rows(0)("ShipCountry")
    
        ' 注文情報(サマリ)を更新する
        orderDao.D3_Update()
      End If
    
      For Each row As System.Data.DataRow In orderDetailsTable.Rows
        ' レコードの状態を確認し、修正されていたら DB を更新する
        If row.RowState = System.Data.DataRowState.Modified Then
          ' 注文情報(明細)更新用のパラメータを設定する
          orderDetailsDao.PK_OrderID = row("OrderId")
          orderDetailsDao.PK_ProductID = row("ProductId")
          orderDetailsDao.Set_UnitPrice_forUPD = row("UnitPrice")
          orderDetailsDao.Set_Quantity_forUPD = row("Quantity")
          orderDetailsDao.Set_Discount_forUPD = row("Discount")
    
          ' 注文情報(明細)を更新する
          orderDetailsDao.D3_Update()
        End If
      Next
    
      ' 戻り値クラスをB層クラスに返す(更新処理のため、戻り値はなし)
      Return returnValue
    End Function

4.6 B層の作成

  1. Visual Studio のソリューション エクスプローラーで、Business フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. OrdersLogic.vb という名前のクラスを追加します。

  3. 以下のコードを OrdersLogic.vb に追加し、Open 棟梁が提供するクラス、引数・戻り値クラス、D 層クラスをインポートします。。

    ' 業務フレームワーク
    Imports Touryo.Infrastructure.Business.Business
    Imports Touryo.Infrastructure.Business.Common
    Imports Touryo.Infrastructure.Business.Dao
    Imports Touryo.Infrastructure.Business.Exceptions
    Imports Touryo.Infrastructure.Business.Presentation
    Imports Touryo.Infrastructure.Business.Util
    Imports Touryo.Infrastructure.Business.RichClient.Asynchronous
    Imports Touryo.Infrastructure.Business.RichClient.Business
    Imports Touryo.Infrastructure.Business.RichClient.Presentation
    
    ' フレームワーク
    Imports Touryo.Infrastructure.Framework.Business
    Imports Touryo.Infrastructure.Framework.Common
    Imports Touryo.Infrastructure.Framework.Dao
    Imports Touryo.Infrastructure.Framework.Exceptions
    Imports Touryo.Infrastructure.Framework.Presentation
    Imports Touryo.Infrastructure.Framework.Util
    Imports Touryo.Infrastructure.Framework.Transmission
    Imports Touryo.Infrastructure.Framework.RichClient.Presentation
    
    ' 部品
    Imports Touryo.Infrastructure.Public.Db
    Imports Touryo.Infrastructure.Public.IO
    Imports Touryo.Infrastructure.Public.Log
    Imports Touryo.Infrastructure.Public.Str
    Imports Touryo.Infrastructure.Public.Util
    
    ' 引数・戻り値クラス
    Imports _2CSClientWin_sample.Common
    
    ' DAO クラス
    Imports _2CSClientWin_sample.Dao
  4. OrdersLogic クラス宣言部分を以下のように修正し、Open 棟梁の「業務親クラス 2」を継承させます。

    Public Class OrdersLogic
      Inherits MyFcBaseLogic2CS
  5. OrdersLogic クラスに、注文情報一覧取得用の UOC_GetOrders メソッド・注文 ID をもとに注文情報の詳細を取得するための UOC_GetOrderById メソッド・注文情報更新用の UOC_UpdateOrder メソッドを作成します。ただし、DAO クラスの呼び出しは DAO 集約クラスが行いますので、B 層クラスは、P 層クラスと DAO 集約クラスの中継のみを行います。

    Private Sub UOC_GetOrders(orderParameter As OrderParameterValue)
      ' DAO 集約クラスを生成する
      Dim facade As new ConsolidatedLayerD(Me.GetDam())
    
      ' 注文情報一覧を取得する
      Dim returnValue As OrderReturnValue = facade.GetOrders(orderParameter)
    
      ' 戻り値クラスを返す
      Me.ReturnValue = returnValue
    End Sub
    
    Private Sub UOC_GetOrderById(orderParameter  As OrderParameterValue)
      ' DAO 集約クラスを生成する
      Dim facade As new ConsolidatedLayerD(Me.GetDam())
    
      ' 注文情報の詳細を取得する
      Dim returnValue As OrderReturnValue = facade.GetOrderById(orderParameter)
    
      ' 戻り値クラスを返す
      Me.ReturnValue = returnValue
    End Sub
    
    Private Sub UOC_UpdateOrder(orderParameter  As OrderParameterValue)
      ' DAO 集約クラスを生成する
      Dim facade As new ConsolidatedLayerD(Me.GetDam())
    
      ' 注文情報をDBに登録する
      Dim returnValue As OrderReturnValue = facade.UpdateOrder(orderParameter)
    
      ' 戻り値クラスを返す
      Me.ReturnValue = returnValue
    End Sub

    【注意】Open 棟梁の「業務親クラス 2」である MyFcBaseLogic2CS クラスを継承した B 層クラスでは、P 層から呼び出されるメソッド名は UOC_xx (xx は任意) とする必要があります。P 層から ”xx” の部分をパラメータとして渡すことで、Open 棟梁により UOC_xx メソッドに処理が振り分けられます。(後述)

4.7 P層(画面コードクラス)の作成

4.7.1 注文情報一覧画面の画面コードクラス (OrdersForm.vb) の作成

  1. Visual Studio のソリューション エクスプローラーで、OrdersForm.vb ファイルを右クリックし、「コードの表示(C)」を選択します。

  2. 以下のコードを OrdersForm.vb に追加し、Open 棟梁が提供するクラス、引数・戻り値クラス、B 層クラスをインポートします。

    ' 業務フレームワーク
    Imports Touryo.Infrastructure.Business.Business
    Imports Touryo.Infrastructure.Business.Common
    Imports Touryo.Infrastructure.Business.Dao
    Imports Touryo.Infrastructure.Business.Exceptions
    Imports Touryo.Infrastructure.Business.Presentation
    Imports Touryo.Infrastructure.Business.Util
    Imports Touryo.Infrastructure.Business.RichClient.Asynchronous
    Imports Touryo.Infrastructure.Business.RichClient.Presentation
    
    ' フレームワーク
    Imports Touryo.Infrastructure.Framework.Business
    Imports Touryo.Infrastructure.Framework.Common
    Imports Touryo.Infrastructure.Framework.Dao
    Imports Touryo.Infrastructure.Framework.Exceptions
    Imports Touryo.Infrastructure.Framework.Presentation
    Imports Touryo.Infrastructure.Framework.Util
    Imports Touryo.Infrastructure.Framework.Transmission
    Imports Touryo.Infrastructure.Framework.RichClient.Business
    Imports Touryo.Infrastructure.Framework.RichClient.Presentation
    
    ' 部品
    Imports Touryo.Infrastructure.Public.Db
    Imports Touryo.Infrastructure.Public.IO
    Imports Touryo.Infrastructure.Public.Log
    Imports Touryo.Infrastructure.Public.Str
    Imports Touryo.Infrastructure.Public.Util
    
    ' 引数・戻り値クラス
    Imports _2CSClientWin_sample.Common
    
    ' B 層クラス
    Imports _2CSClientWin_sample.Business
  3. OrdersLogic クラス宣言部分を以下のように修正し、Open 棟梁の「画面親クラス 2」を継承させます。

    Partial Class OrdersForm
      Inherits MyBaseControllerWin
  4. 画面起動時に注文情報の一覧を表示させるため、OrdersForm クラスの UOC_FormInit メソッドを以下のようにオーバーライドします。

    Protected Overrides Sub UOC_FormInit()
      ' 引数クラスを生成
      Dim param As New OrderParameterValue(Me.Name, "", "GetOrders", "SQL", MyBaseControllerWin.UserInfo)
    
      ' 戻り値クラスを生成
      Dim returnValue As OrderReturnValue
    
      ' B層呼出し
      Dim logic As New OrdersLogic()
      returnValue = DirectCast(logic.DoBusinessLogic(param), OrderReturnValue)
    
      ' DataGridView をクリア
      Me.dataGridView1.DataSource = Nothing
    
      If returnValue.ErrorFlag = True Then
        ' エラーメッセージを表示する
        MessageBox.Show("ErrorMessageID:" & returnValue.ErrorMessageID & vbCrLf _
          & "ErrorMessage:" & returnValue.ErrorMessage & vbCrLf _
          & "ErrorInfo:" & returnValue.ErrorInfo & vbCrLf)
      Else
        ' 注文情報一覧を DataGridView に表示する
        Me.dataGridView1.DataSource = returnValue.Orders
    
        ' DataGridView を編集不可にする
        Me.dataGridView1.ReadOnly = True
      End If
    
      ' DBとの接続を閉じる
      BaseLogic2CS.CommitAndClose()
    End Sub
  5. 次に、ボタン押下時に注文情報詳細画面を表示するためのメソッドを追加します。

    Protected Sub UOC_btnShowOrderDetail_Click(eventArgs As RcFxEventArgs)
      If Me.dataGridView1.SelectedRows.Count = 0 Then
        ' DataGridView の行が選択されていない場合は、エラーメッセージを表示する
        MessageBox.Show("行が選択されていません")
        Return
      End If
    
      ' 注文情報詳細画面を生成する
      Dim orderDetailsForm As New OrderDetailsForm()
    
      ' 注文情報一覧画面に、注文情報詳細画面を所有させる
      orderDetailsForm.Owner = Me
    
      ' 注文情報詳細画面を表示する
      orderDetailsForm.Show()
    End Sub
  6. 注文情報一覧から、選択されている注文 ID を返すプロパティを作成します。

    Public ReadOnly Property SelectedOrderId() As String
      Get
        If Me.dataGridView1.SelectedRows.Count = 0 Then
          ' 行が選択されていない場合は null を返す
          Return Nothing
        Else
          ' 選択されている注文 ID を返す
          Return Me.dataGridView1.SelectedRows(0).Cells(0).Value.ToString()
        End If
      End Get
    End Property

4.7.2 注文情報詳細画面の画面コードクラス (OrderDetailsForm.vb) の作成

  1. 4.7.1 項を参考に、注文情報詳細画面 (OrderDetailsForm) も、必要な型情報をインポートし、Open 棟梁の「業務親クラス 2」を継承させます。

  2. 画面起動時に注文情報の詳細を表示させるため、OrderDetailsForm クラスの UOC_FormInit メソッドを以下のようにオーバーライドします。

    Protected Overrides Sub UOC_FormInit()
      ' 引数クラスを生成
      Dim param As New OrderParameterValue(Me.Name, "", "GetOrderById", "SQL", MyBaseControllerWin.UserInfo)
      param.OrderId = DirectCast(Me.Owner, OrdersForm).SelectedOrderId
    
      ' 戻り値クラスを生成
      Dim returnValue As OrderReturnValue
    
      ' B層呼出し
      Dim logic As New OrdersLogic()
      returnValue = DirectCast(logic.DoBusinessLogic(param), OrderReturnValue)
    
      ' DataGridView をクリア
      Me.dataGridView1.DataSource = Nothing
      Me.dataGridView2.DataSource = Nothing
    
      If returnValue.ErrorFlag = True Then
        ' エラーメッセージを表示する
        MessageBox.Show("ErrorMessageID:" & returnValue.ErrorMessageID & vbCrLf _
          & "ErrorMessage:" & returnValue.ErrorMessage & vbCrLf _
          & "ErrorInfo:" & returnValue.ErrorInfo & vbCrLf)
      Else
        ' 注文情報(サマリ)の表示
        Me.dataGridView1.DataSource = returnValue.Orders
    
        ' 特定の列を編集不可にする
        Me.dataGridView1.Columns("OrderId").ReadOnly = True
        Me.dataGridView1.Columns("CustomerId").ReadOnly = True
        Me.dataGridView1.Columns("EmployeeId").ReadOnly = True
    
        ' 注文情報(明細)の表示
        Me.dataGridView2.DataSource = returnValue.OrderDetails
    
        ' 特定の列を編集不可にする
        Me.dataGridView2.Columns("OrderId").ReadOnly = True
        Me.dataGridView2.Columns("ProductId").ReadOnly = True
      End If
    
      ' DBとの接続を閉じる
      BaseLogic2CS.CommitAndClose()
    End Sub
  3. 次に、ボタン押下時に注文情報を DB に反映させるためのメソッドを追加します。

    Protected Sub UOC_btnUpdateOrder_Click(eventArgs As RcFxEventArgs)
      ' グリッドの値を取得する
      Dim orderTable As DataTable = Me.dataGridView1.DataSource
      Dim orderDetailTable As DataTable = Me.dataGridView2.DataSource
    
      ' 引数クラスを生成
      Dim param As New OrderParameterValue(Me.Name, "", "UpdateOrder", "SQL", MyBaseControllerWin.UserInfo)
    
      ' 業務ロジックに引数としてグリッドの値を渡す
      param.Orders = orderTable
      param.OrderDetails = orderDetailTable
    
      ' 戻り値クラスを生成
      Dim returnValue  As OrderReturnValue
    
      ' B層呼出し
      Dim logic As New OrdersLogic()
      returnValue = logic.DoBusinessLogic(param)
    
      If returnValue.ErrorFlag = true Then
        ' トランザクションをロールバックする
        BaseLogic2CS.RollbackAndClose()
    
        ' エラーメッセージを表示する
        MessageBox.Show("ErrorMessageID:" & returnValue.ErrorMessageID & vbCrLf _
          & "ErrorMessage:" & returnValue.ErrorMessage & vbCrLf _
          & "ErrorInfo:" & returnValue.ErrorInfo & vbCrLf)
      Else
        ' トランザクションをコミットする
        BaseLogic2CS.CommitAndClose()
    
        ' 結果(正常系)
        MessageBox.Show("正常に DB を更新しました。")
      End If
    End Sub

4.8 その他

4.8.1 アプリケーション構成ファイル (app.config) の設定内容の確認

  1. Visual Studio のソリューション エクスプローラーで、app.config ファイルを開きます。

  2. connectionStrings セクションを確認し、”ConnectionString_SQL” という名前の接続文字列設定が、Northwind データベースを指していることを確認します。

    <connectionStrings>
      <!-- SQL Server / SQL Client用 -->
      <add name="ConnectionString_SQL" connectionString="Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True;"/>
    </connectionStrings>

4.9 動作確認

4.9.1 スタートアップ画面の変更

サンプルプログラムを起動すると、既定ではサンプルプログラムが提供している画面が表示されます。これを、注文情報一覧画面 (OrdersForm.vb) が表示されるように変更します。

  1. Visual Studio のソリューション エクスプローラーで、Program.vb ファイルを開きます。

  2. Program.vb で、Application.Run メソッドを実行している箇所を検索し、その部分を、以下のように注文情報一覧画面が起動時に表示されるようにします。

    ' 業務画面の表示(業務の開始)
    Application.Run(New OrdersForm())

4.9.2 Visual Studio によるデバッグ実行

  1. Visual Studio でサンプルプログラムをデバッグ実行します。

  2. スプラッシュ画面が表示された後、ログイン画面が表示されますので、以下のように入力し、「ログイン」ボタンをクリックします。

    • 上部のテキストボックス: 空でない任意の文字列
    • 下部のテキストボックス: 任意の文字列 (空でもよい)
  3. 注文情報一覧画面が表示され、注文情報がグリッドに表示されていることを確認します。どこかの行を選択し、「注文詳細の情報を表示する」ボタンをクリックします。

  4. 注文情報の詳細が表示されますので、画面上で修正したい箇所を編集します。(ただし、OrderId 列、CustomerId 列、Employee 列、ProductId 列は編集できません) 編集終了後、「修正内容を反映」ボタンをクリックします。

  5. 正常にDBを更新したというメッセージが表示されることを確認し、「OK」ボタンをクリックします。

  6. 以下のコマンドを実行し、修正した内容で DB の値が更新されていることを確認します。なお、以下のコマンドの中で【選択した注文番号】の箇所は、先ほど選択した注文番号 (OrderID) に置き換えてください。

    "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S localhost\SQLExpress -E -d Northwind -Q "Select * From Orders Inner Join [Order Details] On Orders.OrderId=[Order Details].OrderId Where Orders.OrderId=【選択した注文番号】"

4.9.3 トレースログの確認

  1. C:\root\programs\C#\Samples\2CS_sample\2CSClientWin_sample\bin\Debug\ACCESS_2CS.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

  2. OrdersFormOrderDetailsForm へのアクセスがトレースとして記録されていることを確認します。(以下はトレースログを抜粋したものです。Login 画面、OrdersForm 画面、OrderDetailsForm 画面がそれぞれトレースされていることが分かります)

    [2017/04/06 11:24:54,043],[INFO ],[9],Splash
    [2017/04/06 11:24:54,058],[INFO ],[10],Splash
    [2017/04/06 11:24:57,084],[INFO ],[9],,-,-,Login,Form_Load
    [2017/04/06 11:25:00,060],[INFO ],[9],,-,----->,Login,btnButton1
    [2017/04/06 11:25:00,065],[INFO ],[9],,user01,-,Login,Form_Closed
    [2017/04/06 11:25:00,076],[INFO ],[9],,user01,<-----,Login,btnButton1,16,0
    [2017/04/06 11:25:00,099],[INFO ],[9],,user01,-,OrdersForm,Form_Load
    [2017/04/06 11:25:00,667],[INFO ],[9],,user01,pc01,----->>,OrdersForm,,GetOrders,
    [2017/04/06 11:25:03,008],[INFO ],[9],,user01,pc01,<<-----,OrdersForm,,GetOrders,,2341,203
    [2017/04/06 11:28:46,964],[INFO ],[9],,user01,----->,OrdersForm,btnShowOrderDetail
    [2017/04/06 11:28:46,983],[INFO ],[9],,user01,-,OrderDetailsForm,Form_Load
    [2017/04/06 11:28:46,986],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,GetOrderById,
    [2017/04/06 11:28:49,486],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,GetOrderById,,2501,31
    [2017/04/06 11:28:49,537],[INFO ],[9],,user01,<-----,OrdersForm,btnShowOrderDetail,2573,109
    [2017/04/06 11:36:09,282],[INFO ],[9],,user01,----->,OrderDetailsForm,btnUpdateOrder
    [2017/04/06 11:36:09,456],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,UpdateOrder,
    [2017/04/06 11:36:10,000],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,UpdateOrder,,543,47
    [2017/04/06 11:39:11,799],[INFO ],[9],,user01,<-----,OrderDetailsForm,btnUpdateOrder,182512,125
    [2017/04/06 11:39:13,542],[INFO ],[9],,user01,-,OrderDetailsForm,Form_Closed
    [2017/04/06 11:39:15,232],[INFO ],[9],,user01,-,OrdersForm,Form_Closed
  3. C:\root\programs\C#\Samples\2CS_sample\2CSClientWin_sample\bin\Debug\SQLTRACE_2CS.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

  4. Orders テーブル・Order Details テーブルに対する SQL 文がトレースとして記録されていることを確認します。(以下は SQL トレースログから、SELECT 文の実行ログを抜粋したものです)

    [2017/04/06 11:25:03,006],[INFO ],[9],207,16,[commandText]:SELECT Orders.OrderID, Customers.CompanyName, Customers.ContactName, Employees.LastName As EmployeeLastName, Employees.FirstName As EmployeeFirstName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID  [commandParameter]:
    [2017/04/06 11:28:49,335],[INFO ],[9],51,16,[commandText]: -- DaoOrders_D2_Select -- 2012/7/30 日立 太郎 SELECT [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry] FROM [Orders] WHERE [OrderID] = @OrderID  [commandParameter]:OrderID=10248,
    [2017/04/06 11:28:49,486],[INFO ],[9],150,0,[commandText]: -- DaoOrder_Details_D2_Select -- 2012/7/30 日立 太郎 SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE [OrderID] = @OrderID  [commandParameter]:OrderID=10248,
Clone this wiki locally