質問

私はこれに対する私の頭を叩いてきた、と私はちょうど何かを明らかに欠けていると確信している、しかし...

私は顧客のデータベース内のテーブルを持っている、それは基本的にあります:

Item_Set_Key int
Item_1       bit
Notes_1      nvarchar(80)
Item_2       bit
Notes_2      nvarchar(80)
Item_3       bit
Notes_3      nvarchar(80)
...

(他の外部の考慮が関与)があり、各レコード内の99個の項目がありますし、何のスキーマを変更することはオプションではありません。

は、しかし、遠隔地のユーザにインテリジェンスに似たもので、それを表示するために、我々はこのように(ビュー経由で)それをアンピボットする必要があります:

SELECT i.Item_Set_Key, i.Item_Number, i.Selected, i.Item, i2.Notes, i2.Note
FROM (
SELECT Item_Set_Key, SUBSTRING (Item, 6, 2) AS Item_Number, Selected, Item
    FROM Item_Set
    UNPIVOT (Selected FOR Item IN
        (Item_1, Item_2, Item_3, Item_4, Item_5, ...)
    ) as u
) AS i
LEFT JOIN (
SELECT Item_Set_Key, SUBSTRING (Note, 7, 2) AS Item_Number, Notes
    FROM Item_Set
    UNPIVOT (Notes FOR Note IN
        (Notes_1, Notes_2, Notes_3, Notes_4, Notes_5, ...)
    ) as n
) AS i2 ON i2.Item_Set_Key = i.Item_Set_Key
    AND i2.Item_Number = i.Item_Number

私は、グリッドにその標準バインドを行います。しかし、テキストが明示的に設定して列に名前を付ける必要があるため、私は、それのためにUpdateCommandを構築する方法についての損失のようなものでんだけど、列名は項目と注意列に動的であり、そして私ができます各レコードは一つだけのアイテム/ノート・ペアのデータを持っているでしょうので、「トンは、ちょうどすべての列を設定します。

アイデア?

役に立ちましたか?

解決

あなたはデータバインディングの元に旋回テーブルに戻ってデータベースに変更を送信するために頼ることができなくなります。代わりに、単一として各更新をキャプチャする必要がある「作業単位。」例えば、アイテムID = 92、値= "トム"。おそらく、以前の項目92の値が「ジョー」でした。ここでの仕事のあなたのユニットは、項目92の値を変更することです。

ユーザーとして、あなたが一緒にバッチ各UOWを可能なユーザインタフェースを介して変更を行い、彼らは[保存]をクリックする準備が整うまで、それらにしがみつきます。ユーザーが保存を要求すると、取り込まれた各UOWは、データベースに対して「演奏」されます。 「コマンド」パターンおよび/またはジェレミー・ミラーの記事のいくつかの周りを検索します。

もう一つの考えは、あなたがスキーマを変更することはできませんが、多分あなたが本当にできると述べています。アンピボット形式である実際のテーブルを作成することを検討してください。そして、PIVOTコマンドを使用するビューで、現在の表を置き換えます。実際には、あなたは、より良い設計にデータを格納しますが、既存のアプリケーションのために、あなたはそれをバックPIVOT。あなたはそれが旋回し、設計にありますながら更新を行う必要がない限り、これは働くことができます。

最後のオプションは、単に2つの物理テーブルを維持して、定期的に同期させるために、いくつかの複雑なマージ操作を書くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top