Microsoft Access Club Access超初心者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルクエリでの抽出結果範囲内でのレコード間移動
記事No83239
投稿日: 2018/01/17(Wed) 12:31
投稿者しま
解決済: ON
OS: WIndows7
Access Version: ACCESS 2007-2010

いつもこちらで大変お世話になっております。

顧客管理データベースを作っており、新たに質問させていただきたく存じます。

<主な構造>
【tbl顧客基本情報】顧客ID(主)、その他基本情報・・
【tbl顧客対応記録】対応記録ID(主)、顧客ID、対応日、対応内容・・・

この二つの主なテーブルにデータを格納し、

【qry顧客対応記録】にて、顧客データと対応記録データを1対多で結びつけています。

今、【frm顧客基本情報】の中に【qry顧客対応記録】をレコードソースにしたサブフォーム(帳票F)を作っており、
例えば顧客Aさんのページを開けば、過去の対応記録がサブフォームにずらりと並び、
その各レコード毎に設けている詳細ボタンから、対応記録IDを元に【frm顧客対応記録】を開く形になっています。

やりたいこととしては、【frm顧客対応記録(レコードソース:qry顧客対応記録)】を開いたときに、
フォーム上のボタンで顧客Aさんの前の記録、次の記録へと移動できればと考えています。

今の形では、対応記録IDのみでフォームを開いているので、フィルターがかかっており、移動ができません。
ただ、なんらかのアクション(ボタンなど)でフィルターを解除すれば、
元になっているレコードソースのクエリでAさんの記録のみを抽出しているので、
その範囲でのレコード移動が可能になります。

フォームのプロパティで開く時のマクロでフィルター解除を設定した際は、
Aさんの記録一覧の中で、一番最新のデータが表示されてしまい、うまくいきませんでした。
一度該当レコードを開いてからのフィルター解除であれば、そのレコードに留まってくれます。

誰もが感覚的に操作できるように、
できればフィルター解除のボタンなどのワンアクションは入れずに、
フォーム上にある「前へ」「次へ」ボタンですぐにレコード移動ができればと考えています。
簡単なことなのかもしれませんが・・・
もし良い案がおありでしたらお教えいただけないでしょうか。

タイトルRe: クエリでの抽出結果範囲内でのレコード間移動
記事No83240
投稿日: 2018/01/17(Wed) 13:11
投稿者ナバ
解決済: ON
こんにちは。

> 今の形では、対応記録IDのみでフォームを開いているので、フィルターがかかっており
ここは具体的にどんな方法で行っていますか。

方針としては、
1.顧客IDでフィルターをかける
2.フォームが開いたら該当する対応記録IDを検索し、移動する
となると思います。

タイトルRe^2: クエリでの抽出結果範囲内でのレコード間移動
記事No83241
投稿日: 2018/01/17(Wed) 15:09
投稿者しま
解決済: ON
ナバさま

ご返信いただきありがとうございます

> > 今の形では、対応記録IDのみでフォームを開いているので、フィルターがかかっており
> ここは具体的にどんな方法で行っていますか。

【qry顧客対応記録一覧】をソースにした【frm_sub顧客対応記録一覧】(帳票フォーム)の各レコードに
コマンドボタンを設けており、このボタンのクリック時イベントで、
【frm顧客対応記録】(←これは表示用です)を開き、対応記録IDで該当するレコードを表示しています。

イメージとしては、こんな感じです。↓

===========================================================
 <<Aさんの個人ページ【frm顧客基本データ】>>

 [名前]
 [生年月日]
 [住所] etc
--------------------------------------------------------
<Aさんの対応記録一覧【frm_sub顧客対応記録一覧】>
   対応年月日   対応内容
[H30/01/15]|[対応記録内容]|[詳細(コマンドボタン)]
[H30/01/10]|[対応記録内容]|[詳細(コマンドボタン)]
     ・
     ・
--------------------------------------------------------
===========================================================

