Tutorial_Automatic_Screen_Generation(DataMaintenance).ja - OpenTouryoProject/OpenTouryo GitHub Wiki

Open 棟梁チュヌトリアル (結合テヌブルに察するデヌタメンテナンス画面自動生成線)

2017幎1月19日

はじめに

本ドキュメントの目的

Open 棟梁の D 局自動生成ツヌルを䜿甚するず、単䞀テヌブルに察するデヌタメンテナンス画面を自動生成できたす。しかし、D 局自動生成ツヌルでは結合テヌブルに察するデヌタメンテナンス画面は生成できたせん。本ドキュメントでは、結合テヌブルに察するデヌタメンテナンス画面の生成方法を玹介したす。

本ドキュメントの察象

Open 棟梁を甚いた ASP.NET アプリケヌション開発で、結合テヌブルに察するデヌタメンテナンス画面の生成を怜蚎しおいる SE および開発者を察象ずしたす。

本ドキュメントの抂芁

本チュヌトリアルでは、Visual Studio 2015 向け Open 棟梁テンプレヌト・ベヌスに付属のサンプルプログラムを題材ずし、結合テヌブルに察するデヌタメンテナンス画面の自動生成手順を、順を远っお説明したす。

他瀟所有名称に察する衚瀺

本ドキュメントに蚘茉の䌚瀟名・商品名は、各瀟の商暙たたは登録商暙です。

ラむセンス

本ドキュメントは、クリ゚むティブ・コモンズ CC BY 2.1 JP ラむセンスの䞋で利甚可胜です。

目次

1. Open棟梁の抂芁

2. 環境蚭定

3. 本チュヌトリアルでの挔習課題に぀いお

4. 挔習の準備

5. 挔習 1: デヌタメンテナンス画面の生成

6. 挔習 2: 自動生成された画面のカスタマむズ

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 棟梁のクラス構成図

本チュヌトリアルでは、結合テヌブルに察するデヌタメンテナンス画面を自動生成するための、動的パラメタラむズドク゚リ・分析ツヌルの䜿い方を説明したす。本チュヌトリアルでは、動的パラメタラむズドク゚リ・分析ツヌルを「DPQuery_Tool」ず略したす。DPQuery_Tool は、XML 圢匏で、テヌブル結合の SQL 文を定矩できたす。たた、構文チェックやテスト機胜なども持っおいたす。

