如果还涉及主表的问题。主表同样有#cgdd临时表,#cgdd1临时表1 如果#cgdd1为空。 并且cgdd的单号在 cgdd里在存在。这种情况说明我在新添加主表
正在修改还没有保存的时候,其它用户 用我正在用的单号提交了。那我提交一定就不成功了。我就取cgdd表最大编号+1作为我本次提交的编号了。cddh为唯一关键字。而#cgdd1,和#cgdd里只存在一条记录。
这种情况该怎样写。让存储过程返回一个错误提示。
正在修改还没有保存的时候,其它用户 用我正在用的单号提交了。那我提交一定就不成功了。我就取cgdd表最大编号+1作为我本次提交的编号了。cddh为唯一关键字。而#cgdd1,和#cgdd里只存在一条记录。
这种情况该怎样写。让存储过程返回一个错误提示。
比方说:cgdd的单号都是你给用户来分配对吧,你可以做一个表来存储序列号的分配情况,然后建一个存储过程,通过这个表来得到单号,并且每次得到单号的时候都将单号加一,这样就能保证用户得到的单号肯定不会重复,只可能会有断号的情况。
用你的方法,取cgdd表最大编号+1,还是有可能重复呀。关于错误信息,在sql里面用户定义的错误信息和系统错误信息肯定是一样的。
比方说:执行
if 1=1
begin
rollback
raiserror 20001 '你修改的数据别人已经修改过了。'
return -1
end
查询分析器肯定会提示“你修改的数据别人已经修改过了。”
在程序也一样
这样就要新建一个存储单号的表。 也就是你说的那种情况,只可能会有断号的情况。
比如,我在用了这个单号, 其它用户再打开的时候就会是下一个,但是我又没有提交,其它用户提交了,那肯定会有断号。 用我的方法肯定有重复是对的。你看一下我的思路哦!
当新建的时候, 我通过存储过程得到 cgdd的最大单号+1,返回到前台。此时并没有将这个值添加到cgdd表里。 这个cgdd表此时为空的(对应这个单号),
那个返回前台的值 此时存储到#cgdd表里,这个表有且只有一条记录。 显示的是当前返回的单号。 而#cgdd1此时也为空的。我只要在提交的时候开启事务, 再判断一下。 此时#cgdd里有一条该单号的记录, #cgdd1里为空, 表示新增。 只要这个时候cgdd里有这个单号的记录,那说明其它用户在我修改的时候用这个单号提交了。 那我得到的应该是下一个了。
我想这种方法更好些。 没有断号,只是我现在不知道这个语句该怎样表达。
@billno varchar(20) output
as
select @billno = convert(varchar(20),convert(numeric(20,0),max(cgdh)))
from cgdd
if @billno is null
set @billno = '你的第一张单号'
但cgdd和#cgdd1都为空。如果这个提交的时候cgdd里有这条记录,说明其它用户修改过。
既然这样,那首先给他分配的单号就没什么意义啊!因为这个单号有可能会改啊。
那还不如到他提交的时候再给他分配单号呢?不过你说的也有道理。
但解决起来也不难呀,在保存的时候,去检查一下cgdd表,看有没有重号,若有,通过取最大单据号给重新分配一个,再保存。
或者,为cgdd表建一个触发器,当#cgdd去更新cgdd表时,是不管单号有没有重复的,这个判断放在触发器里面做。如果触发器发现有重复,则将单号加一。但这样做的坏处是:你的前端程序并不知道单号已经在提交后变化了。
在存储过程里怎样去判断。 在程序里我知道if (#cgdd1表=空) and (#cgdd.dh exist(select dh from cgdd)) Then
result:='其它用户修改了'
三个表的结构是相同的
dh(char 18),....其它字段。
我上面也不知道自己是写的哪路语言.
在存储过程怎样表达.