Cách tạo report

  • Thread starter hoathanh815
  • Ngày gửi
H

hoathanh815

Trung cấp
12/12/06
123
2
18
Viet Nam
Mình tập làm 1 file theo dõi diễn tiến lương bằng access, khi nhập số liệu trên form thì sẽ liệt kê theo các mốc thời gian, qua nhiều tháng, nhiều năm. Ví dụ : Có nhân viên vào cty tháng 11/2005 với mức lương 1.200.000, đến tháng 1 năm 2006 lương 1.400.000,đến tháng 6/2006 2.000.000 cho đến nay. Có nhân viên lại vào cty tháng 01/2006 với lương 1.300.000, đến tháng 8/2006 lương 1.700.000, đến tháng 1/2007 là 2.200.000 cho đến nay. Tức là rất nhiều nhân viên, với nhiều mức lương khác nhau, với nhiều thời điểm tăng lương khác nhau. Mình tạo report theo dõi lương thì thấy rất rõ diễn tiến tăng lương qua các mốc thời gian, nhưng bây giờ mình muốn tạo thêm 1 report là danh sách nhân viên hưởng lương với mốc thời gian cuối cùng gần thời điểm hiện tại nhất. Theo như vd trên thì mình muốn in 1 danh sách sẽ gồm có :nhân viên thứ 1, tăng lương gần nhất là T6/2006 2.000.000, nhân viên thứ 2,tăng lương gần nhất vào T1/2007 mức 2.200.000. Mong bạn nào biết chỉ giùm. Mình xin cảm ơn trước.
Ngoài ra, trong cty có những nhân viên hiện đã thôi việc, mình muốn in báo cáo diễn tiến lương của nhân viên trong cty nhưng không có tên những nhân viên đã thôi việc thì mình phải làm như thế nào ?
 
Khóa học Quản trị dòng tiền
D

dongnamnb

Sơ cấp
16/11/06
42
0
6
47
Thanh Hóa
Bạn hãy cho biết CSDL (cấu trúc các bảng) của bạn được thiết kế như thế nào thì mọi người mới có thể giúp bạn được
 
H

hoathanh815

Trung cấp
12/12/06
123
2
18
Viet Nam
Trước hết, xin cảm ơn bạn Lê Thanh Hà đã giải đáp giúp mình.
Mình tạo 3 table đặt tên là Nhân viên, Mức lương và Theo dõi lương :
NHAN_VIEN, MUC_LUONG và TD_LUONG.
Trong table NHAN_VIEN có các field MANV, TENNV.
Trong table TD_LUONG có các field MA_LUONG, MANV, NGAY_LEN_LUONG. Trong table MUC_LUONG có các field MA_ML, MUC_LUONG.
Sau đó, mình tạo form để nhập dữ liệu, và report theo dõi lương được lấy từ 3 table NHAN_VIEN , TD_LUONG và MUC_LUONG, gồm các dữ liệu ở các field sau : TENNV, NGAY_LEN_LUONG, và MUC_LUONG. Khi in báo cáo sẽ liệt kê toàn bộ diễn tiến lương cùng ngày lên lương của mỗi nhân viên.
Mình muốn rằng ngoài báo cáo đó, mình tạo thêm 1 báo cáo nữa chỉ lấy ngày lên lương tương ứng mức lương cuối cùng nhất của nhân viên và chỉ thể hiện những nhân viên còn đang làm việc hiện tại ở cty thôi. Mong các bạn giúp mình với. Xin chân thành cảm ơn.
 
A

anh phuong

Guest
15/5/07
60
2
8
Mien Tay
Bạn dùng một query làm nguồn cho report . Các dữ liệu được lấy từ nguồn các table đã có . Chú ý khi tạo nguồn cần để ý đến các ràng buộc giựa các table với nhau . Có như vậy mới có được kết quả đúng.
Chúc bạn làm được theo ý muốn của mình
 
H

hoathanh815

Trung cấp
12/12/06
123
2
18
Viet Nam
Mình biết cách làm query, nhưng vấn đề hỏi ở đây là làm sao chỉ thể hiện mức lương ở thởi điểm gần nhất.
 
H

hoathanh815

Trung cấp
12/12/06
123
2
18
Viet Nam
Làm sao để report & form tạo trong access không chỉnh sửa được

Bạn nào biết xin hướng dẫn giùm cách nào để khi tạo form & report trong access, người sự dụng không tự ý sửa chữa thay đổi gì được
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,030
125
63
52
Hà nội
vnuni.net
Bạn nào biết xin hướng dẫn giùm cách nào để khi tạo form & report trong access, người sự dụng không tự ý sửa chữa thay đổi gì được

Dịch ra MDE. Chính là chủ đề bạn đã hỏi tại đây
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,030
125
63
52
Hà nội
vnuni.net
Mình biết cách làm query, nhưng vấn đề hỏi ở đây là làm sao chỉ thể hiện mức lương ở thởi điểm gần nhất.

