• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:主キーによるフォームのリレーションについて。)

主キーによるフォームのリレーションについて

このQ&Aのポイント
  • ACCESS2007で業務の予約・カルテシステムを構築中。予約入力フォームから業務マスターテーブルに予約情報を入力し、カルテ作成ボタンを押すと各業務のカルテ入力フォームが開く。しかし、カルテフォームには業務マスターテーブルのデータも表示されてしまい、重複してしまう現象が発生している。
  • 業務マスターテーブルと業務カルテテーブルを分けてデータを保存している。予約入力フォームでカルテ作成ボタンを押すと、カルテフォームの業務IDにOpenArgsの業務IDを渡している。しかし、業務マスターテーブルのデータもカルテフォームに表示され、重複してしまう現象が生じている。
  • カルテフォームに表示される業務マスターテーブルのデータと業務IDについて問題が発生している。業務マスターテーブルのデータが重複してしまい、分散してしまう現象が発生している。

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

  • ベストアンサー
  • tag1701
  • ベストアンサー率54% (67/123)
回答No.3

neve33609さん こんばんは。 まずはごめんなさい。参照整合性(連鎖更新・連鎖削除)は オートナンバーでは出来ないようでした。(オートナンバーの変更は出来ないので 当然でしたね。調査不足でした) もし参照整合にするならお互い数値型(長整数)等で統一すれば作成出来ます。 しかし、実際このままで作ると新規予約受付フォームで仮登録すると エラーが出ました。(T_業務カルテに連鎖するデータが作成されない為です。) もし別フォームで入力を行うのであれば、 オートナンバー使わず都度番号手動でふるか、もしくは自動カウントアップするVBA組んで行うしかないようです。 お役に立てず申し訳ありません。m(_ _)m

neve33609
質問者

お礼

いろいろアドバイスを頂ありがとうございました。 一度テーブルの設計から見直してみます。

neve33609
質問者

補足

こんばんは。 わざわざお試しいただいてありがとうございます。 >ラーが出ました。(T_業務カルテに連鎖するデータが作成されない為です。) そうですね。そのエラーが出てしまいます。 >お役に立てず申し訳ありません。m(_ _)m いえいえ十分参考になりました、いろいろ試行錯誤してみます。 ありがとうございました。

その他の回答 (2)

  • tag1701
  • ベストアンサー率54% (67/123)
回答No.2

neve33609さん こんばんは。 >参照整合性ができない+カルテフォームの方は、T業務Aカルテ_業務IDを 使っています。 やはりここが原因と思います。 質問を見直してみたんですが、新規予約フォームのID1つに対して カルテはひとつしか発生しないんですよね?(カルテの中には複数の、例えば検査項目とかはありそうですが) で、推測としてカルテフォームの主キーが現在カルテID(オートNo) を主キーとして設定されているのではないかと思うのですが、如何でしょうか? もしそうなら主キーをT_業務○カルテの業務IDに変更して、リレーション を設定してみてください。 又予約受付スタッフ入力は予約フォームの際に入力しない理由が 分かりません。(業務○IDテーブルには無い項目ですので、あえて 別フォームで入れなくても。。こういう入力はどちらのテーブルにも 同じ入力エリアが存在し、参照整合性が成り立っていて同時にデータを セットする場合に行うやり方と思うのですが) >業務カルテ内のものを業務ID参照 などと呼び名を変えておいた方がよさそうでしょうか? --そうですね。今後追加のレポートやクエリを作成する際に 作成者が混同しないようにしておくには、別名が好ましいと思います。 ながなが書いてしまいましたが、まずは予約受付スタッフ入力を 新規入力フォームで入れ込むようにすれば片付きそうです。 次に今後の展開を考え前述の主キーの変更とリレーション作成が うまくいく様再作成して見てください。

neve33609
質問者

補足