デヌタメンテナンス画面自動生成機胜の抂芁を、以䞋に瀺したす。

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 Studio をむンストヌルしおおいおください。

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

  1. GitHub で [Download ZIP] ボタンを抌䞋しお OpenTouryoTemplates.zip を入手し、これを解凍しお Open 棟梁テンプレヌト・ベヌス (Visual Studio 2015 甹) を取埗したす。

  2. root_VS2015 フォルダにある Readme.md の手順に埓っお、Open 棟梁テンプレヌト・ベヌスずサンプルデヌタベヌスのセットアップを行いたす。

  3. テストテヌブル (5 章で䜿甚) 䜜成甚に、任意の堎所に createTestTable.sql を䜜成し、以䞋のように蚘述したす。(本チュヌトリアルでは、C:\users\[ナヌザヌ名]\Documents フォルダヌに䜜成したす)

    USE [Northwind]
    GO
    /****** Object:    Table [dbo].[TABL1]        Script Date: 05/27/2016 14:12:04 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[TABL1](
        [A] [int] NOT NULL,
        [Y] [varchar](50) NULL,
        [Z] [varchar](50) NULL,
        CONSTRAINT [PK_TABL1] PRIMARY KEY CLUSTERED
        (
            [A] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[TABL1] ([A], [Y], [Z]) VALUES (1, N'Insert_1Y', N'Insert_1Z')
    INSERT [dbo].[TABL1] ([A], [Y], [Z]) VALUES (2, N'Insert_1Y2', N'Insert_1Z2')
    INSERT [dbo].[TABL1] ([A], [Y], [Z]) VALUES (3, N'Insert_1Y3', N'Insert_1Z3')
    INSERT [dbo].[TABL1] ([A], [Y], [Z]) VALUES (4, N'Insert_1Y4', N'Insert_1Z4')
    /****** Object:    Table [dbo].[TABL2]        Script Date: 05/27/2016 14:12:04 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[TABL2](
        [A] [int] NOT NULL,
        [B] [varchar](50) NULL,
        [C] [varchar](50) NULL,
        [AX] [int] NOT NULL,
        CONSTRAINT [PK_TABL2] PRIMARY KEY CLUSTERED
        (
            [A] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[TABL2] ([A], [B], [C], [AX]) VALUES (1, N'Insert_2B', N'Insert_2C1', 1)
    INSERT [dbo].[TABL2] ([A], [B], [C], [AX]) VALUES (2, N'Insert_2B2', N'Insert_2C2', 2)
    INSERT [dbo].[TABL2] ([A], [B], [C], [AX]) VALUES (3, N'Insert_2B3', N'Insert_2C3', 3)
    INSERT [dbo].[TABL2] ([A], [B], [C], [AX]) VALUES (4, N'Insert_2B4', N'Insert_2C4', 4)
    /****** Object:    Table [dbo].[TABL3]        Script Date: 05/27/2016 14:12:04 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[TABL3](
        [D] [int] IDENTITY(1,1) NOT NULL,
        [E] [nvarchar](50) NULL,
        [F] [nvarchar](50) NULL,
        [A] [int] NOT NULL,
        CONSTRAINT [PK_TABL3] PRIMARY KEY CLUSTERED
        (
            [D] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[TABL3] ON
    INSERT [dbo].[TABL3] ([D], [E], [F], [A]) VALUES (1, N'Insert_3D1', N'Insert_3E1', 1)
    INSERT [dbo].[TABL3] ([D], [E], [F], [A]) VALUES (2, N'Insert_3D2', N'Insert_3E2', 2)
    INSERT [dbo].[TABL3] ([D], [E], [F], [A]) VALUES (3, N'Insert_3D3', N'Insert_3E3', 3)
    INSERT [dbo].[TABL3] ([D], [E], [F], [A]) VALUES (4, N'Insert_3D4', N'Insert_3E4', 4)
    SET IDENTITY_INSERT [dbo].[TABL3] OFF
    /****** Object:    ForeignKey [FK_TABL2_TABL1]        Script Date: 05/27/2016 14:12:04 ******/
    ALTER TABLE [dbo].[TABL2]    WITH CHECK ADD    CONSTRAINT [FK_TABL2_TABL1] FOREIGN KEY([AX])
    REFERENCES [dbo].[TABL1] ([A])
    GO
    ALTER TABLE [dbo].[TABL2] CHECK CONSTRAINT [FK_TABL2_TABL1]
    GO
    /****** Object:    ForeignKey [FK_TABL3_TABL2]        Script Date: 05/27/2016 14:12:04 ******/
    ALTER TABLE [dbo].[TABL3]    WITH CHECK ADD    CONSTRAINT [FK_TABL3_TABL2] FOREIGN KEY([A])
    REFERENCES [dbo].[TABL2] ([A])
    GO
    ALTER TABLE [dbo].[TABL3] CHECK CONSTRAINT [FK_TABL3_TABL2]
    GO
    
    /****** Object:    Table [dbo].[TABL4]        Script Date: 08/23/2016 14:26:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[TABL4](
        [A] [int] NOT NULL,
        [Y] [varchar](50) NULL,
        [Z] [varchar](50) NULL,
        [TimeStamp] [datetime] NULL,
        CONSTRAINT [PK_TABL4] PRIMARY KEY CLUSTERED
        (
            [A] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[TABL4] ([A], [Y], [Z], [TimeStamp]) VALUES (1, N'Insert_1Y', N'Insert_1Z', CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL4] ([A], [Y], [Z], [TimeStamp]) VALUES (2, N'Insert_1Y2', N'Insert_1Z2', CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL4] ([A], [Y], [Z], [TimeStamp]) VALUES (3, N'Insert_1Y3', N'Insert_1Z3', CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL4] ([A], [Y], [Z], [TimeStamp]) VALUES (4, N'Insert_1Y4', N'Insert_1Z4', CAST(0x0000A66B00EDAAD3 AS DateTime))
    /****** Object:    Table [dbo].[TABL5]        Script Date: 08/23/2016 14:26:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[TABL5](
        [A] [int] NOT NULL,
        [B] [varchar](50) NULL,
        [C] [varchar](50) NULL,
        [AX] [int] NOT NULL,
        [TimeStamp] [datetime] NULL,
        CONSTRAINT [PK_TABL5] PRIMARY KEY CLUSTERED
        (
            [A] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[TABL5] ([A], [B], [C], [AX], [TimeStamp]) VALUES (1, N'Insert_2B', N'Insert_2C1', 1, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL5] ([A], [B], [C], [AX], [TimeStamp]) VALUES (2, N'Insert_2B2', N'Insert_2C2', 2, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL5] ([A], [B], [C], [AX], [TimeStamp]) VALUES (3, N'Insert_2B3', N'Insert_2C3', 3, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL5] ([A], [B], [C], [AX], [TimeStamp]) VALUES (4, N'Insert_2B4', N'Insert_2C4', 4, CAST(0x0000A66B00EDAAD3 AS DateTime))
    /****** Object:    Table [dbo].[TABL6]        Script Date: 08/23/2016 14:26:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[TABL6](
        [D] [int] NOT NULL,
        [E] [nvarchar](50) NULL,
        [F] [nvarchar](50) NULL,
        [A] [int] NOT NULL,
        [TimeStamp] [datetime] NULL,
        CONSTRAINT [PK_TABL6] PRIMARY KEY CLUSTERED
        (
            [D] ASC
        ) WITH (PAD_INDEX    = OFF, STATISTICS_NORECOMPUTE    = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS    = ON, ALLOW_PAGE_LOCKS    = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    INSERT [dbo].[TABL6] ([D], [E], [F], [A], [TimeStamp]) VALUES (1, N'Insert_3D1', N'Insert_3E1', 1, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL6] ([D], [E], [F], [A], [TimeStamp]) VALUES (2, N'Insert_3D2', N'Insert_3E2', 2, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL6] ([D], [E], [F], [A], [TimeStamp]) VALUES (3, N'Insert_3D3', N'Insert_3E3', 3, CAST(0x0000A66B00EDAAD3 AS DateTime))
    INSERT [dbo].[TABL6] ([D], [E], [F], [A], [TimeStamp]) VALUES (4, N'Insert_3D4', N'Insert_3E4', 4, CAST(0x0000A66B00EDAAD3 AS DateTime))
    /****** Object:    Default [DF_TABL4_TimeStamp]        Script Date: 08/23/2016 14:26:23 ******/
    ALTER TABLE [dbo].[TABL4] ADD    CONSTRAINT [DF_TABL4_TimeStamp]    DEFAULT (getdate()) FOR [TimeStamp]
    GO
    /****** Object:    Default [DF_TABL5_TimeStamp]        Script Date: 08/23/2016 14:26:23 ******/
    ALTER TABLE [dbo].[TABL5] ADD    CONSTRAINT [DF_TABL5_TimeStamp]    DEFAULT (getdate()) FOR [TimeStamp]
    GO
    /****** Object:    Default [DF_TABL6_TimeStamp]        Script Date: 08/23/2016 14:26:23 ******/
    ALTER TABLE [dbo].[TABL6] ADD    CONSTRAINT [DF_TABL6_TimeStamp]    DEFAULT (getdate()) FOR [TimeStamp]
    GO
    /****** Object:    ForeignKey [FK_TABL5_TABL4]        Script Date: 08/23/2016 14:26:23 ******/
    ALTER TABLE [dbo].[TABL5]    WITH CHECK ADD    CONSTRAINT [FK_TABL5_TABL4] FOREIGN KEY([AX])
    REFERENCES [dbo].[TABL4] ([A])
    GO
    ALTER TABLE [dbo].[TABL5] CHECK CONSTRAINT [FK_TABL5_TABL4]
    GO
    /****** Object:    ForeignKey [FK_TABL6_TABL5]        Script Date: 08/23/2016 14:26:23 ******/
    ALTER TABLE [dbo].[TABL6]    WITH CHECK ADD    CONSTRAINT [FK_TABL6_TABL5] FOREIGN KEY([A])
    REFERENCES [dbo].[TABL5] ([A])
    GO
    ALTER TABLE [dbo].[TABL6] CHECK CONSTRAINT [FK_TABL6_TABL5]
    GO
  4. コマンドプロンプトで以䞋のコマンドを実行し、本チュヌトリアルで䜿甚するテスト甚デヌタベヌスを䜜成したす。

    "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S localhost\SQLExpress -E -i "C:\Users\[ナヌザヌ名]\Documents\createTestTable.sql"

3. 本チュヌトリアルでの挔習課題に぀いお

本チュヌトリアルでは、Visual Studio 2015 向け Open 棟梁テンプレヌト・ベヌスに付属のサンプルプログラムにデヌタメンテナンス画面自動生成機胜で生成した画面・ロゞックを远加・改修する圢で挔習を行いたす。サンプルプログラムの構成を図 3-1 に、チュヌトリアルの画面遷移図を図 3-2 に瀺したす。

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

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

