Trong thời đại ngày nay, công nghệ thông tin đang được phát triển mạnh mẽ, nhanh chóng và xâm nhập vào nhiều lĩnh vực khoa học, kỹ thuật cũng như trong cuộc sống. Nó trở thành công cụ đắc lực trong nhiều ngành nghề như giao thông, quân sự, y học.... đặc biệt trong công tác quản lý nói chung và quản lý nhà hàng nói riêng. Trước đây, khi máy tính chưa được ứng dụng rộng rãi, các công việc quản lý nhà hàng đều được làm thủ công nên rất mất thời gian và tốn kém về nhân lực cũng như tài chính. Ngày nay, với sự phát triển công nghệ thông tin mà máy tính đã được sử dụng rộng rãi trong các cơ quan, nhà máy, trường học... giúp cho công việc được tốt hơn. Việc sử dụng máy tính vào công tác quản lý nhà hàng là một yêu cầu cần thiết nhằm xóa bỏ những phương pháp quản lý lạc hậu, lỗi thời gây tốn kém về nhiều mặt. Vì vậy, chúng em đã xây dựng đề tài “Quản lý nhà hàng ” với mong muốn giúp cho việc quản lý được dễ dàng, thuận tiện và tránh sai sót.
Trang 1TRƯỜNG ĐẠI HỌC THỦY LỢI KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN HỌC PHẦN: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
ĐỀ TÀI: QUẢN LÝ CỬA HÀNG
Giáo viên hướng dẫn: Nguyễn Ngọc Quỳnh Châu
Sinh viên/nhóm sinh viên thực hiện:
1 Trần Thanh An – 2051060374 - 62PM2
2. Huy Văn Bình - 2051060403 - 62PM2
3. Nguyễn Văn Đức - 2051060456 - 62PM2
Hà Nội, năm 2022
Trang 2MỤC LỤC
A MỞ ĐẦU
1 Giới thiệu
2 Mục đích
3 Phương pháp
B NỘI DUNG
1 Thiết kế CSDL
a Mô tả bài toán
b Mô hình quan hệ
2 Lập trình
a Cursor
b Procedure
c Function
d View
e Trigger
Trang 3A MỞ ĐẦU:
1 Giới thiệu:
Trong thời đại ngày nay, công nghệ thông tin đang được phát triển mạnh
mẽ, nhanh chóng và xâm nhập vào nhiều lĩnh vực khoa học, kỹ thuật cũng như trong cuộc sống Nó trở thành công cụ đắc lực trong nhiều ngành nghề như giao thông, quân sự, y học đặc biệt trong công tác quản lý nói chung
và quản lý nhà hàng nói riêng.
Trước đây, khi máy tính chưa được ứng dụng rộng rãi, các công việc quản lý nhà hàng đều được làm thủ công nên rất mất thời gian và tốn kém
về nhân lực cũng như tài chính Ngày nay, với sự phát triển công nghệ thông tin mà máy tính đã được sử dụng rộng rãi trong các cơ quan, nhà máy, trường học giúp cho công việc được tốt hơn.
Việc sử dụng máy tính vào công tác quản lý nhà hàng là một yêu cầu cần thiết nhằm xóa bỏ những phương pháp quản lý lạc hậu, lỗi thời gây tốn
kém về nhiều mặt Vì vậy, chúng em đã xây dựng đề tài “Quản lý nhà
hàng ” với mong muốn giúp cho việc quản lý được dễ dàng, thuận tiện và
tránh sai sót
2 Mục đích:
Hệ thống “Quản lý nhà hàng ” thực hiện quản lý danh mục các món,
danh sách bàn, danh sách nhân viên: (Thông tin NV, thanh toán lương NV), lịch phân ca làm việc, danh bạ công thức pha chế, danh sách các khoản thu chi, danh sách đại lý, nhà cung cấp, danh sách khách hàng cần thiết (khách VIP, khách quen…), giúp cho việc quản lý nhà hàng được dễ dàng, thuận tiện và tránh sai sót.
Trang 4B NỘI DUNG:
1 Thiết kế CSDL:
a Mô tả bài toán
- Quản lý menu: bảng giá của từng mặt hàng và các mặt hàng có trong nhà hàng
- Quản lý bàn ăn: quản lý hóa đơn tính tạm của mỗi bàn ăn và cập nhật liên tục khi khách thêm món
- Lập hóa đơn thanh toán: hóa đơn thanh toán theo số lượng và đơn giá các món ăn mà khách hàng đã gọi và hệ thống tự động tính tổng tiền khách phải trả và số tiền khách còn dư sau khi trả, và lưu vào cơ sở dữ liệu để quản lý hóa đơn
- Lập báo cáo: Hàng tháng nhân viên thu chi sẽ sử dụng chức năng quản
lý thu chi của hệ thống để tổng hợp và lâp báo cáo về tình hình thu/chi
và lợi nhuận trong tháng của nhà hàng lên giám đốc vào ngày 28 hàng tháng để giám đốc có kế hoạch chi trả lương và thưởng cho nhân viên vào ngày mùng 3 tháng sau.
b CSDL
Trang 5Mô hình quan hệ:
Nhanvien
IDNhanVien int Primary key Mã nhân viên
HoaDon
IDKhachHang int Foreign key Mã khách hàngIDNhanVien Int Foreign key Mã nhân viên
Trang 6SanPham
IDLoaihang int Foreign key Mã loại hàngIDNguyenlieu int Foreign key Mã nguyên liệu
NguyenLieu
IDNguyenLieu int Primary key Mã nguyên liệu
Trang 7IDNhaCungCap int Foreign key Mã nhà cung cấp
LoaiHang
IDLoaiHang int Primary key Mã loại hàng
KhachHang
IDKhachHang int Primary key Mã khách hàng
NhaCungCap
IDNhaCungCa
Trang 82 Lập trình:
a Cursor
1 Sử dụng con trỏ để in ra nhân viên bán được nhiều nhất thông qua khung hình TongKetHoaDon
DECLARE cau1 CURSOR DYNAMIC SCROLL
FOR SELECT IDNhanVien FROM v_TongKetHoaDon
GROUP BY IDNhanVien HAVING COUNT(IDNhanVien) >=
ALL(SELECT COUNT(IDNhanVien)
FROM v_TongKetHoaDon GROUP BY IDNhanVien);
OPEN cau1;
DECLARE @idNhanVien INT;
FETCH FIRST FROM cau1 INTO @idNhanVien;
WHILE (@@FETCH_STATUS = 0) BEGIN
SELECT DISTINCT IDNhanVien, HoTenNhanVien FROM
v_TongKetHoaDon WHERE IDNhanVien = @idNhanVien;
FETCH NEXT FROM cau1 INTO @idNhanVien;
END
close cau1;
2 Sử dụng con trỏ để in ra sản phẩm có số lượng bán nhiều nhất dựa vào khung hình ChiTietHoaDon
DECLARE cau2 CURSOR DYNAMIC SCROLL
FOR SELECT IDSanPham FROM v_ChitietHoaDon
GROUP BY IDSanPham HAVING SUM(SoLuong) >= ALL(SELECT
SUM(SoLuong)
FROM v_ChitietHoaDon GROUP BY IDSanPham);
OPEN cau2;
DECLARE @idSanPham INT;
FETCH FIRST FROM cau2 INTO @idSanPham;
WHILE (@@FETCH_STATUS = 0) BEGIN
Trang 9SELECT DISTINCT IDSanPham, TenSp FROM v_ChitietHoaDon WHERE IDSanPham = @idSanPham;
FETCH NEXT FROM cau2 INTO @idSanPham;
declare cs2 cursor dynamic scroll
for select TenSP, Mota from SanPham
open cs2
declare @ten nvarchar(50) , @mota nvarchar(50);
fetch first from cs2 into @ten, @mota
while(@@FETCH_STATUS=0)
begin
print N'Tên SP:' + @ten + N' Mô tả:' + @mota
fetch next from cs2 into @ten , @mota
end
close cs2;
deallocate cs2;
4 Sử dụng con trỏ để in ra các hóa đơn cùng tên khách hàng:
Mã hóa đơn, Tên hiển thị
declare cs3 cursor dynamic scroll
for select Hoadon.IDHoaDon, KhachHang.HoTen from Hoadon,
KhachHang
open cs3
declare @id int , @tenkh nvarchar(100);
Trang 10fetch first from cs3 into @id, @tenkh
declare cs5 cursor dynamic scroll
for select IDHoaDon, ngayban, Hoten from Hoadon ,NhanVien where Hoadon.IDNhanVien = NhanVien.IDNhanVien
open cs5
declare @id int, @ngayban date, @ten nvarchar(50);
fetch first from cs5 into @id ,@ngayban, @ten;
Trang 116. Sử dụng con trỏ để chứa bản ghi phiếu thống kê và tài khoản Sử dụng con trỏ để in ra theo định dạng “Tên hiển thị… số lượng hóa đơn”
declare cs6 cursor dynamic scroll
for select Hoten, count(IDHoaDon) from NhanVien, HoaDon where HoaDon.IDNhanVien = NhanVien.IDNhanVien group by Hoten open cs6
declare @ten nvarchar(50), @soluong int;
fetch first from cs6 into @ten, @soluong;
1 Viết thủ tục hiển thị số lượng hóa đơn mà 1 nhân viên đã thực hiện
create proc nhanvien
@x nchar(10) output as begin
declare @count int
Trang 12select @count= count(IDHoaDon) from HoaDon where
@x=IDNhanVien
print CONCAT(N'Nhân Viên',@x,N'đã làm', @count,N'Hóa Đơn') end;
exec nhanvien'2'
2 Viết thủ tục hiển thị số lượng sản phẩm
create proc Dem @demsp int
as begin
declare @dem int;
select @dem = count(*) from SanPham
print N'Có ' +cast(@dem as char(4)) + N' SanPham'
end;
3 Viết thủ tục hiển thị số hóa đơn bán theo ngày nhập vào
create or alter proc cau3
4 Viết thủ tục trả về tổng số tiền của tất cả hóa đơn
alter proc tongtiennh
as begin
Trang 13declare @tong int;
declare @dem int;
select @dem = count(*) from NguyenLieu where IDNhaCungCap = (select IDNhaCungCap from NhaCungCap where TenCongTy =
@ncc)
print N'Nhà cung cấp: ' + @ncc + N' cung ứng ' + cast(@dem as nvarchar(10)) + N' nguyên liệu'
end;
6 Viết thủ tục trả về số lượng sản phẩm mà 1 loại hàng cung cấp
create proc SLSPLH @type nvarchar(50)
as begin
declare @dem int;
select @dem = count(*) from SanPham where IDLoaiHang = (select IDLoaiHang from LoaiHang where TenLoaiHang = @type)
Trang 14print N'Loại hàng ' + @type + N' có ' + cast(@dem as nvarchar(10)) + N' sản phẩm'
2 Viết hàm tổng tiền của 1 hóa đơn
CREATE or alter FUNCTION f_TongTien(@idHoaDon int)
Trang 153 Function trả về danh sách chi tiết các sản phẩm trong một đơn hàng bao gồm : IDSanPham, TenSanPham, TenLoaiHang,
TenNguyenLieu, TenNhaCungCapNL,TyLeGiamGia, ThanhTien
create or alter function cau3(@idhoadon int) returns table as
return(select ChitietHoaDon.IDSanPham, SanPham.TenSP,
4 Viết hàm trả về mã hóa đơn có nhiều sản phẩm nhất
create function hdslmax()
returns table
as
return (select top(1) IDHoaDon, count(IDSanPham) as
SoLuong from ChitietHoaDon group by IDHoaDon order by
SoLuong desc)
5 Viết hàm trả về tên nhân viên có nhiều hóa đơn nhất
Trang 16create function f_maxsp()
returns table
as
return select HoTen from HoaDonNhanVien where SoLuong = (select max(SoLuong) from HoaDonNhanVien)
6 Tìm hóa đơn với nhân viên id=1
create function timhoadon()
returns table as
return (select * from HoaDon where IDNhanVien=1)
select * from timhoadon()
i Trần Thanh An: 3, 4
ii Huy Văn Bình: 5 ,6iii Nguyễn Văn Đức: 1, 2
d View
1 Tạo khung hình hiển thị chi tiết thông tin hóa đơn bao
gồm:IDHoaDon, IDSanPham, TenSanPham, TenLoaiHang,
SoLuongBan, TenNguyenLieu,DonGiaBan,
TyLeGiamGia,TongTienBan
create view v_ChitietHoaDon as
select IDHoaDon, SanPham.IDSanPham, TenSP, TenLoaiHang, ChitietHoaDon.SoLuong , TenNguyenLieu, DonGiaBan,
Trang 17JOIN LoaiHang ON SanPham.IDLoaiHang =
LoaiHang.IDLoaiHang
JOIN NguyenLieu ON NguyenLieu.IDNguyenLieu =
SanPham.IDNguyenLieu
SELECT * FROM v_ChitietHoaDon;
2 Tạo 1 khung hình hiển thị thông tin tổng kết các hóa đơn bao gồm IDHoaDon, IDKhachHang, HoTenKhachHang,
GioiTinhKhachHang, IDNhanVien, HoTenNhanVien, NgayBan, TongTienHoaDon
create view v_TongKetHoaDon as
select IDHoaDon, KhachHang.IDKhachHang, KhachHang.HoTen HotenKhachHang, KhachHang.GioiTinh GioiTinhKhachHang, NhanVien.IDNhanVien, NhanVien.Hoten HotenNhanVien,
HoaDon.NgayBan,
dbo.f_TongTien(HoaDon.IDHoaDon) TongTienHoaDon
FROM HoaDon JOIN KhachHang ON KhachHang.IDKhachHang = HoaDon.IDKhachHang
JOIN NhanVien ON NhanVien.IDNhanVien = HoaDon.IDNhanVien
select * from v_TongKetHoaDon
3 Tạo khung nhìn hiển thị Tên sản phẩm, Đơn giá, Mã nguyên liệu,Tên Nguyên liệu,Mã loại hàng, tên loại hàng
Create view SanPhamNguyenLieu as
Trang 18Select SanPham.TenSP, SanPham.Mota, Nguyenlieu.IDNguyenLieu, Nguyenlieu.TenNguyenLieu as'TenNguyenLieu',
LoaiHang.IDLoaiHang, LoaiHang.TenLoaiHang as 'TenLoaiHang' from SanPham, Nguyenlieu, LoaiHang
where SanPham.IDNguyenLieu = Nguyenlieu IDNguyenLieu and SanPham.IDLoaiHang = LoaiHang.IDLoaiHang
Group By SanPham.TenSP, SanPham.Mota,
Nguyenlieu.IDNguyenLieu, Nguyenlieu.TenNguyenLieu,
LoaiHang.IDLoaiHang, LoaiHang.TenLoaiHang
4 Tạo khung nhìn hiển thị số lượng hóa đơn mà mỗi nhân viên thực hiện được
Create view HoaDonNhanVien as
select HoTen, count(IDHoaDon) as SoLuong from NhanVien,
HoaDon where NhanVien.IDNhanVien = HoaDon.IDNhanVien group by HoTen
5 Tạo khung nhìn tổng hợp ra tên của những sản phẩm được bán nhiều nhất
Create view SoluongNguyenLieu as
select Nguyenlieu.tennguyenlieu, Nguyenlieu.soluong from
select TenLoaiHang, count(IDSanPham) as SoLuong from
LoaiHang, SanPham where LoaiHang.IDLoaiHang =
SanPham.IDLoaiHang group by TenLoaiHang
Trang 19ALTER TABLE ChiTietHoaDon
ADD ThanhTien MONEY
GO
CREATE OR ALTER TRIGGER ThanhTienNhap ON
ChiTietHoaDon FOR UPDATE AS
BEGIN
DECLARE @soHDN NVARCHAR(20), @donGiaNhap
MONEY, @maHang NVARCHAR(20)
SELECT @soHDN = IDHoaDon, @maHang = IDSanPham FROM inserted
UPDATE ChiTietHoaDon SET ThanhTien = (SoLuong * DonGiaBan)
where IDHoaDon = @soHDN AND IDSanPham = @maHang END
GO
2 Tạo trigger tự động cập nhật tổng tiền hóa đơn khi người dùng thêm, xóa sản phẩm khỏi chi tiết hóa đơn
ALTER TABLE HoaDon
ADD TongTien MONEY
GO
CREATE OR ALTER TRIGGER TongTienBan ON ChiTietHoaDon FOR INSERT, UPDATE, DELETE AS
BEGIN
Trang 20DECLARE @inSoHDB NVARCHAR(20), @deSoHDB
NVARCHAR(20), @inThanhTien MONEY, @deThanhTien
MONEY
SELECT @inSoHDB = IDHoaDon, @inThanhTien =
ThanhTien FROM inserted
SELECT @deSoHDB = IDHoaDon, @deThanhTien =
ThanhTien FROM deleted
UPDATE HoaDon SET TongTien = ISNULL(TongTien, 0) + ISNULL(@inThanhTien,0) - ISNULL(@deThanhTien, 0) WHERE IDHoaDon = ISNULL(@inSoHDB, @deSoHDB)
Trang 21DELETE FROM NhanVien WHERE IDNhanVien IN
(SELECT IDNhanVien FROM deleted)
END
GO
5 Tạo Trigger để đảm bảo rằng khi thêm một loại mặt hàng vào bảng LoaiHang thì tên loại mặt hàng thêm vào phải chưa có trong bảng create or alter TRIGGER trig_1 ON LoaiHang FOR insert AS
BEGIN
IF ((SELECT COUNT(TenLoaiHang) FROM LoaiHang
WHERE TenLoaiHang = (SELECT TenLoaiHang FROM inserted))
Trang 22PRINT N'Them thanh cong.' END
6 Tạo Trigger để đảm bảo rằng khi sửa một loại mặt hàng trong bảng LoaiHang thì tên loại mặt hàng sau khi sửa phải khác tên loai mặt hàng trước khi sửa và tên loại mặt hàng sau khi sửa không trùng với tên các loại hàng đã có trong bảng.
alter TRIGGER trig_2 ON LoaiHang FOR UPDATE AS BEGIN
IF ((SELECT COUNT(TenLoaiHang) FROM LoaiHang
WHERE TenLoaiHang = (SELECT TenLoaiHang FROM inserted))
> 1) BEGIN
ROLLBACK TRAN;
PRINT N'Ten loai hang da co trong bảng LoaiHang'; END
ELSE IF ((SELECT TenLoaiHang FROM inserted) =
(SELECT TenLoaiHang FROM deleted)) BEGIN
Trang 23CREATE TRIGGER trigger4 on NhanVien for update
BEGIN
COMMIT TRAN PRINT N' Sửa mật khẩu thành công' END
ELSE
BEGIN
ROLLBACK TRAN PRINT N'Mật khẩu chỉ chứa số, không nhập các kí tự khác'
END END
END
i Trần Thanh An: 3, 4
ii Huy Văn Bình: 1, 2
iii Nguyễn Văn Đức: 5, 6