using QuanLyQuanCafe.DTO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuanLyQuanCafe.DAO
{
publicclass TableDAO
{
privatestatic TableDAO instance;
publicstatic TableDAO Instance
{
get { if (instance == null) instance = new TableDAO(); return TableDAO.instance; }
privateset { TableDAO.instance = value; }
}
publicstaticint TableWidth = 90;
publicstaticint TableHeight = 90;
privateTableDAO() { }
publicvoidSwitchTable(int id1, int id2)
{
DataProvider.Instance.ExecuteQuery("USP_SwitchTabel @idTable1 , @idTabel2", newobject[]{id1, id2});
}
public List<Table> LoadTableList()
{
List<Table> tableList = new List<Table>();
DataTable data = DataProvider.Instance.ExecuteQuery("USP_GetTableList");
foreach (DataRow item in data.Rows)
{
Table table = new Table(item);
tableList.Add(table);
}
return tableList;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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 like và share để ủ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.
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.
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
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.
Sửa lỗi này làm sao vậy mọi người giúp em với ạ
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 :
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)
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.
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.
Còn trigger cho BillInfo thì giống trong bài viết. Cảm ơn các bạn đã xem.
Có bạn nào làm được phần Gộp bàn chưa nhỉ?
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