Announcement

Collapse
No announcement yet.

Hỏi về trigger

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hỏi về trigger

    Mình có 2 bảng như thế này CTHD(MaHD, MaMon, SoLuong, DonGia) và bảng HD(MaHD, NgayHD, TongTien) mình có cái trigger như sau:

    PHP Code:
        IF UPDATE(DonGia)
        
    BEGIN
            
    IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                
    BEGIN
                    SET 
    @KHOANGCACH = (SELECT DonGia FROM INSERTED)
                    
    UPDATE tblHoaDon SET TongTien TongTien + @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                
    END
            
    IF ((SELECT COUNT(*) FROM DELETED) > 0)
                
    BEGIN
                    SET 
    @KHOANGCACH = (SELECT DonGia FROM DELETED)
                    
    UPDATE tblHoaDon SET TongTien TongTien - @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM DELETED)
                
    END
        END
        
        
    IF UPDATE(SoLuong)
            
    BEGIN
                
    IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                    
    BEGIN
                        SET 
    @DONGIA = (SELECT GiaTien FROM tblThucDon WHERE MaMon IN (SELECT MaMon FROM INSERTED)) * (SELECT SoLuong FROM INSERTED)
                        
    UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                    
    END
            END 
    Khi mình thay đổi Số lượng thì đơn giá bên bảng CTHD sẽ thay đổi và Tổng tiền bên bảng HD cũng thay đổi. Khi Update Số lượng thì dòng này sẽ chạy trc:

    PHP Code:
        IF UPDATE(SoLuong)
            
    BEGIN
                
    IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                    
    BEGIN
                        SET 
    @DONGIA = (SELECT GiaTien FROM tblThucDon WHERE MaMon IN (SELECT MaMon FROM INSERTED)) * (SELECT SoLuong FROM INSERTED)
                        
    UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                    
    END
            END 
    Trong đoạn trigger trên có dòng Update lại cái Đơn giá trong bảng CTHD:

    PHP Code:
    UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED

    Câu hỏi của mình ở đây: Sau khi Update Đơn Giá thì nó có nhảy qua dòng trigger ở dưới hay không?


    PHP Code:
        IF UPDATE(DonGia)
        
    BEGIN
            
    IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                
    BEGIN
                    SET 
    @KHOANGCACH = (SELECT DonGia FROM INSERTED)
                    
    UPDATE tblHoaDon SET TongTien TongTien + @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                
    END
            
    IF ((SELECT COUNT(*) FROM DELETED) > 0)
                
    BEGIN
                    SET 
    @KHOANGCACH = (SELECT DonGia FROM DELETED)
                    
    UPDATE tblHoaDon SET TongTien TongTien - @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM DELETED)
                
    END
        END 
    Mình đã chạy rồi, nhưng nó không thực thi, Tổng tiền vẫn là 0 vnđ, ko biết mình có viết trigger sai ko, mong mọi người giúp mình nhé....^^

    Cám ơn mọi người đã quan tâm và giúp đỡ ^^....

  • #2
    Originally posted by 10520261 View Post
    Mình có 2 bảng như thế này CTHD(MaHD, MaMon, SoLuong, DonGia) và bảng HD(MaHD, NgayHD, TongTien) mình có cái trigger như sau:

    PHP Code:
    ...   
    IF 
    UPDATE(DonGia)
    ...
    IF 
    UPDATE(SoLuong)
    ...
    END.. 
    Khi mình thay đổi Số lượng thì đơn giá bên bảng CTHD sẽ thay đổi và Tổng tiền bên bảng HD cũng thay đổi. Khi Update Số lượng thì dòng này sẽ chạy trc:

    PHP Code:
        IF UPDATE(SoLuong)
            
    BEGIN
                
    IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                    
    BEGIN
                        SET 
    @DONGIA = (SELECT GiaTien FROM tblThucDon WHERE MaMon IN (SELECT MaMon FROM INSERTED)) * (SELECT SoLuong FROM INSERTED)
                        
    UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                    
    END
            END 
    Trong đoạn trigger trên có dòng Update lại cái Đơn giá trong bảng CTHD:

    PHP Code:
    UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED

    Câu hỏi của mình ở đây: Sau khi Update Đơn Giá thì nó có nhảy qua dòng trigger ở dưới hay không?


    ....
    Câu Trigger nếu theo như đúng bố cục ban đầu mà anh ghi là:
    PHP Code:
    IF UPDATE(DonGia)
    ...
    IF 
    UPDATE(SoLuong)
    ...
    END 
    Thì khi anh thay đổi số lượng, trigger sẽ nảy lên và kiểm tra tuần tự 2 câu IF đó, như vậy nó sẽ thực hiện phần IF UPDATE(SoLuong) rồi END (hết trigger).
    Anh thử kết hợp cả hai công việc trong hai câu IF này xem sao, tập trung vào một bảng trước, ví dụ như ban đầu tập trung vào bảng CTHD: anh thay đổi số lượng, thì cập nhật lại đơn giá, rồi cập nhật lại Tổng tiền mới ở bảng HD luôn.
    Thân Lãng Tử Phiêu Du Theo Ngàn Gió,
    Chốn Phiêu Hồng Buông Kiếm Tựa Hồng Nhan

    Đời Đạo Gian

    Comment


    • #3
      Originally posted by 10520261 View Post
      Mình có 2 bảng như thế này CTHD(MaHD, MaMon, SoLuong, DonGia) và bảng HD(MaHD, NgayHD, TongTien) mình có cái trigger như sau:

      PHP Code:
          IF UPDATE(DonGia)
          
      BEGIN
              
      IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                  
      BEGIN
                      SET 
      @KHOANGCACH = (SELECT DonGia FROM INSERTED)
                      
      UPDATE tblHoaDon SET TongTien TongTien + @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                  
      END
              
      IF ((SELECT COUNT(*) FROM DELETED) > 0)
                  
      BEGIN
                      SET 
      @KHOANGCACH = (SELECT DonGia FROM DELETED)
                      
      UPDATE tblHoaDon SET TongTien TongTien - @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM DELETED)
                  
      END
          END
          
          
      IF UPDATE(SoLuong)
              
      BEGIN
                  
      IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                      
      BEGIN
                          SET 
      @DONGIA = (SELECT GiaTien FROM tblThucDon WHERE MaMon IN (SELECT MaMon FROM INSERTED)) * (SELECT SoLuong FROM INSERTED)
                          
      UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                      
      END
              END 
      Khi mình thay đổi Số lượng thì đơn giá bên bảng CTHD sẽ thay đổi và Tổng tiền bên bảng HD cũng thay đổi. Khi Update Số lượng thì dòng này sẽ chạy trc:

      PHP Code:
          IF UPDATE(SoLuong)
              
      BEGIN
                  
      IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                      
      BEGIN
                          SET 
      @DONGIA = (SELECT GiaTien FROM tblThucDon WHERE MaMon IN (SELECT MaMon FROM INSERTED)) * (SELECT SoLuong FROM INSERTED)
                          
      UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                      
      END
              END 
      Trong đoạn trigger trên có dòng Update lại cái Đơn giá trong bảng CTHD:

      PHP Code:
      UPDATE tblChiTietHoaDon SET DonGia = @DonGia WHERE MaHD IN (SELECT MAHD FROM INSERTED

      Câu hỏi của mình ở đây: Sau khi Update Đơn Giá thì nó có nhảy qua dòng trigger ở dưới hay không?


      PHP Code:
          IF UPDATE(DonGia)
          
      BEGIN
              
      IF ((SELECT COUNT(*) FROM INSERTED) > 0)
                  
      BEGIN
                      SET 
      @KHOANGCACH = (SELECT DonGia FROM INSERTED)
                      
      UPDATE tblHoaDon SET TongTien TongTien + @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM INSERTED)
                  
      END
              
      IF ((SELECT COUNT(*) FROM DELETED) > 0)
                  
      BEGIN
                      SET 
      @KHOANGCACH = (SELECT DonGia FROM DELETED)
                      
      UPDATE tblHoaDon SET TongTien TongTien - @KHOANGCACH WHERE MaHD IN (SELECT MAHD FROM DELETED)
                  
      END
          END 
      Mình đã chạy rồi, nhưng nó không thực thi, Tổng tiền vẫn là 0 vnđ, ko biết mình có viết trigger sai ko, mong mọi người giúp mình nhé....^^

      Cám ơn mọi người đã quan tâm và giúp đỡ ^^....
      1. CDSL mà bạn thiết kế thực ra đã bị "dư thừa dữ liệu rồi" dư thừa ở đây là thuộc tính "TONGTIEN". Vì trong bảng CTHD đã có số lượng và đơn giá, thì bạn hoàn toàn có thể dùng cách truy vấn trực tiếp với bất kì hóa đơn nào trong bảng HD thông qoa câu lênh "select distinct SUM(...) from CTHD where MAHD=...". Và cũng không cần thiết để cài đặt trigger nào hết.

      2. còn nếu bạn vẫn muốn làm theo cách cũ thì theo mình là không nên: cộng thêm, hay trừ bớt như vậy, vì có thể dữ liệu sẽ bị sai. Bạn nên set update tongtien=SUM(DONGIA*SOLUONG)...... trong bảng CTHD thì sẽ chính xác hơn.

      Comment


      • #4
        Đặt vào trọng tâm chính của vấn đề: :salute:
        Bạn suy nghĩ phức tạp quá nên nó như vậy. Suy nghĩ đơn giản hơn đi bạn!

        Comment

        LHQC

        Collapse
        Working...
        X