Access学習メモ 3-8. コンボボックス乗り越えたい③

Access学習メモ 3-8. コンボボックス乗り越えたい③

コンテンツ
学び
【例】
図書館の利用者登録フォーム
学習メモ3-7では利用者の初回利用登録日に応じ、利用期限を算出した。
しかし実際には運転免許等と同様、利用者の生年月日を基準に「初回登録年の○年後の誕生日まで」と定めているケースもある。
実務上、個人情報が掲載されたテーブルと、その他の登録情報テーブルとは分けて管理したほうが望ましいケースもある。

そこで、「利用者マスタ」テーブルの内、個人情報を利用者マスタに残し、図書館利用情報を示す「登録日」と「利用期限」を「図書利用券マスタ」として利用者マスタから切り離してみることを思いついた。

両テーブルはクエリで結合させ、利用期限を算出し、フォームのレコードソースとすれば問題ないと考えた。
利用期限は登録年の3年後の誕生日まで
利用期限: DateSerial(Year([登録日]) + 3, Month([誕生日]), Day([誕生日]))

しかし、さすがはガンコ爺Access(言い方!)
テーブルを切り分けた以外はゆうべとまったく同じ設計なのに、微動だにしないではないか!!
わたし遅くとも1時には寝たいのよ(੭ु(;・∀・))੭ु⁾⁾

「連結列」:
デフォルトは1だが、ソースであるクエリ構成上「図書利用券ID」が1列目。
利用者IDの列を基準とする場合、2列目なので「2」とする必要があったみたい。

「column関数」:
レコードソースが変更され列数が変わったため、調整する必要がある。

利用者名∇
=[cmb利用者].Column(2)

誕生日∇
=[cmb利用者].Column(3)

住所∇
=[cmb利用者].Column(4)

登録日∇
=[cmb利用者].Column(5)

利用期限∇
=[cmb利用者].Column(6)


コンボを「上書き編集用」とする場合は、より注意が必要
前回の「Me!利用者名 = Me!cmb利用者.Column(*)」という式は、Accessに対して「画面に出ている人の名前を、コンボボックスで選んだ人の名前に書き換えなさい」という命令。
テーブルがひとつだった時は、名前や住所を書き換えてもAccessは文句を言わなかった。
今回、テーブルを「利用者マスタ」と「図書利用券マスタ」に分けたことで、相互リレーションの関係が生じた。 
その状況でコンボボックスを動かす(=「Me!利用者ID = ... 」と命令が下る)と、Accessはそれを「今いる行のデータが、無理やり別の人のデータで上書きされる不整合」と察知して拒否る。

DoCmd.SearchForRecordの必要性
コンボボックスのプルダウン切り替えは「今いる行はそのままに、画面の表示だけを別の人の行(レコード)まで移動させる」行為。

Private Sub cmb利用者_AfterUpdate()
DoCmd.SearchForRecord , , acFirst, "[利用者ID] = '" & Me!cmb利用者 & "'"
End Sub

あと、サブフォームがぶっ壊れたが時間切れ&燃料切れ...また明日がんばろう
暇もてあましてなきゃこんなのやってらんない...(だから、言い方!)


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す