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 
![[Hình: ChiaPhongThi.png]](http://www.upsieutoc.com/images/2015/12/08/ChiaPhongThi.png)
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
 
  cái query của anh Ân hay quá!
  cái query của anh Ân hay quá! 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
 .
 .
 
 