huymcsa > 13-02-16, 02:56 AM
(12-02-16, 02:57 PM)huymcsa Đã viết:mình đã thử một số cách tự mình nghĩ ra nhưng ko được....mong các ban giúp đỡ(08-02-16, 06:42 PM)ongke0711 Đã viết: Phần liên kết khoanh màu đỏ là các table mặc định của hệ thống, là table ẩn, khi bạn Show Hidden Objects và Show System Objects thì nó sẽ hiện ra. Bạn không cần quan tâm, có thể remove nó khỏi relationship cũng được, mặc định bạn không thể xóa nó được đâu.
(10-02-16, 06:54 PM)ongke0711 Đã viết: Theo như ứng dụng của bạn, cái form bàn giao/ hoàn trả thiết bị là quan trọng nhất trong toàn bộ ứng dụng. Do vậy bạn cần phân tích kỹ một chút các nghiệp vụ, thao tác phát sinh cho nghiệp vụ này mới thiết kế được table, form đáp ứng đúng, đủ yêu cầu. Điều này trách sau này bị bế tắc khi thực hiện các query, report không ra vì CSDL không đáp ứng được.- Mình muốn làm là: 1 người có thể mượn 1 lúc nhiều thiết bị nhưng.... trả 1 lúc toàn bộ thiết bị mượn (trong 1 phiếu bàn giao) và cũng có thể trả lắc nhắc từng thiết bị..
Trước hết bạn cần trả lời một số câu hỏi liên quan đến cái form "Bàn giao thiết bị" như sau:
- 1 người có thể mượn 1 lúc nhiều thiết bị nhưng có trả 1 lúc toàn bộ thiết bị mượn (trong 1 phiếu bàn giao) hay có thể trả lắc nhắc từng thiết bi? Trường hợp trả lắc nhắc có thể phát sinh vì: có vài thiết bị vẫn cần dùng nên trả sau; hoặc do có người cần gấp một vài TB nên phải linh động thu hồi trước còn mấy TB còn lại trả sau cũng được v.v.. ==> trả lời câu này vì nếu trả lắc nhắc bạn sẽ phải thiết kế lại table và form nhập liệu bàn giao.
- Form bàn giao có kết hợp làm form trả thiết bị luôn không?
- ...
Đối với cái file của bạn hiện tại, bạn muốn sau khi nhập xong sẽ chạy 2 cái query update "cho mượn" và "đã trả" cập nhật vào tblDSThietBi (trường [DaMuon]).
Cái Select query [Thiết bị đã trả] của bạn gặp vấn đề sau: Query dựa vào điều kiện [NgayTra] Not Is Null để lọc các TB đã trả => Vậy ví dụ: thiết bị TBHT1 đã mượn lần 1 và đã trả, sau đó mượn tiếp lần 2 và chưa trả ([NgayTra]= Is Null) --> sau khi chạy query sẽ hiển thị TBHT1 trong danh sách đã trả vì có 1 dòng của lần mượn thứ nhất thỏa điều kiện bạn đưa ra là [NgayTra] = Not Is Null ==> cập nhật vào table thiết bị này đã trả là sai. Đó là lý do vì sao khi bạn chạy Update query nó cập nhật hết.
Bài toán là làm sao tìm ra các TB đã trả thực sự để cập nhật. Bạn ngâm cứu tiếp nhé...
Còn về vấn đề trả thiết bị lắc nhắc bạn phải làm lại form có tùy chọn trả cho từng dòng thiết bị và table cũng sẽ thiết kế đi theo kiểu này.
Bạn mày mò tiếp nếu không ra thì hỏi tiếp nhé.
- Trường hợp trả lắc nhắc có thể phát sinh vì: có vài thiết bị vẫn cần dùng nên trả sau hoặc do có người cần gấp một vài TB nên phải linh động thu hồi trước còn mấy TB còn lại trả sau cũng được....
- Vậy Không biết là mình phải thiết kế lại bảng như thế nào...mình chưa có kinh nghiệm nên mong bạn hướng dẫn cho mình...
Mình chân thành cám ơn...
ongke0711 > 13-02-16, 02:02 PM
huymcsa > 14-02-16, 04:51 PM
(13-02-16, 02:02 PM)ongke0711 Đã viết: Theo tôi, trình tự của nghiệp vụ bàn giao/ hoàn trả như sau:
- Mở form Phiếu bàn giao (như cái form bạn đã làm) để nhập số phiếu bàn giao, người giao, người nhận, ngày giao, mục đích sử dụng và chi tiết các thiết bị nào bàn giao, số lượng, hiện trạng của thiết bị đó khi giao. Form này chỉ có nút [Lưu & Thêm], [Lưu & Đóng], [Đóng]
- Khi hoàn trả thiết bị, bạn chọn phiếu bàn giao nào cần làm thủ tục hoàn trả. Sau đó bạn nhập ngày hoàn trả, trong bảng chi tiết các thiết bị trong phiếu bàn giao bạn click chọn [Returned] cho thiết bị nào trả, không trả thì để trống, hiện trạng thiết bị trả. Form này có các nút như: [Lưu & Thêm], [Lưu & Đóng], [Đóng].
- 2 form này cũng có nhiều điểm chung nên có thể gộp lại thiết kế trong cũng 1 form, tùy nghiệp vụ Giao hay Trả sẽ hiển thị (visible=true) các control tương ứng (vd: form hoàn trả sẽ hiển thị control [NgayTra], nếu bàn giao sẽ ẩn control này đi). Code cho các nút lệnh cũng sẽ theo tương ứng từng loại form. Hiên tại nếu khó quá thì bạn làm 2 form riêng biệt cho dễ.
Về thiết kế table, cũng không thay đổi gì nhiều.
1. tblPhieuBanGiaoTB: thêm field [HienTrangTra] dạng combobox, Row source type: Value list, Row source: 1;Đã hoàn trả;2;Chưa hoàn trả;3;Hoàn trả chưa hết. Field này có mục đích là sau này khi bạn click chọn hoàn trả các thiết bị sẽ chạy query xem nếu trả hết sẽ gán [HienTrangTra]=1, trả 1 phần thiết bị sẽ gán = 3 ... ==> Bạn có thể theo dõi phiếu bàn giao nào đã trả, phiếu nào còn v.v..
2. tblPhieuBanGiaoTB_chitiet: thêm field [HoanTra]- yes/no. Field này dùng để click chọn khi trả thiết bị tương ứng.
Nói thêm về tạo mã số phiếu tự động. Bạn có thể để cho máy tự gán mã số phiếu theo dạng: ngày - tháng - năm - giờ - phút - tên nhân viên nhận [ddmmyyyyhhmmTenNV]. Khi bạn thay đổi người nhận bàn giao sẽ tự động tạo mã trên.
Vd:
Private Sub NguoiNhan_Click ()
Me.txtMaSoPhieu=Format(Date(),"ddmmyyyyhhmm" & Me.cboNguoiNhan
End Sub
Các nút lệnh Lưu, Đóng, bạn nghiên cứu thêm đi nhé.
ongke0711 > 15-02-16, 01:11 AM
Private Sub Command10_Click()
Dim strSQL As String
strSQL = "SELECT tblDSThietBi.MATB, tblDSThietBi.TenTB, tblDSThietBi.DaSD " & _
"FROM tblDSThietBi WHERE (((tblDSThietBi.DaSD)=No));"
DoCmd.GoToRecord , , acNewRec
Me.tblBanGiaoThietBi.Form!MATB.RowSource = strSQL
End Sub
huymcsa > 15-02-16, 06:23 PM
(15-02-16, 01:11 AM)ongke0711 Đã viết: Hướng dẫn bạn làm tiếp nhé. Nếu tôi làm thì cũng nhanh thôi nhưng bạn sẽ không nghiệm ra những vấn đề khi thiết kế ứng dụng này.Cám ơn bạn đã giúp mình...
Làm cái Form "Bàn giao thiết bị" trước đã. Giải quyết vụ [Mã thiết bị] không hiển thị.
- Theo tôi để dễ theo dõi bạn nên có cái form gọi là List các "Phiếu Bàn Giao" đã phát sinh. Tổng hợp thông tin cơ bản của Phiếu bàn giao TB như: Mã phiếu, ngày, người giao/nhận, mục đích sử dụng, ngày hứa hẹn hoàn trả. Tại sao có Form này? là form cũng cấp thông tin theo dõi cơ bản ban đầu để bạn có cái nhìn tổng quát sau đó khi bạn cần xem chi tiết "phiếu bàn giao" nào thì chọn nó (Double-click) rồi mở form chi tiết phiếu bàn giao đó lên xem. Form chi tiết Phiếu bàn giao sẽ là cái form [BanGiaoThietBiNhap] mà bạn đang làm.
- Form [BanGiaoThietBiNhap] bạn đang làm bị lỗi không hiển thị mã hay tên thiết bị là do bạn thiết lập Row source cho cái combobox MaTB không phù hợp. Row source cho combobox bạn đang làm là cái Query [Danh dau thiet bi] tức là chỉ lấy những thiết bị nào chưa bị đánh dấu [Đã mượn] ==> khi mở 1 "Phiếu bàn giao" cũ lên, nó có chi tiết những [MaTB] đã cho mượn (đã đánh dấu rồi) vậy thì làm sao nó có trong Row source của cái combobox [MaTB] mà bạn thiết lập để mà hiển thị.
Giải pháp:
- Đổi Row source của combobox [MaTB] là toàn bộ danh sách các thiết bị hiện có (không cần tính tới cột [Đã mượn] hay chưa.
- Khi click [Tạo mới] form [BanGiaoThietBiNhap] để nhập phiếu bàn giao mới thì lúc đó viết code để thay đổi Row source cho combobox [MaTB] thành cái Query [Danh dau thiet bi] của bạn. Hiện tại nút [Tạo mới] bạn dùng macro để GoToNewRecord thì hạn chế là không viết code xử lý thêm các nhiệm vụ khác được.
Code cho nút [Tạo mới] như sau:
Mã PHP:Private Sub Command10_Click()
Dim strSQL As String
strSQL = "SELECT tblDSThietBi.MATB, tblDSThietBi.TenTB, tblDSThietBi.DaSD " & _
"FROM tblDSThietBi WHERE (((tblDSThietBi.DaSD)=No));"
DoCmd.GoToRecord , , acNewRec
Me.tblBanGiaoThietBi.Form!MATB.RowSource = strSQL
End Sub
- Bạn phải chuẩn hóa lại cách đặt tên form, subform để khi viết code nhanh hơn và không bị sai tên. Như code ở trên tôi dựa thực tế vào cái form của bạn, nhìn vô khó nhận biết đâu là tên subform, đâu là combobox hay textbox, code cho nút lệnh gì vì chỉ có tên là [Command10]. Chịu khó chính xác ngay từ đầu để dễ hơn về sau.
huymcsa > 17-02-16, 10:44 PM
(15-02-16, 06:23 PM)huymcsa Đã viết:(15-02-16, 01:11 AM)ongke0711 Đã viết: Hướng dẫn bạn làm tiếp nhé. Nếu tôi làm thì cũng nhanh thôi nhưng bạn sẽ không nghiệm ra những vấn đề khi thiết kế ứng dụng này.Cám ơn bạn đã giúp mình...
Làm cái Form "Bàn giao thiết bị" trước đã. Giải quyết vụ [Mã thiết bị] không hiển thị.
- Theo tôi để dễ theo dõi bạn nên có cái form gọi là List các "Phiếu Bàn Giao" đã phát sinh. Tổng hợp thông tin cơ bản của Phiếu bàn giao TB như: Mã phiếu, ngày, người giao/nhận, mục đích sử dụng, ngày hứa hẹn hoàn trả. Tại sao có Form này? là form cũng cấp thông tin theo dõi cơ bản ban đầu để bạn có cái nhìn tổng quát sau đó khi bạn cần xem chi tiết "phiếu bàn giao" nào thì chọn nó (Double-click) rồi mở form chi tiết phiếu bàn giao đó lên xem. Form chi tiết Phiếu bàn giao sẽ là cái form [BanGiaoThietBiNhap] mà bạn đang làm.
- Form [BanGiaoThietBiNhap] bạn đang làm bị lỗi không hiển thị mã hay tên thiết bị là do bạn thiết lập Row source cho cái combobox MaTB không phù hợp. Row source cho combobox bạn đang làm là cái Query [Danh dau thiet bi] tức là chỉ lấy những thiết bị nào chưa bị đánh dấu [Đã mượn] ==> khi mở 1 "Phiếu bàn giao" cũ lên, nó có chi tiết những [MaTB] đã cho mượn (đã đánh dấu rồi) vậy thì làm sao nó có trong Row source của cái combobox [MaTB] mà bạn thiết lập để mà hiển thị.
Giải pháp:
- Đổi Row source của combobox [MaTB] là toàn bộ danh sách các thiết bị hiện có (không cần tính tới cột [Đã mượn] hay chưa.
- Khi click [Tạo mới] form [BanGiaoThietBiNhap] để nhập phiếu bàn giao mới thì lúc đó viết code để thay đổi Row source cho combobox [MaTB] thành cái Query [Danh dau thiet bi] của bạn. Hiện tại nút [Tạo mới] bạn dùng macro để GoToNewRecord thì hạn chế là không viết code xử lý thêm các nhiệm vụ khác được.
Code cho nút [Tạo mới] như sau:
Mã PHP:Private Sub Command10_Click()
Dim strSQL As String
strSQL = "SELECT tblDSThietBi.MATB, tblDSThietBi.TenTB, tblDSThietBi.DaSD " & _
"FROM tblDSThietBi WHERE (((tblDSThietBi.DaSD)=No));"
DoCmd.GoToRecord , , acNewRec
Me.tblBanGiaoThietBi.Form!MATB.RowSource = strSQL
End Sub
- Bạn phải chuẩn hóa lại cách đặt tên form, subform để khi viết code nhanh hơn và không bị sai tên. Như code ở trên tôi dựa thực tế vào cái form của bạn, nhìn vô khó nhận biết đâu là tên subform, đâu là combobox hay textbox, code cho nút lệnh gì vì chỉ có tên là [Command10]. Chịu khó chính xác ngay từ đầu để dễ hơn về sau.
Mình đã làm theo những gì bạn hướng dẫn...là:
- Làm thêm 1 form "Phiếu Bàn Giao" khi Double-click sẽ mở form chi tiết phiếu bàn giao[BanGiaoThietBiNhap]
- Sửa lại nút "Tạo mới " trong Form BanGiaoThietBiNhap..
Còn việc trả thiết bị sẽ làm như thế nào ?...mong bạn hướng dẫn giúp mình....
Mình cám ơn...
http://upfile.vn/7kjmukBtxgIg/thietbihie...accdb.html
ongke0711 > 18-02-16, 01:02 AM
Private Sub cmdSelectAll_Click()
Dim rs As DAO.Recordset
Set rs = Me.Ten Subform.Form.RecordsetClone
If rs.RecordCount > 0 Then
rs.MoveFirst
End If
Do While Not rs.EOF
rs.Edit
If rs![HoanTra] = True Then
rs![HoanTra] = False
Me.cmdSelectAll.Caption = "Select All"
Else
rs![HoanTra] = True
Me.cmdSelectAll.Caption = "Deselect All"
End If
rs.Update
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
huymcsa > 18-02-16, 10:46 PM
(18-02-16, 01:02 AM)ongke0711 Đã viết: Sorry là hơi lu bu nên trả lời chậm.cám ơn bạn đã dành thời gian quý giá của bạn để giúp hướng dẫn mình....mình rất cám ơn bạn...
Tôi thấy bạn có làm 2 cái form "Trả thiết bị" 1 cái là trả cho toàn bộ "phiếu đã bàn giao", 1 form là cho trả thiết bị lắc nhắc. Thực ra chỉ cần 1 form là được rồi.
Form "Trả thiết bị" sẽ có nút "Select All" để chọn tất cả thiết bị trong phiếu để hoàn trả hoặc chủ động click chọn thiết bi nào cần trả trong Subform chi tiết.
Khi bấm "Lưu" sẽ:
- Chạy query kiểm tra xem các thiết bị trong "Phiếu bàn giao" được trả hết hay chưa để cập nhật vào hiện trạng của phiếu bàn giao: [Đã hoàn trả], [Hoàn trả chưa hết], [Chưa hoàn trả].
- Query update ngày trả vào cột [ngày trả] của từng dòng thiết bị. Để theo dõi vì ngày trả của những thiết bị sẽ khác nhau nếu trả từng phần.
- Giải phóng hiện trạng [Đã mượn] của thiết bị trong tblDSThietBi.
- Cập nhật tình trạng thiết bị khi hoàn trả vào tblDSThietBi.
Cái tblPhieuBanGiaoTB sẽ có thêm field [HienTrangTra] gồm 3 giá trị: [Đã hoàn trả], [Hoàn trả chưa hết], [Chưa hoàn trả].
Form Danh sách phiếu bàn giao sẽ có thêm phần lọc DS theo hiện trạng trên. Thêm nút [Hoàn Trả] (khi con trỏ chuột đang nằm ở dòng nào sẽ mở form Hoàn trả của Phiếu bàn giao đó).
Tôi nghĩ chỉ như vậy cũng đủ theo dõi rồi. Sau đó là các báo cáo theo dõi theo phiếu, theo nhân viên, theo hiện trạng v.v...
Code cho nút lệnh [Select All] hoặc dùng checkbox cũng được.
VD: Field để click chọn hoàn trả chi tiết từng dòng thiết bị là field [HoanTra] và nằm ở Subform
Mã PHP:Private Sub cmdSelectAll_Click()
Dim rs As DAO.Recordset
Set rs = Me.Ten Subform.Form.RecordsetClone
If rs.RecordCount > 0 Then
rs.MoveFirst
End If
Do While Not rs.EOF
rs.Edit
If rs![HoanTra] = True Then
rs![HoanTra] = False
Me.cmdSelectAll.Caption = "Select All"
Else
rs![HoanTra] = True
Me.cmdSelectAll.Caption = "Deselect All"
End If
rs.Update
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
huymcsa > 20-02-16, 04:46 PM
(12-02-16, 02:57 PM)huymcsa Đã viết:mong bạn hướng dẫn thêm cho mình...mình cám ơn(08-02-16, 06:42 PM)ongke0711 Đã viết: Phần liên kết khoanh màu đỏ là các table mặc định của hệ thống, là table ẩn, khi bạn Show Hidden Objects và Show System Objects thì nó sẽ hiện ra. Bạn không cần quan tâm, có thể remove nó khỏi relationship cũng được, mặc định bạn không thể xóa nó được đâu.
(10-02-16, 06:54 PM)ongke0711 Đã viết: Theo như ứng dụng của bạn, cái form bàn giao/ hoàn trả thiết bị là quan trọng nhất trong toàn bộ ứng dụng. Do vậy bạn cần phân tích kỹ một chút các nghiệp vụ, thao tác phát sinh cho nghiệp vụ này mới thiết kế được table, form đáp ứng đúng, đủ yêu cầu. Điều này trách sau này bị bế tắc khi thực hiện các query, report không ra vì CSDL không đáp ứng được.- Mình muốn làm là: 1 người có thể mượn 1 lúc nhiều thiết bị nhưng.... trả 1 lúc toàn bộ thiết bị mượn (trong 1 phiếu bàn giao) và cũng có thể trả lắc nhắc từng thiết bị..
Trước hết bạn cần trả lời một số câu hỏi liên quan đến cái form "Bàn giao thiết bị" như sau:
- 1 người có thể mượn 1 lúc nhiều thiết bị nhưng có trả 1 lúc toàn bộ thiết bị mượn (trong 1 phiếu bàn giao) hay có thể trả lắc nhắc từng thiết bi? Trường hợp trả lắc nhắc có thể phát sinh vì: có vài thiết bị vẫn cần dùng nên trả sau; hoặc do có người cần gấp một vài TB nên phải linh động thu hồi trước còn mấy TB còn lại trả sau cũng được v.v.. ==> trả lời câu này vì nếu trả lắc nhắc bạn sẽ phải thiết kế lại table và form nhập liệu bàn giao.
- Form bàn giao có kết hợp làm form trả thiết bị luôn không?
- ...
Đối với cái file của bạn hiện tại, bạn muốn sau khi nhập xong sẽ chạy 2 cái query update "cho mượn" và "đã trả" cập nhật vào tblDSThietBi (trường [DaMuon]).
Cái Select query [Thiết bị đã trả] của bạn gặp vấn đề sau: Query dựa vào điều kiện [NgayTra] Not Is Null để lọc các TB đã trả => Vậy ví dụ: thiết bị TBHT1 đã mượn lần 1 và đã trả, sau đó mượn tiếp lần 2 và chưa trả ([NgayTra]= Is Null) --> sau khi chạy query sẽ hiển thị TBHT1 trong danh sách đã trả vì có 1 dòng của lần mượn thứ nhất thỏa điều kiện bạn đưa ra là [NgayTra] = Not Is Null ==> cập nhật vào table thiết bị này đã trả là sai. Đó là lý do vì sao khi bạn chạy Update query nó cập nhật hết.
Bài toán là làm sao tìm ra các TB đã trả thực sự để cập nhật. Bạn ngâm cứu tiếp nhé...
Còn về vấn đề trả thiết bị lắc nhắc bạn phải làm lại form có tùy chọn trả cho từng dòng thiết bị và table cũng sẽ thiết kế đi theo kiểu này.
Bạn mày mò tiếp nếu không ra thì hỏi tiếp nhé.
- Trường hợp trả lắc nhắc có thể phát sinh vì: có vài thiết bị vẫn cần dùng nên trả sau hoặc do có người cần gấp một vài TB nên phải linh động thu hồi trước còn mấy TB còn lại trả sau cũng được....
- Vậy Không biết là mình phải thiết kế lại bảng như thế nào...mình chưa có kinh nghiệm nên mong bạn hướng dẫn cho mình...
Mình chân thành cám ơn...
ongke0711 > 21-02-16, 08:55 AM