Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Kiểm tra Ngày mua hàng 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.

21:05 25-10-2021 954 lượt xem 3 bình luận 21:13 28-10-2021

/* 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


 

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
DongTV đã bình luận 23:08 28-10-2021

/* 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

VoTanDuc đã bình luận 09:13 27-10-2021

Bạn có thể thử xem:

CREATE TABLE KhachHang
(
    maKH CHAR(4) primary key
    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) NOT NULL,
    maNV CHAR(4),
    tongTien MONEY
)
GO

 

Câu hỏi mới nhất