Giúp tôi về quan hệ của Cơ sở dữ liệu Access (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

antrung8384

Thành viên mới
Tham gia
10/12/08
Bài viết
26
Được thích
0
Chào các bạn, tôi đang làm 1 cơ sở dữ liệu bao gồm 3 bảng như sau:
1. Bảng: DANH SÁCH NHÂN VIÊN bao gồm các trường (Stt, MaNV(Pri), Hovaten,Chucvu,phongban)
2. Bảng: TỔNG HỢP DỮ LIỆU gồm (Stt, manv, hovaten, ngay, calamviec, gioden, giove, dimuon, vesom)
3. Bảng theo dõi gồm: (Hovaten, ngay, dimuoncolydo, vesomcolydo, KQT colydo, Nghicolydo, Ghichu)

Tôi muốn tạo quan hệ giữa các bảng sao cho khi thực hiện truy vấn thì dữ liệu trả ra bao gồm các phần:
MaNV|Hovaten|Ngay|Gioden|Giove|Dimuon|VeSom|Dimuoncolydo|Vesomcolydo|KQTColydo|NghiColydo|Ghichu

Tôi đã tạo các bảng và quan hệ như trong file đính kèm nhưng khi thực hiện truy vấn thì kết quả trả ra không chính xác, ví dụ trong bảng theo dõi chỉ có 2 trường hợp là đi muộn có lý do, nghỉ có lý do nhưng không hiểu vì sao tất cả các Nhân viên được nhập trong bảng theo dõi đều bị ghi dữ liệu đi muộn đối với tất cả các ngày. Tôi up file đính kèm mong các bạn xem và giúp tôi. Xin cảm ơn các bạn!
 

File đính kèm

Với yêu cầu truy xuất thế này thì làm luôn cái bảng y chang cho lẹ, sao phải tách ra nhiều thế?
Phương án đó tôi đã nghĩ và thử làm rồi, tuy nhiên table TỔNG HỢP DỮ LIỆU của tôi là table dùng để import dữ liệu từ file Excel (file excel này được tự động sinh ra từ máy chấm công) còn table theo dõi là table lưu lại các giá trị do cán bộ quản lý nhân sự tự ghi bằng tay. Nếu để chung 1 table, khi import dữ liệu từ file excel, các dữ liệu được ghi tay sẽ bị import đè --> dữ liệu ghi tay bị chuyển thành trống bạn ạ.
 
Phương án đó tôi đã nghĩ và thử làm rồi, tuy nhiên table TỔNG HỢP DỮ LIỆU của tôi là table dùng để import dữ liệu từ file Excel (file excel này được tự động sinh ra từ máy chấm công) còn table theo dõi là table lưu lại các giá trị do cán bộ quản lý nhân sự tự ghi bằng tay. Nếu để chung 1 table, khi import dữ liệu từ file excel, các dữ liệu được ghi tay sẽ bị import đè --> dữ liệu ghi tay bị chuyển thành trống bạn ạ.
Nên tổ chức lại CSDL, các khoá chính, bạn có chắc rằng cái tên NV sẽ không bị trùng ? Bảng theo dỏi nên tạo 1 trường MaNV thay cho trường họ tên, Còn điều quan trọng là tên bảng, tên trường nên tránh ghi bằng tiếng Việt có dấu.
Theo ý đồ của bạn là chỉ liệt kê những ngày làm việc giữa 2 bảng chung 1 dòng dữ liệu mà không thể hiện vào các dòng của những ngày khác thì là điều không khó, tuy nhiên bạn phải tạo ra 2 Query trung gian để truy vấn (1 cái là để truy vấn bảng tổng hợp, 1 cái để truy vấn bảng theo dõi).
Nếu bạn chịu làm theo ý này, tôi sẽ giúp bạn.
 
Mình xem file mới thấy hình như bạn mới tự học Access phải không? Tốt nhất bạn làm lại file này.
1/Các Table danh mục bỏ field STT vì nó không có tác dụng gì với Database.
2/Thiết kế các Table phải đảm bảo các field không thừa, trùng lặp. Thực sự cần thiết mới tạo thêm bảng mới. File của bạn thì chỉ cần 2 bảng thôi. Ví dụ sau tôi tôn trọng ý định của bạn vẫn để 3 Table.

Ví dụ tạo CSDL:
I.Tạo bảng

  1. Tạo bảng T_DMNV như sau:
-MaNV : Mã của từng nhân viên (Key chính)
-Hten : Họ và tên NV.
-Chucvu : Chức vụ
-Sinh: Ngày sinh
-Vao: Ngày vào
…………………………………..

2. Tạo bảng T_THEODOI như sau:
-MaCT : Mã chứng từ (Key chính) theo mình nên dùng AutoNumber
-MaNV: Mã nhân viên liên quan.
-LoaiVP: Loại vi phạm (Ví dụ gồm: None, Muon,Som,KLD, CLD … để theo dõi không vi phạm, Đi muộn, về sớm, nghỉ có lý do hay không lý do)

3.Tạo bảng T_CHITIET
-MaCT: Mã chứng từ cần chi tiết
-Vao: Giờ vào
-Ra: Giờ ra.
-Tgian: Thời gian trễ, sớm.
Ldo: Diễn giải lý do

II.Quan hệ:

T_DMNV & T_THEODOI (MaNV=MaNV): Quan hệ 1-nhiều.
T_THEODOI & T_CHITIET (MaCT=MaCT) : Quan hệ 1- nhiều

Trên đây là ví dụ gợi ý thôi, bạn tham khảo cho bài của mình nha
 
Nên tổ chức lại CSDL, các khoá chính, bạn có chắc rằng cái tên NV sẽ không bị trùng ? Bảng theo dỏi nên tạo 1 trường MaNV thay cho trường họ tên, Còn điều quan trọng là tên bảng, tên trường nên tránh ghi bằng tiếng Việt có dấu.
Theo ý đồ của bạn là chỉ liệt kê những ngày làm việc giữa 2 bảng chung 1 dòng dữ liệu mà không thể hiện vào các dòng của những ngày khác thì là điều không khó, tuy nhiên bạn phải tạo ra 2 Query trung gian để truy vấn (1 cái là để truy vấn bảng tổng hợp, 1 cái để truy vấn bảng theo dõi).
Nếu bạn chịu làm theo ý này, tôi sẽ giúp bạn.
Cảm ơn doom đã trả lời câu hỏi của tôi, ý tôi là trả ra tất cả các bản ghi của 2 table Tổng hợp và Theodoi sao cho bản ghi nào có trùng ngày thì gộp làm 1, còn lại các bản ghi khác hiện ra bình thường bạn ạ.
 
Mình xem file mới thấy hình như bạn mới tự học Access phải không? Tốt nhất bạn làm lại file này.
1/Các Table danh mục bỏ field STT vì nó không có tác dụng gì với Database.
2/Thiết kế các Table phải đảm bảo các field không thừa, trùng lặp. Thực sự cần thiết mới tạo thêm bảng mới. File của bạn thì chỉ cần 2 bảng thôi. Ví dụ sau tôi tôn trọng ý định của bạn vẫn để 3 Table.

Ví dụ tạo CSDL:
I.Tạo bảng

  1. Tạo bảng T_DMNV như sau:
-MaNV : Mã của từng nhân viên (Key chính)
-Hten : Họ và tên NV.
-Chucvu : Chức vụ
-Sinh: Ngày sinh
-Vao: Ngày vào
…………………………………..

2. Tạo bảng T_THEODOI như sau:
-MaCT : Mã chứng từ (Key chính) theo mình nên dùng AutoNumber
-MaNV: Mã nhân viên liên quan.
-LoaiVP: Loại vi phạm (Ví dụ gồm: None, Muon,Som,KLD, CLD … để theo dõi không vi phạm, Đi muộn, về sớm, nghỉ có lý do hay không lý do)

3.Tạo bảng T_CHITIET
-MaCT: Mã chứng từ cần chi tiết
-Vao: Giờ vào
-Ra: Giờ ra.
-Tgian: Thời gian trễ, sớm.
Ldo: Diễn giải lý do

II.Quan hệ:

T_DMNV & T_THEODOI (MaNV=MaNV): Quan hệ 1-nhiều.
T_THEODOI & T_CHITIET (MaCT=MaCT) : Quan hệ 1- nhiều

Trên đây là ví dụ gợi ý thôi, bạn tham khảo cho bài của mình nha

Tôi đã đọc và cũng hiểu ý định thiết kế của sealand, tuy nhiên bạn lưu ý giúp tôi:
1. Bảng tổng hợp dữ liệu của tôi (tương ứng với bảng chi tiết của bạn) là dữ liệu được import từ file excel vào, lần import sau có chứa data của lần trước - Data này được lấy tự động từ thiết bị ra
2. Trong cả hai bảng theodoi và tonghopdulieu của tôi đều phải có ngày
3. Bảng theodoi là các tác động thực hiện bằng tay
Với mong muốn là khi tổng hợp dữ liệu thì số bản ghi xuất hiện là tổng số bản ghi có chứa ngày trong 2 bảng theodoi và tonghopdulieu với điều kiện ngày nào trùng nhau thì gộp lại ví dụ: (1.2.3.4.5) gộp với (3.4.5.7)->(1.2.3.4.5.7) trong đó mỗi số như 1.2.3.4.5.7 chỉ xuất hiện 1 lần duy nhất.

Do tự học và mò mẫm access nên có rất nhiều điều chưa biết dẫn đến các câu hỏi có vẻ hơi thừa, mong các cao thủ GPE thông cảm.
 
Union 2 cái bảng tổng hợp và theo dõi của bạn lại rồi group by maNV, ngày
 
Nếu dùng Union ở đây, dùng lệnh
Select*from TBLTonghop
Union
Select*From Theodoi;
Thì vẫn bị tình trạng trùng bản ghi bạn ạ. Vì Union chỉ gộp những bản ghi giống hệt nhau thành 1 thôi.
Phải thêm cột tương ứng cho nó mới được
Mã:
 null as cột
Cột nào thiếu thì thêm vô trước vào sau union cho tương ứng
ví dụ phía dưới
 

File đính kèm

Lần chỉnh sửa cuối:
Phải thêm cột tương ứng cho nó mới được
Mã:
 null as cột
Cột nào thiếu thì thêm vô trước vào sau union cho tương ứng
ví dụ phía dưới
Vấn đề ở chổ là nối làm sao 1 mã nhân viên có đi làm ngày nào thì thể hiện dữ liệu trên 1 dòng, nếu nối như bạn thì nó thành 2 dòng.
 
group by lại, trời domfootwear còn phát biểu được vầy nữa nà!
ncxn cũng chưa có thử, không biết được không, cũng gay nhỉ
------- -- --
Sorry vì chưa thử mà trả lời, group by hổng được (ý là trình độ của ncxn)
 
Lần chỉnh sửa cuối:
TO: nguoiconxunui
Cảm ơn bạn rất nhiều, trong file đính kèm của bạn tôi thấy sử dụng Union như vậy thì xảy ra tình trạng bản ghi theo ngày của Nhân viên A chẳng hạn sẽ xuất hiện 2 lần trong bảng tổng hợp nếu như nó xuất hiện ở cả 2 bảng, điều này dẫn đến dữ liệu bị sai khi tổng hợp bạn ạ. Bạn xem lại giúp tôi xem có cách nào khi sử dụng union như bạn mà gộp được record nếu như Họ tên và ngày là trùng nhau không?
 
TO: nguoiconxunui
Cảm ơn bạn rất nhiều, trong file đính kèm của bạn tôi thấy sử dụng Union như vậy thì xảy ra tình trạng bản ghi theo ngày của Nhân viên A chẳng hạn sẽ xuất hiện 2 lần trong bảng tổng hợp nếu như nó xuất hiện ở cả 2 bảng, điều này dẫn đến dữ liệu bị sai khi tổng hợp bạn ạ. Bạn xem lại giúp tôi xem có cách nào khi sử dụng union như bạn mà gộp được record nếu như Họ tên và ngày là trùng nhau không?
Mình thì làm rất vòng vòng, cũng ra kết quả, nhưng vòng vòng đến nỗi không dám đưa lên, đưa lên sợ bạn cười, Mình làm đến 5 cái Query, 1 form để chạy Query, 1 Table mới để lấy kết quả. Nếu bạn không chê mình sẽ đưa lên ẹc, ẹc....
 
Trời, đúng là vòng vòng mệt chết, viết 1 câu update chạy cái vèo
 
Lần chỉnh sửa cuối:
Bạn nào có kết quả rồi vui lòng upload lên để tôi tham khảo được không? Vì tôi nghĩ mãi mà không ra - thanks
 
Mình thì làm rất vòng vòng, cũng ra kết quả, nhưng vòng vòng đến nỗi không dám đưa lên, đưa lên sợ bạn cười, Mình làm đến 5 cái Query, 1 form để chạy Query, 1 Table mới để lấy kết quả. Nếu bạn không chê mình sẽ đưa lên ẹc, ẹc....
Bạn đưa lên đi, tôi muốn tham khảo cách làm của bạn - thanks
 
Web KT

Bài viết mới nhất

Back
Top Bottom