FC2ブログ

Recalc の罠?怪? 


テキストボックスのコントロールソースに記述した「式」をすぐに反映させたい時とか、
条件付き書式をすぐに反映してもらいたい時など、
Me.Recalc
する時があります。

今回、サブフォームコントロールを持つフォームに対して Racalc してみました。
フォームの構成は
・メインフォーム「F_1M」に、サブフォームコントロールを左右に並べて2つ
・サブフォームコントロールに表示するのは単票フォーム「F_1S」
・左側はレコードの移動を自由にして、右側には左側に表示した1つ前のレコードを表示

以下のデータでテーブル「T1」があったとします。
anF1F2F3F4
11A1B1C1D1
22A2B2C2D2
33A3B3C3D3
44A4B4C4D4

an:オートナンバ

大まかなフォームのデザイン・表示は以下

kEnt181

左上:メインフォーム「F_1M」デザイン
右上:サブ用単票フォーム「F_1S」デザイン
左下:左側先頭レコード表示で、右側空白(1つ前がないので)
右下:左側2レコード目表示で、右側先頭(1レコード目)表示

各フォームに記述した VBA は後述しますが、このフォームでの動きはソコソコです。
サブフォームコントロール右側の表示をすぐに反映させたかったので、メインを Recalc してました。
それで回答したわけですが、余計な1文を記述したかな・・・
左側が Filter された場合は、Filter された中での 1 つ前が右側に表示されます。
(回答内容も後述)

その後、左側に Filter / OrderBy を設定できるようにフォーム修正して確認していくわけですが・・・
結論を先に紹介すると・・・
・左側に Filter / OrderBy を設定後、メインを Recalc すると、
 左側は先頭レコードに表示が固定されてしまう。
 ただ、2レコード目に移動しようとした時、
 Recalc する前には2レコード目に移動している様で、右側には先頭レコードが表示される。
 ・・・ つまり ??、Recalc で Requery の動作が起きているようだ・・・・
 でも、Filter / OrderBy を設定していないと、レコード移動は自由なので、常に Requery ではないようだ。
・サブフォームコントロールを持つフォームへの Recalc は、注意が必要

対処としては、
Recalc ではなく、右側サブフォームコントロールを Requery してね・・・ 関数を設ける事に。
続きを読んでみようかな ---≫
スポンサーサイト

2013/10/01

Category: 訂正あり

TB: --  /  CM: 0

top △

フィルタの適用/解除とその場所 


ある質問に回答して、一応動いた報告がありクローズしたのですが・・・・

レコードを指定して特定のフォームを開くというボタンまでは作れた。
起動されたフォームにはフィルタがかかっており、他のレコードに移動できない。
項目を入力して一旦閉じ、再度指定せずに開くと入力した内容は反映されている。
他のレコードと見比べる時に一回一回閉じないと確認できないので困っている。
閉じずに他のレコードと見比べるには・・・・
また、見比べる時に、表示はその場所から動かない方が・・・・

動いた・・・で、クローズされた回答内容は以下。(私の回答ですけど・・・)
' コマンドボタン「btn1」をヘッダ部等に配置して、以下を記述

Private Sub btn1_Click()
  If (Me.FilterOn) Then
    Me.Painting = False
    Me.FilterOn = False
    With Me.RecordsetClone
      .FindFirst Me.Filter
      If (Not .NoMatch) Then Me.Bookmark = .Bookmark
    End With
    Me.Painting = True
  Else
    Me.FilterOn = True
  End If
End Sub

追記 6/10
この方法ができるのは、即値に展開(例えば、 "ID = 4" )した場合です。
"ID = [Forms]![フォーム名]![コントロール名]" では .FindFirst 時にエラーになります。

kEnt134_1  kEnt134_2
これで一応、大半のものには対応できると思いますが、
いろいろな場合場合を検証するとエラーが出てくるようになります。

どこまでを回答すれば良いのか・・・・難しいですね。
(回答するにあたり、エラー処理は省いちゃいますしね)

まず、エラーの発生する可能性、第一位は、上記黄色い部分で発生するもの・・・・
これ、レコード編集中に処理が走ったとした場合、黄色部分で Form_BeforeUpdate が呼ばれます。
素直にレコードが保存されれば問題はありませんが Cancel = True を設定したとか・・・・
最終的に Me.Bookmark = .Bookmark 部分でエラーになります。
(直前の操作はキャンセルされました の 2001 エラー)
なので、事前にレコードを確定させる処理を行っておく必要があります。
または、編集中なら処理しないとか・・・・

第二位は、過去記事にも取り上げていましたが、私が確認していなかったもの・・・・
それは、Me.Filter = "" かつ Me.FilterOn = False 時に Me.FilterOn = True を代入したら・・・
Access 2007 では、Me.FilterOn = True になることはありませんでした。
2000 / 2003 では、Me.FilterOn = True に設定されてしまいます。( Me.Filter = "" なのに)
仕様がどちらなのかわかりませんが、2007 の動きの方が私にはシックリきます。
この辺の動きが違っているとは思っていなかったし、確認していたつもりが、していなかった・・・

これ、Me.Filter = "" なのに、Me.FilterOn = True になってしまうと、次クリックすると
.FindFirst Me.Filter 部分で、演算子がないエラー 3077 になってしまいます。

過去記事修正しなくては・・・・面倒くさいな・・・・・そのうちに・・・・
VBA の記述と、コメントの関係もこんな感じですかね・・・
記述するコメントは最小限にとどめたいですね・・・
続きを読んでみようかな ---≫

2012/06/09

Category: 訂正あり

TB: --  /  CM: 0

top △