Chuyển bàn trong phần mềm Quản lý quán cafe với C# Winform

Lập trình phần mềm Quản lý quán cafe với C# Winform

5.0 (3 đánh giá)
Tạo bởi HowKteam Cập nhật lần cuối 3 năm trước 40.831 lượt xem 33 bình luận
Tác giả/Dịch giả: HowKteam
Học nhanh

Danh sách bài học

01. Thiết kế cơ sở dữ liệu cho phần mềm Quản lý quán cafe với C# Winform 02. Thiết kế giao diện cho phần mềm Quản lý quán cafe với C# Winform 03. Giới thiệu mô hình 3 lớp (3 Layers) 04. Tạo lớp DataProvider cho phần mềm Quản lý quán cafe với C# Winform 05. Giới thiệu design patern Singleton phần mềm Quản lý quán cafe với C# Winform 06. Tạo chức năng đăng nhập cho phần mềm Quản lý quán cafe với C# Winform 07. Hạn chế lỗi SQL Injection cho phần mềm Quản lý quán cafe với C# Winform 08. Hiển thị số bàn theo CSDL cho phần mềm Quản lý quán cafe với C# Winform 09. Hiển thị hóa đơn theo bàn cho phần mềm Quản lý quán cafe với C# Winform 10. Hiển thị tổng tiền cho phần mềm Quản lý quán cafe với C# Winform 11. Thêm bớt món hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 12. Thanh toán hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 13. Chuyển bàn trong phần mềm Quản lý quán cafe với C# Winform 14. Hiển thị sanh sách hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 15. Thay đổi thông tin cá nhân trong phần mềm Quản lý quán cafe với C# Winform 16. Hiển thị danh sách thức ăn trong phần mềm Quản lý quán cafe với C# Winform 17. Binding thông tin thức ăn trong phần mềm Quản lý quán cafe với C# Winform 18. Thêm, xóa, sửa thức ăn trong phần mềm Quản lý quán cafe với C# Winform 19. Tìm kiếm gần đúng thức ăn trong phần mềm Quản lý quán cafe với C# Winform 20. Hiển thị danh sách tài khoản trong phần mềm Quản lý quán cafe với C# Winform 21. Thêm, xóa, sửa tài khoản trong phần mềm Quản lý quán cafe với C# Winform 22. Mã hóa mật khẩu trong phần mềm Quản lý quán cafe với C# Winform 23. Tạo phím tắt cho phần mềm Quản lý quán cafe với C# Winform 24. Phân trang cho hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 25. Tạo report trong phần mềm Quản lý quán cafe với C# Winform 26. Đóng gói phần mềm Quản lý quán cafe với C# Winform

Chuyển bàn trong phần mềm Quản lý quán cafe với C# Winform

Không có gì tuyệt vời hơn là luyện tập với ví dụ thực tế. Nào cùng nhau thử thách bản thân với phần mềm: Quản lý quán cafe

Bạn nên có kiến thức về:

  • Lập trình Winform cơ bản
  • Delegate – Event
  • SQL server
  • Xử lý ngày tháng năm

Code fTableManager.cs

Code fTableManager.Designer.cs

Code BillDAO.cs

Code Bill.cs

Code TableDAO.cs

Bài sau chúng ta sẽ cùng nhau tìm hiểu cách hiển thị danh sách hóa đơn theo ngày.

Đừng quên: “Luyện tập – Thử thách – Không ngại khó


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Chuyển bàn trong phần mềm Quản lý quán cafe với C# Winform dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Khóa học

Lập trình phần mềm Quản lý quán cafe với C# Winform

Bạn đã học qua LẬP TRÌNH C# CƠ BẢN? Xong nốt cả LẬP TRÌNH WINFORM lẫn SQL?

Bạn đã chán các bài tập căn bản, muốn thực hành các kiến thức đã học vào một dự án thực tế?

Hay đơn giản bạn là chủ quán café, mong muốn tự tạo nên phần mềm dành cho chính mình sử dụng?

Vậy còn chần chừ gì không tham gia ngay khóa học LẬP TRÌNH PHẦN MỀM QUÁN CAFÉ VỚI C# WINFORM?

Đánh giá

5.0
3 đánh giá
Đánh giá
5
3
4
3
2
1
Tú Trần đã đánh giá khoảng 1 năm trước

DongTV đã đánh giá 4 năm trước

nguyenhoangnhat đã đánh giá 4 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Nguyên0909 đã bình luận 3 năm trước
System.Data.SqlClient.SqlException: 'The INSERT statement conflicted with the FOREIGN KEY constraint "FK__BILL__status__22AA2996". The conflict occurred in database "QuanLyQuanCafe", table "dbo.TableFood", column 'id'.
The statement has been terminated.

