• Dùng các phương thức Find của Recordset
  • Dùng các phương thức Find của Recordset

    Noname > 30-08-10, 10:00 AM

    Tác giả: Phatnq2002- DanKeToan
    Trong bài này, tôi sẽ nói việc sử dụng các phương thức Find của một đối tượng Recordset thuộc thư viện DAO.

    Trước tiên, xin lưu ý trong thư viện ADO cũng có đối tượng Recordset, nhưng phương thức Find của đối tượng này sẽ khác với phương thức Find của DAO.Recordset.

    Có bốn phương thức Find của DAO.Recordset:
    - FindFirst: khi gọi phương thức này, con trỏ record sẽ nhảy ngay về record đầu tiên và tiến hành việc tìm kiếm record đầu tiên thỏa điều kiện tìm. Trong trường hợp recordset không có record nào (RecordCount = 0) thì phương thức này sẽ gây ra một lỗi khi gọi nó.
    - FindNext: khi gọi phương thức này, việc tìm kiếm sẽ thực hiện bắt đầu từ vị trí record mà con trỏ record đang đứng đến record cuối cùng. Cũng tương tự như FindFirst, Trong trường hợp recordset không có record nào (RecordCount = 0) thì phương thức này sẽ gây ra một lỗi khi gọi nó. Ngoài ra nếu khi đã con trỏ record duyệt tới record EOF (End of File) mà phương thức này được gọi thì sẽ xảy ra một lỗi.
    - FindPrevious: khi gọi phương thức này, việc tìm kiếm sẽ thực hiện bắt đầu từ vị trí record mà con trỏ record đang đứng trở về record đầu tiên. Cũng tương tự như FindFirst, Trong trường hợp recordset không có record nào (RecordCount = 0) thì phương thức này sẽ gây ra một lỗi khi gọi nó. Ngoài ra nếu khi đã con trỏ record duyệt tới record BOF (Begin of File) mà phương thức này được gọi thì sẽ xảy ra một lỗi.
    - FindLast: khi gọi phương thức này, con trỏ record sẽ nhảy ngay về record cuối cùng và tiến hành việc tìm kiếm record đầu tiên thỏa điều kiện tìm nhưng ngược từ dưới lên. Trong trường hợp recordset không có record nào (RecordCount = 0) thì phương thức này sẽ gây ra một lỗi khi gọi nó.

    Cách gọi phương thức:
    đối_tượng_recordset.FindFirst điều_kiện
    đối_tượng_recordset.FindNext điều_kiện
    đối_tượng_recordset.FindPreviuos điều_kiện
    đối_tượng_recordset.FindLast điều_kiện


    Trong đó điều_kiện là chuỗi thể hiện nội dung tìm kiếm.

    Để minh họa cho cách sử dụng các phương thức trên, chúng ta đặt ra một bài toán sau:
    Giả sử chúng ta thiết kế một form nhập liệu danh sách khách hàng (makh, tenkh, diachi). Trong form này có một nút Tìm (cmdFind). Khi nhấn nút này sẽ cho hiện ra một form khác để người sử dụng nhập vào tên khách hàng cần tìm (textbox tenkh) và 3 nút: Thi hành (cmdFind), Tìm tiếp (cmdFindNext) và Thôi (cmdClose).
    Khi nhấn nút Thi hành sẽ cho thực hiện một thủ tục, trong đó tìm kiếm xem có khách hàng nào thỏa mãn điều kiện tìm không. Nếu có thì cho hiển thị thông tin của khách hàng đó ở form KhachHang. Nếu không thì báo là không tìm thấy.
    Khi nhấn nút Tiếp, sẽ cho thực hiện một thủ tục xem có khách hàng nào còn thỏa mãn điều kiện tìm không. Nếu có thì cho hiển thị thông tin của khách hàng đó ở form KhachHang. Nếu không thì báo là không còn tìm thấy.
    Nút Thôi chủ yếu là đóng form Tim lại mà thôi.
    Bây giờ vào code đây:

    Bước 1: ở form KhachHang, thiết lập thủ tục sự kiện Click cho nút lệnh cmdFind như sau:
    DoCmd.OpenForm "TIM" ' Để cho hiển thị form Tim

    Bước 2: Ở form Tim, trong khu vực Declaration (tức là dưới dòng lệnh Option Explicit và/hoặc Option Compare Database), cho dòng lệnh khai báo sau:
    Dim st As String, rs As DAO.Recordset

    Thiết lập các thủ tục sự kiện sau:


    Mã PHP:
    Private Sub Form_Load ()
        
    Set rs Forms("KHACHHANG").RecordsetClone ' gán dữ liệu nguồn của form KhachHang vào recordset
        End Sub

        Private Sub cmdFind_Click ()
        st = "tenkh LIKE '
    *" & tenkh & "*'" 'dùng toán tử LIKE để tìm kiếm tương đối
        On Error 
    GoTo loi_Find
        rs
    .FindFirst st
        
    If rs.NoMatch Then ' nếu không tìm thấy
        MsgBox "Không tìm thấy."
        Else
        Forms("KHACHHANG").Bookmark = rs.Bookmark '
    cho hiển thị lên form KhachHang thông tin khách đã tìm thấy
        End 
    If
        
    thoat_Find:
        Exit 
    Sub
        loi_Find
    :
        
    MsgBox "Lỗi. Có thể danh sách khách hàng đang trống."
        
    Resume thoat_Find
        End Sub 
    Mã PHP:
    Private Sub cmdFindNext_Click ()
        
    On Error GoTo loi_FindNext
        rs
    .FindNext st
        
    If rs.NoMatch Then ' nếu không tìm thấy nữa
        MsgBox "Không còn tìm thấy."
        Else
        Forms("KHACHHANG").Bookmark = rs.Bookmark '
    cho hiển thị lên form KhachHang thông tin khách đã tìm thấy
        End 
    If
        
    thoat_FindNext:
        Exit 
    Sub
        loi_FindNext
    :
        
    MsgBox "Lỗi. Có thể danh sách khách hàng đang trống."
        
    Resume thoat_FindNext
        End Sub

        
    Private Sub cmdClose_Click ()
        
    DoCmd.Close acFormMe.Name
        End Sub 

    Trên chỉ là những đoạn code chính, các bạn có thể thêm mắm muối vào cho hợp ý mình.
  • RE: Dùng các phương thức Find của Recordset

    chigonvh > 19-10-15, 10:03 AM

    Cho e hỏi làm thế nào để biết mình đang ở record đầu hay cuối. Ví dụ đang ở record đầu thì nút Previous sẽ disabled, ở record cuối thì nút Next sẽ disabled. (Cho giống với access). 
    Thank!
  • RE: Dùng các phương thức Find của Recordset

    tranthanhan1962 > 20-10-15, 12:19 AM

    (19-10-15, 10:03 AM)chigonvh Đã viết: Cho e hỏi làm thế nào để biết mình đang ở record đầu hay cuối. Ví dụ đang ở record đầu thì nút Previous sẽ disabled, ở record cuối thì nút Next sẽ disabled. (Cho giống với access). 
    Thank!

    Ở đầu: rs.BOF (Beginning Of Fields)
    Ở cuối: rs.EOF (Ending Of Fields)