/*========================================================================*/
-- 触发器功能:当单据删除时,做相应的判断
/*------------------------------------------------------------------------*/
-- 描述:1、如果单据被审核,则不允许被删除
/*------------------------------------------------------------------------*/
-- 作者: XXX           日期: 2004-9-6
/*========================================================================*/
CREATE TRIGGER [TR_ECSBillList_BDV] ON dbo.T04_ECSBillList--●●● 
FOR DELETE 
AS
  Declare @ID int,
          @BillCode varchar(20),
          @Audit bit,
          @ECSConfirm bit          Declare Curs Cursor For
            SELECT In_ECSID FROM Deleted--●●●
            Open Curs
            Fetch Curs Into @ID            While(@@Fetch_status = 0)
            Begin
              SELECT @Audit = b.Bi_Audit,
                     @ECSConfirm = b.Bi_ECSConfirm,
                     @BillCode = b.Va_ESCCode--●●●
                FROM Deleted a INNER JOIN 
                     T04_ECSBill b --●●●
                     ON a.In_ECSID = b.In_ECSID --●●●
               WHERE a.In_ECSID = @ID --●●●
                     AND b.Bi_IsVoid = 0   
           
              IF @ECSConfirm = 1
                 Begin
                   Close Curs
                   Deallocate Curs
                   RAISERROR( '单据[%s]已经执行入/出库,不能删除其明细。', 16, 1,@BillCode)
                   ROLLBACK TRANSACTION
                   Return
                 End
 
              IF @Audit = 1
                 Begin
                   Close Curs
                   Deallocate Curs
                   RAISERROR( '单据[%s]已经被审核,不能删除其明细。', 16, 1,@BillCode)
                   ROLLBACK TRANSACTION
                   Return
                 End
              Fetch Curs into @ID 
            End
          Close Curs
          Deallocate Curs

解决方案 »

  1.   

    表结构和数据!!!!
    帮你测一下!!
    ------------------
    表结构和关系不会有问题,可以看得出,这个触发器很简单的。问题好像出现在我在触发器做的标记符号“●●● ”,我刚才试了一下:将第一行“...ON dbo.T04_ECSBillList--●●● ”修改成“...ON dbo.T04_ECSBillList --●●● ”后再选择“应用”就没问题了,注意中间过了个空格。基本上问题算是解决了,但我还是不知道为什么会出现这种现象,我其它的触发器也有无空格写法的,也没出现如题这样的提示呀?请大侠执教!!
      

  2.   

    我不知道怎么发帖子 在这问个问题
    我在安键的clicked事件中写下如下代码  可无法通过编译  请帮忙看一下cb_inquiry clicked;
    datetime birthday1;
    //所有显示清空
    sle_name.text=""
    sle_gender.text=""
    sle_nativeplace.text=""
    em_birthday.text=""
    sle_department.text=""
    sle_class.text=""
    sle_major.text=""
    sle_height.text=""
    sle_weight.text=""
    mle_resume.text=""
    //sql查询,将各个字段值赋给各个显示控件
    select name,gender,nativeplace,birthday,department,class,
    major,height,weight,resume
    into :sle_name.text,:sle_gender.text,:sle_nativeplace.text,
    :birthday1,:sle_department.text,:sle_class.text,
    :sle_major.text,:sle_height.text,:sle_weight.text,:mle_resume.text
    from student
    where number=:sle_number.text
    using sqlca;if sle_name.text="" then
    messagebox("提示: "," 没有找到符合条件的记录,请重新输入学号!")
    return
    end ifem_birthday.text=Mid(string(birthday1),1,10)
    sle_height.text=sle_height.text+"厘米"
    sle_weight.text=sle_weight.text+"公斤"
    end event提示错误是:
    Error   C0031:Syntax  error
      

  3.   

    触发器写得过于复杂,没必要用游标:
    CREATE TRIGGER [TR_ECSBillList_BDV] ON dbo.T04_ECSBillList
    FOR DELETE 
    AS
      if exists(SELECT * FROM Deleted WHERE Bi_IsVoid=0 AND Bi_ECSConfirm=1)
      Begin
        ROLLBACK TRANSACTION
        RAISERROR( '单据[%s]已经执行入/出库,不能删除其明细。', 16, 1)
        return
      End
      if exists(SELECT * FROM Deleted WHERE Bi_IsVoid=0 AND Bi_Audit=1)
      Begin
        ROLLBACK TRANSACTION
        RAISERROR( '单据[%s]已经被审核,不能删除其明细。', 16, 1)
        Return
      End
      

  4.   

    我不知道怎么发帖子 在这问个问题
    我在安键的clicked事件中写下如下代码  可无法通过编译  请帮忙看一下
    ------------------------------------------------------------------
    晕了~~~~
    是不是PB的脚本?你表里的number是什么类型的?还有,建议你定义变量来处理取值的问题,这样写很不规范的。
    至于如何提问,直接在你想发问题的栏目上选择“提问”就可以了。
      

  5.   

    pbsql(风云):
    触发器写得过于复杂,没必要用游标
    ---------------------------------
    这个表是入出库的明细表,用游标的目的是每次更新或者删除的条数是不定的,而且表中的单据类型是不一样的,明细表和主表之间的关联是“主表的ID号”,而且主和子是一对多的关系,你这样一些不全都OVER了??
      

  6.   

    刚才没注意关联,现在改一下:
    CREATE TRIGGER [TR_ECSBillList_BDV] ON dbo.T04_ECSBillList
    FOR DELETE 
    AS
    if exists(SELECT * FROM Deleted a INNER JOIN T04_ECSBill b
              ON a.In_ECSID = b.In_ECSID WHERE a.In_ECSID = a.In_ECSID
                 AND b.Bi_IsVoid = 0   and b.Bi_ECSConfirm=1)
    Begin
      ROLLBACK TRANSACTION
      RAISERROR( '单据[%s]已经执行入/出库,不能删除其明细。', 16, 1)
      Return
    End
    if exists(SELECT * FROM Deleted a INNER JOIN T04_ECSBill b
              ON a.In_ECSID = b.In_ECSID WHERE a.In_ECSID = a.In_ECSID
                 AND b.Bi_IsVoid = 0   and b.Bi_Audit=1)
    Begin
      RAISERROR( '单据[%s]已经被审核,不能删除其明细。', 16, 1)
      ROLLBACK TRANSACTION
      Return
    End
      

  7.   

    pbsql(风云) :
    您上面写的触发器的我看了,是一种做法,但是我的触发器也没有问题,只是用了游标而已。我今天提问的目的不是触发器该怎么写,是想请教大家 我如题的问题。我在4楼已经写出了我针对今天的问题的解决办法,可是我不知道出现这种情况的原因是什么?其它表的触发器也有这么写的,在保存时也没有出现问题。我还是想知道出现如题的现象的根本原因是什么。谢谢。
      

  8.   

    可能首行(create 与 as之间)不允许有注释另:你写的比较低效,建议还是改改
      

  9.   

    可能首行(create 与 as之间)不允许有注释另:你写的比较低效,建议还是改改
    ----------------------------------
    但是注释存在了也没出什么问题。不知道SQL Server抽的哪门子风?
    游标确实低效,接受您的建议!谢谢。结了,知道咋处理就行了,再继续讨论没啥价值了。