Đó hỏi: Em muốn nhờ e-CHÍP hướng dẫn em cách tạo chương trình trắc nghiệm bằng Access. virion32@ Đây trả lời: Tôi xin trình bày một ví dụ đơn giản nhưng rất cơ bản để từ đó bạn có thể tự "chíp" theo ý đồ của mình. Ví dụ: số câuhỏi cho mỗi lần trắc nghiệm là 30 (được chọn ngẫu nhiên từ ngân hàng câu hỏi), chọn 1 trong 4 đáp án. Giả sử ứng dụng Access có tên là DataTN.MDB. Bạn tạo một table có tên NganHangCauHoi để chứa ngân hàng các câu hỏi, có cấu trúc như bảng 1. Bảng này chứa số lượng không hạn chế các câu hỏi, mỗi câuhỏi được đánh số tự động, và có 4 mục tin (TraLoi1, TraLoi2, TraLoi3, TraLoi4) chứa nội dung 4 câu trả lời mà thí sinh có thể chọn. Mục tin DapAnDung chứa số thứ tự (từ 1 đến 4) của câu trả lời đúng. Mục tin DaDuocChon dùng để đánh dấu câuhỏi nào đã được chọn trong quá trình lựa chọn ngẫu nhiên 30 câuhỏi dùng cho bộ đề. Bạn cần phải thiết kế một form để nhập liệu vào bảng này. Tương tự, bạn cần tạo bảng DeThiVaKetQua như trong bảng 2 để chứa bộ đề 30 câu hỏi. Bảng này có mục tin DapAnDuocChon cho biết thí sinh đã chọn câu trả lời nào trong 4 câu trả lời được phép. Giả sử: trả lời đúng được 1 điểm, trả lời sai được 0 điểm. Tạo một query có tên qryDeThiVaKetQua như hình 2 để làm Record Source cho form trắc nghiệm. Sau khi thiết kế xong cấu trúc các bảng, việc đầu tiên bạn nên làm là nhập hơn 30 câuhỏi vào ngân hàng câu hỏi. Bạn thiết kế biểu mẫu trắc nghiệm như trong hình 1. Khi thiết kế biểu mẫu này, cần lưu ý: Đặt thuộc tính AllowAdditions của form là No. Thuộc tính Locked của ô SoThuTu và NoiDung là Yes. Đặt tên cho frame chứa 4 đáp án là grpTraLoi. Đặt tên cho các label liên kết với mỗi option thuộc grpTraLoi lần lượt là lblTraLoi1, lblTraLoi2, lblTraLoi3, lblTraLoi4 theo thứ tự từ trên xuống. Đặt tên cho 2 nút lệnh Kết quả và Chọn đề là cmdKetQua và cmdChonDe. Xong, bạn gõ vào đoạn mã 1 (xử lý tình huống). Đoạn mã 1 Private Sub Form_Current() ‘ Nội dung 4 đáp án liệt kê mỗi lần chuyển sang câu khác lblTraLoi1.Caption = Me.TraLoi1 lblTraLoi2.Caption = Me.TraLoi2 lblTraLoi3.Caption = Me.TraLoi3 lblTraLoi4.Caption = Me.TraLoi4 grpTraLoi = Me.DapAnDuocChon End Sub Private Sub grpTraLoi_Click() Me.DapAnDuocChon = grpTraLoi ‘ Khi thí sinh chọn đáp án End Sub Private Sub cmdChonDe_Click() Dim db As Database, tbDeThi As Recordset, tbNganHang As Recordset Dim rsTamThoi As Recordset Dim nSoLuongCau As Byte, I As Byte, sSQL As String Dim nTongSoCauTrongNH As Long, nSoNgauNhien As Long nSoLuongCau = 30 ' Giả sử 30 câu Set db = CurrentDb ' Tạm thời không kiểm tra trường hợp số lượng câuhỏi cần chọn có lớn hơn ' hay bằng tổng số câu trong ngân hàng đề thi không Set tbNganHang = db.OpenRecordset("NganHangCauHoi") tbNganHang.MoveFirst If tbNganHang.EOF Then MsgBox "Không có câuhỏi trong ngân hàng dữ liệu đề thi !" tbNganHang.Close db.Close Exit Sub End If ' Xóa đề trước đó sSQL = "DELETE * FROM DeThiVaKetQua;" db.Execute sSQL ' Tính tổng số câuhỏi trong ngân hàng đề thi sSQL = "SELECT Max(SoThuTu) AS TongSoCauHoi FROM NganHangCauHoi" Set rsTamThoi = db.OpenRecordset(sSQL) rsTamThoi.MoveFirst nTongSoCauTrongNH = rsTamThoi!TongSoCauHoi rsTamThoi.Close Set tbDeThi = db.OpenRecordset("DeThiVaKetQua") ' Tạo đề mới tbNganHang.Index = "SoThuTu" For I = 1 To nSoLuongCau Do While True nSoNgauNhien = Int((nTongSoCauTrongNH * Rnd) + 1) ‘ Chọn số thứ tự ngẫu nhiên tbNganHang.Seek "=", nSoNgauNhien If Not tbNganHang.NoMatch Then ' chắc chắn tìm thấy If Not tbNganHang!DaDuocChon Then ' Câu này chưa chọn tbDeThi.AddNew tbDeThi!SoThuTu = I tbDeThi!NoiDung = tbNganHang!NoiDung tbDeThi!TraLoi1 = tbNganHang!TraLoi1 tbDeThi!TraLoi2 = tbNganHang!TraLoi2 tbDeThi!TraLoi3 = tbNganHang!TraLoi3 tbDeThi!TraLoi4 = tbNganHang!TraLoi4 tbDeThi!DapAnDung = tbNganHang!DapAnDung tbDeThi!DapAnDuocChon = 0 tbDeThi.Update ' Đánh dấu đã chọn câu này để đưa vào bộ đề thi rồi tbNganHang.Edit tbNganHang!DaDuocChon = True tbNganHang.Update Exit Do End If End If Loop Next tbDeThi.Close ' Đánh dấu chưa được chọn đối với các câuhỏi trong ngân hàng đề thi tbNganHang.Close sSQL = "UPDATE NganHangCauHoi SET DaDuocChon = False WHERE DaDuocChon = True" db.Execute (sSQL) db.Close ' Bộ đề mới đã tạo xong, hiển thị lại trên biểu mẫu Me.Requery SoThuTu.SetFocus ‘ Để có thể disable nút Chọn đề cmdChonDe.Enabled = False ‘ Không cho chọn đề khác nữa End Sub Private Sub cmdKetQua_Click() Dim nTongDiem As Byte, rs As Recordset Set rs = Me.Recordset nTongDiem = 0 With rs .MoveFirst While Not .EOF nTongDiem = nTongDiem + IIf(!DapAnDuocChon = !DapAnDung, 1, 0) .MoveNext Wend .MoveFirst End With MsgBox "Tổng số điểm đạt được là: " & nTongDiem, vbInformation, Me.Caption Set rs = Nothing End Sub Bảng 1: Cấu trúc bảng NganHangCauHoi Field Name Type Size Ghi chú SoThuTu AutoNumber 4 Primary Key NoiDung Memo 0 TraLoi1 Text 50 TraLoi2 Text 50 TraLoi3 Text 50 TraLoi4 Text 50 DapAnDung Number/Byte 1 Từ 1 đến 4 DaDuocChon Yes/No 1 Bảng 2: Cấu trúc bảng DeThiVaKetQua Field Name Type Size Ghi chú SoThuTu Number/Byte 1 NoiDung Memo 0 TraLoi1 Text 50 TraLoi2 Text 50 TraLoi3 Text 50 TraLoi4 Text 50 DapAnDung Number/Byte 1 Từ 1 đến 4 DapAnDuocChon Number/Byte 1 Hình 1: Form trắc nghiệm Hình 2: Query cho form . TongSoCauHoi FROM NganHangCauHoi" Set rsTamThoi = db.OpenRecordset(sSQL) rsTamThoi.MoveFirst nTongSoCauTrongNH = rsTamThoi!TongSoCauHoi rsTamThoi.Close. Recordset Dim rsTamThoi As Recordset Dim nSoLuongCau As Byte, I As Byte, sSQL As String Dim nTongSoCauTrongNH As Long, nSoNgauNhien As Long nSoLuongCau = 30 '