如何将生成器 Generator 的值自动归0,以此来让数据库自动建立一定格式的[订]单号
2005-08-18 13:45
399 查看
在数据库开发过程中,常会遇到这样的问题,一些订单(或其它单据)编号是根据日期+流水编号来生成的,如:今天是2003-11-25,那么今天开出的单号依次为:
20031125-1
20031125-2
20031125-3
……
到明天2003-11-26时,所开出的第一份单就应为:20031126-1
第二份单为:20031126-2
第三份单为:20031126-3
……
当然,通过客户端可以实现,但这样工程比较大,而且要考虑的东东实在太多。
那么数据库本身能自动生成上列这样格式的数据吗?如果能,又是如何自动生成的呢?
下面我来谈谈如何一步一步的来实现。
首先我们来建立一个测试的数据表:
CREATE TABLE "H_FORMATID"
(
"HT_ID" VARCHAR(15),
"HT_DATE" DATE,
"HT_SUBJECT" VARCHAR(60)
);
第一个字段 HT_ID 就是用来存储上列格数据的订单号,
第二个字段 HT_DATE 是用来存储当前日期内容的。
第三个字段 HT_SUBJECT 是用来存储数据内容的,
大伙可根据情况修改上列表,因这只是一个测试表而已。
我们知道,上列格式订单号的 "-" 前面的部份实际就是建立订单的当天的日期,所以很好解决,"-" 后面的部份是建立订单当天从1开始的流水编号,在IB/FB中,生成这样的流水编号当然离不开 Generator 了,所以我们还得建立一个生成器 GENERATOR 。
CREATE GENERATOR GEN_H_FORMATID;
而要让数据库每添加一笔数据时,订单编号(HT_ID)要自动填充数据,这时通常有两种方法去实现:
1:存储过程;
2:触发器(实际上也是一种存储过程)。
下面我们用建立触发器来实现:
SET TERM ^ ;
CREATE TRIGGER "TRI_BI_H_FORMATID" FOR "H_FORMATID"
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE h_d DATE;
/*
Author : 唐辉 http://www.3asoft.com */
BEGIN
SELECT MAX(HT_DATE) FROM H_FORMATID INTO :h_d;
/*查找最大的日期值*/
IF(CURRENT_DATE>h_d) THEN /*将当前日期与最大日期值比较*/
BEGIN
EXECUTE STATEMENT 'SET GENERATOR GEN_H_FORMATID TO 0';
/*如果当前日期大于库中的日期最大值,
*则将Generator值归零
*/
END
NEW.HT_ID=CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS VARCHAR(4))||
/*取年*/
CAST(EXTRACT(MONTH FROM CURRENT_DATE) AS VARCHAR(2))||
/*取月*/
CAST(EXTRACT(DAY FROM CURRENT_DATE) AS VARCHAR(2))||'-'||
/*取日*/
CAST(GEN_ID(GEN_H_FORMATID,1) AS VARCHAR(7));
/*取GENERATOR值*/
NEW.HT_DATE=CURRENT_DATE; /*自动赋HT_DATE为当前日期*/
END
^
COMMIT WORK ^
SET TERM ;^
然后您往数据表里添加几条数据,再将您的系统日期增加一天,再添加几条数据试试,最终达到您的要求了,成功了,庆祝庆祝!!
以上代码在 FireBird 1.5 中测试成功,未在 InterBase 中测试。
20031125-1
20031125-2
20031125-3
……
到明天2003-11-26时,所开出的第一份单就应为:20031126-1
第二份单为:20031126-2
第三份单为:20031126-3
……
当然,通过客户端可以实现,但这样工程比较大,而且要考虑的东东实在太多。
那么数据库本身能自动生成上列这样格式的数据吗?如果能,又是如何自动生成的呢?
下面我来谈谈如何一步一步的来实现。
首先我们来建立一个测试的数据表:
CREATE TABLE "H_FORMATID"
(
"HT_ID" VARCHAR(15),
"HT_DATE" DATE,
"HT_SUBJECT" VARCHAR(60)
);
第一个字段 HT_ID 就是用来存储上列格数据的订单号,
第二个字段 HT_DATE 是用来存储当前日期内容的。
第三个字段 HT_SUBJECT 是用来存储数据内容的,
大伙可根据情况修改上列表,因这只是一个测试表而已。
我们知道,上列格式订单号的 "-" 前面的部份实际就是建立订单的当天的日期,所以很好解决,"-" 后面的部份是建立订单当天从1开始的流水编号,在IB/FB中,生成这样的流水编号当然离不开 Generator 了,所以我们还得建立一个生成器 GENERATOR 。
CREATE GENERATOR GEN_H_FORMATID;
而要让数据库每添加一笔数据时,订单编号(HT_ID)要自动填充数据,这时通常有两种方法去实现:
1:存储过程;
2:触发器(实际上也是一种存储过程)。
下面我们用建立触发器来实现:
SET TERM ^ ;
CREATE TRIGGER "TRI_BI_H_FORMATID" FOR "H_FORMATID"
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE h_d DATE;
/*
Author : 唐辉 http://www.3asoft.com */
BEGIN
SELECT MAX(HT_DATE) FROM H_FORMATID INTO :h_d;
/*查找最大的日期值*/
IF(CURRENT_DATE>h_d) THEN /*将当前日期与最大日期值比较*/
BEGIN
EXECUTE STATEMENT 'SET GENERATOR GEN_H_FORMATID TO 0';
/*如果当前日期大于库中的日期最大值,
*则将Generator值归零
*/
END
NEW.HT_ID=CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS VARCHAR(4))||
/*取年*/
CAST(EXTRACT(MONTH FROM CURRENT_DATE) AS VARCHAR(2))||
/*取月*/
CAST(EXTRACT(DAY FROM CURRENT_DATE) AS VARCHAR(2))||'-'||
/*取日*/
CAST(GEN_ID(GEN_H_FORMATID,1) AS VARCHAR(7));
/*取GENERATOR值*/
NEW.HT_DATE=CURRENT_DATE; /*自动赋HT_DATE为当前日期*/
END
^
COMMIT WORK ^
SET TERM ;^
然后您往数据表里添加几条数据,再将您的系统日期增加一天,再添加几条数据试试,最终达到您的要求了,成功了,庆祝庆祝!!
以上代码在 FireBird 1.5 中测试成功,未在 InterBase 中测试。
相关文章推荐
- 数据库的数据太长,显示在JSP如何到一定长度时自动换行?
- 如何使数据库中取出的数据保持原有格式
- 安装软件时如何自动附加数据库
- 如何保证在浏览器端打开文件(word格式),保存时仍能够进入原数据库!
- SQL SERVER 2005如何建立自动备份的维护计划
- SQL SERVER 2005如何建立自动备份的维护计划
- 自动附加满足一定规则文件名的数据库
- sql优化:从设计表结构开始(SQL Server中如何让数据库中某一个字段随时间自动更新?)
- Hibernate如何让数据库自动创建时间(时间戳)
- 如何自动生成参考文献格式
- 如何实现输入字母就可以查出数据库中以该字母匹配的中文实现自动补全功能
- HTML表单如何利用JavaScript自动验证其格式
- 如何使数据库中取出的数据保持原有格式(转)
- 如何检测 SQL CE 数据库是否成功建立了合并复制
- 如何使用脚本自动备份阿里云rds数据库
- 教你如何在iPhone上安装.deb格式的软件(附Cyida自动安装教程)
- 存储到数据库的文章如何保留原有格式
- 存储到数据库的文章如何保留原有格式
- 如何优化操作大数据量数据库(建立索引)
- [VB.NET]vb.net如何读取数据库生成指定格式的xml文件