4. 挔習の準備

挔習に先立ち、あらかじめ䜜成したデヌタベヌスの「D 局定矩情報ファむル」および SQL ファむルを、Open 棟梁の D 局自動生成ツヌルを䜿甚しお生成しおおきたす。

4.1 SQL ファむルおよび Dao クラスの生成

  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. 本チュヌトリアルでは、「Categories」「Products」「TABL1  TABL6」テヌブルを䜿甚したす。これらのテヌブル以倖を遞択しお、「削陀」ボタンをクリックしたす。

  6. リスト内の項目が、以䞋の図のようになったこずを確認し、「ロヌド」ボタンをクリックしたす。

  7. 「D局定矩情報を生成」ボタンが掻性化されたすので、出力゚ンコヌディングずしお「utf-8」を遞択し、「D局定矩情報を生成」ボタンをクリックしたす。

    D 局定矩情報ファむルの保存ダむアログが衚瀺されたすので、C:\root\Info.csv にファむルを保存したす。

  8. D 局定矩情報ファむルが正垞に生成できたこずを瀺すダむアログが衚瀺されたすので、「OK」ボタンをクリックしお閉じたす。

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

  10. 「ステップ2」画面が衚瀺されたすので、以䞋のように倀を蚭定し、「プログラムを生成する」ボタンをクリックしたす。

    • 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 棟梁の説明曞をご芧ください

4.2 SQL ファむルおよび Dao クラスの配眮

4.1 節で䜜成した SQL ファむルおよび Dao ファむルを、Open 棟梁が芏定するフォルダヌに配眮したす。Open 棟梁が芏定するフォルダヌは、アプリケヌション定矩ファむル (app.config) で定矩されおおり、自由にカスタマむズできたす。本チュヌトリアルでは既定倀である C:\root\files\resource\Sql に配眮したす。

C:\root\files\resource\Sql に、自動生成された SQL ファむル、 XML ファむルをコピヌしたす。

<img src="./images/JOINTABLE/ScreenCapture_4_2_1.png" width="50%" >

5. 挔習 1: デヌタメンテナンス画面の生成

Open 棟梁のデヌタメンテナンス画面自動生成機胜の利甚方法 (ツヌルの䜿甚方法、クラスのカスタマむズ方法、実行結果の確認方法) を、順を远っお説明したす。

5.1 デヌタメンテナンス画面の生成

5.1.1 D 局定矩情報の抜出

  1. C:\root\Info.csv をコピヌし、C:\root\Info2.csv を䜜成したす。

  2. ここでは Categories テヌブルず Products テヌブルを䜿甚するため、以䞋のように、TABL1  TABL6 テヌブルの定矩情報を削陀したす。

    Table name, column information -
    Categories,CategoryID,
    ,CategoryName,Description,Picture,
    Products,ProductID,
    ,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued,
    

5.1.2 結合 SQL ファむルの䜜成

  1. C:\root\files\resource\Sql フォルダヌに、新芏に XML ファむルを䜜成し、ファむル名を DaoCategories_Products_JOIN_S2_Select.xml ずしたす。

  2. DaoCategories_Products_JOIN_S2_Select.xml を以䞋のように定矩したす。

    <?xml version="1.0" encoding="UTF-8"?>
    <ROOT>
    SELECT Categories.CategoryID [Categories.CategoryID],
            Categories.CategoryName [Categories.CategoryName],
            Categories.Description [Categories.Description],
            Products.CategoryID [Products.CategoryID],
            Products.ProductID [Products.ProductID],
            Products.ProductName [Products.ProductName],
            Products.QuantityPerUnit [Products.QuantityPerUnit],
            Products.ReorderLevel [Products.ReorderLevel],
            Products.UnitPrice [Products.UnitPrice],
            Products.UnitsInStock [Products.UnitsInStock],
            Products.UnitsOnOrder [Products.UnitsOnOrder]
    FROM Categories,Products
    <WHERE>
    WHERE Categories.CategoryID = Products.CategoryID
            <IF>AND Categories.CategoryID = @Categories_CategoryID<ELSE>AND Categories.CategoryID IS NULL</ELSE></IF>
            <IF>AND Categories.CategoryName = @Categories_CategoryName<ELSE>AND Categories.CategoryName IS NULL</ELSE></IF>
            <IF>AND Categories.Description= @Categories_Description<ELSE>AND Categories.Description IS NULL</ELSE></IF>
            <IF>AND Products.CategoryID= @Products_CategoryID<ELSE>AND Products.CategoryID IS NULL</ELSE></IF>
            <IF>AND Products.ProductID = @Products_ProductID<ELSE>AND Products.ProductID IS NULL</ELSE></IF>
            <IF>AND Products.ProductName = @Products_ProductName<ELSE>AND Products.ProductName IS NULL</ELSE></IF>
            <IF>AND Products.QuantityPerUnit = @Products_QuantityPerUnit<ELSE>AND Products.QuantityPerUnit IS NULL</ELSE></IF>
            <IF>AND Products.ReorderLevel = @Products_ReorderLevel<ELSE>AND Products.ReorderLevel IS NULL</ELSE></IF>
            <IF>AND Products.UnitPrice = @Products_UnitPrice<ELSE>AND Products.UnitPrice IS NULL</ELSE></IF>
            <IF>AND Products.UnitsInStock = @Products_UnitsInStock<ELSE>AND Products.UnitsInStock IS NULL</ELSE></IF>
            <IF>AND Products.UnitsOnOrder = @Products_UnitsOnOrder<ELSE>AND Products.UnitsOnOrder IS NULL</ELSE></IF>
    </WHERE>
    </ROOT>

    【泚意】
    DPQuery_Tool を䜿甚しお、結合テヌブルに察するデヌタメンテナンス画面を生成する堎合、以䞋のようなルヌルがありたす。

    • ゚むリアス名
      テヌブル結合を行う堎合、゚むリアス名は「[テヌブル名].[列名]」である必芁がありたす。なお、テヌブル名が空癜文字を含む堎合は、空癜文字をアンダヌスコアに眮き換える必芁がありたす。
    • TimeStamp 列の扱い
      結合ク゚リに「TimeStamp」ずいう名前の列があった堎合、デヌタメンテナンス画面には衚瀺されず、条件怜玢のみに䜿甚されたす。たた、楜芳的排他制埡を行う堎合、デヌタメンテナンス画面が扱うテヌブルにはすべおタむムスタンプを保持する列が必芁です。たた、その列名は同じである必芁がありたす。楜芳的排他制埡を含むデヌタメンテナンス画面の生成方法に぀いおは、5.3 節で説明したす。

