- ベストアンサー
Access2002 フォーム間のデータ受け渡し後の動作制御方法
何度もすみません。 簡単な事なのかもしれませんが、自己解決できなかったので、質問させていただきます。 あるフォーム(基本情報閲覧)から、コマンドボタンで別の入力用フォームを呼び出しています。 その際、「ID」というフィールドの文字列を受け渡し、入力用フォームの「ID」に表示させています。 「ID」はテーブル:基本情報の一部であり、そのテーブルには「ID」と「名前」があります。 質問したいのは、入力用フォームにデータが受け渡されたときに、「ID」と共に「名前」も表示させたいのです。 もちろん、どちらのフォームも同じテーブルを裏に持っていますので、簡単にフィルタをかけて表示してくれると思っていましたが、「ID」フィールドに文字列は入るものの、「名前」は自動的には表示されず、他の入力項目を選択(コンボボックスで)したときに、なぜか「名前」が思い出したように表示されます。 入力用フォームの「ID」と「名前」フィールドのプロパティから、大元のテーブルからレコードを取ってくるselect文を書いてみたり、リクエリを指示してみたり、フィルタをかける設定を設けてみたりしましたが、どうも現象が変わってくれません。と申しますか、かえって動きが怪しくなります。 解決法をご存知の方はご教授くださいませ。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
If(データの有無)により開くフォームが違うようです。 "F_基本情報入力":データなし "F_基本情報":データあり だとするとレコードソースも違う可能性があります。 何故、違うフォームなんでしょうね? 単に「追加」を許す/許さないという仕分けでしょうか。 だったら、やはりAllowAdditionsプロパティを変える だけで済む話なんですけどね。(その他、更新や削除も 同様のプロパティがあり、動的に変更可能です) まぁ、画面タイトルや色使いなど違いを持たせているなら、 口出しするところではないですが・・・ ★該当データが無ければ、自動的に新規登録になります。 これは「追加を許す」場合の話です。こういう条件の場合、 データグリッドは「抽出されたデータ+新規用の空データ」 という具合になります。「抽出されたデータ」なければ 「新規用の空データ」だけが残るという理屈です。
その他の回答 (6)
- nda23
- ベストアンサー率54% (777/1415)
If文のElse節ではレコードソースを変更していません。
お礼
お世話になっております。 else節にも同様のコーディングが必要、という意味でしょうか? それとも、 ★該当データが無ければ、自動的に新規登録になります。 とおっしゃられておりますので、そもそもIf分岐は必要ない、ということでしょうか?
- nda23
- ベストアンサー率54% (777/1415)
>「どこに」仕込むのでしょうか? フォームのレコードソース・プロパティ 「仕込む」というのは表現上の問題で、正確には 「フォームのレコードソースプロパティに設定する」 という具合になります。 >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" 単に見易くするための処置であり、個人的な流儀です。
お礼
ご回答ありがとうございます。 そういえば私も若いころ(笑)、プログラミングのクセとか、社内ルールってあったのを思い出しました^^; さて、本題。 呼び出しコマンドボタンのイベントを、下記のように変えてみました。 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)
あぁ、そういうことですか。何か面倒なことしてますね。 フィルタなんか掛けずに、レコードソースを仕込めば 一発なんですけどね。 SQL = "SELECT * FROM Q_基本情報選択 " SQL = SQL & "WHERE ID='" % Me!ID & "'" DoCmd.OpenForm stDocName Formas(stDocName).RecordSource = SQL ★RecordSourceを変更した場合はRefreshは不要です。 ★該当データが無ければ、自動的に新規登録になります。 せっかくstDocNameを使って開いたのだから、Formsの 引数にも使いましょう。 Accessは1.0aのころ(古!)からやってますけど、 フィルタなんぞ使ったことないですよ。
お礼
面倒なこと(苦笑)、は↓で教わりました^^;;;;; http://oshiete1.goo.ne.jp/qa5708127.html ご回答がちょっと理解できていないのですが、「レコードソースを仕込めば」というのは、「どこに」仕込むのでしょうか? あと、重箱の隅をつつくようで申し訳ないのですが、 Formas(stDocName).RecordSource = SQL は Forms(stDocName).RecordSource = SQL でOKですか? もうひとつごめんなさい。 ご回答の例では、SQL変数にSELECT文を代入し、レコードソースで使わせようとしていますが、代入の際、2行に分けているのには理由はありますか? 以上、お手数ですが、またのご回答をお待ちしております。
#2です。リンクを貼り忘れていました(^^;申し訳ない。 http://oshiete1.goo.ne.jp/qa4777807.html
お礼
ありがとうございます。 昨年の私同様、長いお付き合いをされたようですね。(笑 しっかり読ませていただきます。 結果はまたご報告いたします。
何故ご質問のような現象が起きるのか?もう少し詳細が説明されないと判りませんが、「IDを選択後に、それようの入力用フォームを開く」要求を含む、長い回答を書いたことがあります。参考になればよいのですが。
お礼
師匠、ご回答ありがとうございます。 年末から年始にかけ、長い間ご指導賜り、ありがとうございました。 師匠の回答履歴を見て、探してみます。 どうもありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
考えられる一つの原因としてはデータ(ID)が 変化したことを知らせていないからでは? 入力用フォームを開き、IDを仕込んだ後で、 そのフォームにRefreshメソッドを実行したら どうなりますか? サンプル Forms("入力フォーム").Refresh
お礼
ご回答ありがとうございます。 呼び出し元のコマンドボタンには、下記のイベントを仕込んでおり、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
お礼
ご回答ありがとうございます。 なるほど。 表示項目と入力項目が同じであれば、ひとつのフォームで、閲覧/入力をまかなう、ということですね。 最後のほうでおっしゃっておられるように、微妙に色合いや各項目のプロパティは変えてありますが、項目の増減など、後々のメンテナンスを考えるとIf分岐で2つのフォームに振り分けるのは「美しくない」ですね。 教えていただいたことを元に、チャレンジいたします。 ありがとうございました。