• Thứ Năm, 12/06/2008 17:31 (GMT+7)

    Tạo cross-link listbox trong MS Access

    Câu hỏi :
    Tôi gặp một trở ngại không thể nào giải quyết với chương trình Access: chuơng trình có 1 combobox hiển thị tên "Huyện/ thành phố" và 1 combobox hiển thị tên “Xã/ phường”, khi chọn một huyện/thành phố trong combobox 1 thì trong combobox 2 chỉ có các xã/phường liên quan hiện ra mà thôi.

    Trả lời :

    Cách giải quyết thích hợp nhất cho vấn đề của bạn là xây dựng 2 table dữ liệu sau:
     - 1 table (có tên là "TenHuyen") chứa nhiều record, mỗi record miêu tả 1 huyện gồm ít nhất 2 field: HuyenID và TenHuyen.
     - 1 table (có tên là TenXa) chứa thông tin về các xã/phường, mỗi record dữ liệu đặc tả 1 xã/phường nào đó trong 1 huyện/thành phố nào đó. Mỗi record có ít nhất 2 field: HuyenID, TenXa.
     Khi chạy, đầu tiên chương trình sẽ đọc nội dung table TenHuyen, duyệt từng record trong bảng này, lấy field TenHuyen và "add" vào ComboBox cboTenHuyen để người dùng chọn lựa. Mỗi khi người dùng chọn 1 huyện nào đó, chương trình sẽ truy tìm tất cả record trong table TenXa có field HuyenID tương ứng với tên huyện mà người dùng vừa chọn. Sau khi tìm được các record tên xã mong muốn, chương trình sẽ "add" từng tên xã vào ComboxBox cboTenXa để người dùng chọn lựa sau đó.
     Sau đây là đoạn code VBA để thiết lập nội dung 2 ComboBox theo yêu cầu của bạn:
     Option Compare Database
     'thiết lập nội dung cho ComboBox huyện
     Private Sub Form_Load()
     Dim Connection As New ADODB.Connection
     Dim RecordSet As New ADODB.RecordSet
     'Tạo connection tới database nguồn
     Connection.Open "DSN=DBHuyenXa"
     'Tạo recordset chứa các record của table TenHuyen
     RecordSet.Open "TenHuyen", Connection, adOpenStatic, adLockReadOnly, adCmdTable
     'Xóa nội dung ComboBox cboTenHuyen
     cboTenHuyen.RowSource = ""
     'duyệt từng record của table TenHuyen
     While Not RecordSet.EOF
     'add tên huyện trong record hiện hành vào ComboBox
     cboTenHuyen.AddItem RecordSet.Fields("TenHuyen").Value
     RecordSet.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet.Close
     Connection.Close
     End Sub
     
     'thủ tục xử lý chọn 1 huyện trong ComboBox cboTenHuyen
     '==> thiết lập nội dung cho ComboBox xã
     Private Sub cboTenHuyen_Click()
     Dim Connection As New ADODB.Connection
     Dim RecordSet As New ADODB.RecordSet
     Dim Command As New ADODB.Command
     Dim HuyenID As Integer
     'Tạo connection tới database nguồn
     Connection.Open "DSN=DBHuyenXa"
     'Tạo recordset chứa các record của table TenHuyen
     RecordSet.Open "TenHuyen", Connection, adOpenStatic, adLockReadOnly, adCmdTable
     'duyệt tìm mã HuyenID của huyện được chọn
     Do While Not RecordSet.EOF
     If RecordSet.Fields("TenHuyen").Value = cboTenHuyen.SelText Then
     HuyenID = RecordSet.Fields("HuyenID").Value
     Exit Do
     End If
     RecordSet.MoveNext
     Loop
     'đóng các đối tượng đã dùng lại
     RecordSet.Close
     'thiết lập nội dung cho đối tượng Command
     Command.ActiveConnection = Connection
     Command.CommandText = "SELECT * FROM TenXa WHERE HuyenID = " & HuyenID & " ORDER BY TenXa"
     Command.CommandType = adCmdText
     'thi hành lệnh truy vấn SQL
     Set RecordSet = Command.Execute
     'xóa hết nội dung của ComboBox cboTenXa
     cboTenXa.RowSource = ""
     'duyệt từng record trong Recordset chứa kết quả tìm kiếm
     While Not RecordSet.EOF
     'add tên xã trong record hiện hành vào ComboBox
     cboTenXa.AddItem RecordSet.Fields("TenXa").Value
     RecordSet.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet.Close
     Connection.Close
     End Sub
     

    Chuyên mục: Cơ sở dữ liệu