また、詳細ボタンから開く【frm顧客対応記録】には[対応記録ID]フィールドを設けており、
[対応内容]フィールドのレコードソースはDlookUp関数を使って対応記録IDが一致するレコードを
【tbl顧客対応記録】から呼び出し、表示しています。

※レコードソースをクエリの該当フィールドにしていない理由は、必要であれば
前回の相談内容(http://www.accessclub.jp/bbs/wforum2.cgi?mode=allread&no=83169&page=0#83169)から
ご参照いただければと思います。


> 方針としては、
> 1.顧客IDでフィルターをかける
> 2.フォームが開いたら該当する対応記録IDを検索し、移動する
> となると思います。

なるほど!対応記録IDでフィルターをかけるのではなく、先に顧客IDの全データを対象にして開き、
該当の対応記録IDにするのですね。目からうろこでした。
この一連の流れは、ワンクリックでできるのでしょうか?
1.の顧客IDでフィルターをかけてフォームを開く ところまではできたのですが、
2.の該当する対応記録IDを検索して移動する、というのはどのようにすれば実現できるのでしょうか。

フォームを開いた時点で、見に行きたいレコードの対応記録ID情報が失われているような気がするので・・
頼りきりで申し訳ありませんが、よろしくお願いします。

よろしくお願いします。

タイトルRe^3: クエリでの抽出結果範囲内でのレコード間移動
記事No83242
投稿日: 2018/01/17(Wed) 16:24
投稿者ナバ
解決済: ON
> この一連の流れは、ワンクリックでできるのでしょうか?
> 1.の顧客IDでフィルターをかけてフォームを開く ところまではできたのですが、
> 2.の該当する対応記録IDを検索して移動する、というのはどのようにすれば実現できるのでしょうか。

【frm_sub顧客対応記録一覧】のイベントプロシージャで
【frm顧客対応記録】を検索し、レコード移動をさせます。

その時、必要になるのが「Bookmark」というプロパティです。

まずはMicrosoftのページでどんなものか、見てみてください。
https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/form-bookmark-property-access

タイトルRe^4: クエリでの抽出結果範囲内でのレコード間移動
記事No83243
投稿日: 2018/01/18(Thu) 17:11
投稿者しま
解決済: ON
ナバさま

お世話になっております。

お教えいただいたBookmarkプロパティを今理解しようとしているところです。

どういったものなのかを理解するのに少し時間がかかりそうですので、
また次のステップに進む段階でまたお返事させていただきます。

引き続きどうぞよろしくお願いいたします。

タイトルRe^5: クエリでの抽出結果範囲内でのレコード間移動
記事No83244
投稿日: 2018/01/18(Thu) 17:25
投稿者ナバ
解決済: ON
> また次のステップに進む段階でまたお返事させていただきます。

はい。急ぎませんので。

自分自身で理解する努力をしたうえでやりとりすれば
今回の件の解決だけでなく、応用力も付きますので
時間が許せばそういう方向が望ましいと思います。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
私のイメージでは、Bookmark はその名の通り、「しおり」です。

レコードセットという名の本があったとき、
1.そのクローンの本を作成し、それを検索する
2.見つかった個所にしおりを挟む
3.元の本の同じページにしおりを挟み、そこを開く
というような動作だとイメージしています。

タイトルRe^6: クエリでの抽出結果範囲内でのレコード間移動
記事No83249
投稿日: 2018/01/25(Thu) 16:33
投稿者しま
解決済: ON
ナバさま

大変お世話になっております。
すっかり間が空いてしまい、申し訳ございません。


> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 私のイメージでは、Bookmark はその名の通り、「しおり」です。
>
> レコードセットという名の本があったとき、
> 1.そのクローンの本を作成し、それを検索する
> 2.見つかった個所にしおりを挟む
> 3.元の本の同じページにしおりを挟み、そこを開く
> というような動作だとイメージしています。

優しく教えていただきありがとうございます!
こちらの説明で、なんとなくはイメージできたのですが、
それを実現するための具体的なステップについて、まだ理解できていません。

ただ、Bookmarkについて色々と調べながら試しているうちに、やりたかったことが一応形になったのですが・・
方法としては、下記のとおりです。

【frm_sub顧客対応記録一覧】に設置したコマンドボタンで【frm顧客対応記録】を開く際、
マクロで顧客IDでフィルターをかける。

【frm顧客対応記録】が開く。

【frm顧客対応記録】の「開く時」イベントでVBAを記述。

Private Sub Form_Open(Cancel As Integer)
Set Me.Recordset = Forms!frm顧客基本データ!sub_frm顧客記録.Form.Recordset
End Sub

これだけで、【frm_sub顧客対応記録一覧】から【frm顧客対応記録】を開いたときに
該当するレコード(Aさんの○月○日の記録)を読み込み、
さらにレコードの移動ボタンでAさんの記録のみの範囲で前後に移動することもできるようになりました。
この場合、Bookmarkプロパティはどこにも使っていないのですが、これでも大丈夫なのでしょうか?

Bookmarkプロパティ、説明を読んでも難しいのです・・
例えば、どこに記述するべきなのかがまず分かりません。
【frm_sub顧客対応記録一覧】のコマンドボタンクリック時イベントとして記述するのか、
【frm顧客対応記録】の開く時イベントとするのか・・。

基礎をきちんと学ばないまま来ているので、
Microsoftの説明は専門用語が多く、なかなか意味を理解することができず、
お恥ずかしい限りです。

もしまだ見てくださっていれば、もう少し噛み砕いて教えていただけると大変嬉しいです。
どうぞよろしくお願いいたします。

タイトルRe^7: クエリでの抽出結果範囲内でのレコード間移動
記事No83250
投稿日: 2018/01/25(Thu) 17:25
投稿者ナバ
解決済: ON
こんにちは。

> これだけで、【frm_sub顧客対応記録一覧】から【frm顧客対応記録】を開いたときに
> 該当するレコード(Aさんの○月○日の記録)を読み込み、
> さらにレコードの移動ボタンでAさんの記録のみの範囲で前後に移動することもできるようになりました。

私の環境では再現できませんでした。
が、それでお望みの動作ができていればそれでいいかなと思います。


と、これだけではなんですので、せっかくですからBookmarkの使い方を説明します。
【frm_sub顧客対応記録一覧】のコマンドボタンではマクロをやめ、イベントプロシージャで以下を記述します。
※【frm顧客対応記録】には何もしないでください
-----------------------------------------------------
  Dim rs As Recordset
  Dim bm
  
  'フィルターをかけてフォームを開く
  DoCmd.OpenForm "frm顧客対応記録", acNormal, , "顧客Id=" & Me!顧客Id

  'レコードセットのクローンを取得
  Set rs = Forms!frm顧客対応記録.RecordsetClone
  
  '主キーでレコードセットクローンを検索
  rs.FindFirst "対応記録ID = " & Me!対応記録ID

  '検索がヒットしたら
  If Not rs.NoMatch Then

    'ブックマークを取り出す
    bm = rs.Bookmark

    'レコードセットにブックマークをセットする
    Forms!frm顧客対応記録.Recordset.Bookmark = bm

  End If
  
  Set rs = Nothing

タイトルRe^8: クエリでの抽出結果範囲内でのレコード間移動
記事No83252
投稿日: 2018/01/26(Fri) 16:50
投稿者しま
解決済: ON
ナバさま

お世話になっております。ご回答ありがとうございます!

お教えいただいたBookmarkのVBAを使ってみましたところ、
こちらも見事動作しました!

さらに、わたしの方で記述した方法だと、他のフォームから【frm顧客対応記録】を開こうとした際に
【frm_sub顧客対応記録一覧】のレコードを取得しにいってしまい困っていたのですが、
ナバさんにお教えいただいた方法で、こちらも解決することができました。

これで、かなり理想どおりのデータベースを完成させることができました!
本当にありがとうございます。Bookmarkはもう少し勉強していきます・・。

また質問させていただく機会がありましたらどうぞよろしくお願いいたします。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る