Phát biểu bài toán Khi có yêu cầu nhập thiết bị, hàng hoá: nhân viên tiến hành ghi phiếu yêu cầu gồm các thông tin chi tiết về thiết bị, hàng hoá và gửi đến cho nhà cung cấp.. Bên phía
Trang 1I Phát biểu bài toán
Khi có yêu cầu nhập thiết bị, hàng hoá: nhân viên tiến hành ghi phiếu yêu cầu gồm các thông tin chi tiết về thiết bị, hàng hoá và gửi đến cho nhà cung cấp Bên phía nhà cung cấp sẽ gửi đơn chào hàng trong đó có chi tiết các thiết bị bao gồm các thông tin như: tên, loại thiết bị, số lượng, nguồn gốc… Qua đơn chào hàng của nhà cung cấp thì cửa hàng sẽ xem xét và đưa ra đơn đặt hàng rồi gửi đến cho nhà cung cấp, để đáp ứng nhu cầu nhập thiết bị của cửa hàng nhà cung cấp sẽ vận chuyển thiết bị cho cửa hàng theo hợp đồng mua,bán hàng hóa và biên lai bàn giao thiết bị (kiêm hóa đơn thanh toán tiền thiết bị) Trước khi nhập hàng vào kho thì cửa hàng sẽ kiểm tra xem đã đủ thiết bị chưa theo biên bản bàn giao thiết bị mà nhà cung cấp gửi đến, đồng thời cửa hàng sẽ ghi các thông tin cần thiết vào sổ chi và sổ kho Nếu thiết bị nào không đạt yêu cầu thì cửa hàng sẽ trả lại nhà cung cấp, và yêu cầu nhà cung cấp cấp lại những thiết bị như hợp đồng đã thỏa thuận
Khi khách có nhu cầu mua thiết bị, khách hàng xem thông tin hàng hóa, tìm kiếm sản phẩm, hàng hoá cần mua Nếu khách hàng chọn được thiết bị cần mua thì cửa hàng sẽ kiểm tra trong kho, nếu trong kho còn hàng thì nhân viết sẽ viết phiếu bán hàng Sau đó cửa hàng sẽ tiến hành bàn giao thiết bị cho khách và gửi đến khách hàng hóa đơn thanh toán, phiếu bảo hành và các giấy tờ liên quan,
có kèm theo các khuyến mại (nếu có)
Khi khách đã thanh toán tiền thiết bị thì cửa hàng sẽ lập biên lai thu tiền cho khách đồng thời sẽ ghi các thông tin cần thiết vào sổ thu và sổ kho Để tiện cho việc quản lý hệ thống sẽ lưu trữ và quản lý thông tin về nhà cung cấp và thông tin khách hàng Có thể sửa hoặc xóa khi cần thiết Sau một khoảng thời gian nhất định nhân viên các bộ phận sẽ tổng hợp thông tin mua, bán, và các thông tin khác
II Mô hình CSDL
● tblLoaiHang MaLoaiHang ( , TenLoaiHang);
● tblNhaCungCap (MaNCC, TenNhaCC, TenGiaoDich, DiaChi,
Trang 2● tblKhachHang (MaKH, TenKH, DiaChi, DienThoai);
● tblNhanVien MaNV ( , TenNV, DiaChi, DienThoai,
NgaySinh,GioiTinh, NgayVaoLam, LuongCoBan, PhuCap);
● tblDonDatHang (SoHD, MaNV MaKH, NgayDatHang, ,
NgayGiaoHang, DiaChiGiaoHang, TongTienHD);
● tblChiTietDatHang (SoHD, MaHang, GiaBan, SoLuongMua,
MucGiamGia);
● tblDonNhapKho (SoNK, MaNV, NgayNhapHang,
TongSoLuong);
● tblChiTietNhapKho (SoNK, MaHang, GiaNhap, SoLuongNhap)
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
1 sMaLoaiHang varchar(20) PK Mã loại hàng
2 sTenLoaiHang nvarchar(30) Tên loại hàng
*tblNhaCungCap
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
2 sTenNhaCC nvarchar(30) Tên nhà cung cấp
3 sTenGiaoDich nvarchar(50) Tên nhà giao dịch
*tblMatHang
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
Trang 34 sMaLoaiHang varchar(20) FK Mã loại hàng
*tblNhanVien
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
3 sDiaChi nvarchar(50) Địa chỉ
5 dNgaySinh Datetime dNgaysinh
*tblDonDatHang
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
4 dNgayDatHang Datetime Ngày đặt hàng
5 dNgayGiaoHang Datetime dNgayGiao
Hang >=
Ngày giao hàng lớn hơn hoặc bằng ngày đặt hàng
Trang 4dNgayDatHang
6 sDiaChiGiaoHang nvarchar(50) Địa chỉ giao hàng
7 fTongTienHD float fTongTienH
D>0
Tổng tiền của hóa đơn
*tblChiTietDatHang
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
2 sMaHang varchar(20) PK, FK Mã hàng
*tblDonNhapKho
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng
Buộc
Ghi Chú
3 dNgayNhapHang Datetime Ngày nhập hàng
4 fTongSoLuong float fTongSoL
uong >0
Tổng số lượng hàng nhập kho
*tblChiTietNhapKho
TT Tên Thuộc Tính Kiểu Dữ Liệu Ràng Buộc Ghi Chú
1 iSoNK Int PK, FK Số hóa đơn nhập kho
2 sMaHang varchar(20) PK, FK Mã hàng
4 fSoLuongNhap float fSoLuongN
hap >0
Số lượng nhập
Trang 5III Tạo CSDL
1 Tạo Database
Hình 1: Database Diagram
Trang 6CREATE DATABASE BTLN09QuanLyKinhDoanhMayTinh ON(
Trang 7iMaKH INT PRIMARY KEY,
iSoHD INT PRIMARY KEY,
iMaNV INT REFERENCES dbo.tblNhanVien(iMaNV),
iMaKH INT REFERENCES dbo.tblKhachHang(iMaKH),
iSoHD INT REFERENCES dbo.tblDonDatHang(iSoHD),
sMaHang VARCHAR(20) REFERENCES dbo.tblMatHang(sMaHang), fGiaBan FLOAT,
iSoLuongMua INT,
Trang 8iSoNK INT PRIMARY KEY,
iMaNV INT REFERENCES dbo.tblNhanVien(iMaNV),
iSoNK INT REFERENCES dbo.tblDonNhapKho(iSoNK),
sMaHang VARCHAR(20) REFERENCES dbo.tblMatHang(sMaHang), fGiaNhap FLOAT,
fSoLuongNhap FLOAT CHECK (fSoLuongNhap >0),
CONSTRAINT pk_chitietnhapkho PRIMARY KEY(iSoNK,sMaHang) )
INSERT INTO dbo.tblNhaCungCap VALUES
(101, N'ASUS', N'Nhập Hàng Asus', N'Hà Nội', '0334455667'),
(102, N'DELL', N'Nhập Hàng Dell', N'Đà Nẵng', '0334455668'),
(103, N'APPLE', N'Nhập Hàng Apple', N'Hải Phòng', '0334455669'), (104, N'LENOVO', N'Nhập Hàng Lenovo', N'TP Hồ Chí Minh', '0334455670' )
Trang 9tblKhachHang
INSERT INTO dbo.tblKhachHang VALUES
(111, N'Trần Anh Vũ', N'Giáp Nhị, Hà Nội', '0112233445'),
(112, N'Trần Thanh Tâm', N'Hoàng Mai, Hà Nội', '0112233446'), (113, N'Nguyễn Minh Tú', N'Minh Khai, Hà Nội', '0112233447'), (114, N'Đỗ Thu Phương', N'Giáp Bát, Hà Nội', '0112233448'),
(115, N'Lê Văn Tráng', N'Định Công, Hà Nội', '0112233449')
tblNhanVien
INSERT INTO dbo.tblNhanVien VALUES
(1010, N'Đỗ Thị Bích', N'Giáp Bát, Hà Nội', '0123456781', '1997/01/01', N'Nữ', '2019/02/26', 7050000, 1000000),
(1011, N'Nguyễn Công Chính', N'Pháp Vân, Hà Nội', '0123456782', '1989/12/21', N'Nam', '2016/11/22', 12100000, 2000000),
(1012, N'Vương Quang Huy', N'Giải Phóng, Hà Nội', '0123456783','1999/03/12', N'Nam', '2020/04/02', 5500000, 450000),
(1013, N'Phạm Tiến Đạt', N'Cầu Giấy, Hà Nội', '0123456784', '2000/07/15', N'Nam', '2020/07/03', 5000000, 250000)
tblMatHang
INSERT INTO dbo.tblMatHang VALUES
('MH01', N'ASUS VivoBook 15 A512DA', 101, 'LH01', 400, 12290000), ('MH02', N'ASUS Laptop 15 X509UA', 101, 'LH01', 350, 10700000), ('MH03', N'Laptop Dell XPS 13', 102, 'LH01', 100, 40400000),
('MH04', N'Laptop Dell Gaming G3', 102, 'LH01', 200, 21000000), ('MH05', N'Laptop Lenovo Thinkpad X13', 104, 'LH01', 150, 34500000), ('MH06', N'Apple MacBook Pro', 103, 'LH01', 250, 35500000),
('MH12', N'Tai nghe AirPods 2', 103, 'LH03', 200, 3990000),
('MH13', N'Apple Magic Mouse 2', 103, 'LH03', 200, 2490000),
('MH14', N'CPU AMD Ryzen 9', 101, 'LH03', 150, 19299000),
('MH15', N'Card đồ họa RTX3060TI', 101, 'LH03', 200, 13149000) tblDonNhapKho
Trang 10INSERT INTO dbo.tblDonNhapKho VALUES
INSERT INTO dbo.tblChiTietDatHang VALUES
Trang 11SELECT * FROM dbo.tblLoaiHang
SELECT * FROM dbo.tblMatHang
Trang 12SELECT * FROM dbo.tblNhaCungCap
SELECT *FROM dbo.tblKhachHang
SELECT * FROM dbo.tblNhanVien
SELECT * FROM dbo.tblDonDatHang
Trang 13SELECT * FROM dbo.tblChiTietDatHang
SELECT * FROM dbo.tblDonNhapKho
SELECT * FROM dbo.tblChiTietNhapKho
Trang 14IV Xây dựng các view cho CSDL
1 Tạo view chứa danh sách nhân viên với các thông tin: Mã Nhân Viên, Tên Nhân Viên, Lương Cơ Bản, Phụ Cấp
CREATE VIEW vv_dsnhanvien
AS
SELECT iMaNV AS [Mã Nhân Viên],sTenNV AS [Họ & Tên], fLuongCoBan AS [Lương Cơ Bản], fPhuCap AS [Phụ Cấp] FROM dbo.tblNhanVien
SELECT * FROM vv_dsnhanvien
2 Tạo view cho biết danh sách tên hàng đã bán trong tháng 6 năm 2020
CREATE VIEW vv_dshangban2020
AS
SELECT
dbo.tblMatHang.sMaHang,sTenHang,dNgayDatHang,dNgayGiaoHang FROM
SELECT * FROM vv_dshangban2020
Trang 153 Tạo view cho biết mặt hàng có số lượng lớn hơn 200
CREATE VIEW vv_dshangbansoluong200
AS
SELECT sMaHang,sTenHang,fSoLuong FROM dbo.tblMatHang
WHERE fSoLuong > 200
SELECT * FROM vv_dshangbansoluong200
4 Tạo view chứa danh sách nhân viên nam
CREATE VIEW vv_dsnhanviennam
AS
SELECT *
FROM dbo.tblNhanVien
WHERE sGioiTinh = N'Nam'
SELECT * FROM vv_dsnhanviennam
Trang 24AS
SELECT tblMatHang.sMaHang,SUM(iSoLuongMua) AS [Tổng số lượng],SUM(iSoLuongMua*fGiaBan -
iSoLuongMua*fGiaBan*fMucGiamGia) AS [Tổng tiền Max]
SELECT * FROM vv_soluongvatongtiensp2020
20 Tạo view nhân viên làm việc trên 2 năm
CREATE VIEW vv_nhanvienlamtren2nam
AS
SELECT *
FROM dbo.tblNhanVien
WHERE DATEDIFF(YEAR,dNgayVaoLam,GETDATE()) >=2 SELECT * FROM vv_nhanvienlamtren2nam
Trang 25V Xây dựng các Procedure cho CSDL
1 Tìm nhân viên theo tên nhân viên
CREATE PROC sptimnhanvien_tennhanvien (@tennhanvien nvarchar(30))
EXEC sptimnhanvien_tennhanvien N'Vương Quang Huy'
2 Tổng tiền hàng bán ra trong một tháng trong 1 năm
CREATE PROC sptongtienhangban_thang (@thang int, @nam int)
AS
BEGIN
SELECT @thang AS[Thang], SUM
(fGiaBan*iSoLuongMua - fGiaBan*iSoLuongMua*fMucGiamGia) AS [Tong tien]
FROM dbo.tblDonDatHang,dbo.tblChiTietDatHang WHERE tblDonDatHang.iSoHD = tblDonDatHang.iSoHD AND MONTH(dNgayGiaoHang) = @thang AND YEAR(dNgayGiaoHang) = @nam GROUP BY
Trang 26CREATE PROC spluongnhanvien_maNV (@maNV nvarchar(20))
EXEC spluongnhanvien_maNV @maNV=N'1010'
4 Mặt hàng không bán được trong năm
CREATE PROC dskhongduocban2020 (@nam INT)
AS
BEGIN
SELECT tblmathang.smahang, tblmathang.stenhang FROM tblmathang where tblmathang.smahang NOT IN (SELECT tblmathang.smahang FROM tbldondathang,tblchitietdathang,tblmathang WHERE tbldondathang.isohd=tblchitietdathang.isohd AND tblchitietdathang.smahang=tblmathang.smahang AND YEAR(dngaydathang)=@nam )
END
EXEC dskhongduocban2020 @nam='2020'
5 Tạo thủ tục bổ sung thêm 1 bản ghi mới cho tblChiTietDatHang CREATE PROC spthemHD (@mahd nvarchar(10),@mahang
Trang 27nvarchar(10), @giaban float, @SLmua int, @mucgiamgia float)
AS
BEGIN
INSERT INTO tblChiTietDatHang
VALUES (@mahd, @mahang, @giaban, @SLmua,
WHERE tblDonDatHang.iMaNV = tblNhanVien.iMaNV
AND tblDonDatHang.iSoHD =
tblChiTietDatHang.iSoHD
AND YEAR(dNgayDatHang) = @nam
Trang 28GROUP BY tblNhanVien.iMaNV
HAVING SUM (iSoLuongMua)
> @chitieu )
END
EXEC sptangluongcoban_nhanvien 11,2020,0.1
7 Doanh số bán ra của một mặt hàng trong năm
CREATE PROC spdoanhso1mathang1nam (@mahang nvarchar(10),
tblMatHang.sMaHang=tblChiTietDatHang.sMaHang
AND tblChiTietDatHang.iSoHD=tblDonDatHang.iSoHD
AND tblChiTietDatHang.sMaHang= @mahang AND YEAR(tblDonDatHang.dNgayDatHang)=
@nam
END
EXEC spdoanhso1mathang1nam @mahang='MH11', @nam='2019'
8 Tổng số tiền hàng thu được của một năm
Trang 29CREATE PROC sptienhang1nam (@nam int)
AS
BEGIN
SELECT
SUM(tblChiTietDatHang.iSoLuongMua*tblChiTietDatHang.fGiaBan - tblChiTietDatHang.iSoLuongMua*tblChiTietDatHang.fGiaBan*tblChiTietDatHang.fMucGiamGia) as[Tổng số tiền]
FROM tblMatHang,tblChiTietDatHang,tblDonDatHang WHERE
tblMatHang.sMaHang=tblChiTietDatHang.sMaHang
AND tblChiTietDatHang.iSoHD=tblDonDatHang.iSoHD
AND YEAR(tblDonDatHang.dNgayDatHang)=@nam
GROUP BY tblMatHang.sTenHang
END
EXEC sptienhang1nam @nam='2019'
9 Tổng tiền hàng nhập vào của một năm
CREATE PROC sp_tongtiennhaphang1nam (@Nam int)
AS
BEGIN
SELECT @Nam as [Nam],
SUM(tblChiTietNhapKho.fSoLuongNhap*tblChiTietNhapKho.fGiaNhap) as[Tổng số tiền]
FROM tblMatHang,tblChiTietNhapKho,tblDonNhapKho WHERE
tblMatHang.sMaHang=tblChiTietNhapKho.sMaHang AND tblChiTietNhapKho.iSoNK=tblDonNhapKho.iSoNK AND YEAR(tblDonNhapKho.dNgayNhapHang)=@Nam END
EXEC sp_tongtiennhaphang1nam @Nam='2019'
Trang 3010 Giỏ hàng của khách hàng (sản phẩm đã mua + đã giao)
CREATE PROC spgiohang_khachhang (@makh int)
AS
BEGIN
SELECT
tblKhachHang.iMaKH,tblDonDatHang.iSoHD,SUM(iSoLuongMua) AS [Tong so luong]
AND tblKhachHang.iMaKH = @makh GROUP BY tblKhachHang.iMaKH,tblDonDatHang.iSoHD END
EXEC spgiohang_khachhang 114
11 Thống kê hàng nhập từ một nhà cung cấp trong một năm
CREATE PROC spthongkesanpham_nhacungcap (@mancc int,@year int)
AS
BEGIN
SELECT tblNhaCungCap.iMaNCC,@year AS [Nam],sTenHang,SUM(fSoLuongNhap) AS [So luong]
FROM dbo.tblNhaCungCap,dbo.tblChiTietNhapKho,dbo.tblDonNhapKho,dbo.tblMatHang
Trang 31WHERE dbo.tblDonNhapKho.iSoNK = tblChiTietNhapKho.iSoNK
AND dbo.tblChiTietNhapKho.sMaHang = dbo.tblMatHang.sMaHang
AND tblNhaCungCap.iMaNCC = tblMatHang.iMaNCC
AND tblNhaCungCap.iMaNCC = @mancc AND
YEAR(dbo.tblDonNhapKho.dNgayNhapHang) = @year
GROUP BY tblNhaCungCap.iMaNCC,sTenHang END
EXEC spthongkesanpham_nhacungcap 101,2020
12 Truy xuất nguồn gốc của một mặt hàng
CREATE PROC spchitiet_mathang (@mamathang nvarchar(20))
AS
BEGIN
SELECT sMaHang,sTenHang,tblLoaiHang.sTenLoaiHang,sTenNhaCC,sDiaChi
FROM dbo.tblNhaCungCap,dbo.tblMatHang,dbo.tblLoaiHang
WHERE sMaHang = @mamathang AND tblMatHang.iMaNCC = tblNhaCungCap.iMaNCC
AND tblMatHang.sMaLoaiHang = tblLoaiHang.sMaLoaiHang
END
EXEC spchitiet_mathang N'MH06'
Trang 3213 Giảm giá với đơn đặt hàng chưa áp dụng giảm giá và được đặt hàng trong ngày hôm nay ( mức giảm giá x%)
CREATE PROC spmucgiamgia_dondathang (@sohd int,
@ngaydat datetime, @mucgiamgia float )
AS
BEGIN
UPDATE dbo.tblChiTietDatHang SET fMucGiamGia = fMucGiamGia+ @mucgiamgia WHERE iSoHD IN ( SELECT tblDonDatHang.iSoHD
FROM dbo.tblDonDatHang,dbo.tblChiTietDatHang,dbo.tblMatHang
WHERE tblDonDatHang.iSoHD
= tblChiTietDatHang.iSoHD
AND tblChiTietDatHang.sMaHang = dbo.tblMatHang.sMaHang
AND tblDonDatHang.iSoHD = @sohd
AND dNgayDatHang = @ngaydat
AND fMucGiamGia
= 0
) END
EXEC spmucgiamgia_dondathang 510,'2020/01/14',0.1
Trang 3314 Số tiền mà nhân viên sử dụng để nhập kho và số hóa đơn đã xử lí
CREATE PROC spthongkenhapkho_nhanvien ( @manv int )
AS
BEGIN
SELECT tblNhanVien.iMaNV,sTenNV,COUNT(tblDonNhapKho.iSoNK) AS [So Hoa Don NK],SUM(fSoLuongNhap*fGiaNhap) AS [Tong tien]
FROM dbo.tblNhanVien,dbo.tblDonNhapKho,dbo.tblChiTietNhapKho
WHERE dbo.tblNhanVien.iMaNV = dbo.tblDonNhapKho.iMaNV
AND tblDonNhapKho.iSoNK = tblChiTietNhapKho.iSoNK
AND tblNhanVien.iMaNV = @manv GROUP BY tblNhanVien.iMaNV,sTenNV END
EXEC spthongkenhapkho_nhanvien 1012
Trang 3415 Số tiền mà nhân viên bán được và số hóa đơn đã xử lý
CREATE PROC spthongkebanhang_nhanvien ( @manv int )
AS
BEGIN
SELECT tblNhanVien.iMaNV,sTenNV,COUNT(tblDonDatHang.iSoHD) AS [So Hoa Don],
iSoLuongMua*fGiaBan*fMucGiamGia) AS [Tong tien]
SUM(iSoLuongMua*fGiaBan-FROM dbo.tblNhanVien,dbo.tblDonDatHang,dbo.tblChiTietDatHang
WHERE dbo.tblNhanVien.iMaNV = dbo.tblDonDatHang.iMaNV
AND tblDonDatHang.iSoHD = tblChiTietDatHang.iSoHD
AND tblNhanVien.iMaNV = @manv GROUP BY tblNhanVien.iMaNV,tblNhanVien.sTenNV END
EXEC spthongkebanhang_nhanvien 1011
VI Xây dựng các Trigger cho CSDL
1 Giá bán phải lớn hơn hoặc bằng giá hàng
CREATE TRIGGER tg_kiemTraGiaBan
Trang 35SELECT @giaBan = fGiaBan, @maHang = sMaHang FROM Inserted
SELECT @giaHang = fGiaHang FROM dbo.tblMatHang WHERE @maHang = sMaHang
IF(@giaBan < @giaHang) BEGIN
PRINT N'Giá bán phải lớn hơn hoặc bằng giá hàng'
ROLLBACK TRAN END
END
2 Kiểm tra giới tính xem đúng không
CREATE TRIGGER tg_kiemtragioitinh
ON dbo.tblNhanVien
AFTER INSERT, UPDATE
AS
BEGIN DECLARE @gioitinh NVARCHAR(5) SELECT @gioitinh = sGioiTinh FROM inserted IF(@gioitinh != N'Nam' AND @gioitinh != N'Nữ')
Trang 36BEGIN RAISERROR('Giới Tính Không Hợp Lệ!',16,10)
ROLLBACK TRAN END
END
GO
3 Kiểm tra ngày nhập hàng đúng không
CREATE TRIGGER tg_kiemTraNgayNhapHang
ON tblDonNhapKho
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @ngayNhapHang DATETIME
SELECT @ngayNhapHang = dNgayNhapHang FROM Inserted
IF(@ngayNhapHang > GETDATE()) BEGIN
PRINT N'Ngày nhập hàng không đc lớn hơn ngày hiện tại'
ROLLBACK TRAN END
END