Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No23807.フォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?

タイトルフォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?
記事No: 23807
投稿日: 2004/08/20(Fri) 17:05
投稿者: 中山
OS:WinXP
Access Version:2003

はじめまして。
今回、掲題の件で悩んでおりいろいろ調べたのですが解決出来ず困っています・・・。
うまく説明出来ないのですが、フォーム上に1つのコントロール(テキストボックス)
のデータを元にフィルターをかけるトグルボタン(押した時にボタンがへっこんで名前
が変わるようにしている為)を配置してあります。
フォームは単票形式であるレコードを表示している時にフィルター実行のボタンを押すと、
同じ店番のもののみを表示するようなフィルターをかけて、もう一度押すと解除して
全レコードを表示するようにしているのですが、
解除した時に、フィルターをかける前に表示していたレコードに戻るようにしたいのです。

現在は、先頭のレコードに戻ってしまっています。

レコードセットなどを使うのかなぁと思い、いろいろ調べたのですが、
基本的なことが理解出来ていないため、前に進めずに悩んでおります。

初歩的なことなのかもしれませんが、どなたかご教授頂けますでしょうか?

〜 記述しているコード 〜
Private Sub 店番_Click()
Static sblnStartStatus As Boolean

If Not sblnStartStatus Then
sblnStartStatus = True
Me.店番.Caption = "絞込み解除"
Me.Filter = "店舗ID =[Forms]![受付データ]![店舗ID]"
Me.FilterOn = True

Else
sblnStartStatus = False
Me.店番.Caption = "店舗ID 絞込み"
Me.FilterOn = False

End If

End Sub


以上、宜しくお願いいたします。

タイトルRe: フォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?
記事No: 23812
投稿日: 2004/08/20(Fri) 17:33
投稿者: Tkwan
宣言部で
Private retId As Variant

Private Sub 店番_Click()
Static sblnStartStatus As Boolean

If Not sblnStartStatus Then
retID = Me.Bookmark
sblnStartStatus = True
Me.店番.Caption = "絞込み解除"
Me.Filter = "店舗ID =[Forms]![受付データ]![店舗ID]"
Me.FilterOn = True
Else
sblnStartStatus = False
Me.店番.Caption = "店舗ID 絞込み"
Me.FilterOn = False
Me.Bookmark = retID
End If
End Sub

では?

タイトルRe^2: フォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?
記事No: 23817
投稿日: 2004/08/20(Fri) 17:52
投稿者: 中山
早速のご回答ありがとうございます。

試してみたのですが、フィルター解除をすると、

実行時エラー '3159':

ブックマークが正しくありません。

が出て、先頭レコードに戻ります・・・。

ブックマークについても調べていろいろ試してみましたが、
うまくいかないようです。

うまくいく方法はあるのでしょうか?

タイトルRe^3: フォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?
記事No: 23828
投稿日: 2004/08/20(Fri) 21:06
投稿者: Tkwan
> 試してみたのですが、フィルター解除をすると、
> 実行時エラー '3159':
> ブックマークが正しくありません。
> が出て、先頭レコードに戻ります・・・。

Filterプロパティをいじると、Bookmarkプロパティも変わるみたいですね。
フォームのレコードソースの主キーフィールド名が 「ID(数値型)」
と仮定します。

Private Sub 店番_Click()
Static sblnStartStatus As Boolean
Static retID As Long
Dim rs As DAO.Recordset

If sblnStartStatus = False Then
retID = Me!ID
Me.店番.Caption = "絞込み解除"
Me.Filter = "店舗ID = " & [Forms]![受付データ]![店舗ID]
Me.FilterOn = True
Else
Me.店番.Caption = "店舗ID 絞込み"
Me.FilterOn = False
Set rs = Me.RecordsetClone
rs.FindFirst "ID = " & retID
  If rs.NoMatch Then
Else
Me.Bookmark = rs.Bookmark
rs.Close: Set rs = NoThing
End If
End If
sblnStartStatus = (sblnStartStatus = False)
End Sub

でOKです。

タイトルRe^4: フォームでフィルタをかけてから解除した際にフィルタ実行前のレコードを表示させる方法?
記事No: 23835
投稿日: 2004/08/21(Sat) 06:07
投稿者: 中山
出来ました!
ありがとうございました。

コードを下記のように一部変更して正常に思った通りの動作となりました。

Private Sub 店番_Click()
Static sblnStartStatus As Boolean
Static retID As Long
Dim rs As DAO.Recordset