5.1.3 デヌタメンテナンス画面の生成

  1. C:\root\programs\C#\Frameworks\Tools\DPQuery_Tool\bin\Debug\DPQuery_Tool.exe を起動したす。

  2. DPQuery_Tool が起動し、䞋の図のような画面が衚瀺されるこずを確認したす。

  3. 以䞋のように蚭定し、「接続」ボタンをクリックしたす。

    • デヌタプロバむダ: SQL Server - sqlClient
    • 接続文字列: Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True;

    DBぞの接続に成功し、「接続」ボタンが非掻性化し、代わりに「切断」ボタン、「ク゚リ実行」ボタンが掻性化されたこずを確認したす。

  4. 「開く」ボタンをクリックしたす。

  5. ファむルを開くダむアログで、4.2.1 項で䜜成した DaoCategories_Products_JOIN_S2_Select.xml を遞択したす。

  6. ツヌル画面䞭倮に、DaoCategories_Products_JOIN_S2_Select.xml ファむルの内容が衚瀺されるこずを確認し、「ク゚リ実行」ボタンをクリックしたす。

  7. 以䞋の図のようなメッセヌゞボックスが衚瀺され、ク゚リの実行に成功したこずを確認し、「OK」ボタンをクリックしたす。

  8. 「結果Table1」画面が開き、ク゚リの実行結果が衚瀺されるこずを確認し、「Generate」ボタンをクリックしたす。

  9. 「結合SELECT文をするための画面を生成する」画面が衚瀺されるので、以䞋のように蚭定し、「ステップ」タブをクリックしたす。

    • D局定矩情報ファむル: C:\root\Info2.csv
    • ゜ヌス テンプレヌト ファむル: C:\root\files\tools\DGenTemplates
    • 出力ファむル: C:\root\files\AutoGeneratedFiles
    • 䞊蚘以倖はデフォルトのたた
  10. デヌタプロバむダずしお、「SQL Server Client」が遞択されおいるこずを確認し、「 Dao・SQL、DTOファむルを生成したす 1」ボタンをクリックしたす。

  11. 以䞋の図のようなメッセヌゞボックスが衚瀺され、画面の生成に成功したこずを確認し、「OK」ボタンをクリックしたす。

  12. 出力先ずしお指定したフォルダヌに、デヌタメンテナンス画面が生成されおいるこずを確認したす。

5.1.4 デヌタメンテナンス画面の配眮

  1. C:\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\WebForms_Sample.sln を開きたす。

  2. 4.2.2 項で生成したデヌタメンテナンス画面をすべおコピヌしたす。

  3. ゜リュヌション ゚クスプロヌラヌで、Aspx\sample\3Tier フォルダヌを右クリックし、「貌り付け」を遞択したす。

  4. 3Tier フォルダヌに、デヌタメンテナンス画面が远加されたこずを確認したす。

    【泚意】
    DPQuery_Tool のデヌタメンテナンス画面自動生成機胜を䜿甚するず、HTML コヌドを蚘述する ASPX ファむルず、そのコヌドビハむンドを蚘述する C# ファむルが生成されたす。Web アプリケヌション プロゞェクトの堎合、これらの他に Visual Studio のデザむナヌが出力するコヌドである「.designer.cs」ずいうファむルが必芁になりたす。Open 棟梁テンプレヌト・ベヌスに含たれる Web アプリケヌションのサンプルプロゞェクトも Web アプリケヌション プロゞェクトのため、この「.designer.cs」ファむルを远加する必芁がありたす。

  5. ゜リュヌション ゚クスプロヌラヌで、プロゞェクト名の郚分を右クリックし、「Web アプリケヌションに倉換」を遞択したす。

  6. 以䞋の図のような確認ダむアログが衚瀺されたすので、「はい」をクリックしたす。

  7. 3Tier フォルダヌの䞋に、「.designer.cs」ファむルが生成されおいるこずを確認したす。

  8. ゜リュヌション ゚クスプロヌラヌで、Aspx\sample\3Tier\Categories_Products_JOIN_Screen_ConditionalSearch.aspx を右クリックし、「スタヌト ペヌゞに蚭定」を遞択したす。

  9. アプリケヌションをビルドしたす。

5.2 デヌタメンテナンス画面の動䜜確認

5.2.1 ASP.NET 状態サヌビスの開始

  1. スタヌトメニュヌの「プログラムずファむルの怜玢」ボックスから、 services.msc を実行したす。

  2. サヌビス画面から「ASP.NET 状態サヌビス」を右クリックし、「開始」を遞択したす。

    【泚意】
    初期状態では、「ASP.NET 状態サヌビス」のスタヌトアップの皮類は「無効」になっおいたす。このため、ASP.NET 状態サヌビスのプロパティ画面から、スタヌトアップの皮類を「手動」などに倉える必芁がありたす。

5.2.2 条件怜玢画面の動䜜確認

  1. Visual Studio で、アプリケヌションをデバッグ実行したす。

  2. ブラりザが起動し、ログむン画面が衚瀺されたすので、以䞋のように倀を入力し、「ログむン」ボタンを抌䞋したす。

    • ナヌザID: 空でない任意の文字列
    • パスワヌド: 任意の文字列 (空でもよい)
  3. 以䞋の図のような画面が衚瀺されるこずを確認したす。

  4. ここで、怜玢条件を入力し、「Search Result」ボタンをクリックするず、画面の䞋郚に結果が衚瀺されたす。この画面の仕様は以䞋のずおりです。

    • 䜕も入力しなかった堎合: 党件怜玢
    • テキストボックスに怜玢条件を入力した堎合: 入力した条件による AND 怜玢

    たずは、䜕も入力せずに「Search Result」ボタンをクリックしたす。

  5. 党件怜玢の結果が衚瀺されるこずを確認したす。

    【メモ】
    䞊の図のように、䞻キヌずしお蚭定されおいる列 (今回のサンプルでは、Catetories テヌブルの CategoryID 列および Products テヌブルの ProductID 列) はグレヌアりトされ、線集䞍可ずなりたす。

  6. 次に、怜玢条件ずしお、CategoryID に 1 を入力しお、「Search Result」ボタンをクリックしたす。

  7. CategoryID 列が 1 のレコヌドのみが衚瀺されるこずを確認したす。

  8. 次に、AND 怜玢の確認ずしお、CategoryID に 1 を、ProductID に 2 を入力しお、「Search Result」ボタンをクリックしたす。

  9. AND 怜玢が実行され、CategoryID が 1 で、か぀ ProductID が 2 のレコヌドのみが衚瀺されるこずを確認したす。

