当我们设置数据表的时候,一般设置一列为主键,如果利用MS的Sql Server 数据库,可以设置主键列自动编号,它默认的是,从1自动增加。可我们有时,需要将主键列变得有一点意义,比如用年月之后是几位的自动编号,这样看起来,有有一点意义。
例如:一个数据表的结构如下:
If Exists (Select * From SysObjects Where Id = Object_Id('Invoice'))
Drop Table dbo.Invoice
GO
Create Table dbo.Invoice(
InvCode varchar(12) Not null Primary key,--开票编号
InvType varchar(10) Not null, --开票类型:整机、配件;
InvType1 varchar(10) Not null, --开票类型:采购、销售
InvType2 varchar(10) Not Null, --开票类型:普通、增值税
Tax Numeric(8,2) Not Null, --开票金额;
Cess Numeric(2,2) Not Null, --税率;
InvDate smalldatetime Not Null, --开票日期;
Code1 varchar(20) Null, --票号1
Code2 varchar(20) Null, --票号2
OPTaxCode varchar(20) Not Null, --往业单位税号
OPName varchar(50) Not Null, --往来单位名称
Note varchar(100) Null, --备注;
IsValidate bit Not Null, --确认标识:默认没有确认;
Pact Varchar(12) Null --对应合同编号;
)
GO
当建立数据表后,需要设置InvCode数据列为函数所取得的编号,代码如下所示:
--=============================================================================

/**//****** 对象: 自定函数 dbo.fu_Invoice_Code ******/

/**//****** 说明:发票编号 ******/
--=============================================================================
if exists (select * from dbo.sysobjects where id = object_id('dbo.fu_Invoice_Code'))
drop function dbo.fu_Invoice_Code
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
CREATE FUNCTION dbo.fu_Invoice_Code ()
RETURNS varchar(12) AS
BEGIN
declare @ResultCode varchar(12) , @ToDay SmallDatetime
Select @ToDay = ToDay From vw_GetDate
if Exists ( Select * From Invoice )
begin
Select @ResultCode = Max ( InvCode ) From Invoice
--取出数据表中最大年份,看是否是当年的信息
If ( SubString ( @ResultCode , 3 , 4 ) = DateName ( Year,@ToDay ) )
begin
--取出数据表中的最大编号的月份,看是否是当前的月份
If ( SubString ( @ResultCode , 7 , 2 ) = DateName ( Month , @ToDay ) )
--当是当前月份时,把最后四位进行处理,重新获取新的编号
Set @ResultCode = Left ( @ResultCode , 8 ) +
Right ( '0000' + Convert ( varchar , Convert ( int , SubString ( @ResultCode , 9 , 4 ) ) +1 ) , 4 )
else
--当不是当前的月份时,取出前六位,之后把当前的月份编号添加上去,再加上0000,组成最大的编号
Set @ResultCode=Left(@ResultCode,6)+DateName(Month,@ToDay)+'0000'
end
else
--当从数据表中取出的最大年份不是当年时 ,进行如下操作
Set @ResultCode = 'FP' + DateName ( Year , @ToDay ) + DateName ( Month , @ToDay ) + '0000'
end
else
Set @ResultCode = 'FP' + DateName ( Year , @ToDay ) + DateName ( Month , @ToDay ) + '0000'
return @ResultCode
END-------------------------------------------------------------------------------
ALTER TABLE dbo.Invoice ADD
--自动发票编号
CONSTRAINT DF_Invoice_InvCode DEFAULT (dbo.fu_Invoice_Code()) FOR InvCode
GO