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

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

2014年11月27日

はじめに

本ドキュメントの目的

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

本ドキュメントの対象

Open 棟梁を用いた 3 層 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 サーバー側アプリケーションの起動

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

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

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

4.2.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」を継承させます。

    <Serializable()> _
    Public Class OrderParameterValue
        Inherits MyParameterValue

    【注意】
    ネットワーク越しにオブジェクトを送信できるよう、Serializable 属性が必要です。

  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.2.2 戻り値クラスの作成

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

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

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

    <Serializable()> _
    Public Class OrderReturnValue
        Inherits MyReturnValue

    【注意】
    ネットワーク越しにオブジェクトを送信できるよう、Serializable 属性が必要です。

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

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

4.3 D 層の作成

4.3.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 でサンプルプログラムを開き、WSServer_sample プロジェクトの 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.3.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.3.3 DAO 集約クラスの作成

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

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

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

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

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

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

    ' Open棟梁
    Imports Touryo.Infrastructure.Business.Dao
    Imports Touryo.Infrastructure.Public.Db
    
    ' 引数・戻り値クラス
    Imports WSIFType_sample
  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.3.2 項で作成したファイルを使用する)
        Dim dao As New CmnDao(Me.Dam)
        dao.SQLFileName = "SelectOrders.sql"
    
        ' 結果格納用の DataTable
        Dim table As New System.Data.DataTable()
    
        ' DB から注文情報一覧を取得し、DataTable に格納するdatabase and stored in a 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(Me.Dam)
        Dim orderDetailsDao As New DaoOrder_Details(Me.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.4 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.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.Public.Db
    Imports Touryo.Infrastructure.Public.IO
    Imports Touryo.Infrastructure.Public.Log
    Imports Touryo.Infrastructure.Public.Str
    Imports Touryo.Infrastructure.Public.Util
    
    ' 引数・戻り値クラス
    Imports WSIFType_sample
    
    ' DAO クラス
    Imports WSServer_sample.Dao
  4. OrdersLogic クラス宣言部分を以下のように修正し、Open 棟梁の「業務親クラス 2」を継承させます。

    Public Class OrdersLogic
        Inherits MyFcBaseLogic
    
    End Class
  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())
    
        ' 注文情報の詳細を取得する
        Dim returnValue As OrderReturnValue = facade.UpdateOrder(orderParameter)
    
        ' 戻り値クラスを返す
        Me.ReturnValue = returnValue
    End Sub

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

4.5 サービスインタフェースの作成

4.5.1 サービスインタフェース プロジェクトの起動

  1. C:\root\programs\VB\Frameworks\Infrastructure\ServiceInterface\ASPNETWebService\ASPNETWebService.sln を開きます。

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

4.5.2 参照設定の更新

  1. ソリューションエクスプローラーで、ASPNETWebService プロジェクトを右クリックし、「参照の追加」を選択します。

  2. C:\root\programs\VB\Samples\WS_sample\WSServer_sample\bin\Release フォルダーの、WSIFType_sample.dll および WSServer_sample.dll への参照を追加します。

4.5.3 Open 棟梁の設定ファイルの修正

  1. C:\root\files\resource\XML\TMInProcessDefinition.xml を開きます。

  2. TMInProcessDefinition.xml ファイルの Transmission id="testWebService" を検索し、属性を以下のように修正します。

    <Transmission id="testWebService" assemblyName="WSServer_sample" className="WSServer_sample.Business.OrdersLogic" />

    【注意】
    上記のように修正することで、P 層クラスからサービスインタフェースに、ID 値 "testWebService" を送信すると、サービスインタフェースは上記の設定をもとに、B 層クラスをロードします。(詳しくは、Open 棟梁のユーザーガイドを参照してください)

4.5.4 アプリケーション構成ファイルの確認

  1. Visual Studio のソリューション エクスプローラーで、 ASPNETWebService プロジェクトの web.config を開きます。

  2. connectionStrings セクションを確認し、接続文字列が正しいことを確認します。

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

4.5.5 サービスインタフェースの URL の確認

  1. ソリューションエクスプローラーで、ASPNETWebService プロジェクトの ServiceForFx.asmx を右クリックし、「ブラウザで表示」を選択します。

  2. ブラウザが起動し、ServiceForFx.asmx が表示されることを確認します。ブラウザのアドレスバーに表示される URL を控えておきます。

4.6 クライアント側アプリケーションの起動

  1. C:\root\programs\VB\Samples\WS_sample\WSClient_sample\WSClientWin_sample\WSClientWin_sample.sln を開きます。

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

4.7 P 層の作成