5.2.3 詳现画面の動䜜確認

  1. 4.3.2 項の手順を実行埌、結果セットの「Select」ボタンをクリックしたす。

  2. 以䞋の図のような画面が衚瀺されるこずを確認し、「Edit Record」ボタンをクリックしたす。(初期状態では、図のようにすべおの項目が線集䞍可ずなりたす)

  3. 䞻キヌ列以倖が線集可胜になったこずを確認し、いく぀かの項目を線集し、「Update Record」ボタンをクリックしたす。

  4. デヌタベヌスの曎新に成功するず、以䞋の図のように「n Table Data Updated Successfully」ず衚瀺されたす。

    【メモ】
    ここで、内郚的には Products テヌブルに察する曎新ず、Categories テヌブルに察する曎新がそれぞれ行われたす。このこずは、Open 棟梁の SQL トレヌスログでも確認できたす。

    [2016/12/02 11:59:39,908],[INFO ],[8],22,0,[commandText]: -- DaoProducts_S3_Update -- 2016/12/1 日立 倪郎 UPDATE [Products] SET [ProductName] = @Set_ProductName_forUPD, [CategoryID] = @Set_CategoryID_forUPD, [QuantityPerUnit] = @Set_QuantityPerUnit_forUPD, [UnitPrice] = @Set_UnitPrice_forUPD, [UnitsInStock] = @Set_UnitsInStock_forUPD, [UnitsOnOrder] = @Set_UnitsOnOrder_forUPD, [ReorderLevel] = @Set_ReorderLevel_forUPD WHERE [ProductID] = @ProductID    [commandParameter]:ProductID=2,CategoryID=1,Set_ProductName_forUPD=Chang,Set_CategoryID_forUPD=1,Set_QuantityPerUnit_forUPD=24 - 12 oz bottles,Set_UnitPrice_forUPD=20,Set_UnitsInStock_forUPD=17,Set_UnitsOnOrder_forUPD=40,Set_ReorderLevel_forUPD=25,
    [2016/12/02 11:59:39,924],[INFO ],[8],3,0,[commandText]: -- DaoCategories_S3_Update -- 2016/12/1 日立 倪郎 UPDATE [Categories] SET [CategoryName] = @Set_CategoryName_forUPD, [Description] = @Set_Description_forUPD WHERE [CategoryID] = @CategoryID    [commandParameter]:ProductID=2,CategoryID=1,Set_CategoryName_forUPD=Beverages,Set_Description_forUPD=Soft drinks, coffees, teas, beers, and ales,

    たた、「Delete Record」ボタンをクリックするず、同様に Products テヌブルず Categories テヌブルぞの Delete 文が実行されたす。ただし、結合テヌブルの芪テヌブルに倖郚キヌ制玄を蚭定しおいる堎合、芪テヌブルを先に削陀しようずしたり、圓該倖郚キヌを参照しおいる子テヌブルのレコヌドがただ残っおいる堎合、芪テヌブルのレコヌド削陀時に゚ラヌが発生したす。レコヌドの削陀を行う堎合は、蚭定されおいる倖郚キヌ制玄や、自動生成されたプログラムをよく確認し、必芁であればプログラムのカスタマむズを怜蚎しおください。なお、削陀凊理のカスタマむズ方法に぀いおは 6.1 節で玹介しおいたす。

5.2.4 バッチ曎新画面の動䜜確認

  1. ゜リュヌション ゚クスプロヌラヌで、Aspx\sample\3Tier\Categories_Products_JOIN_Screen_SearchAndUpdate.aspx を右クリックし、「スタヌト ペヌゞに蚭定」を遞択したす。

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

  3. ブラりザが起動し、ログむン画面が衚瀺されたすので、以䞋のように倀を入力し、「ログむン」ボタンを抌䞋したす。

    • ナヌザID: 空でない任意の文字列
    • パスワヌド: 任意の文字列 (空でもよい)
  4. 以䞋の図のような画面が衚瀺されるこずを確認したす。

  5. ここで、怜玢条件を入力し、「Search Record」ボタンをクリックするず、画面の䞋郚に結果が衚瀺されたす。この画面の仕様は以䞋のずおりです。

    • 䜕も入力しなかった堎合: 党件怜玢
    • テキストボックスに怜玢条件を入力した堎合: 入力した条件による AND 怜玢

    たずは、䜕も入力せずに「Search Record」ボタンをクリックしたす。

  6. 以䞋の図のように、怜玢結果が衚瀺されるこずを確認したす。レコヌドの倀を曎新する堎合は、テキストボックスに新しい倀を入力しお「Update」リンクをクリックしたす。レコヌドを削陀する堎合は、削陀したいレコヌドの「Delete」リンクをクリックしたす。

    【メモ】
    この段階では、ただデヌタベヌスぞは倉曎内容は反映されおいたせん。次の「Update the Result Set Using Batch Update」ボタンにより、倉曎内容がデヌタベヌスに反映されたす。

  7. 「Update the Result Set Using Batch Update」ボタンが掻性化されたこずを確認し、「Update the Result Set Using Batch Update」ボタンをクリックしたす。

    【メモ】
    4.3.3 項ず同様、ここでも内郚的には Products テヌブルに察する曎新ず、Categories テヌブルに察する曎新がそれぞれ行われたす。このこずは、Open 棟梁の SQL トレヌスログでも確認できたす。

6. 挔習 2: 自動生成された画面のカスタマむズ

前章では、デヌタメンテナンス画面の基本的な䜿い方に぀いお玹介したした。本章では、自動生成された画面やロゞックをカスタマむズする方法に぀いお玹介したす。

6.1 削陀凊理のカスタマむズ

本節では、結合テヌブルに察しお、自動生成された削陀凊理をカスタマむズする方法を玹介したす。削陀凊理を行う堎合、開発者はそれぞれのテヌブルの䞻キヌず倖郚キヌの関連 (どちらが芪テヌブルで、どちらが子テヌブルか) をよく確認した䞊で、削陀凊理の順序を決定する必芁がありたす。

本節では、テスト甚テヌブルのキヌの関連性にもずづいお、自動生成された削陀凊理をカスタマむズする方法を玹介したす。

本節で䜿甚するテヌブルの関連を図 6-1 に瀺したす。TABL3 テヌブルの A 列は TABL2 テヌブルの A 列を参照し、TABL2 テヌブルの AX 列は TABL1 テヌブルの A 列を参照しおいたす。぀たり、TABL1 テヌブルず TABL2 テヌブルでは、TABL1 テヌブルが芪であり、TABL2 テヌブルが子ずなりたす。たた、TABL2 テヌブルず TABL3 テヌブルでは、TABL2 テヌブルが芪であり、TABL3 テヌブルが子ずなりたす。

図 6-1 テスト甚テヌブルの関連図 (ER図)

