如果还涉及主表的问题。主表同样有#cgdd临时表,#cgdd1临时表1 如果#cgdd1为空。 并且cgdd的单号在 cgdd里在存在。这种情况说明我在新添加主表
正在修改还没有保存的时候,其它用户 用我正在用的单号提交了。那我提交一定就不成功了。我就取cgdd表最大编号+1作为我本次提交的编号了。cddh为唯一关键字。而#cgdd1,和#cgdd里只存在一条记录。 
这种情况该怎样写。让存储过程返回一个错误提示。

解决方案 »

  1.   

    你这种做法是被动修改。但你可以想个方法作主动控制。
    比方说:cgdd的单号都是你给用户来分配对吧,你可以做一个表来存储序列号的分配情况,然后建一个存储过程,通过这个表来得到单号,并且每次得到单号的时候都将单号加一,这样就能保证用户得到的单号肯定不会重复,只可能会有断号的情况。
    用你的方法,取cgdd表最大编号+1,还是有可能重复呀。关于错误信息,在sql里面用户定义的错误信息和系统错误信息肯定是一样的。
    比方说:执行
    if 1=1
        begin
        rollback
        raiserror 20001 '你修改的数据别人已经修改过了。'  
        return -1
        end
    查询分析器肯定会提示“你修改的数据别人已经修改过了。”
    在程序也一样
      

  2.   

    你的这种做法肯定可以。很好的想法。 
    这样就要新建一个存储单号的表。 也就是你说的那种情况,只可能会有断号的情况。
    比如,我在用了这个单号, 其它用户再打开的时候就会是下一个,但是我又没有提交,其它用户提交了,那肯定会有断号。 用我的方法肯定有重复是对的。你看一下我的思路哦!
    当新建的时候, 我通过存储过程得到 cgdd的最大单号+1,返回到前台。此时并没有将这个值添加到cgdd表里。  这个cgdd表此时为空的(对应这个单号), 
    那个返回前台的值 此时存储到#cgdd表里,这个表有且只有一条记录。 显示的是当前返回的单号。 而#cgdd1此时也为空的。我只要在提交的时候开启事务, 再判断一下。 此时#cgdd里有一条该单号的记录, #cgdd1里为空, 表示新增。 只要这个时候cgdd里有这个单号的记录,那说明其它用户在我修改的时候用这个单号提交了。 那我得到的应该是下一个了。
    我想这种方法更好些。 没有断号,只是我现在不知道这个语句该怎样表达。
      

  3.   

    建一个循环:Create proc p_getbillno
    @billno varchar(20) output
    as
    select @billno = convert(varchar(20),convert(numeric(20,0),max(cgdh)))
    from cgdd
    if @billno is null 
       set @billno = '你的第一张单号'
      

  4.   

    不是的,我在提交之前就显示了该单号,也就是已经存到了#cgdd表里。
    但cgdd和#cgdd1都为空。如果这个提交的时候cgdd里有这条记录,说明其它用户修改过。
      

  5.   

    也就是说,存到#cgdd表的单号可能会在提交的时候发现这个单号已经被别人使用了。这个时候要将#cgdd的单号重新分配。是这个意思吧。
    既然这样,那首先给他分配的单号就没什么意义啊!因为这个单号有可能会改啊。
    那还不如到他提交的时候再给他分配单号呢?不过你说的也有道理。
    但解决起来也不难呀,在保存的时候,去检查一下cgdd表,看有没有重号,若有,通过取最大单据号给重新分配一个,再保存。
    或者,为cgdd表建一个触发器,当#cgdd去更新cgdd表时,是不管单号有没有重复的,这个判断放在触发器里面做。如果触发器发现有重复,则将单号加一。但这样做的坏处是:你的前端程序并不知道单号已经在提交后变化了。
      

  6.   

    就是你说的这个意思呀,
    在存储过程里怎样去判断。 在程序里我知道if (#cgdd1表=空) and (#cgdd.dh exist(select dh from cgdd)) Then
    result:='其它用户修改了'
    三个表的结构是相同的
    dh(char 18),....其它字段。
    我上面也不知道自己是写的哪路语言.
    在存储过程怎样表达.