4.7.1 Open 棟梁の設定ファイルの確認

  1. ソリューションエクスプローラーで、TMProtocolDefinition.xml を開きます。

  2. TMProtocolDefinition.xml で、以下の設定を検索し、url 属性の値が、4.5.3 項で確認したサービスインタフェースの URL と一致していることを確認します。

    <Transmission id="testWebService" protocol="2" url="http://localhost:8888/ASPNETWebService/ServiceForFx.asmx" timeout="60" />

    【注意】
    ここで、id 属性の値は、4.5.3 項で指定した値と一致させる必要があります。id 属性の値をもとに、P 層クラスはサービスインタフェースにアクセスし、サービスインタフェースは業務ロジッククラスをロードします。(詳しくは、Open 棟梁のユーザーガイドを参照してください)

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

  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.7.3 注文詳細情報画面の作成

  1. 4.7.2 項と同じように、注文の詳細情報を表示する 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.7.4 注文情報一覧画面のコードビハインドの実装

  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 WSIFType_sample
  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 callCtr As New CallController("")
        returnValue = DirectCast(callCtr.Invoke("testWebService", 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
    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
                ' 行が選択されていない場合は Nothing を返す
                Return Nothing
            Else
                ' 選択されている注文 ID を返す
                Return Me.dataGridView1.SelectedRows(0).Cells(0).Value.ToString()
            End If
        End Get
    End Property

4.7.5 注文情報詳細画面のコードビハインドの実装

  1. 4.7.4 項を参考に、注文情報詳細画面 (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 callCtr As New CallController("")
        returnValue = DirectCast(callCtr.Invoke("testWebService", 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
    End Sub
  3. 次に、ボタン押下時に注文情報を DB に反映させるためのメソッドを追加します。

    Protected Sub UOC_btnUpdateOrder_Click(eventArgs As RcFxEventArgs)
        ' グリッドの値を取得する
        Dim orderTable As System.Data.DataTable = DirectCast(Me.dataGridView1.DataSource, System.Data.DataTable)
        Dim orderDetailTable As System.Data.DataTable = DirectCast(Me.dataGridView2.DataSource, System.Data.DataTable)
    
        ' 引数クラスを生成
        Dim param As New OrderParameterValue(Me.Name, "", "UpdateOrder", "SQL", MyBaseControllerWin.UserInfo)
    
        ' 業務ロジックに引数としてグリッドの値を渡す
        param.Orders = orderTable
        param.OrderDetails = orderDetailTable
    
        ' 戻り値クラスを生成
        Dim returnValue As OrderReturnValue
    
        ' B層呼出し
        Dim callCtr As New CallController("")
        returnValue = DirectCast(callCtr.Invoke("testWebService", param), OrderReturnValue)
    
        If returnValue.ErrorFlag = True Then
            ' エラーメッセージを表示する
            MessageBox.Show("ErrorMessageID:" & returnValue.ErrorMessageID & vbCrLf _
                & "ErrorMessage:" & returnValue.ErrorMessage & vbCrLf _
                & "ErrorInfo:" & returnValue.ErrorInfo & vbCrLf)
        Else
            ' 結果(正常系)
            MessageBox.Show("Updated database successfully")
        End If
    End Sub

4.8 動作確認

4.8.1 サービスインタフェースの起動

  1. Visual Studio で、C:\root\programs\VB\Frameworks\Infrastructure\ServiceInterface\ASPNETWebService\ASPNETWebService.sln を開きます。

  2. アプリケーションをデバッグ実行します。

  3. ServiceForFx.asmx がブラウザーに表示されることを確認します。

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

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

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

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

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

4.8.3 クライアント側アプリケーションのデバッグ実行

  1. Viaual Studio で、C:\root\programs\VB\Samples\WS_sample\WSClient_sample\WSClientWin_sample\WSClientWin_sample.sln を開きます。

  2. アプリケーションをデバッグ実行します。

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

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

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

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

  7. 以下のコマンドを実行し、修正した内容で 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.8.4 トレースログの確認

  1. C:\root\files\resource\Log\ACCESS_WS.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

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

    [2012/11/06 09:50:44,019],[INFO ],[9],,user01,pc01,----->>,OrdersForm,,GetOrders,
    [2012/11/06 09:50:54,054],[INFO ],[9],,user01,pc01,<<-----,OrdersForm,,GetOrders,,10033,141
    [2012/11/06 09:51:42,024],[INFO ],[5],,user01,pc01,----->>,OrderDetailsForm,,GetOrderById,
    [2012/11/06 09:51:42,712],[INFO ],[5],,user01,pc01,<<-----,OrderDetailsForm,,GetOrderById,,687,31
    [2012/11/06 09:52:17,335],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,UpdateOrder,
    [2012/11/06 09:52:18,127],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,UpdateOrder,,791,0
    [2012/11/06 09:52:23,514],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,GetOrderById,
    [2012/11/06 09:52:23,700],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,GetOrderById,,186,16
  3. C:\root\files\resource\Log\SQLTRACE_WS.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

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

    [2012/11/06 09:50:54,052],[INFO ],[9],7947,31,[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]:
    [2012/11/06 09:51:42,411],[INFO ],[5],273,0,[commandText]: -- DaoOrders_D2_Select -- 2012/11/5 日立 太郎 SELECT [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry] FROM [Orders] WHERE [OrderID] = @OrderID  [commandParameter]:OrderID=10248,
    [2012/11/06 09:51:42,712],[INFO ],[5],212,0,[commandText]: -- DaoOrder_Details_D2_Select -- 2012/11/5 日立 太郎 SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE [OrderID] = @OrderID  [commandParameter]:OrderID=10248,
Clone this wiki locally