Accessでメイン、サブフォームへの入力について

このQ&Aのポイント
  • accessほぼ初心者です。取引先の会社情報を管理するために、access2007で顧客管理を作成しています。
  • 会社登録フォームの環境は、会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして支社ごとに分けて入力できる登録フォームを作成しました。
  • 本社テーブルの会社名が未入力ならば、サブフォームの入力操作でレコードを追加しないようにしたいと考えています。
回答を見る
  • ベストアンサー

Accessでメイン、サブフォームへの入力について

accessほぼ初心者です。 取引先の会社情報を管理するために、access2007で顧客管理を作成しています。現在、取引先本社情報とその支店情報を登録するフォーム「会社登録フォーム」を作成していますが、次のようなことで困っています。 <問題としていること>: 「サブフォーム」をクリックした瞬間に、テーブルにレコードが追加されてしまう。 <改善したいこと>: 本社テーブルの会社名が未入力ならば、上記の操作でレコードを追加しない。(会社名に主キーは設定していません。) <会社登録フォームの環境>: 会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして支社ごとに分けて入力できる登録フォームを作成しました。本社テーブルの会社IDを主キーに、支店テーブルの支店IDを主キーにしてリレーションシップを設定しています。 <会社情報の入力に関して行っていること>: ・メインフォームに「新規」「更新」「削除」ボタンを設置。 ・新規ボタンでメインフォームの「会社ID」に自動採番。 ・会社(本社)名がないと困るので、未入力の状態で「新規」「更新」及び「サブフォーム」をクリックされた際に「会社名が未入力です。」のメッセージを表示され「OK」で元の状態にもどります。 ・会社(本社)名が入力済みならば、「更新」ボタンで、メッセージ「OK」「キャンセル」が表示され、「OK」ならば本社テーブルにレコードが追加され「キャンセル」ならばそのままの状態になります。 上記の<問題としていること>の補足ですが、新規ボタンで新規登録フォームに会社IDが自動採番(末番)されるのですが、「会社名」を入力せず、先にサブフォームの支店情報から(タブ名「支店(1)」)入力しようとした場合、「会社名が未入力です。」のメッセージを表示されますが、この時点で本社テーブルに、この採番でレコードが追加されてしまいます。入力者がそのまま会社名(本社)から入力するも、途中でキャンセルした場合、再度新規登録をする際、登録フォームの自動採番がキャンセルされた採番の次の番号になります。 キャンセルされた会社情報空白のレコードができるということになります。これを回避したいのです。 出来るだけ詳細をとおもい説明が長くなりましたが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

現状はマクロですか、VBAですか。 VBAならば、下記のようになります。 メインフォームのレコード移動の「イベントプロシージャ」に下記のように記述します。 Private Sub Form_Current() If Me.NewRecord Then Me.サブフォームコントロール名.Enabled = False Else Me.サブフォームコントロール名.Enabled = True End If End Sub 会社名の更新後処理で、 Private Sub 会社名_AfterUpdate() If IsNull(Me.会社名) Then Me.サブフォームコントロール名.Enabled = False Else Me.サブフォームコントロール名.Enabled = True End If End Sub マクロも同じ考え方でできます。

boos-ka
質問者

お礼

hatena1989さんへ 早くのご対応ありがとうございます。 結果的に大変満足しています。 VBAでしたので、さっそくご教授いただいたコードを反映いたしました。 少し戸惑いましたが、何とかできました。 「会社名」が未入力では「支店情報」の入力ができなくなったことで、「会社名」が必須となり 情報入力者に、「本社情報」入力後「支店情報」の入力という流れに誘導出来たように感じます。 また、新規登録、更新、削除といった一連の動作性も良くなったように思います。 ご相談してから、こんなに早く解決するとは思いもよりませんでした。 大変ありがとうございました。

その他の回答 (1)

回答No.1

メイン/サブフォーム形式の場合、サブフォームへ移動する時点で、メインフォームのレコードは保存されるというのがAccessの仕様です。 メインのレコードが存在しないのに、サブのレコードから先に入力するというのは、リレーショナルデータベースの参照整合性に反するので当然の仕様です。 新規レコードへ移動した直後は、サブフォームの「使用可能」は「いいえ」にしておいて、「会社名」を入力したら、サブフォームの「使用可能」を「はい」にするような設計にしておけばどうでしょうか。 どうしてもサブフォームから入力する場合にも対応したいということなら、メインフォームは非連結、サブフォームはワークテーブルと連結、テーブルへの書き込み、読み込みはすべてVBAで制御するという設計にすれば可能ですが、上級レベルのスキルが必要です。

