Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Phân chia phòng thi trong access
#1
Heart 
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 !
Chữ ký của Tuzke95 Tuzke95,gia nhập Thủ Thuật Access từ 07-12 -15.
Reply
Những người đã cảm ơn
#2
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ử.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname
#3
(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ử.

Mình chưa hiểu lắm. bạn có thể bớt chút thời gian giúp mình trong file  được không ?
Chữ ký của Tuzke95 Tuzke95,gia nhập Thủ Thuật Access từ 07-12 -15.
Reply
Những người đã cảm ơn
#4
Để 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.Recordsetrs2 As DAO.Recordset
   Dim strSoTSChuaChia 
As String
   Dim intSoTSPhong 
As Integer
   
   intSoTSPhong 
Nz(Me.txtSoTSPhong0)
   
   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(strSoTSChuaChiadbOpenDynaset)
       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]


Có đúng yêu cầu của bạn chưa?

File demo: PhanBoPhongThi.accdb
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Tuzke95 , maidinhdan
#5
(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.Recordsetrs2 As DAO.Recordset
   Dim strSoTSChuaChia 
As String
   Dim intSoTSPhong 
As Integer
   
   intSoTSPhong 
Nz(Me.txtSoTSPhong0)
   
   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(strSoTSChuaChiadbOpenDynaset)
       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]


Có đúng yêu cầu của bạn chưa?

File demo: PhanBoPhongThi.accdb

Hình như cách chia của bạn chưa phân bố thí sinh đều theo phòng được có phòng nhiều phòng lại quá ít. bạn xem lại giúp mình với
Chữ ký của Tuzke95 Tuzke95,gia nhập Thủ Thuật Access từ 07-12 -15.
Reply
Những người đã cảm ơn
#6
[/quote]

Hình như cách chia của bạn chưa phân bố thí sinh đều theo phòng được có phòng nhiều phòng lại quá ít. bạn xem lại giúp mình với
[/quote]

1. Tôi cũng không hiểu bạn nhìn thông số nào mà nói là có phòng nhiều , phòng ít???
Theo ví dụ của tôi là: có 5 phòng thi (từ 1 -5), mỗi phòng 3 người.
Vậy 3 người đầu vô phòng số 1, kế tiếp 3 người vô phòng thứ 2... đến phòng số 5 chỉ còn 2 thí sinh.

2. Số phòng và số thí sinh/phòng: bạn phải tự cung cấp thông tin để hàm tính toán phân bổ.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#7
(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 !

Căn cứ vào yêu cầu của bạn có thể tạo query update để xử lý tương đối đơn giản với công thức sau: x= (([a]-1)\40)+1.
Với x là số phòng, a là số báo danh và 40 là số thí sinh trong 1 phòng.
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn ongke0711 , maidinhdan , Tuzke95
#8
Thật không thể tin được!! 007 007  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
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#9
(14-12-15, 08:53 PM)ongke0711 Đã viết: Thật không thể tin được!! 007 007  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
 

Đây chỉ là một phép tính suy ra thừa số. Phòng thi có 40 thí sinh thì số phòng sẽ bằng phần chẳn số báo danh chia cho 40. Ví dụ số báo danh là 46 thì 46\40=1(dấu\ chỉ lấy phần chẳn giá trị được chia. Ví dụ 46/40=1,15 - nhưng 46\40=1), số báo danh là 215 thì 215\40=5. Nhưng do số phòng đầu tiên là 1 nên số báo danh 18 theo công thức sẽ có số phòng 18\40=0 là không đúng vì vậy số phòng sẽ là (18\40)+1=phòng 1. Một điều nữa là các số chia chẳn cho 40 thuộc về phòng liền trước vì vậy số báo danh phải trừ cho 1
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn ongke0711 , maidinhdan
#10
Bây giờ mới biết cái dấu "\" này là lấy phần nguyên  007 .
Đúng là mình dở toán thiệt. Nếu anh Ân không giải thích chắc bây giờ cũng chưa hiểu luôn ...Thumbs_up
Cái Query này đúng là theo kiểu "Suy nghĩ phức tạp, hành động đơn giản" đây, còn cách của mình là "Think simple but do complicated"  007 007
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
Photo [Hỏi] Mở Form trên access 2007 báo lỗi jason 5 195 22-11-16, 09:23 AM
Bài mới nhất: jason
  [Help] Giúp đỡ về cách xóa nội dung trong một field nam8384 2 119 17-10-16, 08:43 PM
Bài mới nhất: toancvp
  [Hỏi] Sử dụng chuột giữa trong subform là report. toancvp 10 360 12-10-16, 01:01 AM
Bài mới nhất: toancvp
  Chèn file văn bản word vào access danhxetnghiem 10 456 11-10-16, 03:42 PM
Bài mới nhất: danhxetnghiem
  Lọc theo điều kiện trong listbox Ranju 3 183 06-10-16, 05:26 PM
Bài mới nhất: Ranju

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