Hỏi đáp

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

Lỗi NULL cột Diem_Thi /Quan_Ly_Sinh_Vien sau khi thực thi & nhập liệu các TRIGGER/PROC/FUNC

17:33 06-08-2021 432 lượt xem 1 bình luận 16:22 07-08-2021

Chào HowKTeam!

Sau khi mình làm FUNC, PROC, TRIGGE cho các bài tập đầy đủ, thì mình mở Bảng Điểm để kiểm tra lại các lệnh truy vấn có sai sót gì ko, thì phát hiện ra cột Diem_Thi của bảng Điểm bị thay đổi NULL toàn bộ, sau đó mình có nhập lại điểm, phù hợp theo các TRIGGE đã tạo, nhưng khi tắt & mở lại bảng Điểm thì vẫn NULL, 1 số dòng thì lại có nhưng kết quả ko đúng như ban đầu mình đã nhập.

Hình ảnh lỗi:

https://drive.google.com/open?id=1W8FonI9V4zk4LvQ5JI7ZRxPNbn064uEi

Câu truy vấn FUNC:

CREATE FUNCTION TVDF_Lam_Tron_Diem_Thi
        (@Diem_Ban_Dau FLOAT)
    RETURNS FLOAT
    AS
    BEGIN
        DECLARE @Diem_Lam_Tron FLOAT;
        SET @Diem_Lam_Tron = FLOOR(@Diem_Ban_Dau);

        IF (@Diem_Ban_Dau - @Diem_Lam_Tron < 0.25)
            SET @Diem_Ban_Dau = @Diem_Lam_Tron
        ELSE IF (@Diem_Ban_Dau - @Diem_Lam_Tron >= 0.25 AND @Diem_Ban_Dau - @Diem_Lam_Tron < 0.75)
            SET @Diem_Ban_Dau = @Diem_Lam_Tron + 0.5
        ELSE
            SET @Diem_Ban_Dau = @Diem_Lam_Tron + 1        
        RETURN @Diem_Ban_Dau
    END
    GO    

Câu truy vấn TRIGGER:

CREATE TRIGGER TVDT_Nhap_Moi_Diem_Thi
    ON dbo.Ket_Qua
    FOR INSERT, UPDATE
    AS
    BEGIN        
        UPDATE dbo.Ket_Qua
        SET Diem_Thi = dbo.TVDF_Lam_Tron_Diem_Thi(INS.Diem_Thi) FROM dbo.Ket_Qua AS KQ
        LEFT JOIN Inserted AS INS ON INS.MaSV = KQ.MaSV

                                    --AND INS.MaMH = KQ.MaMH
                                    --AND INS.Lan_Thi = KQ.Lan_Thi
                                    --AND INS.Diem_Thi = KQ.Diem_Thi
 
        IF EXISTS (SELECT * FROM Inserted
                    WHERE Inserted.Diem_Thi > 10 OR Inserted.Diem_Thi < 0)
        BEGIN
            RAISERROR(N'Điểm thi được chấm theo thang điểm 10 !', 16, 1)
            ROLLBACK TRANSACTION
        END
    END
    GO

Rất mong các bạn hỗ trợ, chia sẽ. Cảm ơn HowKTeam rất nhiều.

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 21:58 06-08-2021

Mình đã tìm ra được lỗi, do mình thiếu mệnh đề WHERE trong câu truy vấn UPDATE:

ALTER TRIGGER TVDT_Nhap_Moi_Diem_Thi
    ON dbo.Ket_Qua
    FOR INSERT, UPDATE
    AS
    BEGIN
        UPDATE dbo.Ket_Qua
        SET Diem_Thi = dbo.TVDF_Lam_Tron_Diem_Thi(INS.Diem_Thi) FROM dbo.Ket_Qua AS KQ
        LEFT JOIN Inserted AS INS ON INS.MaSV = KQ.MaSV
                                    AND INS.MaMH = KQ.MaMH
                                    AND INS.Lan_Thi = KQ.Lan_Thi
                                    AND INS.Diem_Thi = KQ.Diem_Thi
        WHERE KQ.MaSV=INS.MaSV 
        IF EXISTS (SELECT * FROM Inserted
                    WHERE Inserted.Diem_Thi > 10
                    OR Inserted.Diem_Thi < 0)
            BEGIN
                RAISERROR(N'Điểm thi được chấm theo thang điểm 10 !', 16, 1)
                ROLLBACK TRANSACTION
            END
    END
    GO

Cảm ơn các bạn rất nhiều.

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