请教如何避免该条触发器的死循环
set ANSI_NULLS ONrnset QUOTED_IDENTIFIER ONrngornrnALTER TRIGGER [fetchlcf] ON [dbo].[RdRecords]rnFOR INSERT,UPDATErnASrnbeginrnSET NOCOUNT ONrndeclare @bustype varchar(12) /*单据类型*/ rndeclare @identity int /*rdredord表的id号*/ rndeclare @invc varchar(20) /*存货编码*/ rndeclare @bccksl varchar(30) /*本次出库数量*/ rndeclare @djbh varchar(30) /*本次出库数量*/ rndeclare @gbd varchar(4) /*冷藏费收费方式*/ rndeclare @zz float /*目的单据净总重*/ rndeclare @maxid int /*最大id号*/ rndeclare @t float /*冷藏费的行记录值*/ rndeclare @t1 float /*冷藏费的行记录累加值*/ rndeclare @maxidminus1 int /*最大id号-1*/ rndeclare @dd datetime /*原单据日期*/ rndeclare @ck varchar(10) /*仓库档案编码*/rnrnselect @maxid=max(id) from rdrecordrnselect @maxidminus1=max(id)-1 from rdrecordrnselect @bustype=a.cbustype from rdrecord a,rdrecords b where a.id=b.id and b.id=(select max(rdrecords.id) from rdrecords) rnset @t=0 rnset @t1=0 rndeclare lengcangfei cursor for rnselect a.id,b.cinvcode,a.ccode,b.cdefine27,a.cdefine8,a.ddate,a.cwhcode from rdrecord a,rdrecords b where a.ccode=b.cinvouchcode and b.id=(select max(rdrecords.id) from rdrecords) rnopen lengcangfei rnset @t=@t+@t1rnfetch next from lengcangfei into @identity,@invc,@djbh,@zz,@gbd,@dd,@ck rnwhile @@FETCH_STATUS = 0 rnbeginrnselect @gbd=a.cdefine8 from rdrecord a,rdrecords b where a.id=b.id and a.ccode=@djbh and b.cinvcode=@invc rnprint @gbd rnrnif @bustype=x27其他出库x27 and @ck=x27001x27 rnbeginrnupdate rdrecordrnset @t1=@zz*@gbd*(floor(datediff(day,@dd,getdate()))) where id in (select id from inserted)rnendrnrnset @t=@t+@t1rnfetch next from lengcangfei into @identity,@invc,@djbh,@zz,@gbd,@dd,@ckrnendrnupdate rdrecord set cdefine16=@t where id=@maxidrnendrnclose lengcangfei rndeallocate lengcangfeiODBC配置选择sql server后再选择相应的数据库所在服务器,输入用户名和密码后选择默数据库就行了,记下这个配置信息的名称
在PB的APP应用中添加如下代码
string ls_startupfile // holds name of start-up file
ls_startupfile='report.ini' //给配置文件变量赋值INI文件
// Populate sqlca from current preference-file settings
sqlca.DBMS = ProfileString (ls_startupfile, "database", "dbms", "") //INI文件中的头[database]
sqlca.database = ProfileString (ls_startupfile, "database", "database", "")
sqlca.dbparm = ProfileString (ls_startupfile, "database", "dbparm", "")
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [fetchlcf] ON [dbo].[RdRecords]
FOR INSERT,UPDATE
AS
begin
SET NOCOUNT ON
declare @bustype varchar(12) /*单据类型*/
declare @identity int /*rdredord表的id号*/
declare @invc varchar(20) /*存货编码*/
declare @bccksl varchar(30) /*本次出库数量*/
declare @djbh varchar(30) /*本次出库数量*/
declare @gbd varchar(4) /*冷藏费收费方式*/ --这里@gbd 的数据类型是varchar(4)?
declare @zz float /*目的单据净总重*/
declare @maxid int /*最大id号*/
declare @t float /*冷藏费的行记录值*/
declare @t1 float /*冷藏费的行记录累加值*/
declare @maxidminus1 int /*最大id号-1*/
declare @dd datetime /*原单据日期*/
declare @ck varchar(10) /*仓库档案编码*/
select @maxid=max(id) from rdrecord
select @maxidminus1=max(id)-1 from rdrecord
select @bustype=a.cbustype from rdrecord a,rdrecords b where a.id=b.id and b.id=(select max(rdrecords.id) from rdrecords)
set @t=0
set @t1=0
declare lengcangfei cursor for
select a.id,b.cinvcode,a.ccode,b.cdefine27,a.cdefine8,a.ddate,a.cwhcode from rdrecord a,rdrecords b where a.ccode=b.cinvouchcode and b.id=(select max(rdrecords.id) from rdrecords)
open lengcangfei
set @t=@t+@t1
fetch next from lengcangfei into @identity,@invc,@djbh,@zz,@gbd,@dd,@ck
while @@FETCH_STATUS = 0
begin
select @gbd=a.cdefine8 from rdrecord a,rdrecords b where a.id=b.id and a.ccode=@djbh and b.cinvcode=@invc
print @gbd
if @bustype='其他出库' and @ck='001'
--begin
--update rdrecord --你没有对rdrecord表做任何更新,仅是为@t1赋值。所以觉得这里有些代码可删。
set @t1=@zz*@gbd*(floor(datediff(day,@dd,getdate()))) where id in (select id from inserted)
--这赋值语句的数据类型很有问题,@zz是floor类型的,但@gbd却是varchar(4)类型的,这样的赋值会报错。
--end
set @t=@t+@t1
fetch next from lengcangfei into @identity,@invc,@djbh,@zz,@gbd,@dd,@ck
end
update rdrecord set cdefine16=@t where id=@maxid
end
close lengcangfei
deallocate lengcangfei
--我觉这个触发器单语句分析是不会死循环的,把那个赋值语句@gbd的值类型,改成支持算术运算的类型试试。
--还有就是你检查下RdRecord表里是不是也有个类似的触发器,才导致连锁效应,你所说的死循环?
while @@FETCH_STATUS = 0
这个条件是错误的,这个条件只是判断上一条语句是否执行成功,那么要是不出错的话就必然死循环了。
解决办法:只要加上一个停止的条件就可以了,具体什么样的条件,就要看你想让他什么时候 停止了。
4楼说的很对,3楼说的不对,不过你的触发器没有错误,你错就错在……你居然在RdRecordsupdate触发器使用update操作,当然会死循环啦……哈哈,给分吧
update rdrecord
set @t1=@zz*@gbd*(floor(datediff(day,@dd,getdate()))) where id in (select id from inserted)
这个难道不报语法错误?
update table set @变量=...
怎样删除知乎上自己的问题
你可以把这样的问题在设置当中把它删除,就是一个可以的办法。
先打开自己的账号进去找到要删除的问题,打开这个问题,点击右上角的三点,里面有删除,直接点击删除就可以了
删除问题你找到那个选项就可以了,点进去你的回答,然后那不有选项删除吗?删除就没有了,回不来了。
在知乎上自己的问题删除的话,那么可以点击选择这个问题,然后撤销
在知乎上频繁删除自己的评论(写了又删那种,并且重复多次)算不算滥用职权?
这算什么滥用职权呀?既然他有那个功能,自己就可以删除评论。这说明我们有这个权利。
知乎上自己发布的问题,而且被人回答了。怎样才能删除?
删除不了,被人回答以后只能对问题进行修改,但是删不了了。
你好,知乎上面的问题
除了被人举报啥违反规定的
不会被删除的
你可以是用匿名身份
不过别的人可以从问题日志里看到你的
但是一般的问题热度不高
你只要匿名一般没有问题
可以从电脑上登陆知乎网站,找到你想删除的以前发布的问题,然后根据提示操作删除你自己的提问!具体步骤请点击登陆电脑版知乎网站!
一般的随意删除就是属于违约行为,所以违约是要承担责任的!你可能会因为删除提问而被扣除积分或者别的!请慎重选择!
如何实现防止点击事件重复触发
<button onclick="btnClick()">按钮</button>
var flag = 0;
function btnClick(){
if(flag == 1){
return false;
}
flag = 1;
//逻辑处理
}
原理就是 有一个flag变量值为0 触发点击事件的时候判断flag 等于1时直接return 不进行后续代码处理,等于0时 把 flag的值改为1 执行后续代码
文章标题: 如何避免触发知乎重复删除
文章地址: http://www.xdqxjxc.cn/gushi/120048.html