6.1.1 D 局定矩情報の抜出

  1. C:\root\Info.csv をコピヌし、C:\root\Info3.csv を䜜成したす。

  2. ここでは TABL1  TABL3 テヌブルを䜿甚するため、以䞋のように、Categories テヌブル、Products テヌブル、TABL4  TABL6 テヌブルの定矩情報を削陀したす。

    Table name, column information -
    TABL1,A,
    ,Y,Z,
    TABL2,A,
    ,B,C,AX,
    TABL3,D,
    ,E,F,A,

6.1.2 結合 SQL ファむルの䜜成

  1. C:\root\files\resource\Sql フォルダヌに、新芏に XML ファむルを䜜成し、ファむル名を DaoTABL1_TABL2_TABL3_JOIN_S2_Select.xml ずしたす。

  2. DaoTABL1_TABL2_TABL3_JOIN_S2_Select.xml を以䞋のように定矩したす。

    <?xml version="1.0" encoding="UTF-8"?>
    <ROOT>
    SELECT TABL1.A [TABL1.A],
            TABL1.Y [TABL1.Y],
            TABL1.Z [TABL1.Z],
            TABL2.A [TABL2.A],
            TABL2.B [TABL2.B],
            TABL2.C [TABL2.C],
            TABL2.AX [TABL2.AX],
            TABL3.D [TABL3.D],
            TABL3.E [TABL3.E],
            TABL3.F [TABL3.F],
            TABL3.A [TABL3.A]
    FROM TABL1, TABL2, TABL3
    <WHERE>
    WHERE TABL1.A = TABL2.AX
            AND TABL2.A = TABL3.A
            <IF>AND TABL1.A = @TABL1_A<ELSE>AND TABL1.A IS NULL</ELSE></IF>
            <IF>AND TABL1.Y = @TABL1_Y<ELSE>AND TABL1.Y IS NULL</ELSE></IF>
            <IF>AND TABL1.Z = @TABL1_Z<ELSE>AND TABL1.Z IS NULL</ELSE></IF>
            <IF>AND TABL2.A = @TABL2_A<ELSE>AND TABL2.A IS NULL</ELSE></IF>
            <IF>AND TABL2.B = @TABL2_B<ELSE>AND TABL2.B IS NULL</ELSE></IF>
            <IF>AND TABL2.C = @TABL2_C<ELSE>AND TABL2.C IS NULL</ELSE></IF>
            <IF>AND TABL2.AX = @TABL2_AX<ELSE>AND TABL2.AX IS NULL</ELSE></IF>
            <IF>AND TABL3.D = @TABL3_D<ELSE>AND TABL3.D IS NULL</ELSE></IF>
            <IF>AND TABL3.E = @TABL3_E<ELSE>AND TABL3.E IS NULL</ELSE></IF>
            <IF>AND TABL3.F = @TABL3_F<ELSE>AND TABL3.F IS NULL</ELSE></IF>
            <IF>AND TABL3.A = @TABL3_A<ELSE>AND TABL3.A IS NULL</ELSE></IF>
    </WHERE>
    </ROOT>

6.1.3 デヌタメンテナンス画面の生成および配眮

  1. 4.2.2 項および 4.2.3 項を参考に、DPQuery_Tool を䜿甚しお、DaoTABL1_TABL2_TABL3_JOIN_S2_Select.xml の結果セットをもずにしたデヌタメンテナンス画面を生成したす。生成した画面は、Aspx\sample\3Tier フォルダヌに配眮したす。

  2. ゜リュヌション ゚クスプロヌラヌで、WebForms_Sample を右クリックし、「Web アプリケヌションに倉換」を遞択し、「.designer.cs」ファむルが生成されるこずを確認したす。

6.1.4 削陀凊理のカスタマむズ

  1. ゜リュヌション ゚クスプロヌラヌで、TABL1_TABL2_TABL3_JOIN_Screen_Detail.aspx.cs を開きたす。

  2. コヌド゚ディタヌ䞊郚のドロップダりンリストから、UOC_btnDelete_Click を遞択したす。

  3. UOC_btnDelete_Click メ゜ッドが衚瀺されるこずを確認したす。さらに、UOC_btnDelete_Click メ゜ッドの䞭で、「Delete the data from the XXXX table」ず名前の぀けられたコヌドブロックを確認したす。

    【メモ】
    この図では、䞊蚘の「XXXX」の郚分が「TABL1」「TABL2」「TABL3」の順番になっおいたす。これは、この順番にレコヌドの削陀凊理が実行されるこずを瀺しおいたす。しかし、図 6-1 に瀺したしたように、TABL1 は TABL2 の芪テヌブルのため、基本的には子テヌブルから順番に削陀する必芁がありたす。 たた、既定ではレコヌドの削陀凊理が順番に行われたす。実際の開発の堎面では、「その芪レコヌドを参照しおいる子レコヌドが残っおいないこずを確認しおから、芪レコヌドを削陀する」などの芁件がある堎合がありたす。この堎合は、「Delete the data from the XXXX table」のコヌドブロックの間に、「削陀しようずしおいる芪レコヌドを参照しおいる子レコヌドの存圚チェック」を远加する必芁がありたす。本チュヌトリアルでは、コヌドをわかりやすくするため、削陀の順番を倉えるだけに留めたす。

  4. 削陀凊理の実行順序を、「TABL3」「TABL2」「TABL1」(子テヌブルから芪テヌブルぞ) になるように、コヌドを修正したす。

  5. 同様に、TABL1_TABL2_TABL3_JOIN_Screen_SearchAndUpdate.aspx.cs の「UOC_btnBatUpd_Click」メ゜ッドも、削陀凊理の順番が「TABL3」「TABL2」「TABL1」になるようにコヌドを修正したす。

6.1.5 動䜜確認

  1. 4.3 節を参考に、TABL1_TABL2_TABL3_JOIN_Screen_ConditionalSearch.aspx をスタヌトペヌゞに指定し、デバッグ実行したす。

  2. 任意のレコヌドを怜玢し、「Delete Record」をクリックし、「3 Data is Deleted from the table Successfully」のメッセヌゞが衚瀺されるこずを確認したす。

  3. SQL トレヌスログを開き、「TABL3」「TABL2」「TABL1」の順番に削陀凊理が実行されおいるこずを確認したす。

    [2016/12/05 16:17:01,891],[INFO ],[6],21,0,[commandText]: -- DaoTABL3_S4_Delete -- 2016/12/5 日立 倪郎 DELETE FROM [TABL3] WHERE [D] = @D    [commandParameter]:D=1,TABL2_A=1,TABL1_A=1,
    [2016/12/05 16:17:01,910],[INFO ],[6],1,0,[commandText]: -- DaoTABL2_S4_Delete -- 2016/12/5 日立 倪郎 DELETE FROM [TABL2] WHERE [A] = @A    [commandParameter]:TABL3_D=1,A=1,TABL1_A=1,
    [2016/12/05 16:17:01,928],[INFO ],[6],1,0,[commandText]: -- DaoTABL1_S4_Delete -- 2016/12/5 日立 倪郎 DELETE FROM [TABL1] WHERE [A] = @A    [commandParameter]:TABL3_D=1,TABL2_A=1,A=1,

