Tuzke95 > 07-12-15, 06:52 PM
ongke0711 > 07-12-15, 08:45 PM
Tuzke95 > 08-12-15, 12:38 AM
(07-12-15, 08:45 PM)ongke0711 Đã viết: Cách của tôi làm sẽ là:
- Chọn TOP 40 thí sinh trong danh sách với điều kiện số phòng là NULL.
- Sau đó UPDATE số phòng cho danh sách (40) này.
- Chọn tiếp TOP 40 thí sinh còn lại và làm tương tự đến hết danh sách.
Bạn tham khảo thử.
ongke0711 > 08-12-15, 03:44 PM
Private Sub cmdChiaPhong_Click()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset
Dim strSoTSChuaChia As String
Dim intSoTSPhong As Integer
intSoTSPhong = Nz(Me.txtSoTSPhong, 0)
Set db = CurrentDb
Set rs1 = db.OpenRecordset("PHONG", dbOpenDynaset)
If rs1.RecordCount <> 0 Then
rs1.MoveFirst
Else
MsgBox "Chua có danh sách phòng thi"
Exit Sub
End If
Do Until rs1.EOF
strSoTSChuaChia = "SELECT TOP " & intSoTSPhong & " * FROM THISINH WHERE SoPhong Is Null ORDER BY SBD"
Set rs2 = db.OpenRecordset(strSoTSChuaChia, dbOpenDynaset)
If rs2.RecordCount <> 0 Then
rs2.MoveFirst
Do Until rs2.EOF
rs2.Edit
rs2!SoPhong = rs1!SoPhong
rs2.Update
rs2.MoveNext
Loop
Else
MsgBox "Da phân bô het danh sách thí sinh cho các phòng"
Exit Sub
End If
rs2.Close
Set rs2 = Nothing
rs1.MoveNext
Loop
rs1.Close
Set rs1 = Nothing
Me.sfrmDanhSach.Requery
End Sub
Tuzke95 > 10-12-15, 12:08 PM
(08-12-15, 03:44 PM)ongke0711 Đã viết: Để tôi nói rõ hơn về cách giải: Dùng query dạng "SELECT TOP N" để lọc từ danh sách ra số thí sinh cho từng phòng. Ví dụ của bạn là 40 người/ phòng thì sẽ là "SELECT TOP 40 * FROM THISINH WHERE SoPhong Is Null ORDER BY SBD". [SoPhong] Is Null là để cho bước sau này khi bạn cập nhật [SoPhong] cho danh sách đầu tiên này rồi thì danh sách này sẽ được loại ra cho lần query TOP 40 kế tiếp, cho đến khi hết danh sách thí sinh.
Cách làm:
- Trong file demo tôi dựa trên 2 table của bạn là [THISINH] và [PHONG]. Table THISINH có cột [SoPhong] để trống, có 14 thí sinh. Table PHONG xem như đã có dữ liệu 5 phòng thi. Tôi ví dụ phân bổ 3 thí sinh/phòng thi, phòng cuối sẽ có 2 thí sinh.
- Code của nút lệnh [Chia phòng] như bên dưới.
- Các phần thiết kế khác, bẫy lỗi bạn tự làm cho nó hoàn chỉnh nhé.
Mã PHP:Private Sub cmdChiaPhong_Click()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset
Dim strSoTSChuaChia As String
Dim intSoTSPhong As Integer
intSoTSPhong = Nz(Me.txtSoTSPhong, 0)
Set db = CurrentDb
Set rs1 = db.OpenRecordset("PHONG", dbOpenDynaset)
If rs1.RecordCount <> 0 Then
rs1.MoveFirst
Else
MsgBox "Chua có danh sách phòng thi"
Exit Sub
End If
Do Until rs1.EOF
strSoTSChuaChia = "SELECT TOP " & intSoTSPhong & " * FROM THISINH WHERE SoPhong Is Null ORDER BY SBD"
Set rs2 = db.OpenRecordset(strSoTSChuaChia, dbOpenDynaset)
If rs2.RecordCount <> 0 Then
rs2.MoveFirst
Do Until rs2.EOF
rs2.Edit
rs2!SoPhong = rs1!SoPhong
rs2.Update
rs2.MoveNext
Loop
Else
MsgBox "Da phân bô het danh sách thí sinh cho các phòng"
Exit Sub
End If
rs2.Close
Set rs2 = Nothing
rs1.MoveNext
Loop
rs1.Close
Set rs1 = Nothing
Me.sfrmDanhSach.Requery
End Sub
Có đúng yêu cầu của bạn chưa?
File demo: PhanBoPhongThi.accdb
ongke0711 > 10-12-15, 01:29 PM
tranthanhan1962 > 14-12-15, 08:03 PM
(07-12-15, 06:52 PM)Tuzke95 Đã viết: Chào mọi người. hiện tại mình đang làm 1 bài tập về quản lý tuyển sinh và có một vấn đề mong mọi người giúp đỡ.
Mình muốn hỏi nếu muốn chia phòng thi theo danh sách thí sinh đã có và danh sách phòng thi muốn phân số thí sinh này theo SBD vào mỗi phòng có 40 người thì mọi người có giải pháp nào không ạ?
Dưới đây là file của mình.
http://www.mediafire.com/download/3s1vhq...DHXD.accdb
Cảm ơn !
ongke0711 > 14-12-15, 08:53 PM
tranthanhan1962 > 15-12-15, 07:28 PM
(14-12-15, 08:53 PM)ongke0711 Đã viết: Thật không thể tin được!! cái query của anh Ân hay quá!
Anh giải thích rõ thêm chút về công thức này được không. Theo em suy luận thì nó sẽ ra số lẻ nhưng cập nhật vô số phòng thì chẳn.
VD: Số báo danh là 3 => ((3-1)/40)=0.05+1=1.05
ongke0711 > 15-12-15, 10:25 PM