質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

1319閲覧

Access 削除したデータを検索にかけた時に表示しないようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/06/19 05:42

##質問内容
伝票管理システムを作成しています。
顧客マスタでサブフォームの帳票でレコードごとに削除ボタンがあり、押すと論理削除で
テーブルには入っているけどフォームでは表示しないようにしているのですが、マスタのヘッダーにある検索ボタンを押したときに、論理削除したデータは検索対象から外したいのですがどうすればよいでしょうか。

##概要
マスタフォームには顧客番号、顧客名、住所で検索できるようにしてあります。

削除時の手順
ボタンを押す

顧客マスタを参照しているテーブルにあるYes/No型のF_DeleteFlagというフィールドにチェックが入る

フォーム上では表示されなくなる

VBA

1'---------------------------- 2'削除ボタン使用時 3'---------------------------- 4 5Private Sub Button_Delete_Click() 6 7 'レコードを削除する 8 9 Dim lans As Long 10 11 lans = MsgBox("削除してもよろしいですか?", vbYesNo + vbInformation, "確認") 12 13 If lans = vbNo Then 14 Exit Sub 15 End If 16 17 '削除フラグにチェックを入れる 18 19 Dim SQL As String 20 21 SQL = "UPDATE T_Customer SET F_DeleteFlag = True WHERE F_CustomerCode = """ & Me!F_CustomerCode & """ And F_DeleteFlag = False" 22 23 With Application.CurrentDb 24 .Execute SQL 25 End With 26 27 'チェックが入っているレコード非表示にする 28 29 Form.Filter = "F_DeleteFlag = False" 30 Form.FilterOnLoad = True 31 32 'レコード数をカウントする 33 34 Dim total As String 35 36 total = DCount("F_CustomerCode", "T_Customer", "F_DeleteFlag = False") 37 38 Forms!F_CustomerMaster.Text_Num = total + "件" 39 40End Sub

こんな感じで動かしています

これをマスタの中で検索をするときに論理削除したデータは検索対象にしないようにしたいです。

VBA

1'---------------------------- 2'検索ボタン使用時 3'---------------------------- 4 5Private Sub Button_Search_Click() 6 7 Dim total As String 8 9 'フィルタをかける 10 11 Me!Sub_CustomerMaster.Form.Filter = "1=1 " 12 13 '顧客番号 14 If Nz(Me!Text_CustomerCode, "") = "" Then 15 Else: Me!Sub_CustomerMaster.Form.Filter = Me!Sub_CustomerMaster.Form.Filter + "and F_CustomerCode like ""*" & Text_CustomerCode & "*""" 16 End If 17 18 '顧客名 19 If Nz(Me!Text_CustomerName, "") = "" Then 20 Else: Me!Sub_CustomerMaster.Form.Filter = Me!Sub_CustomerMaster.Form.Filter + "and F_CustomerName like ""*" & Text_CustomerName & "*""" 21 End If 22 23 '住所 24 If Nz(Me!Text_Address, "") = "" Then 25 Else: Me!Sub_CustomerMaster.Form.Filter = Me!Sub_CustomerMaster.Form.Filter + "and F_Address like ""*" & Text_Address & "*""" 26 End If 27 28 Me!Sub_CustomerMaster.Form.FilterOn = True 29 30 'フィルタをかけた結果が0件だったらメッセージボックスを表示する 31 32 If Sub_CustomerMaster.Form.Recordset.RecordCount = 0 Then 33 34 MsgBox "検索条件に該当するデータは見つかりませんでした。" 35 36 End If 37 38 '件数更新 39 40 total = DCount("F_CustomerCode", "T_Customer", Me!Sub_CustomerMaster.Form.Filter) 41 42 Me.Text_Num = total + "件" 43 44End Sub

検索ボタンを押したときの処理です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

すでにBAは出ているようですが、気になったので。