boos-ka
質問者

お礼

hatena1989さん さっそくのご回答大変ありがとうございます。 "accessの仕様上"と理解させていただき、根本的に分かっていない初心者の私としましては、大変ありがたく、また肩の荷がおりた感じです。 ついては、大変ぶしつけで恐縮ですが、ご回答の中で 「新規レコードへ移動した直後は、サブフォームの「使用可能」は「いいえ」にしておいて、「会社名」を入力したら、サブフォームの「使用可能」を「はい」にするような設計にしておけばどうでしょうか。」 とありましたが、こちらの設計方法なども教えていただければありがたいのですが、よろしくお願いいたします。

関連するQ&A

  • access検索フォームからメイン、サブフォームへ

    access初心者です。 先日、「メイン、サブフォームの入力」について質問した者です。 取引先の会社情報を管理するために、access2007で顧客管理を作成しています。 現在、取引先本社情報とその支店情報を新規登録及び既存顧客を編集するフォーム「会社登録フォーム」と「会社検索フォーム」を主にVBAで作成しています。 <実現したいこと>: 既存顧客を編集する場合は「会社検索フォーム」から抽出し、「選択」ボタンで会社情報を「会社登録フォーム」に呼び出し、本社及びその支店情報を編集する。 <困っていること>: 「会社検索フォーム」から顧客を選択後、「会社登録フォーム」では、支店情報は変わりますが、本社情報が変わりません。 (メッセージ:「リレーションシップが設定されたレコードがテーブル'支店テーブル'にあるので、 レコードの削除や変更を行うことはできません。」というメッセージがでます。) <会社登録フォームの環境>: 会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして、支店ごとに分けて入力できる登録フォームを作成しています。 本社テーブルの会社IDを主キーに、支店テーブルの支店IDを主キーにしてリレーションシップを設定し、クエリ「Q_本社支店」というテーブルを作成しています。 <会社検索フォームの環境>: ・「Q_本社支店」テーブルを元に「会社検索フォーム」を作成しています。 ・「会社名」「支店名」等で検索し、データシートで表示します。 ・ 抽出されたレコードの「選択」ボタンで、「会社ID」を「会社登録フォーム」の本社情報の「会社ID」に代入します。 色々調べてやってはみたのですが、上手くいきません。 行き詰まり感があり、困っております。 ご教授のほどよろしくお願いいたします。

  • アクセスのサブフォームについて。

    アクセスのすでに作成済みのフォーム(ID、患者名、依頼日、検体名などあり)に追加したい項目(抗生剤の感受性検査結果)があるのですが、やはり初めから作り直したほうがよいのでしょうか?それともサブフォームで表示したほうがよいのでしょうか?できればサブフォームで進めていきたいのですが、そうするとあるレコードの入力画面を開いた時に同じレコードについてのサブフォーム画面が自動的に開くということは可能でしょうか?今しているのは、サブフォームに毎回IDと依頼日と検体名を入力して呼び出しています。めんどうなので他によい方法があれば教えていただけないでしょうか?よろしくお願いします。

  • Accessのメインフォームとサブフォームの使い方について

    Accessにてメインフォーム(単票形式)+サブフォーム(帳票形式)を使って進捗管理をするデータベースを作っており、新規にメインフォームで入力し、サブフォームで入力したデータを表示させてます。 サブフォームで更新したいレコードをクリックしたときにメインフォームでそのレコードを表示させるにはどのようにすればよろしいのでしょうか?

  • Access メインフォーム サブフォームにて

    お世話になります。 Accessにて メインフォームにコマンドボタンを置いて、クリックするとサブフォームのレコードが 次に行くようにしたいのですが、 コマンドボタン クリック Forms![メインフォーム]![サブフォーム名].Form!フィールド名.SetFocus DoCmd.GoToRecord , , acNext メインフォームとサブフォームのレコードが次に行ってしまいます。 サブフォームだけ次のレコードに行くには、どのようにすれば良いのでしょうか。 分かる方教えて下さい。 宜しくお願いします。

  • ACCESS2003 サブフォームのデータ

    こんにちは。宜しくお願い致します。 ACCESS2003でDBを作成しています。 メインフォームの中にサブフォームを作っています。 それぞれのID(オートナンバー)をリレーションシップとして設定し、連動しています。 メインフォームにデータを追加する際、サブフォームにデータを入力せずに、 次のメインフォームにデータを入れた場合、 サブフォームのオートナンバーが働かず、のちのちデータを入れた際にIDが違うため情報がずれてしまいます。 例えば、 メインフォームのID1~9のサブフォームには何も書き込まずメインフォームにだけデータを入力します。 その後、メインフォームのID10にあるサブフォームにデータを書き込むと、立ち上げなおしたときに、そのサブフォームへの入力したデータがID1のデータとして出てきてしまいます。 恐らく簡単なことだとは思うのですが、なにぶん初心者なものでさっぱり分かりません。 お分かりになる方、是非ともご教授お願いいたします。

  • Access2000でメインサブフォーム

    テーブル1 商品ID 数値型(主キー) 商品名 テキスト型 ------------------ テーブル2 売上ID  数値型(主キー) 商品ID  数値型 月日   日付型 売上個数 数値型 --------------------- 以上のようなテーブルがあり、テーブル1を「メイン」テーブル2を「サブ」のメインサブフォームを作成しました。 しかし、「サブ」のデータが多いため、さらに、サブフォームの日付フィールドを使い、抽出をしたいのですが、方法がわかりません。(例えば、9/1以上9/10以下のような抽出) いろいろやってみは見たのですが、思うようにできません。メインサブフォームでさらにサブフォームのデータを抽出するということは無理なのでしょうか?

  • ACCESSのサブフォーム

    ACCESSのサブフォームで、レコード表示について教えてください。 添付のサブフォームの一番左のコンボボックスに値を入力もしくは選択すると、未入力のレコードが下に1行分増えます。 (その他項目は連動して表示されます) サブフォームは帳票フォームを選択しているのですが、一般的には帳票フォームを選択した場合、レコードの数分だけ表示されると思うのですが、これは1レコードづつ増えていきます。 このサブフォームを作った人がもういないので、どうやって作ったのかが分かりません。 どなたか分かる人がいれば教えて頂けますでしょうか。 必要な情報があれば、調べて回答します。

  • Accessのサブフォーム

    教えてください。 フォームの中にサブフォームを作っているのですが(入力用の)、 サブフォーム内のテキストボックスは、1件目のデータと新規レコード が表示されています。 この新規レコードのテキストボックスを表示しない方法はありますか? 2件目以降のデータ(新規レコード)を入力する際は「追加」の コマンドボタンを使用して、その都度、新規レコードを表示させたい のです。 よろしくお願いします。

  • [Access]複数のサブフォームで1つのテーブル

    1つのフォームに複数のサブフォーム(sb1,sb2,sb3)があります。 そのサブフォームは1つの同じテーブルを参照しています。 そこで、sb1, sb2, sb3にデータを入力すると 全て別のレコードに書き込まれます。 これを1つのレコードに書き込む方法はないでしょうか? 簡単に、 sb1 には個人情報 sb2 には会社情報 sb3 にはメールアドレス のようになっています。 これが レコード1 個人情報 レコード2        会社情報 レコード3               メールアドレス となってしまいます。 これを レコード1 個人情報 会社情報 メールアドレス とするにはどうしたらよいでしょうか?? よろしくお願いします。

  • Access アクセス VBA レコード追加

    Access フォームからのレコードの追加方法を教えてください。 テーブル1 ・ID(主キー) ・窓口 ・コストセンター ---------- テーブル2 ・コストセンター(主キー) ・目的 ---------- リレーションシップ テーブル1のコストセンターとテーブル2のコストセンターを一対多 ---------- メインのフォームに”ID”を入力したときにテーブル1に一致するレコードがない場合、新規登録用のフォームが表示されるようになっています。 新規登録用のフォームにレコードを入力してもテーブルに反映されません。 新規登録用のフォームは下記のように作成しています。 また、フォームに”コストセンター”を入力したときに入力したレコードがテーブル2にあっても自動で”目的”が表示されません。 メインフォームにはサブフォームで各テーブルが表示されています。 フォーム ・ID(初期値•••メインで入力したID) ・窓口 ・コストセンター ・目的 ・コストセンター(非表示) 上から順に ・テーブル1 ・テーブル1 ・テーブル2 ・テーブル2 ・テーブル1