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

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

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

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

Access

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

データベース

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

Q&A

解決済

2回答

1537閲覧

Access フィールドの連鎖更新について

access

総合スコア9

VBA

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

Access

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

データベース

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

0グッド

0クリップ

投稿2020/06/28 07:11

Access のフィールドの連鎖更新について質問させて頂きます。
以下のような2つのテーブルを用意しました。

T_社員マスタ
社員コード(主キー)
社員名
部署名
課名

T_ヒヤリハット
社員コード
社員名
部署名
課名
ヒヤリ事項
対策

T_社員マスタとT_ヒヤリハットは社員コードで1:多 の関係でリレーションを組んでおり、連鎖更新、連鎖削除も設定しております。

Access VBA で、T_社員マスタの特定の社員の部署名と課名をupdate文で(エラーなく)更新しました。

strSQL = "Update T社員マスタ SET 部署名 = """ & busho & """ , 課名 = """ & kamei & """ where 氏名コード = '" & shimei_code & "';"

ところが、T_ヒヤリハットの部署名、課名が更新されませんでした。
「連鎖更新」とはこういう事ではないのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ところが、T_ヒヤリハットの部署名、課名が更新されませんでした。
「連鎖更新」とはこういう事ではないのでしょうか。

そういう事ではありません。
更新されるのはあくまで連鎖している項目(この場合は社員コード)です。

正規化の観点からは、社員マスタに登録されている内容は参照すべきもので、他のテーブルに項目として持つべきではありません。

正規化されているテーブル設計であれば、処理は社員マスタを参照するように作られることになるので、問題は生じません。

ただ、「T_ヒヤリハット」に部署名があるのは設計として正しく、それを連鎖によって更新するのは、駄目だと思います。
何故なら、社員が異動した場合に更新してしまうとそのヒヤリ事項は新部署での事項になってしまいますから。

投稿2020/06/28 07:51

sazi

総合スコア25327

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

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

access

2020/06/28 08:06

ご回答有難うございます。 そういうことだったのですか! ということは、ある社員が異動した場合、 T_社員マスタの部署名、課名を更新すると共に、T_ヒヤリハットの部署名、課名も変更しなければならないということですね! >>何故なら、社員が異動した場合に更新してしまうとそのヒヤリ事項は新部署での事項になってしまいますから。 こちらは、社員が異動しても持ち越して良い運用になっております。 こちらの事情で申し訳ございません。 大変助かりました、有難うございます。
sazi

2020/06/28 08:16 編集

最新の情報は社員マスタを参照するとして、ヒヤリハットの部署はそのまま残し、発生時点の部署とする方が両方を兼ねる事が出来て良いのではないでしょうか。
sazi

2020/06/28 08:23

ヒヤリハットは個人より業務に関連する方が強いので、発生した時点の部署は残しておいた方が良いと思います。 データが残っていれば、処理で対応できますが、データが残っていなければどうしようもありませんから。
access

2020/06/28 08:27

確かに、ヒヤリ事項を人依存で持ち越すのはおかしいですよね。 一度、上司に相談してみます。 本当は部署マスタ、課マスタなども作成して、1対多の1側は参照するだけにするのがDBの理想的な形なのでしょうか。
sazi

2020/06/28 08:32

社員コードとは別にシステムで管理する不変な番号(例えばオートナンバー)をプライマリーキーにすれば、そもそも連鎖更新は不要になります。 ただ、扱う人の技量にもよりますので、お薦めするという訳ではありませんけれど。
sazi

2020/06/28 09:52 編集

組織の情報をどのように保持するかはシステムの規模や要件によりますので、理想と現実は異なります。 人・組織・所属をそれぞれで、履歴管理まで行うというのが理想になりますけど、扱うにはそれなりのプログラムが必要になりますので。
access

2020/06/28 13:06

有難うございます。 まだまだ勉強が必要なようです。 できる範囲で学習してゆきたいと思います。
access

2020/06/28 15:30

>>社員コードとは別にシステムで管理する不変な番号(例えばオートナンバー)をプライマリーキーにすれば、そもそも連鎖更新は不要になります。 T_ヒヤリハットに連番(オートナンバー型)をつけてみて試したところ、SQLでの操作が非常にしやすくなりました。有難うございます。 ちょっと疑問が浮かびました。このAccessファイルはテーブルのみのファイルAとすべてを込みにしたファイルBに分けて、ファイルAとBのテーブルをリンクで繋げて運用しようと考えております。 ユーザーはファイルBをローカルに落として、フォームを通してT_ヒヤリハットを更新していく手順です。 ただ、T_ヒヤリハットに新しいヒヤリ事項を登録するとき、大勢で同時に登録をしてしまうと、同じ連番(オートナンバー型)でINSERTされてしまうのではないでしょうか。 INSERTするときの連番は、Dmax関数+1で設定しようと考えてます。
sazi

2020/06/28 17:19

オートナンバーの方が番号の被りはありません。 DBの自動連番がロールバックしても戻らない理由 http://cs.hatenablog.jp/entry/2014/03/14/103358 max()+1で行うなら、逆にトランザクション制御を行う必要があります。
sazi

2020/06/29 00:12 編集

連鎖更新が不要になるというのは、一意キーとして不変な番号を採用した場合(変更が無い)という意味なので、誤解なきよう。 サロゲートキーならば不要で、ナチュラルキーなら必要という事です。
access

2020/06/29 13:38

>>max()+1で行うなら、逆にトランザクション制御を行う必要があります。 リンク先読ませて頂きました。 今日は作業ができなかったので明日試してみます。 有難うございます。
guest

0

「[社員コード]で1対多を組んでいる」ので連鎖更新は[社員コード]にしか反応しません。
[部署名][課名]は連鎖更新を組んでいません。
そのようにしたい場合は[部署名][課名]もリレーションを組んでください。
…と理屈上はなるのですが普通はそのようなことはしません。
T_ヒヤリハットのテーブルは社員コードのみをもち、[社員名][部署名][課名]は
selectの際にjoinでくっつけてT_社員マスタから持ってくるのが一般的です。

投稿2020/06/28 07:56

sousuke

総合スコア3830

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

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

access

2020/06/28 08:46

お世話になります。 大きな勘違いをしておりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問