起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 434|回复: 11

【搞定】自动生成编号的需求**

[复制链接]
发表于 2008-1-10 13:18:30 | 显示全部楼层 |阅读模式
业务数据表里有个类别字段,现在希望在保存数据表的时候能给其中的编号字段生成一个自动的编号,规则为 “年-类别-流水号”,其中流水号为数据库中该年该类别流水号中的最大值。
.                                                                                                                                                                                      .
.                                                                                                                                                                                      .
回复

使用道具 举报

发表于 2008-1-10 13:23:57 | 显示全部楼层
做一个业务参数、
参考
业务模型\业务系统\公共\公共函数\公共函数
static function TCOMMONUTILS.GetAutoIncreaseID(AContext: TContext;ACodeID, ACodeRemark: string): string;     
代码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-10 13:42:15 | 显示全部楼层
这个不行的吧,我意思是假设数据库中已经有
2007-HT-001
2007-HT-002
2007-HT-003
2007-QT-001
2007-QT-002
这5条记录,如果我添加条新的记录,编辑时类别选QT,那么保存编号自动生成为2007-QT-003
如果我编辑的时候类别选择的是HT,那保存时编号自动生成为2007-HT-004
同时还要判断编号是否为空,为空时才生成,如果是修改以前的记录,编号已经存在就不自动生成了。
.                                                                                                                                                                                    .
回复 支持 反对

使用道具 举报

发表于 2008-1-10 13:49:34 | 显示全部楼层
2楼的可以完成
1、同时还要判断编号是否为空,为空时才生成    设置自动填充的选项。
2、生成编码,用GetAutoIncreaseID可以完成的。
这个可以产生不重复的编码,而且会是连续的

.         hero419的编码=year +  QT+GetAutoIncreaseID;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-10 14:22:34 | 显示全部楼层
4楼的编码是在添加数据时填充的吧,但添加数据是系统并不知道“类别”字段填的是HT还是QT,似乎在保存是填充才能满足要求吧。

还有“可以产生不重复的编码,而且会是连续的”是根据数据库中的编号最大值判断的么?
.                                                                                                                                                                                .
.                                                                                                                                                                                .
回复 支持 反对

使用道具 举报

发表于 2008-1-10 14:38:26 | 显示全部楼层
ht或者qt有字段存着吗吗?没有的话,就写程序。在数据保存前写入编码。


还有“可以产生不重复的编码,而且会是连续的”是根据数据库中的编号最大值判断的么?----看看2楼那个地方的代码就明白了,产生的编码是用另一个编码表维护的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-10 14:53:02 | 显示全部楼层
对嘛,所以2楼和4楼无法满足我的需求。
按照我的理解这需要写一个afterpost事件来满足需求。
取年简单,我会;
lDateStr := SysUtils.FormatDateTime('yyyy', Business.Data.SysSrv.SysService.Time);
取类别也简单,我也会;
lLBStr := DataSetXX.FieldByName('LB').AsString;
但怎么取当前年度当前类别的流水号最大值呢?
lTmpStr := ???
最后应该有个这样的语句:
sbbhStr := lDateStr+ '-' + lLBStr + '-' + lTmpStr ;
DataSetXX.FieldByName('LB').AsString: = sbbhStr
而且还应该有个判断,如果为空就开始begin填充字段的过程,对吧。

李工帮我给想想吧,谢谢拉~~
回复 支持 反对

使用道具 举报

发表于 2008-1-10 15:01:09 | 显示全部楼层
你就从1开始,2楼的函数会自动记录你用过的编码。恳求求楼主看一下2楼的源代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-15 12:29:24 | 显示全部楼层
不好意思,没注意看~~
2楼的函数应该可以满足需求的~~
procedure TJSJDXX.DataSetJSJDBeforeInsert(DataSet: TDataSet);
var
lDateStr, lLBStr, lTmpStr, lBHStr: string;
begin
lDateStr := SysUtils.FormatDateTime('yyyy', Business.Data.SysSrv.SysService.Time);
lLBStr := DataSetJSJD.FieldByName('JDXMLB').AsString;
lTmpStr := TCommonUtils.GetAutoIncreaseID(Self.Context,lDateStr+'-'+lLBStr,''); ////报错行
lBHStr := lDateStr+'-'+lLBStr+'-'+lTmpStr;
DataSetJSJD.FieldByName('WTJS').AsString := lBHStr;
end;
报错内容是TCommonUtils没有声明,在这个信息里我已经引入“业务模型\业务系统\公共\公共函数\公共函数”了。
回复 支持 反对

使用道具 举报

发表于 2008-1-15 13:19:21 | 显示全部楼层
uses 添加  COMMONUTILS
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-5 13:06 , Processed in 0.040344 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表