HQT CSDL_2
--XÂY DỰNG TRIGGER THEM:
--1. Thêm mới dữ liệu vào bảng PNHAP với tên tg_PNHAP_Them.
-- Trong đó cần kiểm tra các ràng buộc dữ liệu phải hợp lệ:
-- - Ngày nhập hàng phải sau ngày dặt hàng
create trigger tg_PNHAP_Them on PNHAP
for insert
as
declare @NGAYDH datetime, @ErrMsg char(200)
select @NGAYDH= NgayDH from inserted,DONDH where inserted.SoDH=DONDH.SoDH
if @NGAYDH > (select Ngaynhap from Inserted)
Rollback Tran
set @ErrMsg='Ngay nhap hang phai sau ngay'+ convert(char(10),@NGAYDH,103)
Raiserror(@ErrMsg,16,1)
end
--2. thêm mới dữ liệu vào bảng CTPNHAP với tên tg_CTPNHAP_Them.
--Trong đó cần kiểm tra các ràng buộc dữ liệu:
-- Số lượng nhập hàng <= (Số lượng đặt – Tổng số lượng đã nhập vào trước đó)
create trigger tg_CTPNHAP_Them on CTPNHAP
for insert
as
declare @Tongsl int,@pMaHH char(4), @pSoDH char(4)
select @pSoDH=SoDH from PNHAP, inserted where PNHAP.SoPN=inserted.SoPN
select @pMaHH=MaHH from inserted
select @Tongsl=sum(SLNhap) from CTPNHAP,PNHAP where MaHH=@pMaHH and SoDH=@pSoDH and PNHAP.SoPN=CTPNHAP.SoPN
if (@Tongsl>(select SLDat from CTDONDH where SoDH=@pSoDH and MaHH=@pMaHH))
rollback tran
print'So luong hang nhap lon hon so luong dat hang! Hay nhap lai'
return
end
--3. Xây dựng trigger khi thêm mới dữ liệu vào bảng CTPXUAT với tên tg_CTPXUAT_Them.
-- Trong đó cần kiểm tra các ràng buộc dữ liệu:
-- - Số lượng hàng xuất<=∑số lượng đã nhập-∑ số lượng đã xuất trước ngày xuất hiện tại
--(tính theo mã hàng hóa và ngày xuất )
create trigger tg_CTPXUAT_Them on CTPXUAT
for insert
as
declare @Slxuat int,@pMaHH char(4), @pSoDH char(4),@TongNhap int,@Tongdaxuat int
select @pMaHH=MaHH from inserted
select @TongNhap=sum (SLNhap) from CTPNHAP where MaHH=@pMaHH
select @Tongdaxuat=sum(SLXuat) from CTPXUAT,PXUAT where MaHH=@pMaHH and PXUAT.SoPX=CTPXUAT.SoPX and Ngayxuat<getdate()
select @Slxuat= SlXuat from inserted
if (@Slxuat>(@TongNhap-@Tongdaxuat))
rollback tran
print'So luong hang xuat lon hon so luong hang hien co! Hay nhap lai'
return
end
--4. Khi thêm mới dữ liệu vào bảng Hàng hóa
--Trong đó cần kiểm tra ràng buộc: dữ liệu thêm vào phải là duy nhất
create trigger tg_Hanghoa_Them on HANGHOA
for insert
as
declare @pMaHH char(4)
select @pMaHH=MaHH from inserted
if exists(select MaHH from HANGHOA where MaHH=@pMaHH)
rollback tran
print'Mặt hàng này đã tồn tại trong cơ sở dữ liệu! Hay nhap lai'
return
end
--5. Khi thêm mới dữ liệu vào bảng Nhà cung cấp
--Trong đó cần kiểm tra ràng buộc: dữ liệu thêm vào phải là duy nhất
create trigger tg_Nhacungcap_Them on NCC
for insert
as
declare @pMaNCC char(4)
select @pMaNCC=MaNCC from inserted
if exists(select MaNCC from NCC where MaNCC=@pMaNCC)
rollback tran
print'Thông tin nhà cung cấp này đã tồn tại trong cơ sở dữ liệu! '
return
end
--****************************************************
--******************************
--XÂY DỰNG TRIGGER XOA:
--******************************
--****************************************************
--
--6. Xoá dữ liệu trong bảng PXUAT với tên tg_PXUAT_XOA.
-- Trong đó cần thực hiện hành động:
-- - Tự động xoá các dòng dữ liệu liên quan bên bảng CTPXUAT, CT P Nhập, CTĐon DH,
-- - Xóa hàng hóa: kiểm tra nếu hàng hóa này
--không tồn tại trong CTPXuats hoặc CTPNhap, CTDon DH thì xóa ,
create trigger tg_PXUAT_XOA on PXUAT
for delete
as
declare @pSopx char(4),@pMaHH char(4)
select @pSopx=SoPX from deleted
if exists (Select SoPX from CTPXUAT where SoPX=@pSoPX)
select @pMaHH=MaHH from CTPXUAT where SoPX=@pSopx
delete from CTPXUAT where SoPX=@pSoPX
end
if exists (select MaHH from CTPNHAP where MaHH=@pMaHH)
delete from CTPNHAP where MaHH=@pMaHH
if exists (select MaHH from CTPDonDH where MaHH=@pMaHH)
delete from CTPDonDH where MaHH=@pMaHH
delete from HANGHOA where MaHH not in(select MaHH from CTPDonDH )
delete from HANGHOA where MaHH not in(select MaHH from CTPXUAT )
delete from HANGHOA where MaHH not in(select MaHH from CTPNHAP )
--7. . Xây dựng trigger khi xoá dữ liệu trong bảng PNHAP với tên tg_PNHAP_XOA.
-- Trong đó cần thực hiện hành động:
-- - Tự động xoá các dòng dữ liệu liên quan bên bảng CTPNHAP
create trigger tg_PNHAP_XOA on PNHAP
for delete
as
declare @pSoPN char(4)
select @pSoPN =SoPN from deleted
if exists(select SoPN from CTPNHAP where SoPN=@pSoPN)
delete from CTPNHAP where SoPN=@pSoPN
--****************************************************
--******************************
--TRIGGER RÀNG BUỘC KHI SỬA DỮ LIỆU
--******************************
--****************************************************
--8. Khi sửa dữ liệu trong bảng PNHAP với tên tg_PNHAP_SUA.
--Trong đó cần kiểm tra các ràng buộc dữ liệu phải hợp lệ:
-- - Không cho phép sửa đổi giá trị của các cột: số nhập hàng, số đặt hàng
-- - Kiểm tra giá trị mới của cột ngày nhập hàng phải sau ngày đặt hàng
create trigger tg_PNHAP_SUA on PNHAP
for update
as
declare @ngaynhap datetime,@ngaydathang datetime
if (update (SoPN) or update(SoDH))
rollback tran
Raiserror('Khong duoc sua So don dat hang hoac So phieu nhap',16,1)
return
end
select @ngaydathang=NgayDH from deleted,DonDH where deleted.SoDH=DonDH.SoDH
select @ngaynhap=Ngaynhap from inserted
if @ngaynhap<@ngaydathang
rollback tran
Raiserror('Ngay nhap hang khong duoc nho hon ngay dat hang',16,1)
return
end
--9. Xây dựng trigger khi sửa dữ liệu trong bảng PXUAT với tên tg_PXUAT_SUA.
--Trong đó cần kiểm tra các ràng buộc dữ liệu phải hợp lệ:
-- - Không cho phép sửa đổi giá trị của cột số phiếu xuất.
-- - Kiểm tra giá trị mới của ngày xuất phải cùng năm tháng với giá trị cũ của ngày xuất.
-- Nếu khác nhau thì thông báo lỗi không cho sửa đổi.
create trigger tg_PXUAT_SUA on PXUAT
for update
as
declare @ngayxuatmoi datetime,@ngayxuatcu datetime
if (update (SoPX) )
rollback tran
Raiserror('Khong duoc sua So phieu xuat',16,1)
return
end
select @ngayxuatcu=Ngayxuat from deleted
select @ngayxuatmoi=Ngayxuat from inserted
if convert(char(7),@ngayxuatcu,21)<>convert(char(7),@ngayxuatmoi,21)
rollback tran
Raiserror('Ngay xuat moi va ngay xuat cu phai cung nam thang',16,1)
return
end
--10. Trong bảng PNHAP tạo thêm cột tổng trị giá có tên TONGTG
--dùng để lưu tổng trị giá của 1 phiếu nhập hàng.
--Trong trigger tg_PNHAP_Them đã xây dựng trước đó ở phần 1a.
-- Bổ sung thêm các tính toán tự động sau:
-- - Tăng giá trị tại cột TONGTG trong bảng PNHAP khi dữ liệu trong bảng CTPNHAP được thêm vào.
-- - Tăng giá trị tại cột TONGSLN trong bảng TONKHO khi dữ liệu trong bảng CTPNHAP được thêm vào.
--Drop Trigger tg_CTPNHAP_tongGT
create trigger tg_CTPNHAP_tongGT on CTPNHAP
for update
as
declare @Trigia real,@tong_PN real,@tong_Trigia real
select @Trigia=Slnhap*Dgnhap from inserted
select @tong_PN=TongTG from PNHAP where SoPN = (select SoPN from inserted)
set @tong_Trigia =@Trigia+@tong_PN
update PNHAP set TongTG=@tong_Trigia where SoPN=(select SoPN from inserted)
--11. Trong bảng PXUAT tạo thêm cột tổng trị giá có tên TONGTG dùng để
-- lưu tổng trị giá của 1 phiếu XUAT hàng.
--Xây dựng trigger khi thêm mới dữ liệu vào bảng CTPXUAT với tên tg_CTPXUAT_Them.
-- Trong đó cần kiểm tra các ràng buộc dữ liệu phải hợp lệ và tính toán tự động như sau:
--- Kiểm tra số phiếu xuất phải tồn tại trong bảng PXUAT
--- Kiểm tra mã vật tư phải tồn tại trong bảngVATTU
--- Kiểm tra số lượng xuất phải đủ trong bảng TONKHO
--- Kiểm tra đơn giá xuất phải dương.
--Nếu tất cả các ràng buộc trên đều hợp lệ thì tự động thực hiện các hành động sau đây:
-- +Tăng giá trị tại cột TONGGT trong bảng PXUAT
--drop trigger tg_CTPXUAT_Them2
create trigger tg_CTPXUAT_Them2 on CTPXUAT
for update
as
declare @pSoPX char(4),@tongnhap int, @tongdaxuat int,@pMaHH char(4),@pSlXuat int
declare @Trigia money,@tong_PX real,@tong_Trigia money
select @tongnhap=sum(SlNhap) from CTPNHAP,inserted where CTPNHAP.MaHH=inserted.MaHH
select @tongdaxuat=sum(CTPXUAT.SlXuat) from CTPXUAT,inserted where CTPXUAT.MaHH=inserted.MaHH
select @pSlXuat=SlXuat from inserted
select @pMaHH=MaHH from inserted
select @pSoPX=SoPX from inserted
if exists (select PXUAT.SoPX from PXUAT,inserted where PXUAT.SoPX=@pSoPX)
if exists(select MaHH from HANGHOA where MaHH= @pMaHH)
if @pSlXuat < (@tongnhap-@tongdaxuat)
select @Trigia=SlXuat*DgXuat from inserted
select @tong_PX=TongTG from PXUAT where SoPX = @pSoPX
set @tong_Trigia =@Trigia+@tong_PX
update PXUAT set TongTG=@tong_Trigia where SoPX=@pSoPX
end
else
rollback tran
if not exists (select PXUAT.SoPX from PXUAT,inserted where PXUAT.SoPX=inserted.SoPX)
raiserror('Phiếu xuất này không tồn tại trong bảng phiếu xuất',16,1)
else
if not exists(select MaHH from HANGHOA where MaHH= @pMaHH)
raiserror ('Hàng này chưa tồn tại trong bảng hàng hóa',16,1)
else if @pSlXuat >(@tongnhap-@tongdaxuat)
raiserror ('So lương hàng hiện tại không đủ dể xuất',16,1)
return
end
--*******************************************
--********RÀNG BUỘC KHI XÓA DỮ LIỆU********
--12. Tạo trigger khi xoá dữ liệu dùng để kiểm tra các ràng buộc toàn vẹn dữ liệu
-- và tính toán tự động như yêu cầu bên dưới:
--a. Xây dựng trigger khi xoá dữ liệu trong bảng CTPXUAT với tên tg_CTPXUAT_Xoa.
--Trong đó cần thực hiện các tính toán như sau:
-- - Giảm giá trị tại cột TONGTG trong bảng PXUAT
--
drop trigger tg_CTPXUAT_Xoa
create trigger tg_CTPXUAT_Xoa on CTPXUAT
for delete
as
declare @pSoPX char(4),@pTG_cu money
declare @tong_TrigiaPX money,@tong_TrigiaCTPX money
select @pSoPX=SoPX,@tong_TrigiaCTPX=(SlXuat*DgXuat) from deleted
select @pTG_cu=TongTG from PXUAT where SoPX=@pSoPX
set @tong_TrigiaPX = @pTG_cu - @tong_TrigiaCTPX
update PXUAT set TongTG=@tong_TrigiaPX where SoPX=@pSoPX
--13. Xây dựng trigger khi xoá dữ liệu trong bảng CTPNHAP với tên tg_CTPNHAP_Xoa.
-- Trong đó cần thực hiện các tính toán như sau:
-- - Giảm giá trị tại cột TONGTG trong bảng PNHAP
--
drop trigger tg_CTPNHAP_Xoa
create trigger tg_CTPNHAP_Xoa on CTPNHAP
for delete
as
declare @pSoPN char(4),@pTG_cu money
declare @tong_TrigiaPN money,@tong_TrigiaCTPN money
select @pSoPN=SoPN,@tong_TrigiaCTPN=(SlNhap*DgNhap) from deleted
select @pTG_cu=TongTG from PNHAP where SoPN=@pSoPN
set @tong_TrigiaPN = @pTG_cu - @tong_TrigiaCTPN
update PNHAP set TongTG=@tong_TrigiaPN where SoPN=@pSoPN
Bạn đang đọc truyện trên: AzTruyen.Top