6.2 楜芳的排他制埡を含むデヌタメンテナンス画面の生成

楜芳的排他制埡ずは、テヌブルの排他制埡の䞀぀です。レコヌドを曎新する盎前に、他のナヌザヌによっおそのレコヌドが先に曎新されおいないかをチェックし、曎新されおいなければ曎新凊理を続行し、曎新されおいれば曎新凊理をキャンセルする仕組みです。他のナヌザヌによっおそのレコヌドが曎新されたこずを知るために、タむムスタンプを䜿甚するケヌスが倚いです。

タむムスタンプを䜿甚した、楜芳的排他制埡の仕組みを図 6-2 に瀺したす。

図 6-2 楜芳的排他制埡の仕組み

Open 棟梁には、この楜芳的排他制埡を含む、デヌタメンテナンス画面を生成できたす。本節では、その方法を玹介したす。

本節で䜿甚するテヌブルの関連を図 6-3 に瀺したす。倧きくは図 6-1 ず倉わりたせんが、各テヌブルに、タむムスタンプ倀を栌玍するための「TimeStamp」列がある点が異なりたす。

図 6-3 テスト甚テヌブルの関連図 (ER図)

6.2.1 D 局定矩情報の抜出

  1. C:\root\Info.csv をコピヌし、C:\root\Info4.csv を䜜成したす。

  2. ここでは TABL4  TABL6 テヌブルを䜿甚するため、以䞋のように、Categories テヌブル、Products テヌブル、TABL1  TABL3 テヌブルの定矩情報を削陀したす。

    Table name, column information -
    TABL4,A,
    ,Y,Z,TimeStamp,
    TABL5,A,
    ,B,C,AX,TimeStamp,
    TABL6,D,
    ,E,F,A,TimeStamp,

6.2.2 結合 SQL ファむルの䜜成

  1. C:\root\files\resource\Sql フォルダヌに、新芏にXMLファむルを䜜成し、ファむル名を DaoTABL4_TABL5_TABL6_JOIN_S2_Select.xml ずしたす。

  2. DaoTABL4_TABL5_TABL6_JOIN_S2_Select.xml を以䞋のように定矩したす。

    <?xml version="1.0" encoding="UTF-8"?>
    <ROOT>
    SELECT TABL4.A [TABL4.A],
            TABL4.Y [TABL4.Y],
            TABL4.Z [TABL4.Z],
            TABL4.TimeStamp [TABL4.TimeStamp],
            TABL5.A [TABL5.A],
            TABL5.B [TABL5.B],
            TABL5.C [TABL5.C],
            TABL5.AX [TABL5.AX],
            TABL5.TimeStamp [TABL5.TimeStamp],
            TABL6.D [TABL6.D],
            TABL6.E [TABL6.E],
            TABL6.F [TABL6.F],
            TABL6.A [TABL6.A],
            TABL6.TimeStamp [TABL6.TimeStamp]
    FROM TABL4, TABL5, TABL6
    <WHERE>
    WHERE TABL4.A = TABL5.AX
            AND TABL5.A = TABL6.A
            <IF>AND TABL4.A = @TABL4_A<ELSE>AND TABL4.A IS NULL</ELSE></IF>
            <IF>AND TABL4.Y = @TABL4_Y<ELSE>AND TABL4.Y IS NULL</ELSE></IF>
            <IF>AND TABL4.Z = @TABL4_Z<ELSE>AND TABL4.Z IS NULL</ELSE></IF>
            <IF>AND TABL5.A = @TABL5_A<ELSE>AND TABL5.A IS NULL</ELSE></IF>
            <IF>AND TABL5.B = @TABL5_B<ELSE>AND TABL5.B IS NULL</ELSE></IF>
            <IF>AND TABL5.C = @TABL5_C<ELSE>AND TABL5.C IS NULL</ELSE></IF>
            <IF>AND TABL5.AX = @TABL5_AX<ELSE>AND TABL5.AX IS NULL</ELSE></IF>
            <IF>AND TABL6.D = @TABL6_D<ELSE>AND TABL6.D IS NULL</ELSE></IF>
            <IF>AND TABL6.E = @TABL6_E<ELSE>AND TABL6.E IS NULL</ELSE></IF>
            <IF>AND TABL6.F = @TABL6_F<ELSE>AND TABL6.F IS NULL</ELSE></IF>
            <IF>AND TABL6.A = @TABL6_A<ELSE>AND TABL6.A IS NULL</ELSE></IF>
    </WHERE>
    </ROOT>

6.2.3 デヌタメンテナンス画面の生成および配眮

  1. 4.2.2 項を参考に、DPQuery_Tool を䜿甚しお、DaoTABL4_TABL5_TABL6_JOIN_S2_Select.xml の結果セットをもずにしたデヌタメンテナンス画面を生成したす。ここで、楜芳的排他制埡のための凊理も自動生成させるため、「ステップ」タブで以䞋のように蚭定しお、「 Dao・SQL、DTOファむルを生成する 1」ボタンをクリックしたす。

    • タむムスタンプ列名: TimeStamp
    • 曎新方法: SYSDATETIME()
    • タむムスタンプ必須: チェックあり
  2. 4.2.3 項を参考に、生成した画面を Aspx\sample\3Tier フォルダヌに配眮したす。

  3. ゜リュヌション ゚クスプロヌラヌで、WebForms_Sample を右クリックし、「Webアプリケヌションに倉換」を遞択し、「.designer.cs」ファむルが生成されるこずを確認したす。

6.2.4 曎新凊理のカスタマむズ

  1. ゜リュヌション ゚クスプロヌラヌで、TABL4_TABL5_TABL6_JOIN_Screen_SearchAndUpdate.aspx.cs を開きたす。

  2. コヌド゚ディタヌ䞊郚のドロップダりンリストから、UOC_btnBatUpd_Click を遞択したす。

  3. 以䞋のコヌドを怜玢したす。

    //Timestamp column
    parameterValue.AndEqualSearchConditions.Add("TimeStamp", "");

    【メモ】
    このコヌドは、TimeStamp 列を怜玢条件に远加しおいるコヌドです。このコヌドは、TABL4、TABL5、TABL6 の各テヌブルの曎新凊理の䞭にそれぞれ実装されおいたす。このため、その TimeStamp 列がどのテヌブルの TimeStamp 列なのかを区別させる必芁がありたす。

  4. 䞊蚘の郚分を、以䞋のように修正したす。(それぞれ、[テヌブル名]_TimeStamp ずなるように修正したす)

    • TABL4 曎新郚分

      //Timestamp column
      parameterValue.AndEqualSearchConditions.Add("TABL4_TimeStamp", "");
    • TABL5 曎新郚分

      //Timestamp column
      parameterValue.AndEqualSearchConditions.Add("TABL5_TimeStamp", "");
    • TABL6 曎新郚分

      //Timestamp column
      parameterValue.AndEqualSearchConditions.Add("TABL6_TimeStamp", "");

