I.Phát biểu bài toán● Quản lý thuốc tại cửa hàng thuốc● Giải pháp : thiết kế một hệ thống quản lý thuốc theo yêu cầu của cửa hàng thuốc⮚ Nhằm đơn giản hóa việc quản lý thuốc, tự động hóa
Phát biểu bài toán
● Quản lý thuốc tại cửa hàng thuốc
● Giải pháp : thiết kế một hệ thống quản lý thuốc theo yêu cầu của cửa hàng thuốc
⮚ Nhằm đơn giản hóa việc quản lý thuốc, tự động hóa các quy trình , kếtnối CSDL chính xác toàn vẹn, tiết kiệm thời gian chi phí quản lý đảm bảođúng quy trình.
Hệ thống quản lý thuốc được xây dựng nhằm quản lý một số công việc sau:
Mỗi Nhân Viên có các thông tin sau: mã nhân viên, tên nhân viên, ngàynsinh, địa chỉ,giới tính, lương cơ bản , phụ cấp ,Điện thoại, Ngày vào làm
● Quy định mỗi nhân viên có một mã nhân viên, độ tuổi yêu cầu là trên 22 tuổi.
● Mỗi nhân viên đều có nhiệm vụ bán và quản lý thuốc
● Mỗi nhân viên được phân biệt bởi mã nhân viên
Gồm các thông tin sau: Mã thuốc , Tên thuốc, Mã nhà cung cấp , Mãloại thuốc, nơi sx, số lượng, hạn dùng ,đơn vị thuốc
● Mỗi loại thuốc được phân biệt bởi mã thuốc
Gồm các thông tin :Mã loại thuốc , Tên loại thuốc
● Mỗi loại thuốc phân biệt bởi mã loại thuốc
● Loại thuốc : thuốc , thực phẩm chức năng
Gồm các thông tin: Mã nhà cung cấp , Tên nhà cung cấp, Địa chỉ, Điện thoại.
● Mỗi một nhà cung cấp được phân biệt bởi mã nhà cung cấp
Gồm các thông tin: Số hóa đơn, Mã thuốc,Mã nhân viên,MaNCC, Giánhập, Ngày nhập, Số lượng nhập, đơn vị thuốc
● Nhân viên là người tạo hóa đơn
● Mỗi hóa đơn phân biệt bởi Số hóa đơn
Gồm các thông tin :Số hóa đơn , Mã thuốc ,Mã nhân viên, Giá bán , Ngày bán , Số lượng bán, đơn vị thuốc
● Nhân viên là người xuất và tạo hóa đơn
● Mỗi hóa đơn phân biệt bởi Số hóa đơn
Mô hình thực thể liên kết
Xác định các thực thể và thuộc tính
o NhanVien(MaNV,tenNV,ngaySinh,diaChi,GT,NgayVaoLam,LuongCB,PhuCap) o LoaiThuoc(MaLoaiT,TenLoaiThuoc) o Thuoc(MaThuoc,TenThuoc,NoiSX,SoLuong,DonGai,HanDung) o NhaCungCap(MaNCC,TenNCC,DiaChi,SDT) o HoaDonNhap(SoHD,MaNV,MaNCC,MaThuoc,SoLuong,GiaNhap,NgayNhap) o HoaDonXuat(SoHD,MaNV,MaThuoc,SoLuong,GiaBan,NgayBan)
Xác định liên kết giữa các thực thể
Mô hình cơ sở dữ liệu
1) tblNhanVien(MaNV,TenNV,NgaySinh,DiaChi,Gtinh,NgayVaoLam,Luongcoban,Phucap,Dienthoai)
2) tblNhaCungCap(MaNCC , TenNCC, DiaChi, DienThoai)
4) tblThuoc(MaThuoc,TenT,MaNCC,MaLoaiThuoc, NoiSX, SoLuong,HanSD,DonViThuoc,DonGia) 5)tblHoaDonNhap(SoHD,MaNV,MaNCC,MaThuoc,SoLuong,GiaMua,NgayLap)
6) tblHoaDonXuat(SoHD,MaNV,MaThuoc,SoLuong,GiaBan,NgayLap)
ây dựng cơ sở dữ liệu của bài toán
1.Bảng cơ sở dữ liệu
STT Tên thuộc tính Kiểu dữ liệu Ràng buộ0063
STT Tên thuộc tính Kiểu dữ liệu Ràng buộc
STT Tên thuộc tính Kiểu dữ liệu Ràng buộc
STT Tên thuộc tính Kiểu dữ liệu Ràng buộc
STT Tên thuộc tính Kiểu dữ liệu Ràng buộc
STT Tên thuộc tính Kiểu dữ liệu Ràng buộc
● Tạo database create database QuanLyCuaHangTHUOC use QuanLyCuaHangTHUOC
● Bảng nhân viên create table NhanVien(
GioiTinh nvarchar( )10 check (GioiTinh='Nam'or GioiTinh=N'Nữ'),NgayVaoLam datetime,
● Bảng nhà cung cấp create table NhaCungCap(
● Bảng Loại Thuốc create table LoaiThuoc(
● Bảng Thuốc create table Thuoc(
DonViThuoc nvarchar( ),20 constraint FK_Thuoc_MaLoaiThuoc foreign key(MaLoaiThuoc) references LoaiThuoc(MaLoaiThuoc), constraint Fk_Thuoc_MaNCC foreign key(MaNCC) references NhaCungCap(MaNCC)
● Bảng Hóa đơn nhập create table HoaDonNhap
GiaMua float, constraint FK_HoaDonNhap_MaNV foreign key(MaNV) references NhanVien(MaNV), constraint FK_tblHoaDonNhap_MaNCC foreign key(MaNCC) references NhaCungCap(MaNCC), constraint FK_HoaDonNhap_MaThuoc foreign key(MaThuoc) references Thuoc(MaThuoc)
● Bảng Hóa đơn xuất create table HoaDonXuat(
NgayBan date, primary key(SoHD MaThuoc, ), constraint FK_HoaDonXuat_MaThuoc foreign key(MaThuoc) references Thuoc(MaThuoc), constraint FK_HoaDonXuat_MaNV foreign key(MaNV) references NhanVien(MaNV), constraint FK_HoaDonXuat_SoHD foreign key(SoHD) references HoaDonNhap(SoHD)
Thực hiện các yêu cầu
1.Truy vấn dữ liệu a) Danh sách các nhân viên có lương cơ bản trên 4500000 select * from dbo.NhanVien where Luong>4500000 b) Danh sách hóa đơn xuất năm 2022 select * from dbo.HoaDonXuat where year(NgayBan) 22 c) Danh sách tên thuốc có giá lớn hơn 200000 select TenThuoc from dbo.Thuoc where DonGia > 200000 d) Danh sách các nhân viên có giới tính nam select * from NhanVien where GioiTinh = N’Nam’ e) Danh sách mã nhân viên, tên nhân viên có giới tính nam và lương trên 4800000 select MaNV, TenNV from NhanVien where GioiTinh = N’Nam’ and Luong>4800000
2.Tạo view a) Tạo view cho biết mã, tên thuốc được bán năm 2022 create view vThuoc_2022 as select T.MaThuoc,T.TenThuoc from dbo.Thuoc as T, dbo.HoaDonXuat as HD where T.MaThuoc = HD.MaThuoc and year(HD.NgayBan) = 2022 b) Tạo view cho biết danh sách tên thuốc không được nhập về năm 2023 create view vThuocKhongNhap_2023 as select T.MaThuoc, T.TenThuoc from dbo.Thuoc as T, dbo.HoaDonNhap as HD where T.MaThuoc = HD.MaThuoc and year(HD.NgayLap) != 2023 c) Tạo view cho biết danh sách 2 loại thuốc được mua nhiều nhất create view v2LoaiThuocMuaNhieu as select top(2)LT.TenLoaiThuoc, count(HD.SoHD) as [Số lượng mua] from dbo.LoaiThuoc as LT, dbo.Thuoc as T, dbo.HoaDonXuat as HD where LT.MaLoaiThuoc = T.MaLoaiThuoc and T.MaThuoc = HD.MaThuoc group by TenLoaiThuoc order by count(SoHD) desc d) Tạo view tổng tiền đã bán của từng nhân viên năm 2023 create view vTongTienBan2023 as select NV.MaNV, NV.TenNV, sum(HD.GiaBan * HD.SoLuong) as [Tổng tiền bán năm 2023] from NhanVien as NV left join HoaDonXuat as HD on NV.MaNV = HD.MaNV where year(HD.NgayBan) = 2023 group by NV.MaNV, NV.TenNV e) Tạo view tổng tiền nhập hàng về của từng nhân viên năm 2022 create view vTongTienNhapTungNV2022 as select NV.MaNV, NV.TenNV, sum(HD.Soluong * HD.GiaMua) as [Tổng tiền nhập hàng 2022] from NhanVien as NV left join HoaDonNhap as HD on NV.MaNV = HD.MaNV where year(HD.NgayLap) = 2022 group by NV.MaNV, NV.TenNV
3.Tạo procedure a)Thủ tục lấy ra tên loại thuốc với mã thuốc là tham số truyền vào create procedure sp_TenLoaiThuoc
AS select TenLoaiThuoc from Thuoc,LoaiThuoc where Thuoc.MaLoaiThuoc = LoaiThuoc.MaLoaiThuoc and MaThuoc=@mathuoc
Exec sp_TenLoaiThuoc @mathuoc = 'T07' b) Thủ tục lấy ra số lượng nhân viên sinh trong tháng, với tháng là tham số truyền vào create proc sp_SoNVSinhTrongThang
@Thang int as select count(*) from NhanVien where month(NgaySinh) = @Thang exec sp_SoNVSinhTrongThang @Thang = 10 c) Thủ tục truyền vào năm và cho biết nhân viên bắt đầu làm từ năm đó create proc sp_NamVaoLam
@nam int as begin select * from NhanVien where year(NgayVaoLam) = @nam end exec sp_NamVaoLam @nam = 2022 d) Thủ tục cho biết nhân viên có tổng lương cao nhất( Tổng lương = Lương + Lương* phụ cấp) create proc sp_NvTongLuongMax
(@MaxLuong float output) as begin select @MaxLuong =Max(Luong + Luong*PhuCap) from NhanVien end declare @MaxLuong float = 0 exec sp_NvTongLuongMax @MaxLuong output select @MaxLuong as N'Tổng lương cao nhất của nhân viên ' e) Thủ tục cho biết danh sách các mặt hàng không bán được trong năm nào đó, với năm là tham số truyền vào create proc sp_MatHangKhongBanDc
@nam int as begin select MaThuoc,TenThuoc from Thuoc where MaThuoc not in
(select T.MaThuoc from Thuoc as T join HoaDonXuat as HD on T.MaThuoc = HD.MaThuoc where year(HD.NgayBan) = @nam) end exec sp_MatHangKhongBanDc @Nam = 2022
4.Tạo trigger a) Thêm hoặc sửa nhân viên thì tuổi phải >18 create trigger tg_TuoiLonHon18 on NhanVien after insert, update as begin
Declare @tuoi int set @tuoi = (select YEAR(getdate()) - year(NgaySinh) from inserted) if(@tuoi < 18) begin print N'Nhân viên dưới 18 tuổi !!!' rollback tran end end select * from NhanVien insert into NhanVien values('NV06', N'Lê Anh Đức','10/16/2007',N'Nam Định',N'Nam','7/11/2022',3800000,0.1,'0983652547') b) Viết trigger giới tính của nhân viên là nam hoặc nữ create trigger tg_GioiTinh on NhanVien for insert as begin
Declare @gt nvarchar(20) select @gt = GioiTinh from inserted if (@gt) not in (N'Nam',N'Nữ') begin print N'Bạn đã nhập sai giới tính !' rollback tran end end select * from NhanVien insert into NhanVien values('NV06', N'Lê Anh Đức','10/16/2002',N'Nam Định',N'Nam','7/11/2022',4500000,0.1,'0983652547') c) Trigger không cho phép sửa cột giới tính nếu không phải là Nam hoặc Nữ create trigger tg_KoSuaGioiTinh on NhanVien for update as begin
Declare @gtMoi nvarchar(10) select @gtMoi = GioiTinh from inserted if (@gtMoi in (N'Nam',N'Nữ')) print N'Cập nhật thành công !' else begin print N'Giới tính phải là Nam hoặc Nữ' rollback tran end end select * from NhanVien
WHERE MaNV = 'NV01' d) Tạo trigger yêu cầu giá bán ra phải >= giá gốc create trigger tg_Giaca on HoaDonXuat for insert as begin declare @giaban int, @giagoc int, @maT nvarchar(10) select @giaban = inserted.GiaBan, @maT = inserted.MaThuoc from inserted select @giagoc = DonGia from Thuoc where @maT = MaThuoc if(@giaban