検索ボタン使用時の処理の中に、フィルターに"1=1 "を設定している箇所がありますが、
これは絶対にtrueになる条件で、フィルターとしての意味はありません。
ではなぜそのように書いてあるのかというと、なんでもいいから確定で入るフィルター条件があると、
条件を追加する際に全て"AND"から書き始められるからです。
-6/21 23:30修正-
(これがないと検索条件ごとに"AND"を付けるかどうかの判定が発生します)
仮にフィルターに"1=1 "を設定しない場合、検索条件を指定するとフィルターが必ず"AND"から始まってしまうため、
"AND"を除去する処理が必要になります。
もちろんこれは「この書き方の場合」ですので、常にこのように書くべきかは別のお話です。
-修正終わり-

本題ですが、検索結果に削除済みのデータを一切表示しないのであれば、
その"1=1 "を"F_DeleteFlag = True "に書き換えるのが一番楽かと思います。

投稿2019/06/21 12:36

編集2019/06/21 14:32
Volrath

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/06/21 13:11

> なんでもいいから確定で入るフィルター条件があると、条件を追加する際に全て"AND"から書き始められるからです。 好みの問題です。必ず先頭のANDを除去するのでもいいわけですし。
Volrath

2019/06/21 13:32

> 好みの問題です。 そうですね。ただ元の記述がそうなっているので、この場合はその修正でいいのではないかと思いそのように書きました。 また今後のために何故そのように書いてあるのかを説明しただけで、常にそうするべきという意味の解答ではありません。誤解を招く表現がありましたらお手数ですが指摘いただけると有難いです。
Volrath

2019/06/21 13:39

ああ、失礼しました。以下の文がよくないですね。少し考えて修正しておきます。 > (これがないと検索条件ごとに"AND"を付けるかどうかの判定が発生します)
退会済みユーザー

退会済みユーザー

2019/06/24 00:13

回答ありがとうございます。 >F_DeleteFlag = True だと、削除したデータだけが出てくると思うのですが。。。
guest

0

T_Customer テーブルからクエリを作成して、F_DeleteFlag = False の抽出条件を設定します。

sql

1SELECT T_Customer.* FROM T_Customer WHERE F_DeleteFlag = False;

このクエリを保存して、フォームのレコードソースにすれば、コードは現状のままでOKです。
このようなクエリを作成しておけば、その他のフォームやレポート、あるいは集計クエリなどのソースとしてこのクエリを使用すれば、その都度、 F_DeleteFlag = False という条件を付加する必要がなくなるので管理しやすくなります。(クエリ自体はテーブルと同様に扱えますので)

これとは、別に

sql

1SELECT T_Customer.* FROM T_Customer WHERE F_DeleteFlag = True;

というクエリも作成しておいて、削除済みレコードを復活させたり、完全に削除したりする管理用フォームのレコードソースとするといいでしょう。

クエリを使う場合のメリット

saziさんの回答のようフォームの Filterプロパティの抽出条件に F_DeleteFlag = False という条件式を追加すれば希望の結果を得ることはできます。

しかし、Accessの場合、テーブルデータは他の場面でも使いまわすものです。印刷するときはレポートのレコードソースとして使います。集計したい場合は、テーブルから集計クエリを作成します。その場合も論理削除したレコードは除外する必要があります。テーブルを使うたびに、F_DeleteFlag = False という条件式を追加する必要があります。これを忘れると想定外の結果になります。

テーブルからクエリを作成してそこにF_DeleteFlag = Falseという抽出条件を設定して保存します。これをフォームやレポートのレコードソースにしたり、集計クエリのソースにすれば、いちいち、F_DeleteFlag = False という条件式を追加する必要がなくなります。

投稿2019/06/19 06:48

編集2019/06/20 14:33
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/19 08:02 編集

新しくクエリを作るという事でしょうか
hatena19

2019/06/19 09:47

そうです。それをテーブル代わりにフォームやレポートのレコードソースにするということです。 また、集計クエリ等で集計するときもそのクエリから作成すれば、論理削除のレコードを排除する条件を付ける必要がないです。
guest

0

ベストアンサー

Filterの条件に"And F_DeleteFlag = False"を追加して下さい。

こんな感じで。

VBA