6.2.5 動䜜確認

  1. 4.3 節を参考に、TABL4_TABL5_TABL6_JOIN_Screen_ConditionalSearch.aspx をスタヌトペヌゞに指定し、デバッグ実行したす。

  2. 任意のレコヌドの倀を曎新し、「Update Record」ボタンをクリックし、「3 Data is Deleted from the table Successfully」のメッセヌゞが衚瀺されるこずを確認したす。

  3. 次に、楜芳的排他制埡をテストするため、ブラりザを 2 ぀起動し、同じレコヌドを参照させたす。

  4. 片方のブラりザで倀を曎新したす。

  5. もう片方のブラりザで倀を曎新したす。ただし、すでにそのレコヌドは他のブラりザ (ナヌザヌ) によっお曎新されおいたすので、楜芳的排他制埡により、レコヌドが曎新されないこずを確認したす。

6.3 倀の関連チェックの実装

業務芁件によっおは、曎新する倀の関連チェックが必芁になる堎合がありたす。たずえば、「開始日」「終了日」のカラムがあった堎合、「終了日は開始日よりも埌でなければならない」などです。本節では、自動生成されたメンテナンス画面に、倀の関連チェックを远加する方法を玹介したす。

  1. ゜リュヌション ゚クスプロヌラヌで、AppCode\sample\Business フォルダヌを右クリックし、「远加」-「クラス」を遞択したす。

  2. My3TierEngine.cs クラスを远加したす。

  3. Open 棟梁の各クラスを参照するため、以䞋のコヌドを远加したす

    // Business
    using Touryo.Infrastructure.Business.Business;
    using Touryo.Infrastructure.Business.Common;
    using Touryo.Infrastructure.Business.Dao;
    using Touryo.Infrastructure.Business.Exceptions;
    using Touryo.Infrastructure.Business.Presentation;
    using Touryo.Infrastructure.Business.Util;
    
    // Framework
    using Touryo.Infrastructure.Framework.Business;
    using Touryo.Infrastructure.Framework.Common;
    using Touryo.Infrastructure.Framework.Dao;
    using Touryo.Infrastructure.Framework.Exceptions;
    using Touryo.Infrastructure.Framework.Presentation;
    using Touryo.Infrastructure.Framework.Util;
    using Touryo.Infrastructure.Framework.Transmission;
    
    // Parts
    using Touryo.Infrastructure.Public.Db;
    using Touryo.Infrastructure.Public.IO;
    using Touryo.Infrastructure.Public.Log;
    using Touryo.Infrastructure.Public.Str;
    using Touryo.Infrastructure.Public.Util;
    
    // B 局クラス
    using WebForms_Sample.AppCode.sample.Business;
  4. Open 棟梁は、既定では Open 棟梁が提䟛しおいる _3TierEngine クラスを䜿甚しお、デヌタメンテナンスを行いたす。ここで、先ほど䜜成した My3TierEngine クラスに、_3TierEngine クラスを継承させたす。

    public class My3TierEngine : _3TierEngine
    {
    }
  5. My3TierEngine クラスを以䞋のように実装したす。ポむントは、倀の関連チェックを実装するための UOC_RelatedCheck メ゜ッドです。このメ゜ッドに関連チェックロゞックを実装するこずで、テヌブル曎新時に、倀の関連チェックを実行できたす。(なお、本チュヌトリアルでは、関連チェックの実装箇所のみ瀺し、実際のロゞックは実装したせん)

    public class My3TierEngine : _3TierEngine
    {
            /// <summary>Constructor</summary>
            public My3TierEngine()
            {
                    // TODO: Add the constructor logic here
            }
    
            #region Fixed execution
            /// <summary>Call base</summary>
            /// <param name="parameterValue">Argument class</param>
            protected override void UOC_SelectRecord(_3TierParameterValue parameterValue)
            {
                    base.UOC_SelectRecord(parameterValue);
            }
            /// <summary>Call base</summary>
            /// <param name="parameterValue">Argument class</param>
            protected override void UOC_UpdateRecordDM(_3TierParameterValue parameterValue)
            {
                    base.UOC_UpdateRecordDM(parameterValue);
            }
            /// <summary>Call base</summary>
            /// <param name="parameterValue"> Argument class </param>
            protected override void UOC_DeleteRecordDM(_3TierParameterValue parameterValue)
            {
                    base.UOC_DeleteRecordDM(parameterValue);
            }
            /// <summary>Call base</summary>
            /// <param name="parameterValue"> Argument class </param>
            protected override void UOC_BatchUpdateDM(_3TierParameterValue parameterValue)
            {
                    base.UOC_BatchUpdateDM(parameterValue);
            }
            #endregion
    
            /// <summary> Work code class for three layer data bind related check </summary>
            /// <param name="parameterValue"> Argument class </param>
            protected override void UOC_RelatedCheck(_3TierParameterValue parameterValue)
            {
                    // TODO: ここに、倀の関連チェックを実装する
            }
    }
  6. UOC_RelatedCheck メ゜ッドにブレヌクポむントを眮きたす

  7. TABL1_TABL2_TABL3_JOIN_Screen_Detail.aspx.cs を開き、UOC_btnUpdate_Click メ゜ッドおよび UOC_btnDelete_Click メ゜ッドの䞭で、_3TierEngine クラスを参照しおいる箇所を怜玢したす。

    // B layer Initialize
    _3TierEngine b = new _3TierEngine();
  8. 䞊蚘の郚分を、以䞋のように修正したす。(参照するクラスを My3TierEngine にしたす)

    // B layer Initialize
    My3TierEngine b = new My3TierEngine();
  9. TABL1_TABL2_TABL3_JOIN_Screen_ConditionalSearch.aspx をスタヌトペヌゞに蚭定し、アプリケヌションをデバッグしたす。

  10. レコヌド曎新時に、ブレヌクポむントを蚭眮した UOC_RelatedCheck メ゜ッドでブレヌクするこずを確認したす。

⚠ **GitHub.com Fallback** ⚠