-
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ỉ. -
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:
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:(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ỉ.
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
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 String, sChuoiTK 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