<Access Like演算子でパターンマッチングしてみた>
どうも、三流プログラマーのKen3です。 最近、質問もらうけど、 なかなか、解答できてない三流プログラマーのKen3です。 ※私のレベルで手に余る高度な質問が多くて。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba126.lzh にdb126.mdb(Access2000版)が保存されています。/* * 1. 今回のキッカケ */
ヤバイ・・・ほったらかしの問題が、多いんだよね。 http://www.ken3.org/backno/backno_vba22.html#107 の No.107 Access サブフォームの明細データを検索、メインを移動 で、 メンバーを検索、親のグループを移動、なんて処理を作ったんだけど、 イロイロと課題を残したままでした。 まぁ、クリアしたい課題は、 テーブルにはフルネームで入っているけど検索は一部でしたい (複数レコードが該当(メンバー名で同じ名前)した場合) なんて感じの処理かなぁ。 親テーブル名:T_バンド名 バンドID オートナンバー バンド名称 テキスト 備考 メモ型 子テーブル名:T_メンバー 個人ID オートナンバー バンドID 長整数型(親テーブルとリンクする) 名前 文字型 楽器 文字型 出身地 文字型 生年月日 日付型 *今回関係ないけど 備考 文字型 *今回関係ないけど と、テーブルがあって、データが (野球のデータ入れるけどカンベンしてね、あっ阪神優勝おめでとう・・・) テストデータ 親テーブル名:T_バンド名 ^^^^^^^^^^^^ バンドID バンド名称 備考 1 BOOWY 伝説のバンド? 2 てすと モーニング娘はメンバー多いしバンドじゃないし(笑) 3 てすとですよ う〜ん、音楽関係、無知(笑) 4 プロ野球 野球選手 テストデータ 子テーブル名:T_メンバー ^^^^^^^^^^^^ 個人ID バンドID 名前 楽器 出身地 生年月日 備考 1 1 氷室 群馬 2 1 布袋 群馬 3 1 松井 群馬 4 1 高橋 福島 5 2 Ken3 東京 6 2 ZZZ 神奈川 7 2 AAA 東京 8 3 ジャガイモ 北海道 9 3 リンゴ 青森 10 3 メロン 北海道 11 3 コメ 新潟 12 2 高橋 愛 どこ? 13 4 高橋 雅裕 不明 14 4 高橋よしのぶ 不明 15 4 高橋ひさのり 不明 なんて感じのデータがあった時、 名前の検索で、高橋が指定された時に、 現在のDlookupで検索だと、対応できない。 今回は、リストボックスを使って、選択してみたいと思います。 --- 枠外・余談 --- 高橋と言えば高橋 雅裕でしょ(オイオイ) 高橋 愛?ダレそれ?・・・オイオイ 高橋と言えば、思い浮かぶのは、人それぞれだと思います。 プロ野球だと、高橋よしのぶ/ひさのり(漢字知らなくて(笑)) 高橋 雅裕?ってダレって人も多いと思います。 名古屋電気高から大洋ホエルズに83(4)〜 96年に千葉ロッテへ移籍 Ken3が好きだった選手の一人なんですね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ ピーク時は、 88年は遊撃手としては打率.293、守備率.989と12球団トップだったが、 タイトルは全て立浪に持っていかれる。 ※88〜89年、山下を超える連続守備機会無失策の新記録(353)も達成したが、 翌年からは、あれ?ポロポロと失策王の道へ、、外野へコンバート? 月刊ホエールズの「まーちゃんのおしゃべり泥棒」なんてのもあったなぁ。 今、名ショートと言えば、ヤクルト宮本選手や巨人の川相選手って感じだけど。/* * 2.データが複数存在するかDCount関数とLike演算子で判断する */
まずは、データが複数存在するか、判断しますか。 元のソースは、
Private Sub btn検索_Click() Dim str検索条件 As String Dim str検索されたID As String 'フォームの値を元に検索条件を作成する str検索条件 = "名前 = '" & Me!txt検索 & "'" 'str検索条件を条件にバンドIDをT_メンバーテーブルから検索する str検索されたID = "" & DLookup("バンドID", "T_メンバー", str検索条件) '結果のテスト表示 If str検索されたID = "" Then '検索できなかった? MsgBox Me!txt検索 & "は、見つかりませんでした" Else 'データを移動させる DoCmd.GoToControl "バンドID" 'コントロールをIDへ移動 DoCmd.FindRecord str検索されたID 'データを検索する End If End Sub |
Private Sub btn検索_Click() Dim str検索条件 As String Dim str検索されたID As String Dim nRCNT As Integer '検索されたレコード数 'フォームの値を元に検索条件を作成する 'Like演算子と*を前後に勝手に付けるNo.126で追加、ついでにtrimも str検索条件 = "名前 Like '*" & Trim(Me!txt検索) & "*'" 'データを条件指定で検索して、該当数を求める nRCNT = DCount("名前", "T_メンバー", str検索条件) '検索結果によって、処理を分ける Select Case nRCNT Case 0: 'レコード数=0 見つからなかった str検索されたID = "" 'IDに見つからなかった印として、""を代入 MsgBox Me!txt検索 & "は、見つかりませんでした" Case 1: '1件見つかった(単独の時) 'str検索条件を条件にバンドIDをT_メンバーテーブルから検索する str検索されたID = "" & DLookup("バンドID", "T_メンバー", str検索条件) '↑バンドIDがほしかったので、DLookupでバンドIDを検索する Case Is >= 2: '2件以上の時(Case Elseでも可能) '複数データがあったので、別フォームから選択させる MsgBox "複数見つかったよ、選んでね" End Select 'データを移動させる If str検索されたID <> "" Then 'バンドIDがセットされている? DoCmd.GoToControl "バンドID" 'コントロールをIDへ移動 DoCmd.FindRecord str検索されたID 'データを検索する End If End Sub |
Function SELECT_メンバー名() Dim stDocName As String Dim stLinkCriteria As String str選択バンドID = "" 'グローバル変数の初期化 stDocName = "F_名前選択" 'acDialog指定でフォームを開く DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog 'フォーム終了後、 SELECT_メンバー名 = str選択バンドID 'リターン値として返す End Function |
Private Sub btnキャンセル_Click() DoCmd.Close '何もしないで閉じる End Sub |
Private Sub btn選択_Click() 'リストボックスの値をグローバルにセットする str選択バンドID = Me!lst名前.Value '↑連結列でリストボックス(1列目)はバンドIDにしてあるので '値をそのまま代入してみた 'フォームを閉じる DoCmd.Close '閉じる End Sub |
Private Sub btn検索_Click() Dim str検索条件 As String Dim str検索されたID As String Dim nRCNT As Integer '検索されたレコード数 'フォームの値を元に検索条件を作成する 'Like演算子と*を前後に勝手に付けるNo.126で追加、ついでにtrimも str検索条件 = "名前 Like '*" & Trim(Me!txt検索) & "*'" 'データを条件指定で検索して、該当数を求める nRCNT = DCount("名前", "T_メンバー", str検索条件) '検索結果によって、処理を分ける Select Case nRCNT Case 0: 'レコード数=0 見つからなかった str検索されたID = "" 'IDに見つからなかった印として、""を代入 MsgBox Me!txt検索 & "は、見つかりませんでした" Case 1: '1件見つかった(単独の時) 'str検索条件を条件にバンドIDをT_メンバーテーブルから検索する str検索されたID = "" & DLookup("バンドID", "T_メンバー", str検索条件) '↑バンドIDがほしかったので、DLookupでバンドIDを検索する Case Is >= 2: '2件以上の時(Case Elseでも可能) '複数データがあったので、別フォームから選択させる MsgBox "複数見つかったよ、選んでね" str検索されたID = SELECT_メンバー名() '複数選択のフォーム処理 End Select 'データを移動させる If str検索されたID <> "" Then 'バンドIDがセットされている? DoCmd.GoToControl "バンドID" 'コントロールをIDへ移動 DoCmd.FindRecord str検索されたID 'データを検索する End If End Sub |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]