一个简单的编码问题?(5分)

  • 主题发起人 主题发起人 luckyboy97
  • 开始时间 开始时间
L

luckyboy97

Unregistered / Unconfirmed
GUEST, unregistred user!
要实现一个自动编码功能?例如:wzgl_20021230_000001
当我增加一条记录的时候编号自动加一;
编码规则为:wzgl+当前日期(年月日)+数字
请各位帮忙看看要怎么实现?
 
写trigger 能比较好的完成你的要求!
 
5分??
搞什么搞嘛!
 
如果在数据库中用,不考虑编号是否连续可以用触发器。否则你可以建一个表来记录你当前使用到了那个号。在写一个存储过程来读改这个表。
 
var
data:integer;
str:string;
begin

with qry_made_no do ///查找最大值编号Tadoquery
begin
close;
sql.Clear;
sql.Add('select * from 表名 order by ‘索引号’ desc' );// 用降序的方法拿到最新的记录
open;
end;
data= strtoint(copy(qry_made_no.fieldbyname('编码号').AsString,15,6))+1
str:='wzgl_'+formatdatetime('yyyymmdd',now)++'_'+format('%6s',data);
end;
 
在table.insert之后:
var
data:integer;
str:string;
begin
with qry_increase do ///查找最大值编号Tadoquery
begin
close;
sql.Clear;
sql.Add('select * from 表名 order by 编号 desc' );// 用降序的方法拿到最新的记录
open;
end;
qry_increase.first
data= strtoint(copy(qry_made_no.fieldbyname('编号).AsString,15,6))+1
str:='wzgl_'+formatdatetime('yyyymmdd',now)++'_'+format('%6s',data);
end;
 
用两个字段来实现:sID,CodeID。
设置sID为自动增长型字段,即为identity(1,1)。每次增加一条记录时,系统自动产生一个
sID,用'select max(sID) from 表'取出最大的sID即刚刚新增记录的sID,根据你的编码规则,
:wzgl+当前日期(年月日)+最大的sID的值,将这个组装的字符串赋给刚刚新增记录的CodeID
字段,即'update 表 set CodeID=wzgl+当前日期(年月日)+最大的sID的值 WHERE sID=最
大的sID',最大的sID就是你在上面用'select max(sID) from 表'取得的sID

组装成你想要的
添加一个字段sID,此字段为identity(1,1)
 
上面两位大哥说的有道理,但是在运行的时候出现
str:='wzgl_'+formatdatetime('yyyymmdd',now)+'_'+format('%6s',data);
报错,错误为:
[Error] Unit1.pas(56): 不相容类型: 'Array'并且 'Integer'
[Fatal Error] Project1.dpr(5): 不能编译使用单元 'Unit1.pas'
是什么原因?
 
tostr类型转换一下
 
str:='wzgl_'+formatdatetime('yyyymmdd',now)+'_'+inttostr(format('%6d',data));
也是一样的错误
 
自增+格式。
 
str:='wzgl_'+formatdatetime('yyyymmdd',now)+'_'+format('%6s',data);
报错,错误为:
[Error] Unit1.pas(56): 不相容类型: 'Array'并且 'Integer'
[Fatal Error] Project1.dpr(5): 不能编译使用单元 'Unit1.pas'
是什么原因?
 
没必要这么复杂吧,建两个字段不就行了,一个存时间,一个存自增编号,前边的那个因为
固定就有程序处理吧,不固定建一个字段也行,如果用程序的话判断最大编号,多用户同时
操作时会有问题,可能同时写入同一个编号。
 
to panjf你好!你说的是个问题,你能详细的用程序代码帮我解释吗?谢谢!
 
字段A 保存时间,插入时获取系统时间就行了,
字段B 保存自动增加的编号,可作为主键,

用程序判断最大编号:
如果多用户情况下,两个用户同时打开表并且添加数据,那么它们得到最后一条记录的ID会
是一样的,所以当一个用户添加一条记录后,另一个在添加就会出现重复的ID,如果在ID字
段上建了唯一索引,就会报错。你要充分考虑到这种情况。
 
你是否假设流水序号不可重用, 如因人为错误, 取消某先前的序号, 到後来要重用刚取消
的序号, 使其号码不会因那个取消而断开.

一般情况我会建议用数据表, 记着当前的序号及已取消并可重用的序号. 当订单确认时
便可发於当前最少的序号.

所以我需要做不同的stored procedure来处理
1. 发於序号
2. 回收己取消的序号
 
用变量拼接字符串,很容易。
需要例子吗?
 
tohappy:你好!能将你的例子给份来看看吗?chxy97@sina.com
谢谢了
 
>>str:='wzgl_'+formatdatetime('yyyymmdd',now)+'_'+format('%6s',data);
>>报错,错误为:
>>[Error] Unit1.pas(56): 不相容类型: 'Array'并且 'Integer'
>>[Fatal Error] Project1.dpr(5): 不能编译使用单元 'Unit1.pas'
>>是什么原因?

用这个吧:
'wzgl_'+formatdatetime('yyyymmdd',now)+'_'+formatfloat('000000',data)
几个位就几个零了.



 
后退
顶部