• ベストアンサー

Access2002 フォーム間のデータ受け渡し後の動作制御方法

何度もすみません。 簡単な事なのかもしれませんが、自己解決できなかったので、質問させていただきます。 あるフォーム(基本情報閲覧)から、コマンドボタンで別の入力用フォームを呼び出しています。 その際、「ID」というフィールドの文字列を受け渡し、入力用フォームの「ID」に表示させています。 「ID」はテーブル:基本情報の一部であり、そのテーブルには「ID」と「名前」があります。 質問したいのは、入力用フォームにデータが受け渡されたときに、「ID」と共に「名前」も表示させたいのです。 もちろん、どちらのフォームも同じテーブルを裏に持っていますので、簡単にフィルタをかけて表示してくれると思っていましたが、「ID」フィールドに文字列は入るものの、「名前」は自動的には表示されず、他の入力項目を選択(コンボボックスで)したときに、なぜか「名前」が思い出したように表示されます。 入力用フォームの「ID」と「名前」フィールドのプロパティから、大元のテーブルからレコードを取ってくるselect文を書いてみたり、リクエリを指示してみたり、フィルタをかける設定を設けてみたりしましたが、どうも現象が変わってくれません。と申しますか、かえって動きが怪しくなります。 解決法をご存知の方はご教授くださいませ。 よろしくお願いします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.7

If(データの有無)により開くフォームが違うようです。 "F_基本情報入力":データなし "F_基本情報":データあり だとするとレコードソースも違う可能性があります。 何故、違うフォームなんでしょうね? 単に「追加」を許す/許さないという仕分けでしょうか。 だったら、やはりAllowAdditionsプロパティを変える だけで済む話なんですけどね。(その他、更新や削除も 同様のプロパティがあり、動的に変更可能です) まぁ、画面タイトルや色使いなど違いを持たせているなら、 口出しするところではないですが・・・ ★該当データが無ければ、自動的に新規登録になります。 これは「追加を許す」場合の話です。こういう条件の場合、 データグリッドは「抽出されたデータ+新規用の空データ」 という具合になります。「抽出されたデータ」なければ 「新規用の空データ」だけが残るという理屈です。

camo-tech
質問者

お礼

ご回答ありがとうございます。 なるほど。 表示項目と入力項目が同じであれば、ひとつのフォームで、閲覧/入力をまかなう、ということですね。 最後のほうでおっしゃっておられるように、微妙に色合いや各項目のプロパティは変えてありますが、項目の増減など、後々のメンテナンスを考えるとIf分岐で2つのフォームに振り分けるのは「美しくない」ですね。 教えていただいたことを元に、チャレンジいたします。 ありがとうございました。

その他の回答 (6)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.6

If文のElse節ではレコードソースを変更していません。

camo-tech
質問者

お礼

お世話になっております。 else節にも同様のコーディングが必要、という意味でしょうか? それとも、 ★該当データが無ければ、自動的に新規登録になります。 とおっしゃられておりますので、そもそもIf分岐は必要ない、ということでしょうか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

>「どこに」仕込むのでしょうか? フォームのレコードソース・プロパティ 「仕込む」というのは表現上の問題で、正確には 「フォームのレコードソースプロパティに設定する」 という具合になります。 >Formas 失礼しました。綴り間違いです。Formsが正しい。 >2行に分けているのには理由はありますか? ステートメントが長くなり過ぎるのを防ぐ。 抽出条件が変わった時、修正箇所が見易くなる。 私の場合、実務ではフィールドごと、条件1個ごとに 行を分けています。 SQL = "SELECT" SQL = SQL & " A.AAA" SQL = SQL & ",B.BBB" SQL = SQL & " FROM X AS A" SQL = SQL & " INNER JOIN Y AS B" SQL = SQL & " ON A.ID=B.ID" SQL = SQL & " WHERE A.P=1" SQL = SQL & " AND B.Q=2" 単に見易くするための処置であり、個人的な流儀です。

camo-tech
質問者

お礼