Sửa lỗi này làm sao vậy mọi người giúp em với ạ

thong21112001 đã bình luận 3 năm trước

Mình lấy code của bạn dưới để chỉnh lại cho nó đầy đủ hơn về gộp bàn :
 

Create PROC USP_CombineTable
@idTable1 int,@idTable2 int
AS
BEGIN
	Declare @idFirstBill int
	Declare @idSecondBill int
	Declare @isFirstTableEmpty int = 1
	Declare @isSecondTableEmpty int = 1
	--Lấy ra BillID của Bill chưa thanh toán trên 2 bàn cần gộp vào nhau
	Select @idSecondBill = Id from Bill Where IdTable = @idTable2 And StatusBill = 0
	Select @idFirstBill = Id from Bill Where IdTable = @idTable1 And StatusBill = 0

	--Nếu 2 bàn đều có người thì mới tiến hành gộp
	IF(@idFirstBill != 0 AND @idSecondBill != 0)
		BEGIN
			--Gộp bàn thứ 1 vào bàn thứ 2 bằng cách thay BillID trong bảng BillInfo
			UPDATE BillInfo SET IdBill = @idSecondBill WHERE IdBill = @idFirstBill

			--Khi gộp bàn sẽ xuất hiện các món trùng lặp với nhau
			--Tạo con trỏ và lấy ra các FoodID với số lần trùng lặp
			DECLARE BillInfoCursor CURSOR FOR SELECT IdFood, count(*) AS 'Count' FROM BillInfo WHERE IdBill = @idSecondBill GROUP BY IdFood
			OPEN BillInfoCursor

			DECLARE @foodID INT
			DECLARE @count INT

			FETCH NEXT FROM BillInfoCursor INTO @foodID, @count

			WHILE @@FETCH_STATUS = 0
				BEGIN
					--Trường hợp @count > 1 tức là món này bị trùng nhau, xuất hiện hơn 1 lần
					IF(@count > 1) 
						BEGIN
							DECLARE @finalFoodCount INT = 0
							--Tính gộp tổng các FoodCount của món này
							SELECT @finalFoodCount = SUM(CountFood) FROM BillInfo WHERE IdBill = @idSecondBill AND IdFood = @foodID
			
							DECLARE @maxID INT = 0
							--Lấy ra max ID của món này để tí nữa giữ lại, các ID khác xoá hết cho khỏi trùng nhau
							SELECT @maxID = MAX(ID) FROM BillInfo WHERE IdBill = @idSecondBill AND IdFood = @foodID

							--update số lượng món ăn cho ID này
							UPDATE BillInfo SET CountFood = @finalFoodCount WHERE IdBill = @idSecondBill AND IdFood = @foodID AND ID = @maxID --Cài nhiều điều kiện cho chắc kèo

							--Xoá các ID còn lại
							DELETE BillInfo WHERE IdBill = @idSecondBill AND IdFood = @foodID AND ID != @maxID
						END

					FETCH NEXT FROM BillInfoCursor INTO @foodID, @count
				END

			CLOSE BillInfoCursor
			DEALLOCATE BillInfoCursor
		END
		Select @isFirstTableEmpty =  COUNT (*) from BillInfo where IdBill = @idFirstBill
		Select @isSecondTableEmpty =  COUNT (*) from BillInfo where IdBill = @idSecondBill
		Print '------'
		Print @isFirstTableEmpty
		Print @isSecondTableEmpty
	If(@isFirstTableEmpty = 0)
		Begin
			Update TableFood set StatusTable = N'Trống' where Id = @idTable1
			Delete Bill where IdTable = @idTable1 And StatusBill = 0
		End
	If(@isSecondTableEmpty = 0)
		Begin
			Update TableFood set StatusTable = N'Trống' where Id = @idTable2
			Delete Bill where IdTable = @idTable2 And StatusBill = 0
		End
END
GO

 

lqbinh đã bình luận 3 năm trước

Chia sẻ với các bạn code của mình, lí thuyết chuyển bàn như sau: (CSDL mình đặt tên khác với bài nhưng ý nghĩa cũng tương tự)

1. Chỉ chuyển bàn có người sang bàn trống hoặc 2 bàn có người chuyển qua lại cho nhau. (vì thực tế bàn trống thì chuyển cái gì?) Thêm dòng sau ở event button chuyển bàn, sau phần khai báo biến để tránh lỗi do bấm nhầm: (và phải chọn bàn có người ở listview trước)

 if ((lsvFood.Tag as TableDTO).TrangThai != "Trống")

