Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
/* Câu hỏi: Ngày mua hàng (ngayHD) của một khách hàng thành viên sẽ lớn hơn hoặc bằng ngày khách hàng đó đăng ký thành viên (ngayDK).
Mình muốn kiểm tra ngày mua hàng >= ngày đăng ký thành viên, đồng thời check mã hóa đơn, nếu trùng thì UPDATE, còn chưa có thì INSERT.
Rất mong HowKteam hỗ trợ. Mình chân thành cảm ơn. */
USE master
GO
DROP DATABASE QLBanHang
GO
CREATE DATABASE QLBanHang
GO
USE QLBanHang
GO
CREATE TABLE KhachHang
(
maKH CHAR(4) UNIQUE NOT NULL,
hoTen NVARCHAR(40),
diaChi NVARCHAR(50),
soDT VARCHAR(20),
ngaySinh SMALLDATETIME,
ngayDK SMALLDATETIME,
doanhSo MONEY
)
GO
CREATE TABLE HoaDon
(
soHD CHAR(4) UNIQUE NOT NULL,
ngayHD SMALLDATETIME,
maKH CHAR(4),
maNV CHAR(4),
tongTien MONEY
)
GO
ALTER TABLE dbo.KhachHang ADD CONSTRAINT PK_KhachHang PRIMARY KEY (maKH)
GO
ALTER TABLE dbo.HoaDon ADD CONSTRAINT PK_HoaDon PRIMARY KEY (soHD)
GO
ALTER TABLE dbo.HoaDon ADD CONSTRAINT FK_HoaDonKhachHang FOREIGN KEY (maKH) REFERENCES dbo.KhachHang(maKH)
GO
INSERT dbo.KhachHang VALUES ('1', N'Nguyễn Văn A', N'Lâm Đồng', '+84974352898', '20000101', '20210101', 1000000)
GO
--INSERT INTO dbo.HoaDon VALUES ('1', '20210101', '1', '1', '1000000')
--GO
DECLARE @exitSoHD CHAR(4);
DECLARE @exitNgayHD INT;
DECLARE @soHD CHAR(4) = '1';
DECLARE @ngayHD SMALLDATETIME = '20220101';
DECLARE @maKH CHAR(4) = '1';
DECLARE @maNV CHAR(4) = '1';
DECLARE @tongTien MONEY = '1234567890';
SELECT @exitSoHD = COUNT(*) FROM dbo.HoaDon WHERE soHD = @soHD
SELECT @exitNgayHD = DATEDIFF(DD,ngayDK,@ngayHD) FROM dbo.KhachHang JOIN dbo.HoaDon ON HoaDon.maKH = KhachHang.maKH WHERE soHD = @soHD
--PRINT N'Số hóa đơn : ' + @exitSoHD
--PRINT N'Số ngày : ' + CAST(@exitNgayHD AS nvarchar(100))
IF @exitSoHD > 0 -- Nếu tồn tại số hóa đơn
BEGIN
IF @exitNgayHD >= 0 -- Và ngày mua hợp lệ
BEGIN
UPDATE dbo.HoaDon SET ngayHD = @ngayHD, maKH = @maKH, maNV = @maNV, tongTien = @tongTien WHERE soHD = @soHD
PRINT N'Cập nhật hóa đơn thành công!'
END
ELSE IF @exitNgayHD < 0 -- Và ngày mua không hợp lệ
BEGIN
PRINT N'Ngày mua hàng phải lớn hơn hoặc bằng ngày đăng ký thành viên !'
END
END
ELSE IF @exitSoHD = 0 -- Nếu không tồn tại số hóa đơn
BEGIN
IF @exitNgayHD >= 0 -- Và ngày mua hợp lệ
BEGIN
INSERT INTO dbo.HoaDon (soHD, ngayHD, maKH, maNV, tongTien) VALUES (@soHD, @ngayHD, @maKH, @maNV, @tongTien)
PRINT N'Mua hàng thành công!'
END
IF @exitNgayHD < 0 -- Và ngày mua KHÔNG hợp lệ
BEGIN
PRINT N'Ngày mua hàng phải lớn hơn hoặc bằng ngày đăng ký thành viên !'
--ROLLBACK TRAN
END
END
GO
SELECT * FROM dbo.KhachHang
SELECT * FROM dbo.HoaDon
GO
/* Cảm ơn các bạn đã hỗ trợ, mình đã tìm ra giải pháp, do mình suy nghĩ quá phức tạp ko cần thiết, nên dẫn đến sai lầm, hihi. Và đây là kết quả, chia sẽ để ae tham khảo. Mình xin chân thành cảm ơn. */
USE master
GO
DROP DATABASE QLBanHang
GO
CREATE DATABASE QLBanHang
GO
USE QLBanHang
GO
CREATE TABLE KhachHang
(
maKH VARCHAR(4) UNIQUE NOT NULL,
hoTen NVARCHAR(40),
diaChi NVARCHAR(50),
soDT VARCHAR(20),
ngaySinh SMALLDATETIME,
ngayDK SMALLDATETIME,
doanhSo MONEY
)
GO
CREATE TABLE HoaDon
(
soHD VARCHAR(4) UNIQUE NOT NULL,
ngayHD SMALLDATETIME,
maKH VARCHAR(4),
tongTien MONEY
)
GO
ALTER TABLE dbo.KhachHang ADD CONSTRAINT PK_KhachHang PRIMARY KEY (maKH)
GO
ALTER TABLE dbo.HoaDon ADD CONSTRAINT PK_HoaDon PRIMARY KEY (soHD)
GO
ALTER TABLE dbo.HoaDon ADD CONSTRAINT FK_HoaDonKhachHang FOREIGN KEY (maKH) REFERENCES dbo.KhachHang(maKH)
GO
INSERT dbo.KhachHang VALUES ('1', N'Nguyễn Văn A', N'Lâm Đồng', '+84974352898', '20000101', '20210101', 1000000)
GO
INSERT INTO dbo.HoaDon VALUES ('2', '20210101', '1', '1000000')
GO
ALTER PROCEDURE [dbo].[usp_checkNgayHD]
@soHD VARCHAR(4),
@ngayHD SMALLDATETIME,
@maKH VARCHAR(4),
@tongTien MONEY
AS
BEGIN
DECLARE @exitSoHD VARCHAR(4);
DECLARE @exitNgayDK SMALLDATETIME;
SELECT @exitSoHD = COUNT(*) FROM dbo.HoaDon WHERE soHD = @soHD
SELECT @exitNgayDK = ngayDK FROM dbo.KhachHang WHERE maKH = @maKH
IF @exitSoHD > 0 -- Nếu tồn tại số hóa đơn
BEGIN
IF @ngayHD >= @exitNgayDK -- Và ngày mua hợp lệ
BEGIN
UPDATE dbo.HoaDon SET ngayHD = @ngayHD, maKH = @maKH, tongTien = @tongTien WHERE soHD = @soHD
PRINT N'Cập nhật hóa đơn thành công!'
END
ELSE --IF @ngayHD < @exitNgayDK -- Và ngày mua không hợp lệ
BEGIN
PRINT N'Thông báo 1: Ngày mua hàng phải lớn hơn hoặc bằng ngày đăng ký thành viên !'
END
END
ELSE IF @exitSoHD = 0 -- Nếu KHÔNG tồn tại số hóa đơn
BEGIN
IF @ngayHD >= @exitNgayDK -- Và ngày mua hợp lệ
BEGIN
INSERT INTO dbo.HoaDon (soHD, ngayHD, maKH, tongTien) VALUES (@soHD, @ngayHD, @maKH, @tongTien)
PRINT N'Mua hàng thành công!'
END
ELSE --IF @ngayHD < @exitNgayDK -- Và ngày mua KHÔNG hợp lệ
BEGIN
PRINT N'Thông báo 2: Ngày mua hàng phải lớn hơn hoặc bằng ngày đăng ký thành viên !'
END
END
END
GO
EXEC dbo.usp_checkNgayHD @soHD = '1', @ngayHD = '20200101', @maKH = '1', @tongTien = 1000000
GO
Bạn có thể thử xem: