`

使用触发器实现编码

阅读更多

在做项目的时候,经常需要给某个东西编码,譬如说合同编码、项目编码,这个编码得唯一、得有意义。

以下的几个,是在insert或者update的时候,使用触发器根据日期自动编码。

测试环境:

数据库:MS SQL Server 2005

1、实现效果:

编码格式:’FK‘+填表日期的年份+当前是第几个,譬如:FK2014001。

SQL:
CREATE TRIGGER [CreateYJCode]
   ON  [dbo].[table25]
   AFTER INSERT
AS 
BEGIN
	declare @field1 int --联络单序号
	declare @field15 datetime --填写日期
	declare @code varchar(50)--编码
	declare @count int --末三位数据
	declare @countvar varchar(50)
	declare @result varchar(50)
	select @field1=field1,@field15=field15 from INSERTED;--获取当前联络单序号
	set @code='FK'+cast(year(@field15) as varchar(5));--拼接CODE,目前的形式是:FK2014
	--获取符合条件的编码末三位的最大值,因为总长度是9位,前6位是FK2014,所以要从7开始截取,截取到最后
        select @count=max(cast(substring(field2,7,len(field2)) as int)) from table25 where field2 is not null and year(field15)=year(@field15);
        --当第一次生成编码的时候,@count就可能是空,这样的话,就从0开始
	if(@count = '' or @count is null) begin set @count = 0 end
        --@countvar接收@count加1后的值,来实现递增
	set @countvar = cast(@count+1 as varchar(5))
        --这个编码默认是后面带三位数字的,所以当@countvar只有1位的时候,需要补两个0
	if (len(@countvar)=1) begin set @result ='00' end
	if (len(@countvar)=2) begin set @result ='0' end
	if (len(@countvar)=3) begin set @result ='' end
        --将三个关键数据拼接起来:FK2014+00+1(假设是2014年第一次生成)
	set @code = @code+@result +@countvar;
        --更新相应的字段
	update table25 set field2=@code where field1=@field1;
END
简单解释一下:这是给反馈意见联络单做的一个编码,编码格式是:’FK‘+填表日期的年份+当前是第几个,譬如:FK2014001。其中Field2就是那个编码字段。

2、实现效果:
编码格式:年+月+当前是第几个(三位),譬如:201501001
SQL如下:
CREATE TRIGGER [CreateInComeCode]
   ON  [dbo].[table2]
   AFTER INSERT,UPDATE
AS 
BEGIN
	declare @field1 int --序号
	declare @field16 datetime --日期
	declare @code varchar(50)--编码
	declare @count int --末两位数据
	declare @countvar varchar(50)
	declare @result varchar(50)
	
	if not exists(select * from DELETED)--新增
	begin
		select @field1=field1,@field16=field16 from INSERTED;--获取刚刚添加的序号
	end
	--修改
	else  if(select count(*) from DELETED)>0 and (select count(*) from INSERTED)>0
	begin
		if update(field16)
		begin
			declare @f16_old datetime;--旧的时间
			declare @f16_new datetime;--新的时间
			select @f16_old = field16 from DELETED;--从DELETED里面获取老的时间
			select @f16_new = field16 from INSERTED;--从INSERTED里面获取新的时间
			if @f16_old<>@f16_new --两个时间不相同
			begin
				select @field1=field1,@field16=field16 from INSERTED;--获取刚刚添加的序号
			end
			else --否则不需要修改
				return ;
		end
	end
	--别的什么,一律不处理
	else
		return ;

	--进行处理
	declare @month varchar(10);--月份字符串
	set @month = cast(month(@field16) as varchar(3));
	if month(@field16)<10  set @month = '0'+@month;--要是只有一位,则需要补零
	set @code=cast(year(@field16) as varchar(5))+@month;--获取年份、月份
	
	--获取当天当前编号的最大数(不能使用count(),因为存在删除的情况,一旦删除编号就有可能相同)
	select @count=isnull(max(cast(substring(field19,7,len(field19)) as int)),0) from table2 
	where 
	field1<>@field1 --不是当前记录(这个很关键,一定要加上去,不然计数时永远都会多1,多了当前记录)
	AND LEN(field19)>0 --编号存在
	AND DATEDIFF(MONTH,field16,@field16)=0;--同一个月
	
	--在原来的基础上加1
	set @countvar = cast(@count+1 as varchar(5))
	
        --因为尾数为3位,所以当@countvar只有1、2位时,需要补零
	if (len(@countvar)=1) begin set @result ='00' end
	if (len(@countvar)=2) begin set @result ='0' end
	if (len(@countvar)=3) begin set @result ='' end
	--拼接最后的编码
        set @code = @code+@result+@countvar;
	
	--更新编码
	update table2 set field19=@code where field1=@field1;

END
 
3、实现效果:
编码格式:年+月+日+当前第几个(两位),譬如:2015031701

SQL如下:

CREATE TRIGGER [CreateCode]
   ON  [dbo].[table1]
   AFTER INSERT,UPDATE
AS 
BEGIN
declare @field1 int --序号
declare @field9 datetime --日期
declare @code varchar(50)--编码
declare @count int --末两位数据
declare @countvar varchar(50)
declare @result varchar(50)
	
if not exists(select * from DELETED)--新增
begin
	select @field1=field1,@field9=field9 from INSERTED;--获取刚刚添加的基本信息
end
--修改
else  if(select count(*) from DELETED)>0 and (select count(*) from INSERTED)>0
begin
	if update(field9)--如果修改了日期
	begin
		declare @f9_old datetime;--旧的时间
		declare @f9_new datetime;--新的时间
		select @f9_old = field9 from DELETED;--从DELETED里面获取老的时间
		select @f9_new = field9 from INSERTED;--从INSERTED里面获取新的时间
		if @f9_old<>@f9_new --两个时间不相同
		begin
                     --从INSERTED表中获取新的基本信息 
                      select @field1=field1,@field9=field9 from INSERTED;
		end
		else --时间没有发生,不需要修改
			return ;
	end
end
--别的什么,一律不处理
else
    return ;

--进行处理
declare @month varchar(10);--月份字符串
declare @day varchar(10);--日 字符串
set @month = cast(month(@field9) as varchar(3));--获取月份
set @day = cast(day(@field9) as varchar(3));--获取日
if month(@field9)<10  set @month = '0'+@month;--要是只有一位,则需要补零
if day(@field9)<10 set @day = '0'+@day;
set @code=cast(year(@field9) as varchar(5))+@month+@day;--拼接年份、月份、天
	
--获取当天当前编号的最大数(不能使用count(),因为存在删除的情况,一旦删除编号就有可能相同)
select @count=isnull(max(cast(substring(field2,9,len(field2)) as int)),0) from table1 
where 
field1<>@field1 --不是当前记录(这个很关键,一定要加上去,不然计数时永远都会多1,多了当前记录)
AND LEN(field2)>0 --编号存在
AND DATEDIFF(DAY,field9,@field9)=0;--同一天
--在原来编号的基础上加1
set @countvar = cast(@count+1 as varchar(5))
	
--因为只有两位,所以只需要补一个零
if (len(@countvar)=1) begin set @result ='0' end
if (len(@countvar)=2) begin set @result ='' end
set @code = @code+@result+@countvar;--拼接最后的编码
	
--更新编号
update table1 set field2=@code where field1=@field1;

END
分享到:
评论

相关推荐

    使用D触发器制作正交编码器的鉴相电路

    "使用D触发器制作正交编码器的鉴相电路" 正交编码器是伺服电机...使用D触发器制作正交编码器的鉴相电路可以实现伺服电机的方向控制,且可以根据成本考虑选择单D触发器或双D触发器来实现单个或多个旋转编码器的鉴相。

    用触发器实现SQLite的外键约束

    ### 使用触发器实现SQLite的外键约束 #### 背景与问题介绍 在进行数码相框嵌入式开发的过程中,开发团队选择了SQLite作为数据库管理系统。然而,在编码过程中遇到了一个较为棘手的问题:SQLite默认情况下不支持...

    用JK触发器实现九进制计数器PPT学习教案.pptx

    为了使用JK触发器实现九进制计数器,我们首先需要将状态转换图转换为卡诺图,然后将卡诺图分解为多个小区块。每个小区块对应一个JK触发器,我们可以根据JK触发器的特性来设计电路。最后,我们可以将所有的小区块连接...

    oracle触发器实现二维码

    首先,"oracle触发器实现二维码"这个标题意味着我们将结合Oracle数据库和二维码技术。二维码(Quick Response Code,简称QR Code)是一种二维条形码,能够存储大量的信息,包括文字、网址、联系信息等。在Java编程...

    multisim数字电路仿真逻辑门计数器触发器编码器等multisim10设计源文件合集(19个).zip

    《Multisim数字电路仿真:逻辑门、计数器、触发器及编码器解析》 在数字电子技术领域,Multisim是一款广受欢迎的电路仿真软件,尤其在教学和研究中占据重要地位。本资源包提供了19个Multisim10及更高版本的设计...

    触发器使用教程和命名规范

    * 触发器是一种数据库对象,编码方式类似存储过程,触发器可以与某张表相关联。 * 触发器可以在 DML 语句对表进行操作时执行,达到对插入记录的一致性、正确性和规范性控制的目的。 * 触发器的实现比较灵活,编程性...

    使用D触发器设计一个11001序列检测器.pdf

    使用 D 触发器设计一个 11001 序列检测器 本文讨论了使用 D 触发器设计一个 11001 序列检测器,涵盖了序列可交迭(Overlap)检测和不可交迭检测在设计上的区别,Mealy 机设计和 Moore 机设计的区别,以及未用状态的...

    JK触发器实现74LS194以及74LS197功能.pdf

    JK触发器的使用可以在很多方面替代复杂的74LS194和74LS197芯片,因为JK触发器能够通过组合逻辑和适当的反馈回路来实现计数和移位寄存器的功能。在设计时序逻辑电路时,JK触发器可以连接成更复杂的电路,实现类似于74...

    小猪专用 触发器小猪专用 触发器

    例如,当新的进口或出口记录被添加到数据库时,触发器可以检查商品的HS编码(Harmonized System,国际通用的商品分类代码),以确保其符合关税规定。此外,触发器还可以用于记录每一次操作的审计日志,这对于追踪...

    带电子报警器的数字编码电子锁

    总的来说,这款电子编码锁设计巧妙地结合了电子技术和安全理念,通过精心布局的电路设计,实现了高效、安全的密码验证和防盗报警功能,是电子技术在安全领域的一个实际应用实例,充分体现了理论知识与实践操作的完美...

    Verilog中状态机编码方式的选择

    独热码编码使用的触发器较多,但可减少实现状态机的组合逻辑数目,减少复杂性,提高系统的速度。独热码编码适用于中型设计,状态数处于4-24之间时。 在选择编码方式时,设计者需要考虑设计的具体需求,包括状态数、...

    曼彻斯特编码的实现

    这通常通过模拟电路或数字逻辑电路实现,如使用比较器、触发器和延迟线等。 4. **接收与解码**:在接收端,通过检测电压变化的中间点来确定数据位的边界,然后根据电压的上升还是下降来判断是0还是1。由于每个数据...

    rs编码verilog实现

    在Verilog中实现RS编码,是硬件描述语言对这种算法的硬件化,用于FPGA或ASIC设计。 Reed-Solomon编码的核心思想是通过多项式计算,将原始数据扩展为包含冗余信息的数据块,这些冗余信息能够在数据受到干扰时帮助...

    vhdl试验(全加器、频率计、计数器、优先编码器、触发器、状态机、数据选择器、数码管扫描)

    在VHDL中,优先编码器的实现需要考虑输入信号的逻辑关系,以及如何有效地检测和输出高优先级信号。 5. **触发器**:触发器是数字逻辑的基础存储单元,如D触发器、JK触发器、T触发器和RS触发器等,它们可以保持状态...

    新增用户就发送邮件和手机短信的SqlServer触发器

    这意味着在代码中不应硬编码敏感信息(如SMTP服务器凭证或短信服务API密钥),而应使用更安全的存储机制,如环境变量或配置文件,并在适当的地方使用加密。 ### 结论 通过在SQL Server中实施邮件和短信发送触发器...

    D触发器构成的余3码计数器数电课设报告 23.pdf

    由于D触发器能存储一位二进制数,所以需要四个D触发器来实现四位的余3码计数。设计过程包括绘制状态转移图,如图1所示,接着根据状态转移图制作卡诺图,如图2所示,然后通过卡诺图确定激励方程,计算出多余的不描述...

    基于FPGA的卷积码 的编码实现的 源代码

    这可能包括简化LFSR的结构、使用更高效的数据处理方式,以及在满足性能要求的前提下,尽可能减少使用的触发器和逻辑门数量。 5. **源码实现**:在压缩包中的“编码”文件中,包含了实现这一过程的源代码。这些代码...

    fpga实现曼彻斯特编码

    这通常包括一个时钟分频器(因为曼彻斯特编码的速率是输入数据速率的一半),一个比较器来判断当前比特是“0”还是“1”,以及一个DFF(D Flip-Flop)或者触发器来控制电平的切换时机。 3. **时钟同步**:由于...

    使用 D 触发器的 7 位计数器:使用 D 触发器的 7 位计数器设计-matlab开发

    3. **计数状态编码**:为了确保计数器按照预定顺序计数,我们需要设计一个状态转移图或真值表来定义每个触发器的D输入。对于7位计数器,每个触发器的状态变化都取决于当前所有触发器的状态,这通常通过布尔函数或...

    光电脉冲编码器四倍频电路的实现及其应用

    常用的解决方案之一是使用单稳态触发器来完成这项任务。例如,采用74LS221非重触发单稳态触发器可以有效地检测出上升沿和下降沿。通过适当调节触发器的参数,可以确保输出的脉冲宽度符合实际系统的需求。此外,还...

Global site tag (gtag.js) - Google Analytics