none
【Lightswitch】リレーションシップのあるテーブルへのAddNew時、コードで上で外部キーを持つフィールドに値を設定する方法 RRS feed

  • 質問

  • VS2013 Lightswitch + SQL Server 2014 Standard を使用しています。


    【状況等】

    Table_1とTable_2があります。

    Table_1には、3つのフィールドがあり、
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [F1] [int] NOT NULL CONSTRAINT [DF_Table_1_F1]  DEFAULT ((2)),
     [F2] [nvarchar](50) NOT NULL
    のように設定されています。
    この、[DF_Table_1_F1] は、Table_2の[ID]を指しています。

    Table_1のF1には、Table_2に存在する値(ID)しか入れらないようにしたいという事です。


    さてここで、あるボタンがClickされたら、ExecuteイベントでこのTable_1へAddNewを行います。
    Namespace LightSwitchApplication

        Public Class Table_1ListDetail

            Private Sub Method_Execute()
                Dim x = Me.DataWorkspace.TESTDBData.Table_1.AddNew
                x.F2 = "HOGE"

    ( Dim x = Me.Table_1.AddNew でも同じことですね)

    しかし、このときF1は表示されないので、直接値を設定する事ができません。
    リレーションシップを定義している親側のフィールドは、Data Source上表示されませんから、
    x.F1 = 3 のような事ができません。
    画面上でTable_2側を選択(オートコンプルートボックス)すればよいのでは?という話もありますが、コードで埋めたい!


    以下のいくつかの方法は可能な事を確かめました。

    1) Insert専用のストアドプロシージャを呼ぶ
     今回の話題とは別に必要で利用している、でもこれがスタンダード?ではないと思っています。
    2) Table_1 のみが存在するデータソースを用意して使う。
     できるけど、これ?ほんと?と思っています。

    どちらの場合も、画面を最新の情報にリフレッシュしなくてはならないし…


    【質問です】

    本当は、もっと何かスタンダード(というか、あたりまえ?)な方法があるのでは?と思うのです。


    どうか、ご存知の方、知恵を授けてください。
    Beth Massiさんのブログ読みまくれ!とか、本買え!は、とりあえず無しでお願いします(^^;

    (近々 Visual Studio Lightswitch 2015 を買うような予感はあります。)

    以上、よろしくお願いします。


    • 編集済み Keiichi Oumi 2016年9月7日 1:58 日本語直しました
    2016年9月7日 1:55

回答

  • どうやら、できたようです。

    詳細は、後日UPしますが、簡単な話でした(^^;

    要約するとTable1 に外部キーは見えないものの、その部分?は、Table_2Item となっているのだから、なら、Table_2Item をセットしてあげればよいだけじゃないか!?

    なして、今まで気が付かなかったんだろう・・・

                Dim nd = Me.Table_1.AddNew
                With nd
                    nd.Table_2Item = DataWorkspace.TESTDBData.Table_2_Single(6)
                    nd.F2 = "66666"
                End With

    直接値を入れようとするところが、なんだか古い頭だったのかもしれません。
    EDMあたりを使い慣れてる人なら、当たり前の事だったのかも・・・

    DataWorkspace~となっているのは、画面にデータ項目として無いからであって、あるとMe.~とできると思います。
    • 編集済み Keiichi Oumi 2016年9月13日 5:44 ちと追加
    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月13日 5:30
  • まとめ

    発端は、リレーションシップが設定されているテーブルを外部データ参照で取り込んだ時、外部キーとなるカラムが表示されないという事です。

    この状態で、AddNewメソッド後、制約設定されているカラムに値を設定しようとしても、インテリセンス上に候補として現れません。
    よって、このテーブルをコードから作成する事ができない。
    といった問題がありました。(そう思っていました。)
    ※当然ながら、UIからの操作はできます。


    結論としては、外部キーとなるカラムには、その対象テーブルの当体であるオブジェクトを設定すれば良いという事でした。
    (自分の勘違いと基礎知識の無さから来た問題である点は否めません)
    当初LightSwitchの挙動が云々・・・なども考えましたが、LightSwitchはむしろ忠実にテーブル側の設定を解釈しているという事でした。(><)

    もし!自分と同じ状況となる人がいた場合にそなえて(いるか?)全コードをUPしておきます。

    【確認テスト用のTABLE作成】
    ※SQL SERVER SSMS より、スクリプトの生成で出力した結果です。

    USE [TESTDB]
    GO
    /****** Object:  Table [dbo].[Table_1]    Script Date: 2016/09/14 13:38:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_1](
    	[T1_ID] [int] IDENTITY(1,1) NOT NULL,
    	[T1_F1] [int] NULL,
    	[T1_VALUES] [nvarchar](50) NULL,
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
    	[T1_ID] 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
    /****** Object:  Table [dbo].[Table_2]    Script Date: 2016/09/14 13:38:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_2](
    	[T2_ID] [int] IDENTITY(1,1) NOT NULL,
    	[T2_VALUES] [nvarchar](50) NULL,
     CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED 
    (
    	[T2_ID] 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].[Table_1] ON 
    
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (1, 1, N'ひでまる')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (2, 2, N'茶々丸')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (3, 3, N'蘭丸')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (5, 2, N'ポチ')
    GO
    SET IDENTITY_INSERT [dbo].[Table_1] OFF
    GO
    SET IDENTITY_INSERT [dbo].[Table_2] ON 
    
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (1, N'トイプードル')
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (2, N'シーズー')
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (3, N'ちわわ')
    GO
    SET IDENTITY_INSERT [dbo].[Table_2] OFF
    GO
    ALTER TABLE [dbo].[Table_1]  WITH CHECK ADD  CONSTRAINT [FK_Table_1_Table_2] FOREIGN KEY([T1_F1])
    REFERENCES [dbo].[Table_2] ([T2_ID])
    GO
    ALTER TABLE [dbo].[Table_1] CHECK CONSTRAINT [FK_Table_1_Table_2]
    GO
    


    【Lightswitch 側 UIとメソッド】

    Namespace LightSwitchApplication
    
        Public Class Table_1ListDetail
    
            Private Sub Method_Execute()
    
                Dim NewFamilly = Me.Table_1.AddNew
    
                NewFamilly.T1_VALUES = "名前を入れてください。"
    
                '初期値として、ID=1 の値を入れる
                NewFamilly.Table_2Item = DataWorkspace.TESTDBData.Table_2_Single(1)
    
                'Save() あれば、あったなりに、無ければ無いなりに、動作します。
    
            End Sub
    
        End Class
    
    End Namespace


    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:59
    2016年9月14日 4:54
  • 実行してみると、こんな感じ!の図

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月14日 4:55
  • VB.NETで記述されているようですので、VB.NETにて調査内容をまとめてみました。
    [調査環境]
    Visual Studio 2013
    VB.NET
    SQL Server 2014 Express
    OS
    Windows 10 Pro

    試したのはデスクトップアプリケーションの実装に関してとなります(HTMLアプリケーションではございません)。
    なお、下記に記してある各サイトは2016/09/10時点の内容となります。
    サイトを管理されている方のご都合により変更されることがございますので
    あらかじめ、ご了承ください。

    お手数をおかけいたしますが、一つずつ、確認をさせていただきます。

    [報告1]
    テーブルを2個作成し、「Table_1」テーブルのF1フィールドのデータが
    「Table_2」テーブルのIDフィールドに登録されているデータのみしか
    利用できないようにするという内容で、よろしかったでしょうか?
    上記認識として下記質問に調査内容を記します。

    はじめに、テーブルには「主キー」をつけてください。
    おそらく、これは仕様です。

    [理由の動機]
    「図1」をご覧いただきながら、下記内容をご覧ください。

    [図1]


    実は数日前インストールしたSQL Serverに2個テーブル(リレーションあり)を作成し
    そのうちの外部キーのあるテーブルの一覧表示を試みましたが
    テーブルのデータが1件も表示されませんでした。

    原因の切り分けのため、新規に1個「aaa」テーブルを作成しました。
    「aaa」テーブルはサーバーエクスプローラーの「データ接続」の一覧には確認できたのですが
    「ソリューションエクスプローラー」の「Data Sources」から「データソースの追加」を選択し
    SQLServerの接続認証処理を経た「データベースオブジェクトの選択」画面の一覧には表示されませんでした。

    しばらく考えてみたところ作成した新規「aaa」テーブルには主キーがないことが
    わかりました。
    作成した新規「aaa」テーブルに主キーをつけて、再度実行したところ
    「データソースの更新」による「データベースオブジェクトの選択」画面の一覧を確認したところ
    先ほどは表示されなかった新規「aaa」テーブルが表示されました。

    このことから、LightSwitchのテーブルには主キーが必要であるという仕様だと考えました。

    この他としてリレーションシップの設定画面の一部に次のキャプチャのようなエラーが表示されます。


    [エラーメッセージ]
    「リレーションシップは、キーフィールドに対応付ける必要があり、リレーションシップのプライマリ側の
    キーフィールドのみに対応付ける必要があります。」

    上記アラートの内容からも主キーを必要な項目としていると考えられます。


    確認用のデータとして用いたDDLおよびDMLは次の通りとなります。
    [DDL]

    下記テーブルおよび制約を削除する場合
    alter table table_1 drop constraint DF_Table_1_F1
    alter table table_1 drop constraint pk1
    alter table table_2 drop constraint pk2
    drop table table_1
    drop table table_2
    
    Table_1テーブル
    create table Table_1(
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [F1] [int] NOT NULL CONSTRAINT [DF_Table_1_F1]  DEFAULT ((2)),
     [F2] [nvarchar](50) NOT NULL
    )
    
    Table_2テーブル
    create table Table_2(
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [F1] [int] NOT NULL ,
     [F2] [nvarchar](50) NOT NULL
    )
    
    使用した制約
    Table_1テーブルのf1フィールドを主キーにしています
    alter table table_1 add constraint pk1 primary key(f1)
    
    Table_2テーブルのf1フィールドを主キーにしています
    alter table table_2 add constraint pk2 primary key(f1)

    [DML]

    Table_2テーブルに登録したデータ
    insert into Table_2 (f1, f2) values(100,'aaa');
    insert into Table_2 (f1, f2) values(200,'bbb');
    insert into Table_2 (f1, f2) values(300,'ccc');
    insert into Table_2 (f1, f2) values(400,'ddd');
    insert into Table_2 (f1, f2) values(500,'eee');
    
    確認したSQL
    select * from Table_2;
    1 100 aaa
    2 200 bbb
    3 300 ccc
    4 400 ddd
    5 500 eee
    
    Table_1テーブルに登録したデータ
    insert into Table_1 (f1, f2) values(1,'aaa');
    insert into Table_1 (f1, f2) values(2,'bbb');
    insert into Table_1 (f1, f2) values(3,'ccc');
    
    確認したSQL
    select * from Table_1;
    1 1 aaa
    2 2 bbb
    3 3 ccc
    
    確認したSQL
    select '1', * from Table_1
    union all
    select '2', * from Table_2
    1 1 1 aaa
    1 2 2 bbb
    1 3 3 ccc
    2 1 100 aaa
    2 2 200 bbb
    2 3 300 ccc
    2 4 400 ddd
    2 5 500 eee

    ※注意点
    IDENTITYのフィールドを主キーとして登録したテーブルをデータソースとして取り込むと
    他のフィールドが消えることがありますので登録したデータソースのフィールドは
    確認いただけますよう、お願いします。
    (例)
    ID:IDENTITY(主キーを付加)
    F1:int
    F2:varchar



    [取り込んだ結果]
    ID:IDENTITY(主キー)
    F2:varchar

    のようにF1フィールドが消えることがあります。

    画面構成は次の通りとなります。


    F1フィールドには現在格納されている「F1フィールドの最大値 + 1」を設定するため
    画面上のレイアウトには追加しておりません。
    [該当ロジック]
    '指定したデータソースの情報の取得準備をしています
    Dim iData = 0       'F1フィールドに設定する値
    '指定したデータソースの情報の取得準備をしています
    Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()
    iData = items.LastOrDefault().F1 + 1

    このサンプルでは「Saving」イベントに次の処理で実装しています。

    (1)データの存在チェック
    Table_2テーブルのIDフィールドに格納されているデータに
    今回登録を使用としているデータが存在するかどうか?

    このようなデータの取得処理は実務ではLINQで実装しているようです。
    ※海外サイトのインターネットで、ご確認いただければご理解いただけると思います。

    (2)データ登録処理
    [該当ロジック]
    'データソースにデータを追加する準備をしています
    Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
    With tbl
        'F1フィールドの最後のデータに1を加算した値を設定します
        .F1 = iData
        '画面項目(F2)の値を設定します
        .F2 = Table_1ItemProperty.F2
    End With
    'データを保存してデータ更新処理をします
    Me.DataWorkspace.TESTData.SaveChanges()

    このようなデータの登録処理は実務ではデータソースで実装しているようです。
    ※海外サイトのインターネットで、ご確認いただければご理解いただけると思います。

    (3)エラー処理
    Try Catchで実装しています。
    「DataServiceOperationException」はLightSwitchのために準備されているものとなります。

    Private Sub CreateNewTable_1Item_Saving(ByRef handled As Boolean)
        ' ここにコードを書き込んでください。
        Try
            'LINQでデータを取得して存在チェックをする
            '既存データに含まれていない場合はエラーとします
    
            '指定したデータソースの情報の取得準備をしています
            Dim iData = 0       'F1フィールドに設定する値
            '指定したデータソースの情報の取得準備をしています
            Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()
            iData = items.LastOrDefault().F1 + 1
    
            Dim result = From tbl2 In DataWorkspace.TESTData.Table_2
                        Where tbl2.ID = iData
    
            Dim iCount = Aggregate o In result.Execute() Into Sum(o.ID)
    
    
            If iCount < 1 Then
                Me.ShowMessageBox("データが重複しています。" + ControlChars.CrLf + "データを見直してください。")
                handled = True
                Exit Sub
            End If
    
            'データソースにデータを追加する準備をしています
            Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
            With tbl
                'F1フィールドの最後のデータに1を加算した値を設定します
                .F1 = iData
                '画面項目(F2)の値を設定します
                .F2 = Table_1ItemProperty.F2
            End With
            'データを保存してデータ更新処理をします
            Me.DataWorkspace.TESTData.SaveChanges()
    
        Catch ex As DataServiceOperationException
    
            Me.ShowMessageBox(ex.Message + ControlChars.CrLf + ex.ErrorInfo)
            handled = False
            Exit Sub
    
        Catch ex2 As Exception
            Me.ShowMessageBox(ex2.Message)
            handled = False
            Exit Sub
    
        End Try
    
        handled = True
    
    End Sub
    
    [報告2]

    > 【質問です】
    >
    > 本当は、もっと何かスタンダード(というか、あたりまえ?)な方法があるのでは?と思うのです。

    海外のサイトを中心に調べましたが(必然的に海外のサイトが多くなりました)、
    ※海外のMsdnのフォーラムではデータソースに追加している例が見られます。
    (例)
    Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()

    Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
    With tbl
        .F1 = items.LastOrDefault().F1 + 1
        .F2 = Table_1ItemProperty.F2
    End With

    上記理由より、開発者と思われるユーザはストアドプロシージャで登録するよりも
    データセットオブジェクトに登録して更新処理等を実装している開発手法と見受けられました。

    [報告3]
    参考になるサイトなどがあればともおっしゃっていると解釈し、
    下記に調査した中で利用しやすそうなサイトを記しました。

    Visual Studio LightSwitch ハンズオンラボ 資料 0.5 版
    ※最新の資料ではありませんが、わかりやすいと思います。
    [URL]
    http://sqlazure.jp/d/hans.pdf

    コードを使用したデータ関連タスクの実行
    [URL]
    https://msdn.microsoft.com/ja-jp/library/ff851990(v=vs.120).aspx?

    Flip the Switch An Introduction to Visual Studio Lightswitch for Visual FoxPro Developers
    [URL]
    http://saltydogllc.com/wp-content/uploads/Selje_LightSwitch1.pdf

    Visual Studio Lightswitch 2011
    ※コードの実装イメージがつくと思います。
    [URL]
    https://books.google.co.jp/books?id=vUwAPK4BMaMC&pg=PA315&lpg=PA315&dq=visual+studio+Lightswitch+FirstOrDefault&source=bl&ots=nMsG00f_2b&sig=QkdxNs0U5nIk7LKNG0uQT6qDn3E&hl=ja&sa=X&ved=0ahUKEwij7sTn5PzOAhWEkpQKHWMmBukQ6AEIMzAC#v=onepage&q=visual%20studio%2

    Visual Studio Lightswitch 2015
    ※コードの実装イメージがつくと思います。
    [URL]
    https://books.google.co.jp/books?id=ukRECwAAQBAJ&pg=PA198&lpg=PA198&dq=lightswitch+validate&source=bl&ots=lkcTu54C0N&sig=7qhswyE6c3gOGtWlUNpC4u_q6FM&hl=ja&sa=X&ved=0ahUKEwj7sIi62oHPAhXCNJQKHXWOD284ChDoAQgvMAI#v=onepage&q=lightswitch%20validate&f=false


    C#であればVB.NETよりも参考サイトが増えると思います。
    また、HTML系ではタグの生成分岐処理やデータの取得・更新・表示処理などに
    Javascriptを使っているフォーラムなどのサイトを目にしています。

    未実装未確認で申し訳ございませんが、画面構成の「はば」を広げる手段として
    Silverlightを用いたユーザコントロールの組み込みもございます。

    [Silverlight] Visual Studio LightSwitch - カスタム Silverlight コントロールの作成方法 [LightSwitch]
    [URL]
    http://blogs.jp.infragistics.com/blogs/dikehara/archive/2010/10/28/silverlight-visual-studio-lightswitch-silverlight-lightswitch.aspx

    [Silverlight] Visual Studio LightSwitch – Screen デザイナへのコントロールの組み込み その1 [LightSwitch]
    [URL]
    http://blogs.jp.infragistics.com/blogs/dikehara/archive/2010/11/01/silverlight-visual-studio-lightswitch-screen-1-lightswitch.aspx

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月10日 9:20
  • Keiichi Oumi様

    いつも大変お世話になっております。

    YES/NOで答えられるような質問にしてくださったのにも関わらず
    回答が遅れてしまったこと、そして私の説明不足および理解しづらい文章より、
    困惑させてしまったことをお詫び申し上げます。
    そしてお休みの日と思われるのに、ご返答してくださったことをお礼申し上げます。

    >CONSTRAINT [DF_Table_1_F1] の REFERENCES定義はどのようななっているでしょうか?

    今回、「REFERENCES定義」にはTable_2の[ID]には外部キーは設定しておりません。
    理由は、
    最初は下記のように、
     (『IDENTITY』を設定した、table_2の、idカラムへの)
    外部キーを設定して、
    Lightswtichで、動作確認してたのですが、エラーになり、
    お手上げでした。

    alter table table_1 add constraint fk1 foreign key(f1)
    references table_2(id)

    そのため、外部キーを設定するのは、あきらめました。

    >Check制約の有無でLightswitch側の挙動が変わるのではないか?

    CONSTRAINT句の CHECK制約を使って、
    別テーブルのカラムの値かどうか?をチェックする
    (今回の場合、Table_2のIDに存在するか、どうか?)
    方法は、わたしは、わかりません。

    そのため、わたしが、このプログラムを担当する場合は、
    「CONSTRAINT句の CHECK制約」を使うのは
    あきらめて、VB.NET側の、プログラムで、
    上記のチェックを実装して、逃げると思います。

    現在、私もリレーションを追加した方法での追加方法を
    探しているのですが、時間がかかっております。

    おそらく
    Keiichi Oumi様が先に見つけてしまう思います。
    もし方法を見つけましたら大変申し訳ございませんが
    時間のあるときに、どのように実装したのか?を
    公開(もしくは 報告)していただれば、
    うれしいです。

    恐れ入りますが現状報告までに
    お知らせします。
    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月12日 3:05
  • msuser_forum さん、こんにちは。

    むー、やはり悩んでいる方がいた!と、少し安心しました。(笑)

    さて、今現在は、CHECK制の意味からして、Lightswitchの動作は正しいものであるといったほうに、考えが傾倒してきました。ただし、このような状況下で外部キーフィールドに値を設定する直接的な方法はまだ見つけていません。

    見つからないにしても、一連のコード、テーブル作成の考え方等、自分の結論をまとめてUPします。(ちょと時間が必要です・・)

    以上です、ありがとうございました。

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月12日 6:09
  • Keiichi Oumi様

    いつも大変お世話になっております。

    おめでとうございます。

    私のほうも外部キーを貼った状態でLightswtichに取り込み実装してみました。
    ------------------------------------------------------------------
    alter table table_1 add constraint fk1 foreign key(f1)
    references table_2(id);
    ------------------------------------------------------------------

    登録すると2重にデータが発生したエラーが発生していたため
    一度登録する前に変数に値をとっておき
    次のように登録をして回避しました。
    ------------------------------------------------------------------
    'データが2重登録されることがあるので回避するため削除しています
    Table_1ItemProperty.Delete()
    ------------------------------------------------------------------
    でも私のやり方であるとまだ次の課題が残ってしまっています。
    (1)データ更新後、「F1」項目が読み取り専用項目のようにグレーとなってしまっていること
    (2)外部エラーによる日本語のメッセージがこれでいいのか?疑問を覚えること
    ※英語メッセージは問題ないのですが。
    ------------------------------------------------------------------
    2016/09/14 09:40 追加修正

    Me.DataWorkspace.TESTDBData.SaveChanges()
    の後に、下記、実装で画面のリフレッシュができました。
    ※データ更新後、「F1」項目が読み取り専用項目のようにグレーとなってしまっていること
    が解消されました。

    Me.Details.Dispatcher.BeginInvoke(
        Sub()
            Me.Refresh()
        End Sub
    )

    [参考URL]

    https://social.msdn.microsoft.com/Forums/en-US/0bfb9028-307f-49c2-8d65-309443e2d653/grid-refresh-bug-formerly-sheels-event-handling-etc?forum=lightswitchgeneral

    上記文章を下記のように一部修正しました。

    [修正前] 一度値を登録する変数にとっておき

    [修正後] 一度登録する前に変数に値をとっておき

    2016/09/14 10:42 追加修正
    「(2)外部エラーによる日本語のメッセージがこれでいいのか?疑問を覚えること」について
    [参考URL]
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/f0d93f45-00fb-4630-83bd-5cd72934e7e1/change-default-error-message?forum=lightswitch

    ※URL修正 2016/09/14 14:14

    The only exception that
    I can think of is that
    you cannot control the wording of messages of built-in validation
    such as the "is required" validator.

    Justin Anderson, LightSwitch Development Team

    「LightSwitch 開発チーム」のスタッフさんが
    普通ではできないようになっているとのようですので、このままにします。

    ------------------------------------------------------------------

    うまくできたようで何よりです。

    それでは今後のご活躍をご期待いたします。






    2016年9月13日 9:02

すべての返信

  • VB.NETで記述されているようですので、VB.NETにて調査内容をまとめてみました。
    [調査環境]
    Visual Studio 2013
    VB.NET
    SQL Server 2014 Express
    OS
    Windows 10 Pro

    試したのはデスクトップアプリケーションの実装に関してとなります(HTMLアプリケーションではございません)。
    なお、下記に記してある各サイトは2016/09/10時点の内容となります。
    サイトを管理されている方のご都合により変更されることがございますので
    あらかじめ、ご了承ください。

    お手数をおかけいたしますが、一つずつ、確認をさせていただきます。

    [報告1]
    テーブルを2個作成し、「Table_1」テーブルのF1フィールドのデータが
    「Table_2」テーブルのIDフィールドに登録されているデータのみしか
    利用できないようにするという内容で、よろしかったでしょうか?
    上記認識として下記質問に調査内容を記します。

    はじめに、テーブルには「主キー」をつけてください。
    おそらく、これは仕様です。

    [理由の動機]
    「図1」をご覧いただきながら、下記内容をご覧ください。

    [図1]


    実は数日前インストールしたSQL Serverに2個テーブル(リレーションあり)を作成し
    そのうちの外部キーのあるテーブルの一覧表示を試みましたが
    テーブルのデータが1件も表示されませんでした。

    原因の切り分けのため、新規に1個「aaa」テーブルを作成しました。
    「aaa」テーブルはサーバーエクスプローラーの「データ接続」の一覧には確認できたのですが
    「ソリューションエクスプローラー」の「Data Sources」から「データソースの追加」を選択し
    SQLServerの接続認証処理を経た「データベースオブジェクトの選択」画面の一覧には表示されませんでした。

    しばらく考えてみたところ作成した新規「aaa」テーブルには主キーがないことが
    わかりました。
    作成した新規「aaa」テーブルに主キーをつけて、再度実行したところ
    「データソースの更新」による「データベースオブジェクトの選択」画面の一覧を確認したところ
    先ほどは表示されなかった新規「aaa」テーブルが表示されました。

    このことから、LightSwitchのテーブルには主キーが必要であるという仕様だと考えました。

    この他としてリレーションシップの設定画面の一部に次のキャプチャのようなエラーが表示されます。


    [エラーメッセージ]
    「リレーションシップは、キーフィールドに対応付ける必要があり、リレーションシップのプライマリ側の
    キーフィールドのみに対応付ける必要があります。」

    上記アラートの内容からも主キーを必要な項目としていると考えられます。


    確認用のデータとして用いたDDLおよびDMLは次の通りとなります。
    [DDL]

    下記テーブルおよび制約を削除する場合
    alter table table_1 drop constraint DF_Table_1_F1
    alter table table_1 drop constraint pk1
    alter table table_2 drop constraint pk2
    drop table table_1
    drop table table_2
    
    Table_1テーブル
    create table Table_1(
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [F1] [int] NOT NULL CONSTRAINT [DF_Table_1_F1]  DEFAULT ((2)),
     [F2] [nvarchar](50) NOT NULL
    )
    
    Table_2テーブル
    create table Table_2(
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [F1] [int] NOT NULL ,
     [F2] [nvarchar](50) NOT NULL
    )
    
    使用した制約
    Table_1テーブルのf1フィールドを主キーにしています
    alter table table_1 add constraint pk1 primary key(f1)
    
    Table_2テーブルのf1フィールドを主キーにしています
    alter table table_2 add constraint pk2 primary key(f1)

    [DML]

    Table_2テーブルに登録したデータ
    insert into Table_2 (f1, f2) values(100,'aaa');
    insert into Table_2 (f1, f2) values(200,'bbb');
    insert into Table_2 (f1, f2) values(300,'ccc');
    insert into Table_2 (f1, f2) values(400,'ddd');
    insert into Table_2 (f1, f2) values(500,'eee');
    
    確認したSQL
    select * from Table_2;
    1 100 aaa
    2 200 bbb
    3 300 ccc
    4 400 ddd
    5 500 eee
    
    Table_1テーブルに登録したデータ
    insert into Table_1 (f1, f2) values(1,'aaa');
    insert into Table_1 (f1, f2) values(2,'bbb');
    insert into Table_1 (f1, f2) values(3,'ccc');
    
    確認したSQL
    select * from Table_1;
    1 1 aaa
    2 2 bbb
    3 3 ccc
    
    確認したSQL
    select '1', * from Table_1
    union all
    select '2', * from Table_2
    1 1 1 aaa
    1 2 2 bbb
    1 3 3 ccc
    2 1 100 aaa
    2 2 200 bbb
    2 3 300 ccc
    2 4 400 ddd
    2 5 500 eee

    ※注意点
    IDENTITYのフィールドを主キーとして登録したテーブルをデータソースとして取り込むと
    他のフィールドが消えることがありますので登録したデータソースのフィールドは
    確認いただけますよう、お願いします。
    (例)
    ID:IDENTITY(主キーを付加)
    F1:int
    F2:varchar



    [取り込んだ結果]
    ID:IDENTITY(主キー)
    F2:varchar

    のようにF1フィールドが消えることがあります。

    画面構成は次の通りとなります。


    F1フィールドには現在格納されている「F1フィールドの最大値 + 1」を設定するため
    画面上のレイアウトには追加しておりません。
    [該当ロジック]
    '指定したデータソースの情報の取得準備をしています
    Dim iData = 0       'F1フィールドに設定する値
    '指定したデータソースの情報の取得準備をしています
    Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()
    iData = items.LastOrDefault().F1 + 1

    このサンプルでは「Saving」イベントに次の処理で実装しています。

    (1)データの存在チェック
    Table_2テーブルのIDフィールドに格納されているデータに
    今回登録を使用としているデータが存在するかどうか?

    このようなデータの取得処理は実務ではLINQで実装しているようです。
    ※海外サイトのインターネットで、ご確認いただければご理解いただけると思います。

    (2)データ登録処理
    [該当ロジック]
    'データソースにデータを追加する準備をしています
    Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
    With tbl
        'F1フィールドの最後のデータに1を加算した値を設定します
        .F1 = iData
        '画面項目(F2)の値を設定します
        .F2 = Table_1ItemProperty.F2
    End With
    'データを保存してデータ更新処理をします
    Me.DataWorkspace.TESTData.SaveChanges()

    このようなデータの登録処理は実務ではデータソースで実装しているようです。
    ※海外サイトのインターネットで、ご確認いただければご理解いただけると思います。

    (3)エラー処理
    Try Catchで実装しています。
    「DataServiceOperationException」はLightSwitchのために準備されているものとなります。

    Private Sub CreateNewTable_1Item_Saving(ByRef handled As Boolean)
        ' ここにコードを書き込んでください。
        Try
            'LINQでデータを取得して存在チェックをする
            '既存データに含まれていない場合はエラーとします
    
            '指定したデータソースの情報の取得準備をしています
            Dim iData = 0       'F1フィールドに設定する値
            '指定したデータソースの情報の取得準備をしています
            Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()
            iData = items.LastOrDefault().F1 + 1
    
            Dim result = From tbl2 In DataWorkspace.TESTData.Table_2
                        Where tbl2.ID = iData
    
            Dim iCount = Aggregate o In result.Execute() Into Sum(o.ID)
    
    
            If iCount < 1 Then
                Me.ShowMessageBox("データが重複しています。" + ControlChars.CrLf + "データを見直してください。")
                handled = True
                Exit Sub
            End If
    
            'データソースにデータを追加する準備をしています
            Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
            With tbl
                'F1フィールドの最後のデータに1を加算した値を設定します
                .F1 = iData
                '画面項目(F2)の値を設定します
                .F2 = Table_1ItemProperty.F2
            End With
            'データを保存してデータ更新処理をします
            Me.DataWorkspace.TESTData.SaveChanges()
    
        Catch ex As DataServiceOperationException
    
            Me.ShowMessageBox(ex.Message + ControlChars.CrLf + ex.ErrorInfo)
            handled = False
            Exit Sub
    
        Catch ex2 As Exception
            Me.ShowMessageBox(ex2.Message)
            handled = False
            Exit Sub
    
        End Try
    
        handled = True
    
    End Sub
    
    [報告2]

    > 【質問です】
    >
    > 本当は、もっと何かスタンダード(というか、あたりまえ?)な方法があるのでは?と思うのです。

    海外のサイトを中心に調べましたが(必然的に海外のサイトが多くなりました)、
    ※海外のMsdnのフォーラムではデータソースに追加している例が見られます。
    (例)
    Dim items As IEnumerable(Of Table_1Item) = Me.DataWorkspace.TESTData.Table_1.GetQuery.Execute()

    Dim tbl = Me.DataWorkspace.TESTData.Table_1.AddNew()
    With tbl
        .F1 = items.LastOrDefault().F1 + 1
        .F2 = Table_1ItemProperty.F2
    End With

    上記理由より、開発者と思われるユーザはストアドプロシージャで登録するよりも
    データセットオブジェクトに登録して更新処理等を実装している開発手法と見受けられました。

    [報告3]
    参考になるサイトなどがあればともおっしゃっていると解釈し、
    下記に調査した中で利用しやすそうなサイトを記しました。

    Visual Studio LightSwitch ハンズオンラボ 資料 0.5 版
    ※最新の資料ではありませんが、わかりやすいと思います。
    [URL]
    http://sqlazure.jp/d/hans.pdf

    コードを使用したデータ関連タスクの実行
    [URL]
    https://msdn.microsoft.com/ja-jp/library/ff851990(v=vs.120).aspx?

    Flip the Switch An Introduction to Visual Studio Lightswitch for Visual FoxPro Developers
    [URL]
    http://saltydogllc.com/wp-content/uploads/Selje_LightSwitch1.pdf

    Visual Studio Lightswitch 2011
    ※コードの実装イメージがつくと思います。
    [URL]
    https://books.google.co.jp/books?id=vUwAPK4BMaMC&pg=PA315&lpg=PA315&dq=visual+studio+Lightswitch+FirstOrDefault&source=bl&ots=nMsG00f_2b&sig=QkdxNs0U5nIk7LKNG0uQT6qDn3E&hl=ja&sa=X&ved=0ahUKEwij7sTn5PzOAhWEkpQKHWMmBukQ6AEIMzAC#v=onepage&q=visual%20studio%2

    Visual Studio Lightswitch 2015
    ※コードの実装イメージがつくと思います。
    [URL]
    https://books.google.co.jp/books?id=ukRECwAAQBAJ&pg=PA198&lpg=PA198&dq=lightswitch+validate&source=bl&ots=lkcTu54C0N&sig=7qhswyE6c3gOGtWlUNpC4u_q6FM&hl=ja&sa=X&ved=0ahUKEwj7sIi62oHPAhXCNJQKHXWOD284ChDoAQgvMAI#v=onepage&q=lightswitch%20validate&f=false


    C#であればVB.NETよりも参考サイトが増えると思います。
    また、HTML系ではタグの生成分岐処理やデータの取得・更新・表示処理などに
    Javascriptを使っているフォーラムなどのサイトを目にしています。

    未実装未確認で申し訳ございませんが、画面構成の「はば」を広げる手段として
    Silverlightを用いたユーザコントロールの組み込みもございます。

    [Silverlight] Visual Studio LightSwitch - カスタム Silverlight コントロールの作成方法 [LightSwitch]
    [URL]
    http://blogs.jp.infragistics.com/blogs/dikehara/archive/2010/10/28/silverlight-visual-studio-lightswitch-silverlight-lightswitch.aspx

    [Silverlight] Visual Studio LightSwitch – Screen デザイナへのコントロールの組み込み その1 [LightSwitch]
    [URL]
    http://blogs.jp.infragistics.com/blogs/dikehara/archive/2010/11/01/silverlight-visual-studio-lightswitch-screen-1-lightswitch.aspx

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月10日 9:20
  • msuser_forum さん、こんにちは。

    レスありがとうございます。

    1点だけ確認したいのですが、

    CONSTRAINT [DF_Table_1_F1] の REFERENCES定義はどのようななっているでしょうか?

    どうも、Check制約の有無でLightswitch側の挙動が変わるのではないか?という気がしてきています。(まだ確認しきれていませんが)

    2016年9月11日 4:07
  • Keiichi Oumi様

    いつも大変お世話になっております。

    YES/NOで答えられるような質問にしてくださったのにも関わらず
    回答が遅れてしまったこと、そして私の説明不足および理解しづらい文章より、
    困惑させてしまったことをお詫び申し上げます。
    そしてお休みの日と思われるのに、ご返答してくださったことをお礼申し上げます。

    >CONSTRAINT [DF_Table_1_F1] の REFERENCES定義はどのようななっているでしょうか?

    今回、「REFERENCES定義」にはTable_2の[ID]には外部キーは設定しておりません。
    理由は、
    最初は下記のように、
     (『IDENTITY』を設定した、table_2の、idカラムへの)
    外部キーを設定して、
    Lightswtichで、動作確認してたのですが、エラーになり、
    お手上げでした。

    alter table table_1 add constraint fk1 foreign key(f1)
    references table_2(id)

    そのため、外部キーを設定するのは、あきらめました。

    >Check制約の有無でLightswitch側の挙動が変わるのではないか?

    CONSTRAINT句の CHECK制約を使って、
    別テーブルのカラムの値かどうか?をチェックする
    (今回の場合、Table_2のIDに存在するか、どうか?)
    方法は、わたしは、わかりません。

    そのため、わたしが、このプログラムを担当する場合は、
    「CONSTRAINT句の CHECK制約」を使うのは
    あきらめて、VB.NET側の、プログラムで、
    上記のチェックを実装して、逃げると思います。

    現在、私もリレーションを追加した方法での追加方法を
    探しているのですが、時間がかかっております。

    おそらく
    Keiichi Oumi様が先に見つけてしまう思います。
    もし方法を見つけましたら大変申し訳ございませんが
    時間のあるときに、どのように実装したのか?を
    公開(もしくは 報告)していただれば、
    うれしいです。

    恐れ入りますが現状報告までに
    お知らせします。
    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月12日 3:05
  • msuser_forum さん、こんにちは。

    むー、やはり悩んでいる方がいた!と、少し安心しました。(笑)

    さて、今現在は、CHECK制の意味からして、Lightswitchの動作は正しいものであるといったほうに、考えが傾倒してきました。ただし、このような状況下で外部キーフィールドに値を設定する直接的な方法はまだ見つけていません。

    見つからないにしても、一連のコード、テーブル作成の考え方等、自分の結論をまとめてUPします。(ちょと時間が必要です・・)

    以上です、ありがとうございました。

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月12日 6:09
  • どうやら、できたようです。

    詳細は、後日UPしますが、簡単な話でした(^^;

    要約するとTable1 に外部キーは見えないものの、その部分?は、Table_2Item となっているのだから、なら、Table_2Item をセットしてあげればよいだけじゃないか!?

    なして、今まで気が付かなかったんだろう・・・

                Dim nd = Me.Table_1.AddNew
                With nd
                    nd.Table_2Item = DataWorkspace.TESTDBData.Table_2_Single(6)
                    nd.F2 = "66666"
                End With

    直接値を入れようとするところが、なんだか古い頭だったのかもしれません。
    EDMあたりを使い慣れてる人なら、当たり前の事だったのかも・・・

    DataWorkspace~となっているのは、画面にデータ項目として無いからであって、あるとMe.~とできると思います。
    • 編集済み Keiichi Oumi 2016年9月13日 5:44 ちと追加
    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月13日 5:30
  • Keiichi Oumi様

    いつも大変お世話になっております。

    おめでとうございます。

    私のほうも外部キーを貼った状態でLightswtichに取り込み実装してみました。
    ------------------------------------------------------------------
    alter table table_1 add constraint fk1 foreign key(f1)
    references table_2(id);
    ------------------------------------------------------------------

    登録すると2重にデータが発生したエラーが発生していたため
    一度登録する前に変数に値をとっておき
    次のように登録をして回避しました。
    ------------------------------------------------------------------
    'データが2重登録されることがあるので回避するため削除しています
    Table_1ItemProperty.Delete()
    ------------------------------------------------------------------
    でも私のやり方であるとまだ次の課題が残ってしまっています。
    (1)データ更新後、「F1」項目が読み取り専用項目のようにグレーとなってしまっていること
    (2)外部エラーによる日本語のメッセージがこれでいいのか?疑問を覚えること
    ※英語メッセージは問題ないのですが。
    ------------------------------------------------------------------
    2016/09/14 09:40 追加修正

    Me.DataWorkspace.TESTDBData.SaveChanges()
    の後に、下記、実装で画面のリフレッシュができました。
    ※データ更新後、「F1」項目が読み取り専用項目のようにグレーとなってしまっていること
    が解消されました。

    Me.Details.Dispatcher.BeginInvoke(
        Sub()
            Me.Refresh()
        End Sub
    )

    [参考URL]

    https://social.msdn.microsoft.com/Forums/en-US/0bfb9028-307f-49c2-8d65-309443e2d653/grid-refresh-bug-formerly-sheels-event-handling-etc?forum=lightswitchgeneral

    上記文章を下記のように一部修正しました。

    [修正前] 一度値を登録する変数にとっておき

    [修正後] 一度登録する前に変数に値をとっておき

    2016/09/14 10:42 追加修正
    「(2)外部エラーによる日本語のメッセージがこれでいいのか?疑問を覚えること」について
    [参考URL]
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/f0d93f45-00fb-4630-83bd-5cd72934e7e1/change-default-error-message?forum=lightswitch

    ※URL修正 2016/09/14 14:14

    The only exception that
    I can think of is that
    you cannot control the wording of messages of built-in validation
    such as the "is required" validator.

    Justin Anderson, LightSwitch Development Team

    「LightSwitch 開発チーム」のスタッフさんが
    普通ではできないようになっているとのようですので、このままにします。

    ------------------------------------------------------------------

    うまくできたようで何よりです。

    それでは今後のご活躍をご期待いたします。






    2016年9月13日 9:02
  • まとめ

    発端は、リレーションシップが設定されているテーブルを外部データ参照で取り込んだ時、外部キーとなるカラムが表示されないという事です。

    この状態で、AddNewメソッド後、制約設定されているカラムに値を設定しようとしても、インテリセンス上に候補として現れません。
    よって、このテーブルをコードから作成する事ができない。
    といった問題がありました。(そう思っていました。)
    ※当然ながら、UIからの操作はできます。


    結論としては、外部キーとなるカラムには、その対象テーブルの当体であるオブジェクトを設定すれば良いという事でした。
    (自分の勘違いと基礎知識の無さから来た問題である点は否めません)
    当初LightSwitchの挙動が云々・・・なども考えましたが、LightSwitchはむしろ忠実にテーブル側の設定を解釈しているという事でした。(><)

    もし!自分と同じ状況となる人がいた場合にそなえて(いるか?)全コードをUPしておきます。

    【確認テスト用のTABLE作成】
    ※SQL SERVER SSMS より、スクリプトの生成で出力した結果です。

    USE [TESTDB]
    GO
    /****** Object:  Table [dbo].[Table_1]    Script Date: 2016/09/14 13:38:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_1](
    	[T1_ID] [int] IDENTITY(1,1) NOT NULL,
    	[T1_F1] [int] NULL,
    	[T1_VALUES] [nvarchar](50) NULL,
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
    	[T1_ID] 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
    /****** Object:  Table [dbo].[Table_2]    Script Date: 2016/09/14 13:38:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_2](
    	[T2_ID] [int] IDENTITY(1,1) NOT NULL,
    	[T2_VALUES] [nvarchar](50) NULL,
     CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED 
    (
    	[T2_ID] 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].[Table_1] ON 
    
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (1, 1, N'ひでまる')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (2, 2, N'茶々丸')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (3, 3, N'蘭丸')
    GO
    INSERT [dbo].[Table_1] ([T1_ID], [T1_F1], [T1_VALUES]) VALUES (5, 2, N'ポチ')
    GO
    SET IDENTITY_INSERT [dbo].[Table_1] OFF
    GO
    SET IDENTITY_INSERT [dbo].[Table_2] ON 
    
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (1, N'トイプードル')
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (2, N'シーズー')
    GO
    INSERT [dbo].[Table_2] ([T2_ID], [T2_VALUES]) VALUES (3, N'ちわわ')
    GO
    SET IDENTITY_INSERT [dbo].[Table_2] OFF
    GO
    ALTER TABLE [dbo].[Table_1]  WITH CHECK ADD  CONSTRAINT [FK_Table_1_Table_2] FOREIGN KEY([T1_F1])
    REFERENCES [dbo].[Table_2] ([T2_ID])
    GO
    ALTER TABLE [dbo].[Table_1] CHECK CONSTRAINT [FK_Table_1_Table_2]
    GO
    


    【Lightswitch 側 UIとメソッド】

    Namespace LightSwitchApplication
    
        Public Class Table_1ListDetail
    
            Private Sub Method_Execute()
    
                Dim NewFamilly = Me.Table_1.AddNew
    
                NewFamilly.T1_VALUES = "名前を入れてください。"
    
                '初期値として、ID=1 の値を入れる
                NewFamilly.Table_2Item = DataWorkspace.TESTDBData.Table_2_Single(1)
    
                'Save() あれば、あったなりに、無ければ無いなりに、動作します。
    
            End Sub
    
        End Class
    
    End Namespace


    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:59
    2016年9月14日 4:54
  • 実行してみると、こんな感じ!の図

    • 回答としてマーク Keiichi Oumi 2016年9月14日 4:58
    2016年9月14日 4:55