2. Như trên ta có 2 trường hợp. Nếu bàn 1 có người chuyển qua bàn 2 trống, thì idtable2 NULL, nếu 2 bàn có người thì không có idtable nào NULL cả. Stored Procedure sp_SwitchTable như sau: Lưu ý khi viết SP này:

- Vòng IF của trường hợp 2 bàn có người phải nằm trước trường hợp 1 bàn có người, do SP chạy từ trên xuống nên nếu đặt ngược lại vẫn chạy cả 2 vòng IF.

- Đối với trường hợp chuyển 1 bàn có người sang 1 bàn trống, thuật toán là xóa đi bàn đã chuyển & tạo trigger để cập nhật lại trạng thái bàn trống cho bảng Bill.

CREATE PROC sp_SwitchTable
@idtable1 INT, @idtable2 INT
AS
BEGIN
	DECLARE @idBillFirst INT
	DECLARE @idBillSecond INT

	SELECT @idBillFirst = id FROM dbo.HoaDon WHERE BanSo = @idtable1 AND ThanhToan = 0
	SELECT @idBillSecond = id FROM dbo.HoaDon WHERE BanSo = @idtable2 AND ThanhToan = 0

	IF (@idBillFirst IS NOT NULL AND @idBillSecond IS NOT NULL)
	BEGIN
	    SELECT id INTO IdBillInfoTable FROM dbo.TTHoaDon WHERE SoHoaDon = @idBillFirst

	UPDATE dbo.TTHoaDon SET SoHoaDon = @idBillFirst WHERE SoHoaDon = @idBillSecond
	UPDATE dbo.TTHoaDon SET SoHoaDon = @idBillSecond WHERE id IN (SELECT * FROM dbo.IdBillInfoTable)

	DROP TABLE dbo.IdBillInfoTable
	END

	IF (@idBillFirst IS NOT NULL AND @idBillSecond IS NULL)
	BEGIN
		INSERT dbo.HoaDon
		(
		    DateCheckIn,
		    DateCheckOut,
		    BanSo,
		    ThanhToan,
		    discount
		)
		VALUES
		(   GETDATE(), -- DateCheckIn - date
		    NULL, -- DateCheckOut - date
		    @idtable2,         -- BanSo - int
		    0,         -- ThanhToan - int
		    0          -- discount - int
		    )
		SELECT @idBillSecond = MAX(id) FROM dbo.HoaDon WHERE BanSo = @idtable2 AND ThanhToan = 0
	UPDATE dbo.TTHoaDon SET SoHoaDon = @idBillSecond WHERE SoHoaDon = @idBillFirst
	DELETE dbo.HoaDon WHERE BanSo = @idtable1 AND ThanhToan = 0
	END
END
GO

Trigger set trạng thái bàn về trống sau khi xóa đi bàn ban đầu trong trường hợp chuyển 1 bàn có người sang 1 bàn khác trống. Đồng thời cũng thêm 1 phần bị lỗi khi thanh toán xong bàn vẫn có người do Trigger của BillInfo làm.

CREATE TRIGGER tg_UpdateBill ON dbo.HoaDon
FOR DELETE, UPDATE
AS
BEGIN
	-- Check out
	DECLARE @idbillinfo INT
	SELECT @idbillinfo = Inserted.id FROM Inserted
	
	DECLARE @idtableCheckout INT
	SELECT @idtableCheckout = BanSo FROM dbo.HoaDon WHERE id = @idbillinfo AND ThanhToan = 1

	DECLARE @countBillInfoCheckout INT
	SELECT @countBillInfoCheckout = COUNT(*) FROM dbo.TTHoaDon WHERE SoHoaDon = @idbillinfo

	IF (@countBillInfoCheckout > 0)
		UPDATE dbo.BanAn SET TrangThai = N'Trống' WHERE SoBan = @idtableCheckout

	-- Chuyển bàn
	DECLARE @iddeletebillinfo INT
	SELECT @iddeletebillinfo = Deleted.id FROM Deleted

	DECLARE @idtabledelete INT
	SELECT @idtabledelete = banso FROM Deleted WHERE id = @iddeletebillinfo AND ThanhToan = 0

	DECLARE @countbilldelete INT
	SELECT @countbilldelete = COUNT(*) FROM Deleted

	IF (@countbilldelete > 0)
		UPDATE dbo.BanAn SET TrangThai = N'Trống' WHERE SoBan = @idtabledelete
END
GO

Còn trigger cho BillInfo thì giống trong bài viết. Cảm ơn các bạn đã xem.

DongTV đã bình luận 4 năm trước

Có bạn nào làm được phần Gộp bàn chưa nhỉ?

meopos2 đã bình luận 5 năm trước

có ai biết lỗi mà ko chuyển được bàn không mọi người ko báo lỗi gì nhưng ko chuyển đc bàn

Không có video.