|
毎度お世話になっております。
現在、EXCEL,ADO,ACCESSを用いて、車の整備会社で、顧客管理、請求書・見積書作成、
部品管理、売上管理などをするものを作成しております。EXCELをユーザーインターフェースとして使用(Excel自体にデータを保存しない)しています。
顧客の中には、車を複数台所有してる方が多いので顧客データを表示するユーザーフォ
ームに、所有する車名を表示するComboBoxを配置しております。車名を選択すると同フォ
ーム内にある車検証データを表示するTextBox群にその車の車検証データが表示されるようになっています。
その車が廃車になった時の処理を一例としてあげると、
Dim CN as New ADODB.Connection
Dim Res as New ADODB.RecordSet
Dim SQL as String
SQL="select * from T_車検証マスタ where F_顧客ID =" & ID & " AND F_車名 ='"
& strCarName & "' ;"
Res.Open SQL, CN, adOpenKeyset, adLockOptimistic
If Not Res.EOF then
....
....
Res.Fields(F_車台番号).Value = Null
....
....
End If
このような感じで該当フィールドにNullを代入しています。
通常削除する場合、Res.Deleteですが訳あって、Nullを代入しております。
(テーブルの設計ミスです。リレーションで他のデータが消えてしまうので...)
この後
Res.UpDate をして
Call Control_Refresh(引数省略)
車検証データを表示するTextBox群のリフレッシュをするSubを呼んでいます。
/////////////////////////////////////////////////////////
Sub Control_Refresh(引数省略)
'Res.Fields(****).ValueがNULLならテキストボックスを空に、
'Nullでないなら、その値を表示する。
.....
.....
If IsNull(Res.Fields(F_車台番号).Value)=False Then 'ここにブレークポイント設置
TextBox1.Clear
Else
TextBox1.Text=Res.Fields(F_車台番号).Value
End If
.....
.....
End Sub
/////////////////////////////////////////////////////////
このプログラムを実行すると、ブレークを張ってない場合に
IF IsNull(Res.Fields(F_車台番号).Value)=False の部分がFalseですり抜けてしまう場合がありあます。
ブレークを張って見ていると、止まった瞬間はRes.Fields(F_車台番号).ValueにNullを代入する前の車台番号が入っていて、その後、1秒ほどしてからNullになるといった具合
でした。
Res.UpDateをしてから、実際にRecordSetがNullになるまでには、タイムラグがあるのでしょうか?(あって当たり前のような気がしていますが...)今はその場しのぎで、Application.Wait Now()+TimeValue("00:00:02")を入れて対応していますが、2秒という数字は環境によってまちまち(私のテスト環境では2秒で大丈夫ですが、本番の環境はPC2台のネットワークで使用しますので、条件が悪くなるかもしれません)だと思いますので、この待ち方はできれば回避したいです。
Excel+ADO+Accessにおける待ちの常套手段とは、どういったものなのでしょうか?
アドバイス頂けると幸いです。よろしくお願い致します。
テスト環境 会社のPC Excel2003 Access2000 OS Xp RAM128MBのロースペックPC
待ちをいれなくてもFalseですり抜ける事はありません。
主にこちらで作成しているので、自宅でやるまで気づきませんでした。
テスト環境 自宅のPC Excel2003 Access2000 OS Vista CORE 2Quo 4GB
待ちを入れないとかなりの確立ですり抜けます。
本番の環境 2台のPC共に、Excel2003 OS Xp Accessはインストールされていません
LANケーブル接続
ネットワークフォルダに1つのmdbファイルを置いて、それぞれのPCの
excelファイルからADOで接続して同時に使用します。
|
|