Đó là bạn mới chỉ biết ở mức viết SQL đơn giản thôi. Nếu bạn đã biết ở mức thực sự rồi thì ko cần phải hỏi vấn đề này. (Ko phải ai cũng biết viết SQL một cách tối ưu đâu bạn ạ (optimized or turning SQL), vì thế mới có khái niệm Advance programming) :)

Đầu tiên phải nói về quan hệ dữ liệu giữa nhân viên với diễn biến lương:
1 Nhân viên có nhiều diễn biến lương. Như vậy ta sẽ thiết kế sao cho 2 tables: "Nhân viên" và "Diễn biến lương" có quan hệ 1-nhiều với nhau. (thông qua EmployeeID, cái này chắc bạn biết làm rồi chứ?)

Khi tính toán lương hoặc lấy hệ số lương tại 1 thời điểm (giả sử tớ gọi là RunDate), ta phải join 2 bảng đó với nhau thông qua EmployeeID (Bạn tham khảo về các kiểu Inner Join, Left Join, Right Join trong help nhé). Ở câu lệnh SQL đó, bạn nhớ lọc cái Ngày hiệu lực (EffectiveDate - trong diễn biến lương) theo ngày RunDate (SalaryHistory.EffectiveDate <= RunDate). Sắp xếp dữ liệu giảm dần theo EffectiveDate và chỉ Select top 1.

Như vậy bạn sẽ có 1 bản ghi với EffectiveDate là gần nhất với cái ngày Rundate đó.

Mình chỉ có thể hướng dẫn đến đó thôi. Không thể code chi tiết cho bạn được. Bạn cứ theo hướng đó mà thử nhé.

Hope that helps.
 
Sửa lần cuối:
D

dongnamnb

Sơ cấp
16/11/06
42
0
6
47
Thanh Hóa
Với cấu trúc dữ liệu như của bạn, bạn hãy thử câu lệnh SQL này xem:
SELECT NHAN_VIEN.TenNV, Last(TD_LUONG.Ngay_Len_Luong) AS LastOfNgay_Len_Luong, Last(MUC_LUONG.Muc_Luong) AS LastOfMuc_Luong
FROM MUC_LUONG INNER JOIN (TD_LUONG INNER JOIN NHAN_VIEN ON TD_LUONG.MaNV = NHAN_VIEN.MaNV) ON MUC_LUONG.Ma_ML = TD_LUONG.Ma_Luong
GROUP BY NHAN_VIEN.TenNV;

Chúc thành công
 
S

smallgent

Guest
23/3/07
55
0
0
HCMC
@hoathanh815: cực kỳ dễ ...

- Bạn dùng dạng Select Query nhưng ở dạng tính tổng (Total Query: Mở menu View kế đến chọn Total và ngay khi đó bạn sẽ thấy xuất hiện dòng Total trong ô lưới)
- Chọn cả 3 bảng đưa vào Query nhé.
- Chọn TENNV từ bảng NHAN_VIEN
- Chọn MANV, MA_LUONG, NGAY_LEN_LUONG từ bảng TD_LUONG
- Chọn MUC_LUONG trong bảng MUC_LUONG

Trong dòng Total cùa phần ô lưới chỉ có ô của MUC_LUONG thì chọn Max, còn cái ô của các field khác thì chọn Group by.

Cách trên sẽ chỉ in ra danh sách các nhân viên có mức lương mới nhất bất cứ lúc nào bạn mở query đó.

Còn nếu bạn muốn lấy ra các nhân viên đã nghỉ thì trong bảng NHAN_VIEN nên thêm vào field Nghi chang hạn dang logical (true/false). Khi đã nghỉ thì set giá trị false còn chưa thì mặc định là true. Rồi trong phần query trên chúng ta sẽ thêm đk đó vào và chỉ lấy ra những nhân viên có giá trị true thui.
 
S

smallgent

Guest
23/3/07
55
0
0
HCMC
Với cấu trúc dữ liệu như của bạn, bạn hãy thử câu lệnh SQL này xem:
SELECT NHAN_VIEN.TenNV, Last(TD_LUONG.Ngay_Len_Luong) AS LastOfNgay_Len_Luong, Last(MUC_LUONG.Muc_Luong) AS LastOfMuc_Luong
FROM MUC_LUONG INNER JOIN (TD_LUONG INNER JOIN NHAN_VIEN ON TD_LUONG.MaNV = NHAN_VIEN.MaNV) ON MUC_LUONG.Ma_ML = TD_LUONG.Ma_Luong
GROUP BY NHAN_VIEN.TenNV;

Chúc thành công

Bạn chắc biết về lập trình hihii nhưng theo như mình biết thì SQL không có điều kiện lọc đó hihiii....
 
H

hoathanh815

Trung cấp
12/12/06
123
2
18
Viet Nam
Cảm ơn bạn smallgent và bạn Lê Thanh Hà. Cách 2 bạn giống nhau, nhưng của bạn smallgent mình làm theo và có kết quả như ý, phải lấy là " max" mới được, còn "last" không ra.Riêng bạn hai2hai thì cao siêu quá. Mình đã nói là mình mới học và đúng là trình độ mình ờ cấp thấp thôi. Nhưng cũng cảm ơn bạn nhiều
 

Xem nhiều