• Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt
  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    ongke0711 > 17-06-21, 03:09 PM

    (17-06-21, 02:54 PM)tungthoi15 Đã viết: Khi gõ vào Textbox từ có dấu hoặc không dấu mà nó vẫn cho ra kết quả giống nhau thì theo em vẫn nên thêm cột phụ "TENKHONGDAU", Ssau đó sửa câu lệnh tìm kiếm sSQL là:
    Mã:
    sSQL = "Select * From tblNhanVien Where TENKHONGDAU Like '*" & UNItokdau(Me.txtTimTen) & "*'"

    Em đã test thử và cho ra kết quả đều giống nhau; Ví dụ gõ "anh" hay "ánh" thì cho ra cùng kết quả.

    Đối với form TimKiem: bạn gõ từ "Ân" xem, nó cũng sẽ cho ra các từ như gõ từ "An" --> tức nó không loại bỏ các từ có chữ "a" và "ă". 
    Cũng căng nhỉ. 007
  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    tungthoi15 > 17-06-21, 03:13 PM

    (17-06-21, 03:09 PM)ongke0711 Đã viết:
    (17-06-21, 02:54 PM)tungthoi15 Đã viết: Khi gõ vào Textbox từ có dấu hoặc không dấu mà nó vẫn cho ra kết quả giống nhau thì theo em vẫn nên thêm cột phụ "TENKHONGDAU", Ssau đó sửa câu lệnh tìm kiếm sSQL là:
    Mã:
    sSQL = "Select * From tblNhanVien Where TENKHONGDAU Like '*" & UNItokdau(Me.txtTimTen) & "*'"

    Em đã test thử và cho ra kết quả đều giống nhau; Ví dụ gõ "anh" hay "ánh" thì cho ra cùng kết quả.

    Đối với form TimKiem1: bạn gõ từ "Ân" xem, nó cũng sẽ cho ra các từ như gõ từ "An" --> tức nó không loại bỏ các từ có chữ "a" và "ă".
    Cũng căng nhỉ. 007
    Hoặc muốn tìm chính xác khi gõ có dấu trả về tên đúng có dấu y hệt thì theo em là làm thêm cái Option Group (em đặt là opChon), gồm 2 lựa chọn là: 1 là "Tìm có dấu" và 2 là "tìm Không dấu", rồi thêm code:
    Mã:
    Select Case Ophchon
    [/size]
    Case 1 ' Tim co dau va tim chinh xac
    sSQL = "Select * From tblNhanVien Where Ten Like '" & Me.txtTimTen & "'"
    Case 2
    sSQL = "Select * From tblNhanVien Where TenKhongDau Like '*" & Me.txtTimTen & "*'"
    End Select
        Me.sfmNhanVien.Form.RecordSource = sSQL
    [size=x-small]    Me.sfmNhanVien.Requery
  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    ongke0711 > 17-06-21, 03:21 PM

    007 Thực ra thì khi gõ 1 từ mà nó hiện kết quả liệt kê các từ có dấu, không dấu chứa từ khoá đó đã là đặt yêu cầu tìm kiếm lắm rồi. Áp dụng vô ứng dụng cũng ngon rồi đó.
    Nếu thêm tuỳ chọn thì lại không thuận tiện co thao tác tìm kiếm cho lắm nhưng cũng thực tế. Thường là thêm tuỳ chọn: Bắt đầu với từ (begin with...) , chứa từ (contain...), bằng (equal...),... 
    Tôi thấy giải pháp của bạn phù hợp đó.
  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    ledangvan > 17-06-21, 05:28 PM

  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    ongke0711 > 17-06-21, 06:01 PM

    (17-06-21, 05:28 PM)ledangvan Đã viết: https://www.mediafire.com/file/e3zzdl0kz...1.mdb/file

    Cái phần tìm không dấu anh khỏi dùng cột phụ mà dùng hàm vào luôn câu lệnh như bạn tungthoi15 có sửa lại ở bài #5 rồi đó.

    Mã PHP:
    sSQL "Select * From tblNhanVien Where UNItokdau(tblNhanVien.Ten) Like '*" Me.txtTimTen "*'" 
  • RE: Tìm kiếm bằng từ không dấu, trả về kết quả là từ có dấu tiếng Việt

    ongke0711 > 18-06-21, 01:03 AM

    Đối với bài toán tìm kiếm tên có dấu tiếng Việt này thì cách chung là chuyển đổi về không dấu hết để tìm được tất cả các trường hợp giống từ khoá (tìm gần đúng). Như lúc đầu tôi có nói là dùng kết hợp với một cách mới trong câu lệnh SQL để tìm kiếm mà ít người sử dụng đó là: dùng dấu ngoặc vuông [...] để chứa các giá trị để tìm kiếm lần lượt.
    Ví dụ: 

    SELECT * FROM Table1 WHERE Name Like 'D[aáâầă]n' ==> Khi đó Access sẽ tìm lần lượt các từ khoá như: {Dan, Dán, Dân, Dần, Dăn}

    Trong Demo dưới đây tôi cũng dùng kỹ thuật trên và thêm cái thủ thuật để giới hạn lại số record trả về gần đúng hơn một mức nữa so với cách chuyển về tiếng Việt không dấu.
    Ví dụ: 
    + Khi gõ chữ "a" --> sẽ tìm toàn bộ [ a á â ă ắ... ]
    + Khi gõ chứ "â" --> sẽ giới hạn tìm kiếm, chỉ tìm [ â ấ ầ ậ ẫ ẩ ]


    Link demo: https://drive.google.com/file/d/1gcpZgBA...sp=sharing

    Code:

    Mã PHP:
    Option Compare Database
    Option Explicit

    Private Sub txtTimTen_AfterUpdate()
    '// Dùng dau ngoac vuong [] trong cau lenh LIKE cua SQL
    '
    Ví du: ... Like D[aâã...]n  --> Like 'Dan''Dân''Dãn',...

        Dim sSQL As StringsChuoiTK As String

        Select 
    Case Me.frmKieuTK
        
    Case 1
            sChuoiTK 
    = getVowelStr(Me.txtTimTen)
        Case 2
            sChuoiTK 
    = Me.txtTimTen
        End Select

        sSQL 
    "Select * From tblNhanVien Where Ten Like '*" sChuoiTK "*' Order By Ten"
        Me.sfmNhanVien.Form.RecordSource sSQL
        Me
    .sfmNhanVien.Requery
        
    End Sub 


    Mã PHP:
    '// Hàm tong hop chuoi nguyen am voi các dau thanh: [aáàâ...], [eéèê...]
    Function getVowelStr(txt As Variant) As String

        If Len(Nz(txt, "")) = 0 Then
            getVowelStr = ""
            Exit Function
        End If
        
        Dim dic As Object, arrKeyList() As Variant, arrItemList() As Variant
        Dim aa$, a$, a1$, a2$, e$, e1$, i$, o$, o1$, o2$, u$, u1$, y$, d$
        
        Set dic = CreateObject("Scripting.Dictonary")

        a = "a" & ChrW(224) & ChrW(225) & ChrW(227) & ChrW(7841) & ChrW(7843)                  '
    a
        a1 
    ChrW(226) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853)      
        a2 = "" & ChrW(259) & ChrW(7855) & ChrW(7857) & ChrW(7859) & ChrW(7861) & ChrW(7863)      '
    a-"
        e = "
    e" & ChrW(232) & ChrW(233) & ChrW(7865) & ChrW(7867) & ChrW(7869)                  'e
        e1 = ChrW(234) & ChrW(7871) & ChrW(7873) & ChrW(7875) & ChrW(7877) & ChrW(7879)      'ê
        i = "
    i" & ChrW(236) & ChrW(237) & ChrW(297) & ChrW(7881) & ChrW(7883)
        o = "
    o" & ChrW(242) & ChrW(243) & ChrW(245) & ChrW(7885) & ChrW(7887)
        o1 = ChrW(244) & ChrW(7889) & ChrW(7891) & ChrW(7893) & ChrW(7895) & ChrW(7897)
        o2 = ChrW(417) & ChrW(7899) & ChrW(7901) & ChrW(7903) & ChrW(7905) & ChrW(7907)
        u = "
    u" & ChrW(249) & ChrW(250) & ChrW(361) & ChrW(7909) & ChrW(7911)
        u1 = ChrW(432) & ChrW(7913) & ChrW(7915) & ChrW(7917) & ChrW(7919) & ChrW(7921)
        y = "
    y" & ChrW(253) & ChrW(7923) & ChrW(7925) & ChrW(7927) & ChrW(7929)
        d = "
    d" & ChrW(273)

        arrKeyList = Array("
    a", "a1", "a2", "e", "e1", "o", "o1", "o2", "u", "u1", "y", "d")
        arrItemList = Array(a, a1, a2, e, e1, o, o1, o2, u, u1, y, d)

        Dim k As Integer
        For k = 0 To UBound(arrKeyList)
            dic.Add arrKeyList(k), arrItemList(k)
        Next k
        
        Dim t As Integer, retTxt As String, v As Variant, flag As Boolean
        retTxt = ""
        For t = 1 To Len(txt)
            flag = False
            For Each v In dic.Keys
                If InStr(dic.Item(v), Mid$(txt, t, 1)) > 0 Then
                    Select Case v
                    Case "
    a"
                        retTxt = retTxt & "
    [" & dic.Item("a") & dic.Item("a1") & dic.Item("a2") & "]"
                    Case "
    e"
                        retTxt = retTxt & "
    [" & dic.Item("e") & dic.Item("e1") & "]"
                    Case "
    o"
                        retTxt = retTxt & "
    [" & dic.Item("o") & dic.Item("o1") & dic.Item("o2") & "]"
                    Case "
    u"
                        retTxt = retTxt & "
    [" & dic.Item("u") & dic.Item("u1") & "]"
                    Case Else
                        retTxt = retTxt & "
    [" & dic.Item(v) & "]"
                    End Select
                    flag = True
                End If
            Next v
            If flag = False Then
                retTxt = retTxt & Mid$(txt, t, 1)
            End If
        Next t

        getVowelStr = retTxt
     
    End Function 


    [Hình: timtuTV.gif]