自动产生票据编号,应设计为bigint还是varchar(50)?(50分)

  • 主题发起人 主题发起人 halen
  • 开始时间 开始时间
H

halen

Unregistered / Unconfirmed
GUEST, unregistred user!
自动产生票据编号,应设计为bigint还是varchar(50)?
为充分满足用户使用,需设计为50位,若设计为bigint,因为 bigint最大只能到9223372036854775807
,是20位,不满足要求;若设计为varchar(50),则每新增记录时要产生一个新编号,就要将所有记录的编号
用strToInt()转换为int,用循环选出最大值,加1就是新编号,这样很麻烦,且还要用循环,费时间。要是bigint
类型的话,就可直接用聚合函数max()得到最大值,或将其设置为identity(1,1),系统自动产生一个新编号,
很方便的。所以这是一对矛盾,不知如何解决,请赐教。
 
你用 Varchar 也能通过 select max(field) from table . 来选出最大的呀!!

 
建议你设一个自动编号的字段和一个票据编号的字段,两个字段配合使用,即当你要产生
票据编号时,用Max(自动编号) 找到表内编号的最大值,然后得到对应的票据编号后用
StrToInt()转换加1 后得到新的票据编号(我一直这么用,效果挺好)
 
to Puma Wang:
--你用 Varchar 也能通过 select max(field) from table . 来选出最大的呀!!

若字段类型为Varchar,能通过 select max(field) from table 选出的最大值是字符串比较
的结果。如果field有两个值:5和19,select max(field) from table返回的结果是5而不是
19。
 
不要用bigint sql7不support
 
建议用varchar
票据编号规则为:类型 + YYYYMMDD + 9999,这样的编号bigint不能处理。
 
建议用varchar
 
使用varchar
可以单独建立一个流水号表来存放当前使用的最大编号,每次编号加一后更新该表,下次取
编号的时候只需要从流水号表取当前值加一就可以了,这样效率会比取MAX值高很多。
 
citybug的方法是迄今为止最好的办法,我用过,效果特别好。
需要注意:
流水号的编号规则,
例如,
1、部分流水号是所有人共用的
2、部分流水号是操作员互相独立的
3、部分流水号是某级别操作员共用的

这在更新SN表的时候一定要注意,不要多更新记录,也不要少更新记录
 
字段设置为varchar我认为比较合适,取号时采用存储过程再配合序列的使用一定很有效!
 
//我是写了一个触发器来完成累加的 号码格式为:YYYYMMDD_XXX
CREATE TRIGGER add_ddh ON dbo.dingdan_xinxi
FOR INSERT
AS
declare @new_ddh char(12)
declare @rec_count int
select @rec_count =count(*) from dingdan_xinxi--当前表中的记录行数

declare @curr_date char(10)
select @curr_date=convert(char(10),getdate(),20)--把当前日期转为字符型

declare @curr_char char(8)
--下面去掉日期符中的‘-’或‘/’
select @curr_char=substring(@curr_date,1,4)+substring(@curr_date,6,2)+substring(@curr_date,9,2)

declare @add0 char(3)
if @rec_count>0

begin
declare @max_date int
select @max_date =max(substring(ddh,1,8)) from dingdan_xinxi--最大的日期字串
declare @max_xh int /*最大流水号*/
select @max_xh= max(substring(ddh,10,3)) from dingdan_xinxi where substring(ddh,1,8)=@max_date
if @curr_char<>@max_date
select @new_ddh=@curr_char+'_'+'001'
else
begin----补零,如是后面的流水号位数再增加可以用replicate函数
if @max_xh<9
select @add0='00'+ltrim(rtrim(convert(char(3),@max_xh+1)))
else
if @max_xh<99
select @add0='0'+ltrim(rtrim(convert(char(3),@max_xh+1)))
else
select @add0=ltrim(rtrim(convert(char(3),@max_xh+1)))
select @new_ddh=@curr_char+'_'+@add0
end
end
else
select @new_ddh= @curr_char+'_'+'001'
update dingdan_xinxi
set ddh =@new_ddh
where ddh='88888888_888'---数据表中的默认值

以上是小弟以前原创一个程序,请各位斧正!
 
halen :
首先定长 8 位 或者更多。 5 就是 00000005, 其他都一样。
这样选就能选出来了。
 
  我不喜欢流水号里加日期,日期就日期嘛,流水就流水嘛,为什么非要联系在一起?!
我直Integer+DisplayFromat.
 
哦, citybug说的方法的确比较快的方法. 我们公司现在就是用这样的方法来取订单,发票号的.
订好编号规则后,很方便的.
建议使用这种方法.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部