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:
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
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 acForm, Me.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.
Thấy hay thì vỗ tay, còn dỡ thỉ chê ít ít thôi cho đỡ quê !!!
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:
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
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 acForm, Me.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.
Thấy hay thì vỗ tay, còn dỡ thỉ chê ít ít thôi cho đỡ quê !!!