Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

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: Truyen247.Pro

Tags: