Access初心者です。
Webシステムに入力するデータを収集するためにAccessを使おうとしております。
そんため、次ぎのような構成のテーブル・フォームを作っています。
メインテーブル・サブテーブル所属・サブテーブル役職
メインフォーム・サブフォーム所属追加用・サブフォーム役職追加用
メインテーブルから、サブフォーム呼び出しボタンを作り、そのボタンをお酢と追加用サブフォームが立ち上がり、所属や役職を追加修正する形にしています。
このサブテーブルの変更を、メインフォームにある複数のコントロール(所属1、所属2,所属3など)のコンボリストに、”自動的に”かつ”すぐに”反映させたいのですが、出来ていません。
以下、私のトライしたことです。
(1)メインテーブルとサブテーブルとのリレーションを作り、連鎖更新をONに。この形で、サブテーブルに変更を加えると、メインフォーム上のいくつかのコンボリストは更新されるのですが、全てのコンボリストは更新されません。。。。
(2)サブテーブルの更新をした後に、F9ボタンを押して更新する。全てのコンボボックスでアップデートされる。
(3)メインフォームに「Requeryマクロ」を作り、新しいRequeryボタンに割り当てます。サブテーブルの更新をした後に、「Requeryボタン」を押す。全てのコンボボックスでアップデートされる。
(4)メインフォームのいろいろなイベントに、Requeryマクロを割り付けるも上手くいかず(全てのイベントは試していません)
どうしたら、サブテーブルを更新後、自動かつ即時に、メインフォームの全てのコンボボックスをアップデートできるのでしょうか?
ヒントや方法など教えてください。よろしくお願い致します。
作業手順がよくわかりません。
「Requeryマクロ」とはリボンの[作成]タブにある[マクロ]メニューから作成したマクロですか?
イベントとは、ユーザーの操作に対応して発生・実行されるものです。
と、Requeryボタンのクリック時イベントが発生します。
今回やりたいことは「サブテーブルを更新後に何かしたい」なので、「サブテーブルを更新したと判断できる作業」のイベントにマクロを設定する必要があります。
操作中のフォーム「サブフォームのイベントにマクロを設定する」と良いでしょう。
具体的にはサブフォームの更新後処理が「”自動的に”かつ”すぐに”」に合うかと思います。
”すぐに”を本当に「すぐに」にしたいのであればサブフォーム上の個別のコントロール(所属や役職)それぞれの更新後処理イベントを使うという方法もあります。
逆に、サブフォームで作業したあと、メインフォームで作業する前にサブフォームは閉じるという手順があるのであれば、サブフォームの閉じる時イベントでもいいのではないかと思います。
「サブフォーム」という言葉はACCESSではあるフォームの中に組み込まれたコントロールとしてのフォームを指す言葉として使われます。
誤解を招きやすいので「入力用フォーム」としたり、あるいは「AフォームとBフォームを作ってAフォームからBフォームを呼び出しています」等の前置きから質問すると良いです。
アドバイスありがとうございます。
初心者なので、間違った語句の使い方はご容赦を。
ご指摘のとおり
テーブル: メインテーブル、所属テーブル、役職テーブル
フォーム:メインフォーム、所属追加フォーム、役職追加フォーム
の
アドバイスありがとうございます。
初心者なので、間違った語句の使い方等はご容赦を。
ご指摘のとおり
テーブル: メインテーブル、所属テーブル、役職テーブル
フォーム:メインフォーム、所属追加フォーム、役職追加フォーム
の構成です。
メインフォーム中の、所属と役職を選択するコンボボックスがそれぞれ5個あり、それぞれ所属テーブルと役職テーブルを参照する形(Lookup)にしてあります。
メインフォームから、所属追加フォームと役職追加フォームを呼び出して、所属や役職を追加し、その追加修正をメインフォームの合計10個の所属・役職コンボボックスに即時かつ自動的に反映させたいのです。
所属追加フォームや役職追加フォームには、「レコードセーブボタン」、「フォームを閉じるボタン」を配してあります。アドバイス頂いたように、この2つのボタンのon-clickイベントマクロにRequery(コントロールなし)で追加するのですが、全くメインフォームには反映されない、あるいは1つのコンボボックスだけ反映されるなど、不思議な挙動をします。
この他にAfter UpdateイベントマクロにRequery(このトロールなし)を加えても同じ。追加フォーム上に「Requeryボタン」を作ってon-clickイベントでRequeryをさせても、全く同じ挙動。VBAコードとしてon-clikイベントでMe.Requeryなども試しましたが反映されず。
唯一、所属追加フォームや役職追加フォームの変更を反映させることができる動作は
(1)メインフォームにおいて、Shift-F9
(2)メインフォームにおいてRequeryを行う。
この他、Relationshipで連鎖更新もONにしてあるのですが、Joinタイプを変えるとか、私の思いつく範囲でいろいろ試してみたのですが、私の知識・経験では(1)(2)でしか実現できません。
しかし、この(1)(2)を行うと、現在入力しているレコードから、一番先頭のレコードに飛びます。User Unfriendlyも甚だしいので、なんとか、Macroを使ってCurrentRecord番号をゲットして、Requery後にGoToRecordで元のレコードに飛ばそうと思っているのですが、マクロでCurrentRecordのゲットの書式が分かりません。。。。
マクロだからeasyかと思いましたが、VBAとは違って、[TempVars]![MyVal]のフォーマットだし、かといってMacroの書式について初心者向けの資料もないし。。。。
どうしてこんな簡単なことが、ここまで難しいのか。。。。
やっぱりAccessは使うべきではないなと-と感じています。FileMakerにしておけば良かった。でも関係者にFileMakerを買わせる負担を掛ける訳にもいかず。。。。
Accessのフォーラムにこんなこと書くのは失礼かもしれませんが、Accessって基本思想自体が間違っていると感じます。
(2)を使って解決しました。
SetTempVar
Nme
(2)を使って解決しました。
SetTempVar
Name CurrentRecordNo
= [Forms]![Frm_Name].[CurrentRecord]
Requery
GoToRecord
Record GoTo
Offset =[TempVars]![CurrentRecordNo]
長々と回答を考えていたら解決のレスが・・・
VBAコードの一例を載せておきます。
フォーム自身を更新せずに所属や役職のコントールをそれぞれ更新すればスクロールは発生しません。
フォーマットについてはVBAでも変わりませんね。
資料の有無でいえば圧倒的なのはそうですねぇ。
マクロだからeasyというよりは簡易機能ならマクロでもできるって感じですね。