• 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
  • 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 > 16-06-21, 05:20 PM

    Chào các bạn,

    Từ cái chủ đề gần đây của maidinhdan "Textbox tìm kiếm có gợi ý sau dấu phẩy" (link: https://thuthuataccess.com/forum/thread-11893.html), tôi có một trường hợp tìm kiếm mở rộng nhưng thực tế để các bạn cùng tham gia tìm giải thuật xử lý như thế nào nhé. Vận động trí não cho vui thôi.

    Đối với Access khi gõ từ tìm kiếm thì nó sẽ tìm các từ nào có chứa "chính xác" các ký tự gõ vào.
    Ví dụ: gõ từ "an" --> kết quả trả về sẽ là: An, Anh, Thanh, Lan,....

    Giờ bài tập là gõ từ "an" --> kết quả trả về sẽ là các từ: ÂN, Ấn, Ẩn, Ăn, Ắn, Ánh, Lành, Lan, An, Anh, Thanh, ...
    Tôi có đính kèm file dữ liệu mẫu để các bạn làm cho tiện.
    Ai rảnh thì tham gia cho vui. 007

    *** Qui định là chỉ dùng font Unicode dựng sẵn trong CSDL để xử lý cho đơn giản nhé.


    Link file: https://www.mediafire.com/file/dbvkt06uo...accdb/file

    [Hình: fxmH9Kul.png]


    ===================================================================
    Bổ sung bài giải: 18/6/21

    Các bạn xem bài giải:
    - Bài #4, #5 của bạn tungthoi15
    - Bài #14 của anh ledangvan
    - Bài #16 của tôi.
  • 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

    maidinhdan > 16-06-21, 09:47 PM

    Gửi tặng 2 file, Cũng test sơ sơ... nói chung khó hơn tạo 1 con AL
    Dùng chức năng Import từ file XMLtrong Access để dễ quan sá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 > 16-06-21, 10:04 PM

    (16-06-21, 09:47 PM)maidinhdan Đã viết: Gửi tặng 2 file, Cũng test sơ sơ... nói chung khó hơn tạo 1 con AL
    Dùng chức năng Import từ file XMLtrong Access để dễ quan sát.

    Dùng bộ từ điển tiếng việt có dấu thanh luôn.  007 007

    Nó cũng không phức tạp đến vậy. Cách xử lý này dùng trong SQL Server và Access nhưng ít dùng nên mọi người ít để ý tới.
  • 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, 08:59 AM

    To OngKe0711: Em tạo thêm 1 cột tên mới rồi chuyển từ cột tên có dấu sang thành không dấu là được
    Mã:
    Public Function UNItokdau(str$) As String
        Dim kd$, unI$, i&, skd$, arrkd() As String, stt
        kd = "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,e,e,e,e,e,e,e,e,e,e,e,i,i,i,i,i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,u,u,u,u,u,u,u,u,u,u,u,y,y,y,y,y,d,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,E,E,E,E,E,E,E,E,E,E,E,I,I,I,I,I,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,U,U,U,U,U,U,U,U,U,U,U,Y,Y,Y,Y,Y,D"
        unI = "02250224784302277841025978557857785978617863022678457847784978517853023302327867786978650234787178737875787778790237023678810297788302430242788702457885024478897891789378957897041778997901790379057907025002497911036179090432791379157917791979210253792379277929792502730193019278420195784002587854785678587860786201947844784678487850785202010200786678687864020278707872787478767878020502047880029678820211021078860213788402127888789078927894789604167898790079027904790602180217791003607908043179127914791679187920022179227926792879240272"
        arrkd = Split(kd, ",")
        For i = 1 To Len(str)
    If InStr(unI, AscW(Mid(str$, i, 1))) > 0 And AscW(Mid(str$, i, 1)) > 127 Then
              stt = InStr(unI, AscW(Mid(str$, i, 1))) \ 4
              skd = skd & arrkd(stt)
    Else
                skd = skd & Mid(str, i, 1)
    End If
        Next
        UNItokdau = skd
    End Function

    Function DoiTenKhongDau()
    DoCmd.RunSQL "Update tblNhanVien SET tblNhanvien.TenKhongdau = UNItokdau(tblNhanvien.ten)"
    End Function


    Sau đó ở form tìm kiếm thì tìm ở cột tên không dấu.
    [img][Hình: n9IIdhg.jpg][/img]
    Bác xem có được không?
    https://drive.google.com/file/d/1i_L5KE_...sp=sharing
  • 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, 09:24 AM

    Nghĩ lại thấy mình làm rườm rà quá, chỉ cần sửa mỗi câu lệnh ở Form Tìm Kiếm này là được mà không cần phải thêm cột TenKhongDau nữa

    Mã:
    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 > 17-06-21, 09:50 AM

    (17-06-21, 08:59 AM)tungthoi15 Đã viết: To OngKe0711: Em tạo thêm 1 cột tên mới rồi chuyển từ cột tên có dấu sang thành không dấu là được
    Mã:
    Public Function UNItokdau(str$) As String
        Dim kd$, unI$, i&, skd$, arrkd() As String, stt
        kd = "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,e,e,e,e,e,e,e,e,e,e,e,i,i,i,i,i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,u,u,u,u,u,u,u,u,u,u,u,y,y,y,y,y,d,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,E,E,E,E,E,E,E,E,E,E,E,I,I,I,I,I,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,U,U,U,U,U,U,U,U,U,U,U,Y,Y,Y,Y,Y,D"
        unI = "02250224784302277841025978557857785978617863022678457847784978517853023302327867786978650234787178737875787778790237023678810297788302430242788702457885024478897891789378957897041778997901790379057907025002497911036179090432791379157917791979210253792379277929792502730193019278420195784002587854785678587860786201947844784678487850785202010200786678687864020278707872787478767878020502047880029678820211021078860213788402127888789078927894789604167898790079027904790602180217791003607908043179127914791679187920022179227926792879240272"
        arrkd = Split(kd, ",")
        For i = 1 To Len(str)
    If InStr(unI, AscW(Mid(str$, i, 1))) > 0 And AscW(Mid(str$, i, 1)) > 127 Then
              stt = InStr(unI, AscW(Mid(str$, i, 1))) \ 4
              skd = skd & arrkd(stt)
    Else
                skd = skd & Mid(str, i, 1)
    End If
        Next
        UNItokdau = skd
    End Function

    Function DoiTenKhongDau()
    DoCmd.RunSQL "Update tblNhanVien SET tblNhanvien.TenKhongdau = UNItokdau(tblNhanvien.ten)"
    End Function

    Là một trong các cách xử lý đúng rồi đó.  Thumbs_up
    Cách tiếp cận cũng gần như vậy.

    À quên chưa kiểm tra vụ gõ từ có dấu vào textbox tìm kiếm thì lại tìm không ra.  014
  • 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, 01:00 PM

    ongke0711 anh thấy có một cách nữa là dùng hàm bỏ dấu -> Textbox có dấu cũng biến nó thành ko có dấu rồi làm lệnh tìm kiếm chữ ko dấu thì kể cả đánh có dấu hay ko dấu nó vẫn tìm được
  • 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, 01:38 PM

    (17-06-21, 01:00 PM)ledangvan Đã viết: ongke0711 anh thấy có một cách nữa là dùng hàm bỏ dấu -> Textbox có dấu cũng biến nó thành ko có dấu rồi làm lệnh tìm kiếm chữ ko dấu thì kể cả đánh có dấu hay ko dấu nó vẫn tìm được

    Cũng là cách đúng đó anh. Anh thử gõ từ có dấu xem nó tìm có ra đúng từ có dấu không nhe.
  • 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, 02:32 PM

    (17-06-21, 01:38 PM)ongke0711 Đã viết:
    (17-06-21, 01:00 PM)ledangvan Đã viết: ongke0711 anh thấy có một cách nữa là dùng hàm bỏ dấu -> Textbox có dấu cũng biến nó thành ko có dấu rồi làm lệnh tìm kiếm chữ ko dấu thì kể cả đánh có dấu hay ko dấu nó vẫn tìm được

    Cũng là cách đúng đó anh. Anh thử gõ từ có dấu xem nó tìm có ra đúng từ có dấu không nhe.

    Cũng ra, nhưng nó hơi nhiều kết quả

    https://www.mediafire.com/file/e3zzdl0kz...1.mdb/file
  • 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, 02:54 PM

    (17-06-21, 09:50 AM)ongke0711 Đã viết:
    (17-06-21, 08:59 AM)tungthoi15 Đã viết: To OngKe0711: Em tạo thêm 1 cột tên mới rồi chuyển từ cột tên có dấu sang thành không dấu là được
    Mã:
    Public Function UNItokdau(str$) As String
        Dim kd$, unI$, i&, skd$, arrkd() As String, stt
        kd = "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,e,e,e,e,e,e,e,e,e,e,e,i,i,i,i,i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,u,u,u,u,u,u,u,u,u,u,u,y,y,y,y,y,d,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,E,E,E,E,E,E,E,E,E,E,E,I,I,I,I,I,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,U,U,U,U,U,U,U,U,U,U,U,Y,Y,Y,Y,Y,D"
        unI = "02250224784302277841025978557857785978617863022678457847784978517853023302327867786978650234787178737875787778790237023678810297788302430242788702457885024478897891789378957897041778997901790379057907025002497911036179090432791379157917791979210253792379277929792502730193019278420195784002587854785678587860786201947844784678487850785202010200786678687864020278707872787478767878020502047880029678820211021078860213788402127888789078927894789604167898790079027904790602180217791003607908043179127914791679187920022179227926792879240272"
        arrkd = Split(kd, ",")
        For i = 1 To Len(str)
    If InStr(unI, AscW(Mid(str$, i, 1))) > 0 And AscW(Mid(str$, i, 1)) > 127 Then
              stt = InStr(unI, AscW(Mid(str$, i, 1))) \ 4
              skd = skd & arrkd(stt)
    Else
                skd = skd & Mid(str, i, 1)
    End If
        Next
        UNItokdau = skd
    End Function

    Function DoiTenKhongDau()
    DoCmd.RunSQL "Update tblNhanVien SET tblNhanvien.TenKhongdau = UNItokdau(tblNhanvien.ten)"
    End Function

    Là một trong các cách xử lý đúng rồi đó.  Thumbs_up
    Cách tiếp cận cũng gần như vậy.

    À quên chưa kiểm tra vụ gõ từ có dấu vào textbox tìm kiếm thì lại tìm không ra.  014
    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ả.
    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
    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
        Me.sfmNhanVien.Requery