2017-10-10 6 views
0

私のフォームのレコードソースをSQL Serverビューに設定しました。今すぐ開いたときMS AccessのフォームのレコードソースがSQL Server上にある場合、ビューは更新可能ではありません

DoCmd.OpenForm "frmDocuments", WhereCondition:=varWhere 
Forms!frmDocuments.SetFocus 

開かれますが、更新できません。私は知りたい、これは普通ですか? Accessフォームで開いたビューはすべて更新できません。

ビュー用に一意のインデックスを作成すると、ネット上で読み込み可能になります。更新可能になります。私はこのコード

CREATE UNIQUE CLUSTERED INDEX i_Documents 
    ON qryDocuments([Owner Document Number]) 

でビューにインデックスを作成しようとすると、

は今、私はその後、私は、スキーマでビューを作成しようと、エラー

「バインドスキーマ」を取得しますバインディング、エラーが発生する

名前 'tblDiscipline'がスキーマ・バインディングに対して無効であるため、ビュー 'test'をスキーマにバインドできません。名前は2つの部分からなる形式でなければならず、オブジェクトはそれ自体を参照できません。

私が使用しているコードは以下のようなものです:

CREATE VIEW qryDocuments 
WITH SCHEMABINDING 
AS 
    SELECT 
     tblDocuments.[Owner Document Number], tblDocuments.[Sazeh Document 
    Number], 
     tblDocuments.[Document Title], tblDocuments.[Project No], 
     tblDocuments.Originator, tblOriginator.[Originator Des], 
     tblDocuments.Zone, tblDocuments.Unit, tblDocuments.Discipline, 
     tblDiscipline.DiscDesc, tblDocuments.[Document Type], 
     tblDocumentType.[TYPE Description], tblDocuments.SheetNumber 
    FROM 
     tblDiscipline 
    RIGHT JOIN 
     ((tblDocumentType 
    RIGHT JOIN 
     tblDocuments ON tblDocumentType.TYPE = tblDocuments.[Document Type]) 
    LEFT JOIN 
     tblOriginator ON tblDocuments.Originator = tblOriginator.Originator) 
     ON tblDiscipline.DiscCode = tblDocuments.Discipline 
    GO 

助けてください - どのように私はこの問題を解決することができますか?

答えて

1

まず、テキストクエリの壁に少し書式を設定してみましょう。どのようにコードの量を大幅に減らし、何が起こっているかを見るのがずっと簡単になるalisesをどのように使用したかに注目してください。これらの結合は別のものです。このようなパターンで右結合と左結合を組み合わせると、これはクエリツールによって作成されたことを示します。

SELECT d.[Owner Document Number] 
    , d.[Sazeh Document Number] 
    , d.[Document Title] 
    , d.[Project No] 
    , d.Originator 
    , o.[Originator Des] 
    , d.Zone 
    , d.Unit 
    , d.Discipline 
    , dis.DiscDesc 
    , d.[Document Type] 
    , dt.[TYPE Description] 
    , d.SheetNumber 
FROM tblDiscipline dis 
RIGHT JOIN tblDocuments d ON dis.DiscCode = d.Discipline 
RIGHT JOIN tblDocumentType dt ON dt.TYPE = d.[Document Type] 
LEFT JOIN tblOriginator o ON d.Originator = o.Originator 

ここで実際にこのクエリを読むことができます。エラーメッセージは非常に明確です。この部分を特に見てください。 "名前は2つの部分からなる形式でなければなりません"。オブジェクトのスキーマを指定していない場合、ビューをスキーマにバインドすることはできません。おそらく、ここのドキュメントを参照する必要があります。 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql「更新可能なビュー」の部分を特に見てください。

+0

ありがとう、前の問題は解決しましたが、「外部結合でビューを作成するとインデックスを作成できません」というエラーが表示され、内部結合に変更され、フォームでクエリを更新できるようになりました。しかし、私は外側の結合でビューにインデックスを作成する方法がないという質問がありますか? –

+0

いいえ、外部結合はできません。 1秒間それを考えてみましょう。クエリエンジンがビュー内の行を更新するよう依頼していますが、更新対象の列は実際には存在しません。なぜなら、左側のテーブルのテーブルからのものであるためです。物事をやろうとするときは、もう一度ドキュメンテーションを見てください。インデックス付きビューを作成するためのドキュメントは次のとおりです。 https://docs.microsoft.com/en-us/sql/relational-databases/views/create-indexed-views –