1Private Sub Button_Search_Click() 2 3 Dim total As String 4 Dim wFilter As String 5 'フィルタをかける 6 wFilter = "" 7 '顧客番号 8 If Nz(Me!Text_CustomerCode, "") <> "" Then 9 wFilter = wFilter & " and F_CustomerCode like ""*" & Text_CustomerCode & "*""" 10 End If 11 12 '顧客名 13 If Nz(Me!Text_CustomerName, "") <> "" Then 14 wFilter = wFilter & " and F_CustomerName like ""*" & Text_CustomerName & "*""" 15 End If 16 17 '住所 18 If Nz(Me!Text_Address, "") <> "" Then 19 wFilter = wFilter & " and F_Address like ""*" & Text_Address & "*""" 20 End If 21 22 Me!Sub_CustomerMaster.Form.Filter = "F_DeleteFlag = False" & wFilter 23 Me!Sub_CustomerMaster.Form.FilterOn = True 24 25 'フィルタをかけた結果が0件だったらメッセージボックスを表示する 26 27 If Sub_CustomerMaster.Form.Recordset.RecordCount = 0 Then 28 29 MsgBox "検索条件に該当するデータは見つかりませんでした。" 30 31 End If 32 33 '件数更新 34 35 total = DCount("F_CustomerCode", "T_Customer", Me!Sub_CustomerMaster.Form.Filter) 36 37 Me.Text_Num = total + "件" 38 39End Sub

投稿2019/06/19 05:57

編集2019/06/20 04:22
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/19 06:02

顧客番号、顧客名、住所それぞれにですか?
sazi

2019/06/19 07:45

全部にする必要はありませんけど、全部に入れてもAND条件なので問題は無いはずです。 冗長なコードにしない為には、コードのリファクタリングをする必要がありますけど、それは質問の本質ではないですよね。
退会済みユーザー

退会済みユーザー

2019/06/19 08:02

Else: Me!Sub_CustomerMaster.Form.Filter = Me!Sub_CustomerMaster.Form.Filter + "and F_Address like ""*" & Text_Address & "*""" の後にそれぞれ付け加えてみましたが、エラーが出て通りません。
退会済みユーザー

退会済みユーザー

2019/06/19 08:05

データとしては、000000の顧客データを論理削除し、検索で000000で検索した時です。
sazi

2019/06/19 10:33 編集

追加したand条件などは空白で区切られた形で追加されているかどうか、生成されたfilterの内容を確認してみてください。
退会済みユーザー

退会済みユーザー

2019/06/20 01:04

"And F_DeleteFlag = False" の時に+を付けるのを忘れていました。付けたら正常に動作しました。
退会済みユーザー

退会済みユーザー

2019/06/20 01:06

検索欄に何も入力していない場合で検索すると、000000のデータも含む検索になってしまいます。 もしよろしければそこのどうしたら対象から外れるか、教えてくれないでしょうか。
sazi

2019/06/20 02:07

それは質問にあるコードでの話ですか? 質問のコードでは、検索欄に何も入力していない場合はフィルターは無条件ですから当然そうなりますよね。 1=1としているところで、000000を除く条件をデフォルトにすれば対象外になりそうですけど。
退会済みユーザー

退会済みユーザー

2019/06/20 04:07

1=1 を And F_DeleteFlag = False にすればいいということでしょうか?
sazi

2019/06/20 04:12

000000を除くというのが、F_DeleteFlag = Falseと同じ意味ならそうです。 ANDは不要ですけど。
sazi

2019/06/20 04:23

研修という事なので、コードはあまり提示しない方が良いと考えていましたが、先に進めないのもどうかと思いましたので、追記しました。
退会済みユーザー

退会済みユーザー

2019/06/21 00:58

追記ありがとうございます。 全ての欄を空白にして検索ボタンを押すと、000000は除外して検索してくれるのですが、000000を入力して検索すると >クエリ式'F_DeleteFlag = Falseand F_CustomerCode like "*000000*"の構文エラー:演算子がありません。 というエラーが出てしまいました。どう対処すればよいでしょうか。
sazi

2019/06/24 00:23 編集

> F_DeleteFlag = Falseand F_CustomerCode F_DeleteFlag = False and F_CustomerCode 直ぐ頼る癖が付くようだと、コードの提示は止めておいた方がよさそうですね・・・
退会済みユーザー

退会済みユーザー

2019/06/21 07:45

そうですか。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問