-
Cùng nhau giải toán Tìm Kiếm và Lọc
Xuân Thanh > 08-09-21, 07:18 PM
Mời các bạn đam mê VBA cùng nhau giải bài toàn Tìm Kiếm và Lọc dưới đây để giúp một bạn trong Forum
1/ Cấu trúc File
- Table tblCustomer chỉ có một field CompanyName chứa danh sách khách hàng thân thuộc của Công ty
- Table tblResult chỉ có một field Match
- Form frmFinter có một textbox txtValue và một button btnFind
2/ Yêu cầu bài toán và lời giải
- Nhập một cụm từ khóa vào ô textbox txtValue trên form. Cụm từ khóa có độ dài bất kỳ tư 1 đến 5 từ, Sau khi nhấn button btnFind thì Lọc tắt cả các khách hàng có các từ trùng với tất cả các từ của cụm từ khóa dù cho nó nằm ở bất kỳ vị trí nào rồi append vào tblRessult
3/ Ví dụ : Cụm từ khóa "xây dựng Bình An" thì kết quả sau append là
Công ty TNHH xây dựng Bình An
Công ty đâu tư xây dựng và thương mại An Binh Nam
Công ty cổ phần dịch vụ xây dựng Hoàng Bình An
....
P/s : Đưa ra biện pháp (Thuật toán ) để giải và viết code cho btnFind -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
tungthoi15 > 08-09-21, 09:12 PM
Phải thừa nhận bài toán của bác khó thật. -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
ongke0711 > 08-09-21, 10:43 PM
Giải thuật chưa test nhé anh Thanh.
- Đưa tất cả từ khoá vô mảng (dùng hàm Split).
- Duyệt từng phần tử mảng và nối chuỗi SQL tìm kiếm.
Vd:
Mã PHP:arrTuKhoa = Split(txtValue, " ")
sSQL = Select CompanyName From tblCustomer Where 1=1"
sWhere = ""
For i=0 to Ubound(arrTuKhoa)
sWhere = sWhere & " AND CompanyName Like '*" & arrTuKhoa(i) & "*'"
Next i
sSQL = sSQL & sWhere
CurrentDB.Execute "INSERT INTO tblResult " & sSQL, dbFailOnError -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
paulsteigel > 08-09-21, 11:12 PM
(08-09-21, 10:43 PM)ongke0711 Đã viết: Giải thuật chưa test nhé anh Thanh.
- Đưa tất cả từ khoá vô mảng (dùng hàm Split).
- Duyệt từng phần tử mảng và nối chuỗi SQL tìm kiếm.
Vd:
Mã PHP:arrTuKhoa = Split(txtValue, " ")
sSQL = Select CompanyName From tblCustomer Where 1=1"
sWhere = ""
For i=0 to Ubound(arrTuKhoa)
sWhere = sWhere & " AND CompanyName Like '*" & arrTuKhoa(i) & "*'"
Next i
sSQL = sSQL & sWhere
CurrentDB.Execute "INSERT INTO tblResult " & sSQL, dbFailOnError
Bài toán này sao cụ Xuân thanh không tư vấn cho bạn ý dùng listbox, vì thực sự chạy query như vậy sẽ làm tốn tài nguyên, vì listbox có thuộc tính recordsource hiện ngay lên! -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
ongke0711 > 08-09-21, 11:34 PM
-
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
paulsteigel > 08-09-21, 11:48 PM
(08-09-21, 11:34 PM)ongke0711 Đã viết:
(08-09-21, 11:12 PM)paulsteigel Đã viết: Ông Kẹ phải dùng OR mới đúng chứ, sao lại là AND
Tại thấy đề bài có ghi "có các từ trùng với tất cả các từ của cụm từ khóa dù cho nó nằm ở bất kỳ vị trí nào" nên em suy ra là phải cùng lúc có đủ các từ => AND
Tôi xóa câu comment đó rùi - mắt nhanh hơn não! giờ già nên đọc mà não không kịp kiểu ông Kẹ ạ! -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
Xuân Thanh > 09-09-21, 12:31 AM
(08-09-21, 10:43 PM)ongke0711 Đã viết: Giải thuật chưa test nhé anh Thanh.
- Đưa tất cả từ khoá vô mảng (dùng hàm Split).
- Duyệt từng phần tử mảng và nối chuỗi SQL tìm kiếm.
Vd:
Mã PHP:arrTuKhoa = Split(txtValue, " ")
sSQL = Select CompanyName From tblCustomer Where 1=1"
sWhere = ""
For i=0 to Ubound(arrTuKhoa)
sWhere = sWhere & " AND CompanyName Like '*" & arrTuKhoa(i) & "*'"
Next i
sSQL = sSQL & sWhere
CurrentDB.Execute "INSERT INTO tblResult " & sSQL, dbFailOnError
Giải thuật thì OK rồi nhưng hình như cái sSQL có vấn đề, ongke nói rõ hơn cho bạn í hiểu không? -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
Xuân Thanh > 09-09-21, 12:34 AM
(08-09-21, 11:12 PM)paulsteigel Đã viết: Bài toán này sao cụ Xuân thanh không tư vấn cho bạn ý dùng listbox, vì thực sự chạy query như vậy sẽ làm tốn tài nguyên, vì listbox có thuộc tính recordsource hiện ngay lên!
Dùng Listbox thì hiện ngay kết quả nhưng chắc vì bạn í muốn dùng cho công việc khác nữa nên mới phải Insert vô table khác để dùng -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
ongke0711 > 09-09-21, 11:04 AM
(09-09-21, 12:31 AM)Xuân Thanh Đã viết: Giải thuật thì OK rồi nhưng hình như cái sSQL có vấn đề, ongke nói rõ hơn cho bạn í hiểu không?
Code:
Mã PHP:Private Sub cmdFind_Click()
Dim arrTuKhoa() As String
Dim sSQL As String, sWhere As String, i As Integer
arrTuKhoa = Split(Me.txtValue)
sSQL = "Select CompanyName From tblCustomers Where 1=1"
sWhere = ""
For i = 0 To UBound(arrTuKhoa)
sWhere = sWhere & " AND CompanyName Like '*" & arrTuKhoa(i) & "*'"
Next i
sSQL = sSQL & sWhere
CurrentDb.Execute "INSERT INTO tblResult " & sSQL, dbFailOnError
MsgBox "Xong."
End Sub
Không biết nó báo lỗi gì về biến sSQL vậy anh Thanh?
Giải thích code:
- Muốn tìm tên Cty có chứa từ khoá thì dùng Like "*Từ khoá*". Do đó tìm lần lượt từng Record xem record nào có từ khoá đang gõ.
- Muốn tìm tên Cty trùng với tất cả các từ khoá đã gõ thì dùng toán tử AND nối từng chuỗi SQL
- Sau khi nối chuỗi thì câu lệnh SQL nó ra như sau:
Mã PHP:sWhere = AND CompanyName Like '*xây*' AND CompanyName Like '*dựng*' AND CompanyName Like '*Bình*' AND CompanyName Like '*An*'
sSQL = Select CompanyName From tblCustomers Where 1=1 AND CompanyName Like '*xây*' AND CompanyName Like '*dựng*' AND CompanyName Like '*Bình*' AND CompanyName Like '*An*'
INSERT INTO tblResult Select CompanyName From tblCustomers Where 1=1 AND CompanyName Like '*xây*' AND CompanyName Like '*dựng*' AND CompanyName Like '*Bình*' AND CompanyName Like '*An*' -
RE: Cùng nhau giải toán Tìm Kiếm và Lọc
paulsteigel > 09-09-21, 02:43 PM
(09-09-21, 11:04 AM)ongke0711 Đã viết: arrTuKhoa = Split(Me.txtValue)
Ông kẹ ơi, không cần thiết phải có 1=1 đâu, chỉ cần sqlWhere = mid(sqlWhere,4) để bỏ từ khóa AND đầu chuỗi đi. Nếu để 1=1 thì tốc độ sẽ bị chậm chút ít. Lệnh execute sẽ chạy theo điều kiện mà ông kẹ làm rồi! Có tìm được thì đẩy vào, không có thì thôi!
sSQL = "Select CompanyName From tblCustomers Where 1=1"