1


0

私はバックエンドとしてSQL Serverを使用しており、フロントエンドとしてMS Accessを使用しています。

私は2つのテーブル( person`と manager`)を持っています、 manager`は person`から派生しているので(1:1の関係)、それで私は基本的にaである `managerFull`ビューを作成しました。

SELECT * FROMから `manager`` m`内部結合 `people`` p` ON `m`.`id` =` p`.`id`

person`の id`はオートインクリメントで、 manager`の id`は主キーと外部キーで、 `person`を参照しています。

今、私はmsアクセスでフォームを持つ新しいデータセットを挿入することができるようにしたいです、しかし、私はそれを働かせられません。 エラーメッセージ、ステータス行、なし。 新しい行は挿入されず、msアクセスでデザインビューに戻るには、変更をキャンセルするためにescapeキーを押す必要があります。

私は「管理職」フォームについて話していますが、管理者と個人情報を単一のフォームで同時に入力できるようにしたいです。

私の質問は今です:それは私がここでやりたいことは可能ですか? そうでない場合は、挿入後トリガーまたはvbaコードの一部の行を使用した「単純な」回避策はありますか?

前もって感謝します

4 Answer


2


問題はあなたの見解が複数のテーブルにまたがっていることです。 複数のテーブルにアクセスする場合は、それらのうちの1つだけを更新または挿入できます。

制限事項の詳細およびhttp://msdn.microsoft.com/jaを参照してください。 -us / library / ms180800.aspx [ビュー更新のための適切な戦略]


1


ODBCを想定して、考慮すべきことがいくつかあります。

  1. personテーブルにタイムスタンプフィールドがあり、それがマネージャビューに返されていることを確認してください。 あなたはおそらくマネージャビューのpersonテーブルの本当のPKも必要です(あなたのビューは自己結合のために使われたFKを取り、それをIDフィールドとしてエイリアスすると仮定しています - 私はそれをしません混乱しています。 代わりに、管理者ビューで実際の外部キー名を使用し、PKを実際の名前のままにします。

  2. レコードソースでJet / ACE固有のDISTINCTROW述語を試してください。 Jet / ACEバックエンドでは、他の方法では不可能な場合に両方のテーブルに挿入することが可能になります。 ただし、JetがSQL Serverに正しいことを実行するように指示するのに十分な賢さがあるかどうかはわかりません。

  3. どちらもうまくいかない場合は、自分のpersonテーブルに基づくレコードソースを使用するようにフォームを変更し、レコードを編集してその人をマネージャに関連付けるためのコントロールとしてmanagerビューに基づくコンボボックスを使用します。


0


Ilya Kochetovは、1つのテーブルしか更新できないと指摘しましたが、回避策は、一方のテーブルのフィールドに更新を適用し、次にもう一方のテーブルに更新を適用することです。 このソリューションは、これら2つのテーブルへの唯一のアクセスがこのビューを介して行われていることと、これを処理するストアドプロシージャを作成することは許可されていないことを前提としています。


0


アクセスする2つの関連テーブルをモデル化して管理するには、両方のテーブルを結合したクエリやビューを使用しないでください。 メインフォームを使用して、子テーブルに基づくサブフォームをドロップするだけです。 サブフォームのリンクマスターと子の設定が正しく設定されていれば、コードを記述する必要はなく、アクセスするとリンクフィールドにその人のIDが挿入されます。

そのため、ここで結合テーブルを使用しないでください。 フォームサブフォーム設定を使用するだけで、データと関連する子テーブルのデータを編集および管理できます。

これは、ビューではなく、テーブルの上にフォームを作成することを意味します。 そして、サブフォームを子テーブルに基づいて作成します。 そのため、ここではビューを使用しないでください。