質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

2547閲覧

Access 登録フォームで「重複する値が生成されるため、テーブルを変更できませんでした」を解決したい

ryoya_access

総合スコア34

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/08/13 03:20

実現したいこと

Access(2007-2016)で従業員管理DBを作成しています。

従業員登録フォームを作成し、登録ボタンを押すと新規レコードを追加するようにしたいのですが、思うように動作しないため、こちらで質問させていただくことにしました。

以下、詳細になります。

テーブルとリレーション

イメージ説明

イメージ説明*
従業員ID:オートナンバー
従業員名:短いテキスト
パスワードID:数値

従業員ID 従業員名 パスワードID
1 一郎 1
2 二郎 2
3 三郎 3
4 四郎 4

〇T_パスワード
パスワードID:オートナンバー
パスワード:短いテキスト
管理者:YES/NO

パスワードID パスワード 管理者
1 aaa Yes
2 bbb No
3 ccc Yes
4 ddd Yes

###フォーム
「T_従業員」「T_パスワード」の全てのフィールドを利用し、次のような登録フォームを作成しました。
※緑掛けの「T_従業員_パスワード」は可視「いいえ」にしています。
イメージ説明
イメージ説明

Private Sub btn登録_Click() Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("T_従業員", dbOpenTable) With Rst On Error Resume Next .AddNew .Fields("従業員ID") = Me.従業員ID .Fields("従業員名") = Me.従業員名 .Fields("パスワードID") = Me.T_従業員_パスワードID .Update End With Rst.Close Set Rst = Nothing Set Rst = CurrentDb.OpenRecordset("T_パスワード", dbOpenTable) With Rst On Error Resume Next .AddNew .Fields("パスワードID") = Me.T_パスワード_パスワードID .Fields("パスワード") = Me.パスワード .Fields("管理者") = Me.管理者 .Update End With Rst.Close Set Rst = Nothing MsgBox (Me.従業員名 & "さんの登録が完了しました。") End Sub

ここに値を入力していき「btn登録」を押すと、次のようなエラーメッセージが表示されます。
イメージ説明

いくつかのサイトを見たのですが、エラーの意味と対処法がよく分かりませんでした。
こちらどのように対応すればよいか、お力をお貸しいただきたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DreamTheater

2020/08/13 04:06

「Me.T_パスワード_パスワードID」はいつどこで値を生成するのですか?
DreamTheater

2020/08/13 04:09

失礼 「Me.T_従業員_パスワードID」はいつどこで値を生成するのですか? それと、「Me.T_従業員_パスワードID」と「Me.T_パスワード_パスワードID」は同値が保証されるのでしょうか?
guest

回答3

0

解決済みになっちゃいましたが、
このテーブルの設計、フォームの設計、根本的におかしいですよ。

まず、テーブル設計、
T_パスワードとT_従業員が一対多の関係になってますが、
これだと、一つのパスワードを複数の従業員が共有することが可能になりますが、
それでいいのでしょうか。

管理者用のパスワードはすべての管理者で共通にするとかならいいのですが、
通常はパスワードを複数で共有するなんてしませんよね。

一人の従業員に一つのパスワードという仕様なら、一対一の関係になります。
その場合、従業員テーブルが主テーブルになるので、下記のような設計にします。

T_従業員
従業員ID オートナンバー型
従業員名
管理者

T_パスワード
従業員ID 主キー 数値型
パスワード

ただし、一対一の場合はテーブルを分ける必要性はほとんどないです。

T_従業員
従業員ID オートナンバー型
従業員名
管理者
パスワード

と一つのテーブルで管理するほうかシンプルです。

詳細は下記を参照してください。

一対一関係のテーブル設計 - hatena chips

次に、フォーム設計
連結テーブルですよね。
連結テーブルなら、入力して Shift+Enter とか レコードセレクタクリックとか、最終フィールドでEnterキーとか、・・・様々な保存アクションでレコード保存(あるいは新規登録)できます。
VBAなら、DoCmd.RunCommand acCmdSaveRecordで可能です。

わさわざ、別にDAO.Recordsetを開いて .AddNewする必要はありません。
今回のエラーが回避できたとしても、
フォームで入力中のレコードと別に新規レコードが生成されて追加されてしまい二重登録になってしまいます。

下記のコードで十分です。

vba

1Private Sub btn登録_Click() 2 DoCmd.RunCommand acCmdSaveRecord 3 MsgBox (Me.従業員名 & "さんの登録が完了しました。") 4End Sub

saziさんも追記されてますが、もし、一つのパスワードを複数人で共有する運用になっているとしたら、
現状のテーブル設計でいいですが、パスワードの登録をここでするのはおかしいです。

投稿2020/08/13 05:41

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

VBA

1.Fields("従業員ID") = Me.従業員ID

新規なのでこの従業員IDは新たな番号でないと駄目なのですが、テーブルの定義上オートナンバーなのではないでしょうか?

そうであれば、このステップをコメントアウトすれば自動で番号が振られキー重複にはならないと思います。

尚、メッセージが出力された場合、ctrl+breakでエラーが発生してる箇所が表示されますので、原因特定に役立つと思います。

追記

T_パスワードもキーに関しては同様ですけど、テーブルのリレーションの関係から、複数人が同じパスワードを使用するなら、このタイミングでのT_パスワードへ登録するのではなく参照だと思いますけど。

投稿2020/08/13 04:27

編集2020/08/13 05:12
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーメッセージの意味としては、T_従業員またはT_パスワードいずれか(もしくは両方)のテーブルでプライマリキー(T_従業員なら「従業員ID」、T_パスワードなら「パスワードID」)が重複しているのでレコードを登録できないと言われています。

既に登録済のプライマリーキーと登録しようとしてエラーとなる従業員IDまたはパスワードIDが同じかどうか、Debug.Print等で確認しましょう。

、、、と待てよ、どちらもオートナンバー型なのにフォーム入力値を入れるというのも変ですね。

投稿2020/08/13 04:14

編集2020/08/13 04:16
DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問