我现在在做一个导入单据的功能组织好数据(包括单据号,是通过 GetVouchNo 获取)放入 domhead 中,之后调用 sub vouchsave 保存,因为 sub vouchsave 还要进行一些判断处理,可能该 domhead 保存不上。
现在的问题是 如果导入保存失败,该次导入获取的 单据号就被占掉不能用了。
举例:当前单据号该轮到 0012 了,导入失败一次(把 0012 浪费掉了),继续导入成功后的单据号变成了 0013,而不是想要的 0012,跳号了.......想到的方法是 先预置一个单据号,之后的判断都通过 保存成功后,再更新为 通过 GetVouchNo 获取的 单据号,
但 如果自己随意指定一个预置值,可能与客户 实际应用的单据号冲突....... 单据号的长度是 nvarchar(20)该如何处理啊......

解决方案 »

  1.   

    我觉得可以故意跳号,比如:通过 GetVouchNo 获取 与 预置值 相同 的号
      

  2.   

    GetVouchNo 是自动取值 连续的...(不论你这次是否保存成功,下次取值,就是下一个值了...)刚才我向别人请教,人家说了 先把单据号预置为 'newid()'   ----- ccode='newid()'
    刚才我调试时确认事务查数据库,存的就是 'newid()'
    那不就是把 字符串 'newid()' 当特殊值预置了嘛....或许我的表达还不够清楚,我想要的结果是无论 导入失败是零次 还是连续好多次,导入成功的单据 的单据号,应该是连续的 0012 0013 0014......我想的 实现逻辑就是 先把单据号预置成一个不可能于 表中用户手动设置的单据号冲突 的预置单据号,导入成功后再更新为 自动取值的 有连续性的 单据号。
      

  3.   

    在另外一个表中设定一个字段为保存成功的单据的ID,然后每次插入成功的话,就更新新的ID.
      

  4.   

    别让单号成为自增加primary key
      

  5.   

    单据号通过 GetVouchNo 获取,放在一个变量,然后判断保存是否成功,不成功,接着用,成功后再由GetVouchNo 获取。
    就这么一个逻辑嘛~
      

  6.   

    我试了一下,也没试出来哪些特殊字符是不能录入单据号的
    最后还是 取了一个特殊值先保存,基本保存成功之后,在取真值update,update也在事务中,不过能走到update就基本上保存成功了....保证准确性比保持连贯性重要。
    GetVouchNo 是调用别处的,没有源码,就不考虑动它了
    感谢各位的回答指点,结帖了