Access (VBA) |
![]() ![]() |
(Windows 10全般 : Access 2016)
検索や更新等の処理後の表示について
投稿日時: 22/11/13 20:09:47
投稿者: おーさん0729
|
---|---|
お世話になります。
|
![]() |
投稿日時: 22/11/14 09:13:01
投稿者: Suzu
|
---|---|
推測 になりますが
|
![]() |
投稿日時: 22/11/14 19:42:09
投稿者: おーさん0729
|
---|---|
Suzu さんの引用: たしかに混在しているところもあります。 間にRequeryやRefreshやDo eventsを入れて、更新しているようにしてるのですが、それでもダメなのでしょうか? |
![]() |
投稿日時: 22/11/14 22:06:00
投稿者: hatena
|
---|---|
おーさん0729 さんの引用: コードが間違っているのでしょう。 Suzuさんから推測の回答がでてますが、 実際のコードを提示してもらわないと、これ以上回答はむずかしいでしょう。 おーさん0729 さんの引用: 処理によってはそれで解決する場合もありますが、実際にそれではダメだったんですよね。 ひとつずつ、ダメだった、コードを提示して質問してみてはどうですか。 |
![]() |
投稿日時: 22/11/14 22:50:50
投稿者: おーさん0729
|
---|---|
@Private Sub Form_Load()
|
![]() |
投稿日時: 22/11/15 11:10:04
投稿者: Suzu
|
---|---|
大きな問題としては
引用: ここ。 前半で、フォームのレコードソースを テーブル「Ptname」の全レコードをSELECTする様に変更。 後半で、その テーブル「Ptname」 の データを フォーム上にレコードを表示しながら ← レコードを使用している状態 その表示しているかも知れないレコードに対し、レコード編集 を行っています。 好ましい順番としては OnError ResumeNext 'レコードソースを空にする recSource = PCurrentform.RecordSource PCurrentform.RecordSource = "" 'レコード更新 db.Execute "UPDATE " & Ptname & " SET 表示 = false "", dbFailOnerror If Error.Number = 0 Then 'レコード更新成功 PCurrentform.RecordSource = Ptname Else 'レコード更新失敗 PCurrentform.RecordSource = recSource End If の様になるかと。 直接関係ないですが RecordSouce ではなく Filter で 制御しても良いと思いますよ。 |
![]() |
投稿日時: 22/11/15 19:51:44
投稿者: おーさん0729
|
---|---|
Suzu さんの引用: 記述していただいたところをそっくりそのまま変更してみました。 Cの '対象:画面表示されているレコードセットをもつ Set Prsf = PRecordform.Recordset PRecordform.カレント = PRecordform.CurrentRecord ← ここで、「指定した式に、CurrentRecordプロパティに対する正しくない参照が含まれます」のメッセージが、 'レコード更新 db.Execute "UPDATE " & Ptname & " SET 表示 = false "", dbFailOnerror← ここで、「オブジェクトが必要です」のメッセージが、 出ました。 よろしくお願いします。 |
![]() |
投稿日時: 22/11/16 17:06:51
投稿者: Suzu
|
---|---|
引用: そっくりそのまま動くコードは提示していません。 ここまでのコードを書ける方なので、流れの説明の為に、コードを提示しました。 フォームのレコードソースに、変数Ptname のテーブル名のSELECT句を指定 '対象:テーブル全体のレコードセットをもつ PmySQL(1) = "SELECT * FROM " & Ptname & "; " Pcurrentform.RecordSource = PmySQL(1) ※1この段階で、フォーム上には、変数Ptname の全レコードが表示されている '全レコードの[表示]をfalseにする PmySQL(1) = "UPDATE " & Ptname & " SET " & Ptname & ".表示 = false " PmySQL(1) = PmySQL(1) & "WHERE (((" & Ptname & ".表示)=True)); " db.Execute PmySQL(1) によって 変数Ptname の全レコードの 表示フィールドの値 を False に変更している ※1 で表示しているレコードに対しても、値更新を掛けており ※1 の内容と、テーブルに保存されているレコードに齟齬が発生しうる。 ※2 フォームのレコードロックの設定次第では、 カレントレコード周辺のレコードについては レコードロックが掛かり False への更新が失敗する可能性がある ※3 Refresh で画面更新を行い、 テーブルの変更内容を画面に反映しようとしている。 でも、初めから更新する事が判っているから、 ※1 の段階の処理は不要 更新後に、レコードソースを指定した方が効率的 ------------------------------------------------------------------------------------------ 提示したコードの解説としては エラーが発生した場合でも、次の処理を進める OnError ResumeNext 'レコードソースを空にする ※2 の レコードがロックされるのを回避 既存のレコードソース を変数 recSource に保持 recSource = PCurrentform.RecordSource レコードソースを空にする PCurrentform.RecordSource = "" 'レコード更新 変数Ptname の全レコードの 表示フィールドの値 を False に変更している db.Execute "UPDATE " & Ptname & " SET 表示 = false "", dbFailOnerror エラーが発生しているか判定 If Error.Number = 0 Then 'レコード更新成功 レコードソースに、テーブルを指定 表示されるレコードは、SELECT * FROM 〜と同じなので 直接テーブルを指定 PCurrentform.RecordSource = Ptname Else 'レコード更新失敗 レコードソースを元に戻す PCurrentform.RecordSource = recSource End If --------------------------------------------------------------- 上記コードは FileMaker作成物のAccessでの再現について https://www.moug.net/faq/viewtopic.php?t=81858 での 引用: については考慮していません。 同時使用者が同じ Ptname を 開いている場合、フィールド「表示」の True/False だけで レコードの表示/非表示を行っては ダメですよね? ・開いているユーザー名等も、そのレコードに保存する ・別に表示用のテーブルを用意(ユーザー名、レコードID、表示/非表示の状態) : などの方策が必要でしょう。 クライアント/サーバー タイプでは、 誰かが レコードを操作している可能性を考慮した仕組みを構築する必要があります。 そういう意味では、全レコードに対し処理 を行う場合は特に注意が必要です。 |
![]() |
投稿日時: 22/11/25 20:28:57
投稿者: おーさん0729
|
---|---|
[quote="Suzu"] 引用: すみません。遅くなりました。 これを見て、使用者Aが検索かけて、使用者Bが起動すると検索内容を共有(同じ画面になってしまう)することに気づきました。(このことで四苦八苦してました) 使用者Aと使用者Bは違うことをするので、別々の内容が表示される必要があります。 やはり、表示用テーブルを作って、データ変更したら、元のテーブルに反映をする というのが一番ですかね... |
![]() |
投稿日時: 22/12/11 23:02:14
投稿者: おーさん0729
|
---|---|
ありがとうございました。 |