HoangManh > 28-03-17, 06:27 PM
ongke0711 > 28-03-17, 08:56 PM
HoangManh > 28-03-17, 09:57 PM
(28-03-17, 08:56 PM)ongke0711 Đã viết: Trong trường hợp này bạn nên đưa bài toán tổng thể bạn muốn chứ đừng nên hỏi rời rạc như vậy. Khi hiểu về yêu cầu bài toán tổng thể thì sẽ có nhưng giải pháp toàm diện hơn về tổ chức CSDL của bạn, thuận tiện hơn cho các truy vấn sau này (như trường hợp bạn đang hỏi). Nếu trả lời theo từng câu hỏi rời rạc của bạn như: hàm tính số tháng giữa 2 ngày cho trước? xác định nghỉ trên 6 tháng sẽ tự động thay đổi ngày vào làm v.v.. khi gộp lại đôi khi bạn không giải quyết vấn đề cốt lõi bạn đang cần xử lý.
Còn theo như đề bài của bạn hiện tại, theo tôi bạn nên tạo 1 table khác tên tblNghiDaiHan (Mã NV, Nghỉ Từ Ngày, Đến Ngày, Lý Do). Table này sẽ phục vụ cho việc tính lương, tính công v.v.. Ví dụ sau này khi cần tính lương, chỉ cần đối chiếu tháng, nếu tháng/năm đó có trong tblNghiDaiHan sẽ đánh dấu, không tính lương…
ongke0711 > 28-03-17, 10:35 PM
ongke0711 > 29-03-17, 03:20 AM
SELECT ngaylam.manv, ngaylam.ngaylam, DateDiff("m",(SELECT TOP 1 [ngaylam] FROM ngaylam AS Q
WHERE Q.ngaylam < ngaylam.ngaylam AND Q.manv = ngaylam.manv
ORDER BY Q.ngaylam DESC),ngaylam.ngaylam)-1 AS KhoangCachThang
FROM ngaylam
WHERE ((((SELECT TOP 1 ngaylam FROM ngaylam AS Q
WHERE Q.ngaylam < ngaylam.ngaylam)) Is Not Null))
ORDER BY ngaylam.manv, ngaylam.ngaylam;
HoangManh > 29-03-17, 07:31 AM
(28-03-17, 10:35 PM)ongke0711 Đã viết: Nói là CSDL chứ chẳng phải là gì to lớn, đối với bạn thì nó sẽ gồm vài table liên quan để kết hợp xử lý truy vấn. Đôi khi bạn tổ chức ra nhiều table sẽ giải quyết bài toán nhanh hơn. Trường hơp này của bạn mà viết hàm sẽ không đơn giản đâu. Tôi nghĩ vậy.- Thời gian nhân viên nghỉ thì năm đựoc và em có làm một trường kiểm tra ngày nào nghỉ thì tích vào rồi ạ.Tuy nhiên vì công ty mang tính chất là cho thuê nhân lực vì vậy đôi khi 1 nhân viên chỉ làm tại công ty a có vài ngày hoặc vài tháng xong nghỉ.
- Bạn có chủ động nắm được thông tin nhân viên nào sẽ nghĩ và thời gian nghỉ bao lâu không (thông qua đơn xin nghỉ) hay đây chỉ là nhân viên thời vụ ra vô ầm ầm?
- Nếu nghỉ quá 6 tháng rồi vô lại, bạn cập nhật lại ngày vào Cty mới nhất -> vậy bạn không lưu lại được lịch sử nhân viên này đã từng làm trước đó nhiều năm rồi. Bạn có cần quan tâm dữ liệu này không?
- Nhân viên vào làm ngày nào là chấm công ngày đó? và nhập vào table ngaylam?
PS: Bạn nên lưu file dạng Access 2003 (.mdb) để nhiều người có thể hỗ trợ bạn.
HoangManh > 29-03-17, 01:14 PM
(29-03-17, 03:20 AM)ongke0711 Đã viết: Dựa trên 2 table bạn đưa (table nhanvien và ngaylam), trước mắt tôi xử lý bài toán của bạn bằng 3 cái query.
- Chạy Query1 để tính ra khoảng cách tháng giữa các ngày chấm công nhân viên. Từ đó sẽ lọc nhưng trường hợp nào > 6 tháng để cập nhật [ngayvaocongty].
- Chạy Query2 để tạo table tạm. Query2 lọc lấy ra ngày gần nhất nhân viên trở lại làm việc sau 6 tháng.
- Query3 để cập nhật vào [ngayvaocongty]
Code Query1:
Mã PHP:SELECT ngaylam.manv, ngaylam.ngaylam, DateDiff("m",(SELECT TOP 1 [ngaylam] FROM ngaylam AS Q
WHERE Q.ngaylam < ngaylam.ngaylam AND Q.manv = ngaylam.manv
ORDER BY Q.ngaylam DESC),ngaylam.ngaylam)-1 AS KhoangCachThang
FROM ngaylam
WHERE ((((SELECT TOP 1 ngaylam FROM ngaylam AS Q
WHERE Q.ngaylam < ngaylam.ngaylam)) Is Not Null))
ORDER BY ngaylam.manv, ngaylam.ngaylam;
Link file demo: http://www.mediafire.com/file/4cwmtg4uka...amViec.mdb
ongke0711 > 29-03-17, 01:31 PM
HoangManh > 29-03-17, 01:46 PM
(29-03-17, 01:31 PM)ongke0711 Đã viết: "Q" chỉ là một cái tên khác tôi đặt cho table ngaylam thôi. Bạn muốn đặt chữ gì cũng được.
Nó báo lỗi gì? bạn chụp hình gửi lên xem.
Nhìn một đống chữ Nhật loằng ngoằng của bạn muốn tẩu hỏa luôn...
ongke0711 > 29-03-17, 02:33 PM