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

Tags: