能否通过触发器实现满足某个条件时,阻止审核单据?

xqing0101 2013-12-05 06:49:37
如题,比如,领料单单身有两个栏位A、B,当A或B的值为空时,不允许审核单据,并且提示信息,只有当A,B有具体值时才可以审核(注,无系统源码,才想这样的下三烂手段)
...全文
1074 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-12-08
  • 打赏
  • 举报
回复
引用 13 楼 xqing0101 的回复:
[quote=引用 12 楼 yupeigu 的回复:] 如果这样: create trigger tr_test_update on PURTA for update as if update(审核码)--这个就是审核 begin if exists(select * from inserted left join PURTB on inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='') begin raiserror('“参考单别”或“参考单号”不能为空!',16,1) rollback end end --else --这里是正常的单据修改,会走的else部分 go
正常单据的修改是前台程序控制,通过SQL控制不了吧?[/quote] 也会走触发器,只是在触发器中什么也没有做,当然你也可以对正常的修改,进行判断,控制。
好帅的一条鱼 2013-12-07
  • 打赏
  • 举报
回复
难道是易飞? 哈哈,单据审核就是更新一个字段
LongRui888 2013-12-07
  • 打赏
  • 举报
回复
引用 4 楼 xqing0101 的回复:
[quote=引用 2 楼 yupeigu 的回复:] 这个可以实现的,但是如果报错,错误信息如何传到前端呢
引用 1 楼 shoppo0505 的回复:
当然可以。 触发器执行的时候,看看这两个值是否存在。但是提示信息建议直接更新入表格列。因为触发器中不能所谓error返回信息。
引用 3 楼 mcxhh2005 的回复:
可以的,用trigger 或constrain
我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create  trigger tr_test_update on PURTA
for update
as 
	if exists(select * from inserted left join PURTB on 
	inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
	raiserror('“参考单别”或“参考单号”不能为空!',16,1)
	rollback
end
但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。 [/quote] 哦 这个单据审核操作也是update操作是吧,那就和普通的update操作,没区别,所以不管是审核,还是更新,都会报错了。 如果在操作的时候,能区分审核,还是更新操作,就好了
xqing0101 2013-12-07
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
如果这样: create trigger tr_test_update on PURTA for update as if update(审核码)--这个就是审核 begin if exists(select * from inserted left join PURTB on inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='') begin raiserror('“参考单别”或“参考单号”不能为空!',16,1) rollback end end --else --这里是正常的单据修改,会走的else部分 go
正常单据的修改是前台程序控制,通过SQL控制不了吧?
xqing0101 2013-12-07
  • 打赏
  • 举报
回复
xqing0101 2013-12-07
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
这个可以实现的,但是如果报错,错误信息如何传到前端呢



引用 1 楼 shoppo0505 的回复:
当然可以。
触发器执行的时候,看看这两个值是否存在。但是提示信息建议直接更新入表格列。因为触发器中不能所谓error返回信息。




引用 3 楼 mcxhh2005 的回复:
可以的,用trigger 或constrain



我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create trigger tr_test_update on PURTA
for update
as
if exists(select * from inserted left join PURTB on
inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
raiserror('“参考单别”或“参考单号”不能为空!',16,1)
rollback
end



但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。




LongRui888 2013-12-07
  • 打赏
  • 举报
回复
如果这样: create trigger tr_test_update on PURTA for update as if update(审核码)--这个就是审核 begin if exists(select * from inserted left join PURTB on inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='') begin raiserror('“参考单别”或“参考单号”不能为空!',16,1) rollback end end --else --这里是正常的单据修改,会走的else部分 go
LongRui888 2013-12-07
  • 打赏
  • 举报
回复
引用 10 楼 xqing0101 的回复:
[quote=引用 9 楼 yupeigu 的回复:] [quote=引用 8 楼 xqing0101 的回复:] [quote=引用 6 楼 yupeigu 的回复:] 我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create  trigger tr_test_update on PURTA
for update
as 
	if exists(select * from inserted left join PURTB on 
	inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
	raiserror('“参考单别”或“参考单号”不能为空!',16,1)
	rollback
end
但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。
哦 这个单据审核操作也是update操作是吧,那就和普通的update操作,没区别,所以不管是审核,还是更新,都会报错了。 如果在操作的时候,能区分审核,还是更新操作,就好了[/quote] 系统单据的审核,在后台数据库就是有单据的单头档,和单身档两个表,各有一个审核码的字段,默认为‘ N ’,审核之后就都更新为‘ Y ’[/quote] 哦 ,那就在你的update触发器中,再加个判断:
create  trigger tr_test_update on PURTA
for update
as 
    if  update(审核码)--这个就是审核
    begin
        if exists(select * from inserted left join PURTB on 
           inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
           
			begin
				raiserror('“参考单别”或“参考单号”不能为空!',16,1)
				rollback
			end
	end
go
[/quote] 已经能达到效果,提示审核失败, 并且修改单据没完成也能保存,但“raiserror('“参考单别”或“参考单号”不能为空!',16,1)”是不是没有执行,怎么没有返回消息呢[/quote] 呵呵,其实对于单据修改,就是当修改的时候,虽然也触发了update触发器,但是什么也没有做,所以保存肯定是成功的哈
xqing0101 2013-12-07
  • 打赏
  • 举报
回复
引用 9 楼 yupeigu 的回复:
[quote=引用 8 楼 xqing0101 的回复:]
[quote=引用 6 楼 yupeigu 的回复:]
我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create trigger tr_test_update on PURTA
for update
as
if exists(select * from inserted left join PURTB on
inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
raiserror('“参考单别”或“参考单号”不能为空!',16,1)
rollback
end



但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。


哦 这个单据审核操作也是update操作是吧,那就和普通的update操作,没区别,所以不管是审核,还是更新,都会报错了。

如果在操作的时候,能区分审核,还是更新操作,就好了[/quote]


系统单据的审核,在后台数据库就是有单据的单头档,和单身档两个表,各有一个审核码的字段,默认为‘ N ’,审核之后就都更新为‘ Y ’[/quote]

哦 ,那就在你的update触发器中,再加个判断:

create  trigger tr_test_update on PURTA
for update
as
if update(审核码)--这个就是审核
begin
if exists(select * from inserted left join PURTB on
inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')

begin
raiserror('“参考单别”或“参考单号”不能为空!',16,1)
rollback
end
end
go
[/quote]
已经能达到效果,提示审核失败,

并且修改单据没完成也能保存,但“raiserror('“参考单别”或“参考单号”不能为空!',16,1)”是不是没有执行,怎么没有返回消息呢
LongRui888 2013-12-07
  • 打赏
  • 举报
回复
引用 8 楼 xqing0101 的回复:
[quote=引用 6 楼 yupeigu 的回复:] 我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create  trigger tr_test_update on PURTA
for update
as 
	if exists(select * from inserted left join PURTB on 
	inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
	raiserror('“参考单别”或“参考单号”不能为空!',16,1)
	rollback
end
但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。
哦 这个单据审核操作也是update操作是吧,那就和普通的update操作,没区别,所以不管是审核,还是更新,都会报错了。 如果在操作的时候,能区分审核,还是更新操作,就好了[/quote] 系统单据的审核,在后台数据库就是有单据的单头档,和单身档两个表,各有一个审核码的字段,默认为‘ N ’,审核之后就都更新为‘ Y ’[/quote] 哦 ,那就在你的update触发器中,再加个判断:
create  trigger tr_test_update on PURTA
for update
as 
    if  update(审核码)--这个就是审核
    begin
        if exists(select * from inserted left join PURTB on 
           inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
           
			begin
				raiserror('“参考单别”或“参考单号”不能为空!',16,1)
				rollback
			end
	end
go
xqing0101 2013-12-07
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
我通过如下代码基本能实现我的需求

select * from sysobjects where type = 'TR';
exec sp_helptext 'tr_test_update'

create  trigger tr_test_update on PURTA
for update
as 
	if exists(select * from inserted left join PURTB on 
	inserted.单别=PURTB.单别 and inserted.单号=PURTB.单号 where A='' or B='')
begin
	raiserror('“参考单别”或“参考单号”不能为空!',16,1)
	rollback
end
但同时引发出另一个问题困扰我,如果是修改单据,某一行要控制的“参考单别”或“参考单号”漏写,则也会提示 '“参考单别”或“参考单号”不能为空!',造成修改后的整张单据都不能保存,必须要放弃整张单据,重新来修改。
哦 这个单据审核操作也是update操作是吧,那就和普通的update操作,没区别,所以不管是审核,还是更新,都会报错了。 如果在操作的时候,能区分审核,还是更新操作,就好了[/quote] 系统单据的审核,在后台数据库就是有单据的单头档,和单身档两个表,各有一个审核码的字段,默认为‘ N ’,审核之后就都更新为‘ Y ’
ChinaITOldMan 2013-12-05
  • 打赏
  • 举报
回复
可以的,用trigger 或constrain
LongRui888 2013-12-05
  • 打赏
  • 举报
回复
这个可以实现的,但是如果报错,错误信息如何传到前端呢
shoppo0505 2013-12-05
  • 打赏
  • 举报
回复
当然可以。 触发器执行的时候,看看这两个值是否存在。但是提示信息建议直接更新入表格列。因为触发器中不能所谓error返回信息。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