ご回答ありがとうございます。 そういえば私も若いころ(笑)、プログラミングのクセとか、社内ルールってあったのを思い出しました^^; さて、本題。 呼び出しコマンドボタンのイベントを、下記のように変えてみました。 IF文はそのままで、呼び出し関数でSQL文を呼び出される側のフォームのレコードソースに「仕込む」作りになっていると思うのですが、実際に動かしてみると、レコードソースは元々のクエリの名前が表示されています。(つまり、変化がない) どこがおかしいのでしょうか? そもそも、nda23さんが意図されている動作とは違うイベントを仕込んでしまっているのでしょうか? ちなみに・・・またまた「重箱」ですが、 SQL = SQL & "WHERE ID='" % Me!ID & "'" は SQL = SQL & "WHERE ID='" & Me!ID & "'" でいいですよね^^ ---------------------------------------------------------- Private Sub コマンド31_Click() On Error GoTo Err_コマンド31_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = 前と同じでここは省略します stLinkCriteria = "[ID]=" & "'" & Me![ID] & "'" 'DoCmd.OpenForm stDocName, , , stLinkCriteria<コメントアウト 'DCountの結果で、開くフォーム名(→stDocName)を切替 If DCount("*", "Q_基本情報", stLinkCriteria) = 0 Then stDocName = "F_基本情報入力" 'レコード不在(=0)時はF_基本情報入力を指定 SQL = "SELECT * FROM Q_基本情報 " SQL = SQL & "WHERE ID='" & Me!ID & "'" DoCmd.OpenForm stDocName Forms(stDocName).RecordSource = SQL Else stDocName = "F_基本情報" 'レコード存在時はF_基本情報を指定 DoCmd.OpenForm stDocName, , , stLinkCriteria End If Exit_コマンド31_Click: Exit Sub Err_コマンド31_Click: MsgBox Err.Description Resume Exit_コマンド31_Click End Sub

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

あぁ、そういうことですか。何か面倒なことしてますね。 フィルタなんか掛けずに、レコードソースを仕込めば 一発なんですけどね。 SQL = "SELECT * FROM Q_基本情報選択 " SQL = SQL & "WHERE ID='" % Me!ID & "'" DoCmd.OpenForm stDocName Formas(stDocName).RecordSource = SQL ★RecordSourceを変更した場合はRefreshは不要です。 ★該当データが無ければ、自動的に新規登録になります。 せっかくstDocNameを使って開いたのだから、Formsの 引数にも使いましょう。 Accessは1.0aのころ(古!)からやってますけど、 フィルタなんぞ使ったことないですよ。

camo-tech
質問者

お礼

面倒なこと(苦笑)、は↓で教わりました^^;;;;; http://oshiete1.goo.ne.jp/qa5708127.html ご回答がちょっと理解できていないのですが、「レコードソースを仕込めば」というのは、「どこに」仕込むのでしょうか? あと、重箱の隅をつつくようで申し訳ないのですが、 Formas(stDocName).RecordSource = SQL は Forms(stDocName).RecordSource = SQL でOKですか? もうひとつごめんなさい。 ご回答の例では、SQL変数にSELECT文を代入し、レコードソースで使わせようとしていますが、代入の際、2行に分けているのには理由はありますか? 以上、お手数ですが、またのご回答をお待ちしております。

noname#182251
noname#182251
回答No.3

#2です。リンクを貼り忘れていました(^^;申し訳ない。 http://oshiete1.goo.ne.jp/qa4777807.html

camo-tech
質問者

お礼

