当我们设置数据表的时候,一般设置一列为主键,如果利用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