Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2016)
重複する値のあるフィールド
投稿日時: 19/12/02 15:52:53
投稿者: Cyber033

フィールド「工事番号」とフィールド「副番」を含んだテーブル1というデータシートを作成し、
主キーを工事番号と副番に設定したとします。次にまたフィールド「工事番号」「副番」を含んだ
テーブル2を作成し、テーブル2も工事番号、副番を主キーに設定し、フィールド「工事番号」の
相互のテーブル間でリレーションを設定い、同様に「副番」もリレーションを設定します。
次にクエリでテーブル1及びテーブル2からフィールドを選択し、選択クエリを作っておき、
テーブル2のデータを入力するためにこの選択クエリから分割フォームを作成し、下半分にクエリの
データシート上段にフォームを作成し、下段のデータシート上のレコードを選択すると、上段に
そのレコードのフォームが表示されるようにしました。テーブル1は全レコードが入力されている状態
でこのフォームから新規レコードを入力しようと新規入力で工事番号、副番を入力(テーブル2は全レ
コード未入力なので、残りのレコードのフィールドデータを入力するため)したが、
インデックス、主キー又はリレーションシップで重複する値が生成されるため、テーブルを変更できません
でした。重複する値のあるフィールドの値を変更するかインデックスの値を変更するか、インデックスを
削除してください。又は重複する値を使用できるように再定義してください。とエラー表示が出ます。
どう対処したらよいでしょうか。

回答
投稿日時: 19/12/02 17:46:03
投稿者: sk

引用:
フィールド「工事番号」とフィールド「副番」を含んだテーブル1という
データシートを作成し、主キーを工事番号と副番に設定したとします。
次にまたフィールド「工事番号」「副番」を含んだテーブル2を作成し、
テーブル2も工事番号、副番を主キーに設定し、フィールド「工事番号」の
相互のテーブル間でリレーションを設定い、同様に「副番」もリレーションを
設定します。

(何故そういうテーブル設計にされたのか、その理由が不明ですが)
[テーブル1]と[テーブル2]は 1対1 の関係にある」として、
その両者のどちらが親テーブルに当たるのでしょうか。
[結合の種類]をどのように設定したのか)
 
引用:
次にクエリでテーブル1及びテーブル2からフィールドを選択し、
選択クエリを作っておき、テーブル2のデータを入力するために
この選択クエリから分割フォームを作成

そういうケースでは、次のようなフォーム設計にされた方がよいでしょう。
 
1. [テーブル1]をレコードソースとする単票フォーム
   (または分割フォーム)を作成する。
 
2. [テーブル2]をレコードソースとする単票フォームを作成する。
 
3. 1 のフォームの詳細セクションにサブフォームコントロールを
   挿入する。
 
4. 3 のサブフォームコントロールのソースオブジェクトを
   2 のフォームとし、フィールド[工事番号], [副番]同士で
   メインフォームとサブフォームがリンクするように設定する。

回答
投稿日時: 19/12/02 18:12:38
投稿者: sk

追記:

引用:
テーブル1は全レコードが入力されている状態

引用:
テーブル2は全レコード未入力

引用:
インデックス、主キー又はリレーションシップで重複する値が
生成されるため、テーブルを変更できませんでした。
重複する値のあるフィールドの値を変更するか
インデックスの値を変更するか、インデックスを
削除してください。又は重複する値を使用できるように再定義してください。
とエラー表示が出ます。

恐らく[テーブル2]において、主キーとは別にユニークキーが
定義されているのではないでしょうか。

投稿日時: 19/12/03 15:42:01
投稿者: Cyber033

質問を言い換えると
1連のレコードセットがあり、入力する時期のちがう2組のフィールド郡があったとします。
このフィールド郡を共通の「工事番号」と「副番」を主キーとするテーブル1とテーブル2に
分け工事番号、副番各々にリレーションを設定します。テーブル1のデータ入力用にテーブル1
の分割フォームを作成し、1件づつ入力していき、テーブル2も同様に分割フォームでデータを
入力したいのですが、テーブル2のデータ入力はテーブル1のデータが既に入力済なので、
下段のテーブル1のデータシートからレコードを選択し、上段のフォームにそのレコードの
テーブル2を入力したいのですが、この分割フォームをどうデザインすればよいのでしょうか。

回答
投稿日時: 19/12/03 16:39:42
投稿者: sk

引用:
1連のレコードセットがあり、入力する時期のちがう2組のフィールド郡があったとします。

引用:
テーブル1のデータ入力用にテーブル1の分割フォームを作成し、1件づつ入力していき、
テーブル2も同様に分割フォームでデータを入力したいのですが、
テーブル2のデータ入力はテーブル1のデータが既に入力済なので

要するに、[テーブル1]と[テーブル2]は、
前者を親テーブル、後者を子テーブルとした
1対1 の関係にある、ということでしょうか。
 
引用:
下段のテーブル1のデータシートからレコードを選択し、上段のフォームにそのレコードの
テーブル2を入力したいのですが、この分割フォームをどうデザインすればよいのでしょうか。

その前に、以下のエラーメッセージが表示される問題を
解決される方がよいではないでしょうか。
 
引用:
インデックス、主キー又はリレーションシップで重複する値が生成されるため、
テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか
インデックスの値を変更するか、インデックスを削除してください。
又は重複する値を使用できるように再定義してください。

[テーブル1]に対する新規レコードの追加が問題なく行なわれているのであれば、
[テーブル2]の定義内容、及びリレーションシップの定義に原因があると
考えるのが妥当です。
 
とりあえず、[テーブル2]をデザインビューで開き、
インデックスウィンドウを表示させて
各インデックスの定義内容を確認してみて下さい。
 
・主キー(PrimaryKey)以外のインデックスが定義されていないか。
 
・(他にインデックスが定義されている場合)
 [固有]プロパティの値が「はい」に設定されている
 インデックスが存在していないか。

トピックに返信