If sblnStartStatus = False Then
retID = Me!ID
Me.店番.Caption = "絞込み解除"
Me.Filter = "店舗ID = [Forms]![受付データ]![店舗ID]" ← ここを修正
Me.FilterOn = True
Else
Me.店番.Caption = "店舗ID 絞込み"
Me.FilterOn = False
Set rs = Me.RecordsetClone
rs.FindFirst "ID = " & retID
If rs.NoMatch Then
Else
Me.Bookmark = rs.Bookmark
rs.Close: Set rs = Nothing
End If
End If
sblnStartStatus = (sblnStartStatus = False)
End Sub

どのような処理なのか、きちんと理解出来ていない部分もありますが、
理解できるよう調べてみようと思います。

大変、助かりました。
どうもありがとうございます。

タイトル間違っていますよ。
記事No: 23889
投稿日: 2004/08/23(Mon) 12:21
投稿者: Tkwan
> Me.Filter = "店舗ID = [Forms]![受付データ]![店舗ID]" ← ここを修正

     ↑この書き方は間違いです。修正の必要はありません。 

たまたま店舗IDが数値型なのでうまく行っていますが、テキスト型のフィールドの場合は、
この書き方では、絶対に抽出はされません。

タイトルRe: 間違っていますよ。
記事No: 23915
投稿日: 2004/08/23(Mon) 14:53
投稿者: 中山
解決済みとした内容のフォローまでしてくださいましてありがとうございます。

早速、試してみましたが、
同じ処理をしているボタンが3つあり、いずれもテーブルのデータ型は「テキスト型」です。

Me.Filter = "店舗ID = " & [Forms]![受付データ]![店舗ID]

上記のコードの場合は下記のエラーで抽出がされません。

実行時エラー '2001':
直前の操作はキャンセルされました。

Me.Filter = "店舗ID = " & "[Forms]![受付データ]![店舗ID]"

上記のようにしたところうまくいくようです。

データ型は元々、”数値型”ではなく”テキスト型”のため、データ型を変えての検証は
しておりませんが、どこが間違っているのでしょうか?

結果的にはお力をお借りして期待していた事が出来ているのでいいのですが、
今後の為にも少し突っ込んで勉強したいと思います。

「'」と「"」の使い方もいまいちきちんと理解していないようで・・・。

ぜひとも、教えて頂いた方法でうまくいかずちょこっと書き換えるとうまくいく理由について、
ご教授下さい。

お手数をおかけしますが、宜しくお願いします。

タイトルRe^2: 間違っていますよ。
記事No: 23930
投稿日: 2004/08/23(Mon) 15:51
投稿者: Tkwan
フォームのFilterプロパティに設定する場合、
Me.Filter = "店舗ID = [Forms]![受付データ]![店舗ID]" 
とすると、
1.フォームのFilterプロパティに
 店舗ID = [Forms]![受付データ]![店舗ID]
 が設定される。

2.[Forms]![受付データ]![店舗ID]を参照しに行く。

という動きのようです。
したがって中山さんの書き方で、数値型でもテキスト型でもレコードの抽出は
実行されるようです。すみません。

しかしながら、文法的には間違っていますので、SQL文の場合やレコードセットに
Filterプロパティを設定する場合などは正しく抽出されないと思います。

正しい記述の仕方は、
テキスト型の場合
Me.Filter = "店舗ID ='" & [Forms]![受付データ]![店舗ID] & "'"
数値型の場合は
Me.Filter = "店舗ID =" & [Forms]![受付データ]![店舗ID]
です。

タイトルRe^3: 間違っていますよ。
記事No: 23934
投稿日: 2004/08/23(Mon) 16:10
投稿者: 中山

度々、ご丁寧な解説をありがとうございます。
> しかしながら、文法的には間違っていますので、SQL文の場合やレコードセットに
> Filterプロパティを設定する場合などは正しく抽出されないと思います。
この部分をきちんと理解出来るよう勉強しようと思います。

今の所、正しく動いているのでよしとしますが、念のため、
> Me.Filter = "店舗ID ='" & [Forms]![受付データ]![店舗ID] & "'"
上記のように書き換えておきました。

まだまた、”文法的には”と言う部分を勉強しなくてならない事を痛感致しました。

わたしで修正してうまく動いたと言うのも、正直なところ偶然の産物のようなもので・・・。

今回は、大変お世話になりました。

これで、改めて「解決済み」と言うことで・・・。

どうもありがとうございました。
また機会がありましたら、宜しくお願い致します。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています


 

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