ありがとうございます。 昨年の私同様、長いお付き合いをされたようですね。(笑 しっかり読ませていただきます。 結果はまたご報告いたします。

noname#182251
noname#182251
回答No.2

何故ご質問のような現象が起きるのか?もう少し詳細が説明されないと判りませんが、「IDを選択後に、それようの入力用フォームを開く」要求を含む、長い回答を書いたことがあります。参考になればよいのですが。

camo-tech
質問者

お礼

師匠、ご回答ありがとうございます。 年末から年始にかけ、長い間ご指導賜り、ありがとうございました。 師匠の回答履歴を見て、探してみます。 どうもありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

考えられる一つの原因としてはデータ(ID)が 変化したことを知らせていないからでは? 入力用フォームを開き、IDを仕込んだ後で、 そのフォームにRefreshメソッドを実行したら どうなりますか? サンプル Forms("入力フォーム").Refresh

camo-tech
質問者

お礼

ご回答ありがとうございます。 呼び出し元のコマンドボタンには、下記のイベントを仕込んでおり、IDを受け渡すようにしております。 (ここでIf分岐のやり方を教わりました) IDに紐付く付帯情報がなければ、「F_基本情報新規追加」フォームを開き、あれば、「F_基本情報閲覧」を開きます。 ご指導されたように、F_基本情報新規追加を開く際は、そのコマンドボタンのイベントに Forms("F_基本情報新規追加").Refresh を入れていますが、動作させたところ、現象は変わりませんでした。 また、呼び出される側の「開くとき」のプロパティや、IDを表示するフィールドのプロパティで、 Forms("F_基本情報新規追加").Refresh や Me.Refresh を組み入れましたが、やはり状況は改善せず。。。という状況です。 ----------------------------------------------------------- Private Sub コマンド31_Click() On Error GoTo Err_コマンド31_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = ここはすみませんが省略します stLinkCriteria = "[ID]=" & "'" & Me![ID] & "'" 'DoCmd.OpenForm stDocName, , , stLinkCriteria 'DCountの結果で、開くフォーム名(→stDocName)を切替 If DCount("*", "Q_基本情報選択", stLinkCriteria) = 0 Then stDocName = "F_基本情報新規追加" 'レコード不在(=0)時はF_基本情報新規追加を指定 DoCmd.OpenForm stDocName 'stLinkCriteriaは使用しません Forms("F_基本情報新規追加").Refresh Else stDocName = "F_基本情報閲覧" 'レコード存在時はF_基本情報閲覧を指定 DoCmd.OpenForm stDocName, , , stLinkCriteria End If Exit_コマンド31_Click: Exit Sub Err_コマンド31_Click: MsgBox Err.Description Resume Exit_コマンド31_Click End Sub

関連するQ&A

  • Access2002 閲覧フォームから入力フォームへのレコードの受け渡し

    度々すみません。 Access初心者です。よろしくお願いします。 例えば「基本情報フォーム」から、「付帯データ入力フォーム」を起動する作りになっていたとします。 この場合、基本情報フォームは閲覧専用で、付帯データ入力フォームは入力用フォームになると思います。 しかし、コマンドボタンの追加ウィザードで両方のフォームで取り扱う「ID」で絞り込んで入力フォームを開こうとすると、うまく行きません。 単純に、入力フォーム単体で立ち上げると、入力できます。 やりたいことは単純で、閲覧フォーム上のIDを、入力用フォームのIDフィールドに表示させたいだけなのですが。。。 解決策をご存知の方がいらっしゃいましたら、ご教授お願いいたします。

  • Accessについて。フォームでデータ入力

    超基本的な質問ですみません。 仮に下記のような構造のデータベースがあったとします。 テーブル 都道府県名 フィールド 都道府県 テーブル 住所    フィールド 都道府県 市町村 テーブル 顧客    フィールド 都道府県 市町村 顧客にデータを入れていくために"顧客情報入力"というフォームを作ります。 "都道府県"をコンボボックスで選択しました。 市町村のコンボボックスに上の"都道府県"で選択した都道府県の"市町村"だけを表示させるためにはどうしたら良いのでしょうか。 クエリについてはある程度理解していたつもりなのですが、頭が真っ白になってしまいました。

  • アクセス/フォームでの名前の選択入力

    アクセス2000 住所テーブルに名簿ID、名前、ふりがな、フィールド有り。 売上伝票フォームの名前欄にコンボボックスを作って名前のリストを表示させ選択入力しています。 住所テーブルの名前が100を超えるようになったので、売上伝票フォーム上に、よみ(ふりがなの2文字位を入れる)欄を作って、上記コンボボックスで表示する名前を”よみ”で絞り込みたい。 "よみ"欄など作る必要がなければその方法でよいです。 アクセス幼稚園生です。このWebの過去の履歴の中に有るのかも知れませんが、よろしく。

  • Accessでテーブルのデータを検索してフォームに表示させる方法を教えてください

    現在、アクセスでテーブルを作成しました。テーブルは患者テーブルという名前でデータはID、名前、年齢です。フォームにはID、名前、年齢のフィールドを作成しました。IDのフィールドに、ID番号を入力し患者テーブル テーブルのID番号と一致すれば、名前と年齢を自動的に表示させるモジュールを作成したいのですが、どのように作成すればいいでしょうか?ご教示頂ければ幸いです。

  • Access2002 フォーム間のデータ受け渡し条件による動作分岐

    いつもお世話になっております。 未だ初心者のものです。 表題ではわかりにくいと思いますが、ああしか書けなかったのでお許し下さい。 本題ですが、人員の情報フォーム(フォームA)に、コマンドボタンを設け、他のフォーム(フォームB)を開く作りにしています。 コマンドボタンを作成するときに自動起動されるウィザードにしたがって、人員のIDとマッチするデータを表示するよう、コマンドボタンは設定されています。 フォームBの元になっているテーブルに、その人員のIDと付帯情報が入っていればフォームBはうまく表示されるのですが、まだ付帯情報が入っていない場合、当たり前ですが空白のフォームが現れます。 そこでご相談なのですが、フォームBの元テーブル(あるいはクエリ)にデータがない場合はフォームB用のデータ入力をさせるフォーム(フォームC)を表示させる様にはできませんでしょうか? これだけの情報ではイメージできないかも知れませんので、追加情報が必要であれば、逆質問をお願いします。 よろしくご回答のほど、お願いします。

  • Accessのフォームについて教えて下さい

    Access 2010のフォームについてお教え下さい。 テーブルにはテーブル名T1、フィールド「ID」、「Price」というテキストボックス。2フィールドがあります。 テーブルの各データは、 ID,Price 001,100 002,200 003,300 フォームにはにフォーム名F1、「cmb」というコンボボックスと、「price」というテキストボックスが配置されています。 「cmb」のデータは値集合ソースで、「SELECT T1.ID FROM T1;」と指定しています。 「cmb」で選択したデータのプライスを「Price」テキストボックスに表示したいと思います。 例えば、「001」を選択したら、「100」と表示されるようにしたいと思います。 色々調べているのですが、どうやってやるのかわかりません。どのように実現したらよろしいでしょうか? よろしくお願いいたします。

  • ACCESS フォーム設計

    ACCESS2003を使用して、基本情報と明細のテーブルとフォーム設計をしています。基本テーブルに担当者IDと氏名があり、明細テーブルにも担当者IDと氏名があります。明細のフォームで、担当者IDを入力したら、基本情報にある担当者名を自動表示し、明細テーブルに書き込みたいのですが、=DLookup("[氏名]", "[基本情報]", "[担当者ID] = " & Forms("明細")("[担当者ID]")) を指定しても、うまく動作しません。明細フォームの氏名のコントロールソースを空白にしても、テーブルとリンクしてもだめです。 又、明細の更新フォームとして、担当者IDを入力したら、該当レコードの内容を全て表示し、変更内容を入力後、同一主キーでUPDATEモードで書き込む方法も教えてください。

  • Accessのフォームで

    Accessで2つほど質問いたします。 (1)テーブルにフィールドを追加したのですがフォーム上でそのフィールドが追加できません(プロパティで選択できない)、多分クエリーを経由してフォームを作成したのですが、どのクエリーだかわからなくなってしまいました、参照しているクエリーがどれなのかを調べる方法を教えてください。 (2)検索フォームを作成して入力した文字を含む検索をしたいのですが どのようにしたら良いのでしょうか、今は入力の文字列の最初と最後に「 * 」を入力して検索しています。

  • アクセスフォームでフィールドデータ一括表示方法

    「アクセス2013において、IDを入力しただけで、連結しているテーブルのフィールドのデータを自動で一括表示するフォームを作りたいのですがどのようにすればよいのでしょうか?」

  • Accessのフォームとテーブルについて教えてください。

    Access2003を使用しています。 既存のフォームAにフィールド3個を増やしました。 フォームAはテーブル(1)と連動していました。 追加したフィールドはテーブル(6)のものです。 ところがフォーム上で追加フィールドに入力が出来なくなりました。3フィールドのうち、ひとつはコンボボックスです。表示はされますが確定ができません。 フォームAのSQLステートメントではテーブル(1)・(6)以外にテーブル(2)・(3)・(4)・(5)が結合されています。 フォームAからするとテーブル(2)・(3)・(4)・(5)のデータはIDの名称を見るための参照用です。 テーブル(6)は、追加フィールドのコンボボックスが参照用で、他の2追加フィールドは、フォームから入力してテーブル(6)に反映させたいものです。 テーブル(6)の画面では入力できます。 フォーム上からは入力できません。 設定が何か欠けているからでしょうか? 他の質問では2つのテーブルをひとつのフォームにする場合は、クエリを別に設けた方がいいとなっています。フォームが出来上がっているので、できればクエリを設けずに行いたいのですが、よくない方法でしょうか? 手順なども踏まえて教えていただけると助かります。 よろしくお願いいたします。