データテーブルに半角カナで保存されているフィールドを50音検索するサンプルです。
SQLのWhere句に Tool.KanaSearchFilterStringメソッドの戻り値を付ければ
データテーブル以外にもデータベースに対しても50音検索できます。
Public Class Form1 Private _tbl As DataTable Public Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 'テストデータ作成 Call CreateTestData() End Sub 'テストデータ作成 Private Sub CreateTestData() Dim tbl As New DataTable tbl.Columns.Add("Kana", GetType(String)) tbl.Rows.Add(New Object() {"ア"}) tbl.Rows.Add(New Object() {"カ"}) tbl.Rows.Add(New Object() {"サ"}) tbl.Rows.Add(New Object() {"タ"}) tbl.Rows.Add(New Object() {"ナ"}) tbl.Rows.Add(New Object() {"ハ"}) tbl.Rows.Add(New Object() {"マ"}) tbl.Rows.Add(New Object() {"ヤ"}) tbl.Rows.Add(New Object() {"ラ"}) tbl.Rows.Add(New Object() {"ワ"}) Me._tbl = tbl End Sub Private Sub rdoKana_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles rdoKana_All.CheckedChanged _ , rdoKana_A.CheckedChanged _ , rdoKana_Ka.CheckedChanged _ , rdoKana_Sa.CheckedChanged _ , rdoKana_Ta.CheckedChanged _ , rdoKana_Na.CheckedChanged _ , rdoKana_Ha.CheckedChanged _ , rdoKana_Ma.CheckedChanged _ , rdoKana_Ya.CheckedChanged _ , rdoKana_Ra.CheckedChanged _ , rdoKana_Wa.CheckedChanged _ , rdoKana_Other.CheckedChanged If DirectCast(sender, RadioButton).Checked = False Then Return End If Dim kana As Tool.KanaSearchType If rdoKana_A.Checked Then kana = Tool.KanaSearchType.A ElseIf rdoKana_Ka.Checked Then kana = Tool.KanaSearchType.Ka ElseIf rdoKana_Sa.Checked Then kana = Tool.KanaSearchType.Sa ElseIf rdoKana_Ta.Checked Then kana = Tool.KanaSearchType.Ta ElseIf rdoKana_Na.Checked Then kana = Tool.KanaSearchType.Na ElseIf rdoKana_Ha.Checked Then kana = Tool.KanaSearchType.Ha ElseIf rdoKana_Ma.Checked Then kana = Tool.KanaSearchType.Ma ElseIf rdoKana_Ya.Checked Then kana = Tool.KanaSearchType.Ya ElseIf rdoKana_Ra.Checked Then kana = Tool.KanaSearchType.Ra ElseIf rdoKana_Wa.Checked Then kana = Tool.KanaSearchType.Wa ElseIf rdoKana_Other.Checked Then kana = Tool.KanaSearchType.Other End If Dim sFilter As String = String.Empty sFilter = Tool.KanaSearchFilterString("Kana", kana, Tool.KanaSearchDataType.DataTable) Dim row() As DataRow = Me._tbl.Select(sFilter) Console.WriteLine("【{0}】", kana.ToString) For Each r As DataRow In row Console.WriteLine(r.Item(0)) Next End Sub End Class
Public Class Tool ''' <summary> ''' 50音検索の検索文字 ''' </summary> ''' <remarks></remarks> Public Enum KanaSearchType A = 1 Ka = 2 Sa = 3 Ta = 4 Na = 5 Ha = 6 Ma = 7 Ya = 8 Ra = 9 Wa = 10 Other = 11 End Enum ''' <summary> ''' 50音検索するデータ種 ''' </summary> ''' <remarks></remarks> Public Enum KanaSearchDataType Oracle = 1 SQLServer = 2 Access = 3 DataTable = 4 End Enum ''' <summary> ''' 50音検索を行うフィルター文字列を作成します。 ''' </summary> ''' <param name="sFieldNm">50音検索を行うフィールド名</param> ''' <param name="kana">検索するカナ</param> ''' <param name="dataType">検索するデータ種</param> ''' <returns></returns> ''' <remarks> ''' </remarks> Public Shared Function KanaSearchFilterString(ByVal sFieldNm As String, ByVal kana As KanaSearchType, ByVal dataType As KanaSearchDataType) As String 'Oracle SubStr 'DataTable SubString 'SQLServer SubString 'Access Mid Dim funcNm As String Select Case dataType Case KanaSearchDataType.Oracle funcNm = "Substr" Case KanaSearchDataType.Access funcNm = "Mid" Case Else funcNm = "SubString" End Select Dim sFilter As String = String.Empty If kana = KanaSearchType.A Then sFilter = "{0}({1},1,1) in ('ア','イ','ウ','エ','オ','ァ','ィ','ゥ','ェ','ォ')" ElseIf kana = KanaSearchType.Ka Then sFilter = "{0}({1},1,1) in ('カ','キ','ク','ケ','コ')" ElseIf kana = KanaSearchType.Sa Then sFilter = "{0}({1},1,1) in ('サ','シ','ス','セ','ソ')" ElseIf kana = KanaSearchType.Ta Then sFilter = "{0}({1},1,1) in ('タ','チ','ツ','テ','ト')" ElseIf kana = KanaSearchType.Na Then sFilter = "{0}({1},1,1) in ('ナ','ニ','ヌ','ネ','ノ')" ElseIf kana = KanaSearchType.Ha Then sFilter = "{0}({1},1,1) in ('ハ','ヒ','フ','ヘ','ホ')" ElseIf kana = KanaSearchType.Ma Then sFilter = "{0}({1},1,1) in ('マ','ミ','ム','メ','モ')" ElseIf kana = KanaSearchType.Ya Then sFilter = "{0}({1},1,1) in ('ヤ','ユ','ヨ','ャ','ュ','ョ')" ElseIf kana = KanaSearchType.Ra Then sFilter = "{0}({1},1,1) in ('ラ','リ','ル','レ','ロ')" ElseIf kana = KanaSearchType.Wa Then sFilter = "{0}({1},1,1) in ('ワ','ヲ','ン')" ElseIf kana = KanaSearchType.Other Then sFilter = "{1} IS NULL OR {0}({1},1,1) not in ('ア','イ','ウ','エ','オ','ァ','ィ','ゥ','ェ','ォ'" & _ ",'カ','キ','ク','ケ','コ'" & _ ",'サ','シ','ス','セ','ソ'" & _ ",'タ','チ','ツ','テ','ト'" & _ ",'ナ','ニ','ヌ','ネ','ノ'" & _ ",'ハ','ヒ','フ','ヘ','ホ'" & _ ",'マ','ミ','ム','メ','モ'" & _ ",'ヤ','ユ','ヨ','ャ','ュ','ョ'" & _ ",'ラ','リ','ル','レ','ロ'" & _ ",'ワ','ヲ','ン')" End If If Not String.IsNullOrEmpty(sFilter) Then sFilter = String.Format(sFilter, funcNm, sFieldNm) End If Return sFilter End Function End Class
0 件のコメント:
コメントを投稿