たびたびのご回答ありがとうございます。 >質問を見直してみたんですが、新規予約フォームのID1つに対してカルテはひとつしか 発生しないんですよね? はい、1つの予約のIDに対してカルテはのIDはひとつのみです。 >推測としてカルテフォームの主キーが現在カルテID(オートNo)を主キーとして >設定されているのではないかと思うのですが、如何でしょうか? そうですね。いろいろ試してみたのですが、現状おっしゃるような構成になっております。 >予約受付スタッフ入力は予約フォームの際に入力しない理由が分かりません。 >(業務○IDテーブルには無い項目ですので、あえて別フォームで入れなくても。。 そうですね。本当はもっといろいな項目が実用上あるのですが質問の際にわかりやすいように 極端に減らしました。実作業では、まず予約フォームで業務のカテゴリーのみ決めて、選んだ カテゴリーのカルテを新規で開き、データを入力、しかしそのカルテのデータの内の1割ぐらい はT_業務AカルテではなくT_業務マスターに格納したいと考えております。 理由は、カルテを開くまでもなく、すべての種類のカルテに共通して必要な基本的な予約情報( 業務のカテゴリー、顧客名、予約日時、担当スタッフ簡単な予約内容など)はT_業務マスターに 格納して、すべての業務を混合で時系列でリストアップするためです。 本当はT_業務マスターのようなものを使わず、すべてカルテ側のテーブルに格納して、クエリー などですべての業務カテゴリー混合で抽出できるのかも知れませんがちょっとクエリーが苦手で、 さけておりました。 アドバイスいただいた内容を参考に、アドバイスをいただきやすいよう以下のように最低限の構成 で作りなおしてみました、前回とフィールド、テーブル名など違うかも知れませんがご了承ください。 最小限の構成のため、実務上のことは無視し、業務カテゴリー等はとりあえず考えず以下のことを 動作させることを考えております。 【T_業務マスター】☆=主キー ☆業務ID(オートナンバー) ・予約日時(日時型 ・顧客名(現状テキスト型) ・項目A(テキスト型) 【T_カルテ】 ☆業務ID参照(数値型) ・カルテID(オートナンバー) ・項目B(テキスト型) 【F_新規予約登録】 ・T_業務マスター/業務ID ・T_業務マスター/予約日時 ・コマンドボタン(クリック時 DoCmd.OpenFormでカルテIDを開く、OpenArgsにはMe.業務IDを設定) 【F_カルテ】 ・T_カルテ/カルテID ・T_カルテ/業務ID参照(規定値でOpenArgsからT_業務マスター/業務IDを取得) ・T_業務マスター/予約日時(すでに前フォームで入力済みなので、何とかして表示させる・・・) ・T_業務マスター/顧客名 ・T_業務マスター/項目A ・T_カルテ/項目B(実際にはこのT_カルテ/項目C.D.E......とカルテデータの大半がこの部分です) 【F_予約リスト】 レコードソースを【T_カルテ】で日時順で表示 という構成ですが、やはりこの構成では「T_業務マスター/業務ID」と「T_カルテ/業務ID参照」 では参照整合性ではリレーションが組めませんし、、、根本的にリレーションが良く分かっていない というのがわかりました。 この最低限の構成で動作してくれればあとは何とかなりそうなんですが、、、 書籍を読んでサンプルなどを読み進めて同じようにやっていく時はわかったような感じがするんですが、 いざ自分で実用的にシステムを考えていくと、全然わかっていないのに痛感させられました。 トンチンカンな質問なのかもしれませんがよろしくお願いいたします。

  • tag1701
  • ベストアンサー率54% (67/123)
回答No.1

業務Aカルテフォームに使用するテーブルの T_業務マスター_業務IDとT_業務Aカルテ_業務IDはりレーション 組んでいますでしょうか?(一対一) 雰囲気的にはフォームの業務IDはT_業務Aカルテ_業務IDを使用し 入力していますが、T_業務マスター_業務IDとリレーションされてないのでT_業務マスターとしては新規レコードと言う事で予約受付スタッフ 列にデータが追加されたように見受けられます。

neve33609
質問者

補足

tag1701さん、コメントありがとうございます。 リレーションの件ですが、試してみたところ参照整合性を付けてのリレーションが組めませんでした。 参照整合性のチェックを外せばリレーションを組めましたので試してみましたが結果は変わらずでした。 >入力していますが、T_業務マスター_業務IDとリレーションされてないのでT_業務マスターとしては >新規レコードと言う事で予約受付スタッフ列にデータが追加されたように見受けられます。 やはりそういうことですか。。。。 >雰囲気的にはフォームの業務IDはT_業務Aカルテ_業務IDを使用し入力していますが 現状では、新規予約フォームではT_業務マスター_業務IDをしようしていて、カルテフォームの方は、 T業務Aカルテ_業務IDを使っています。 T業務マスター内のものを業務ID 業務カルテ内のものを業務ID参照 などと呼び名を変えておいた方がよさそうでしょうか? アドバイスいただければと思います。

関連するQ&A

専門家に質問してみよう