• Cùng nhau giải toán Tìm Kiếm và Lọc
  • 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

    (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
  • 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 StringsWhere As StringAs Integer
        
        arrTuKhoa 
    Split(Me.txtValue)
        sSQL "Select CompanyName From tblCustomers Where 1=1"
        sWhere ""
        For 0 To UBound(arrTuKhoa)
            sWhere sWhere " AND CompanyName  Like '*" arrTuKhoa(i) & "*'"
        Next i
        sSQL 
    sSQL sWhere
        
        CurrentDb
    .Execute "INSERT INTO tblResult " sSQLdbFailOnError
        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=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=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)
        sSQL = "Select CompanyName From tblCustomers Where 1=1"
        
    Ô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!