三级次数据(一):在数据库使用存储过程输出为自联表形式
Author:水如烟
我这里定义的所谓三级次数据,是指都具有属性(ID,Name)的三种类别数据的集合。
这种数据较常见,也通用。一般数据的分门别类多采用三级或二级,少有多于三级的。
比如行政区划,现在是省、市、县三级,到了县级截止了。县级以下的设定,其实还是三级,农村的就是:
县、镇、管理区。在学校,年级,班级,学员;在公司,部门,班组,职员;材料上,类别,名称,规格;应用软件的菜单,一般也就三级,超过三级的少有。
这种数据的输出表现形式,一是利用树,二是利用ComboBox,ListBox之类。
利用我曾做过的SinceLink类,可以很方便的处理这种数据。
在下一文中,也尝试做一个三级次数据类,换另一种方式来处理。
这里给出一个存储过程,输出后用SinceLink处理。
和以往一样,我是用中文作表名、列名、变量名的,见笑了:
USE [EmployeeWorks]
GO
/****** 对象: StoredProcedure [SalaryProgram].[部门班组人员] 脚本日期: 12/14/2006 10:24:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:LzmTW
-- Create date:20061213
-- Description:部门,班组,人员自联表
-- =============================================
CREATE PROCEDURE [SalaryProgram].[部门班组人员]
@当前时间 [Salary].[SalaryDate] = N'Current'
,@公司ID smallint = 1
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Declare @部门ID_Len smallint
,@班组ID_Len smallint
,@职员ID_Len smallint
SET @部门ID_Len = Len(Ident_Current(N'Base.部门'))
SET @班组ID_Len = Len(Ident_Current(N'Base.部门_班组'))
SET @职员ID_Len = Len(Ident_Current(N'Base.职员'))
Declare @部门Format Nvarchar(50)
,@班组Format Nvarchar(50)
,@职员Format Nvarchar(50)
SET @部门Format = REPLICATE('0', @部门ID_Len)
SET @班组Format = REPLICATE('0', @班组ID_Len)
SET @职员Format = REPLICATE('0', @职员ID_Len)
--输出CodeFormt
SELECT @部门Format + ',' + @班组Format + ',' + @职员Format As CodeFormat
--定义输出表
Declare @CodeTable Table
(
Code nvarchar(50) PRIMARY KEY
,[Name] nvarchar(50)
)
--取部门
INSERT INTO @CodeTable
SELECT DISTINCT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ @班组Format
+ @职员Format AS Code
, a.部门 As [Name]
FROM [Base].部门 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.部门ID = b.部门ID
--取班组
INSERT INTO @CodeTable
SELECT DISTINCT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ dbo.PadLeft(b.班组ID, @班组ID_Len, '0')
+ @职员Format AS Code
, a.班组 As [Name]
FROM [Base].部门_班组 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.班组ID = b.班组ID
--取职员
INSERT INTO @CodeTable
SELECT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ dbo.PadLeft(b.班组ID, @班组ID_Len, '0')
+ dbo.PadLeft(b.姓名ID, @职员ID_Len, '0') AS Code
, a.姓名 As [Name]
FROM [Base].职员 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.姓名ID = b.姓名ID
--输出Code,Name表
SELECT *
FROM @CodeTable
ORDER BY Code
END
GO
/****** 对象: StoredProcedure [SalaryProgram].[部门班组人员] 脚本日期: 12/14/2006 10:24:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:LzmTW
-- Create date:20061213
-- Description:部门,班组,人员自联表
-- =============================================
CREATE PROCEDURE [SalaryProgram].[部门班组人员]
@当前时间 [Salary].[SalaryDate] = N'Current'
,@公司ID smallint = 1
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Declare @部门ID_Len smallint
,@班组ID_Len smallint
,@职员ID_Len smallint
SET @部门ID_Len = Len(Ident_Current(N'Base.部门'))
SET @班组ID_Len = Len(Ident_Current(N'Base.部门_班组'))
SET @职员ID_Len = Len(Ident_Current(N'Base.职员'))
Declare @部门Format Nvarchar(50)
,@班组Format Nvarchar(50)
,@职员Format Nvarchar(50)
SET @部门Format = REPLICATE('0', @部门ID_Len)
SET @班组Format = REPLICATE('0', @班组ID_Len)
SET @职员Format = REPLICATE('0', @职员ID_Len)
--输出CodeFormt
SELECT @部门Format + ',' + @班组Format + ',' + @职员Format As CodeFormat
--定义输出表
Declare @CodeTable Table
(
Code nvarchar(50) PRIMARY KEY
,[Name] nvarchar(50)
)
--取部门
INSERT INTO @CodeTable
SELECT DISTINCT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ @班组Format
+ @职员Format AS Code
, a.部门 As [Name]
FROM [Base].部门 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.部门ID = b.部门ID
--取班组
INSERT INTO @CodeTable
SELECT DISTINCT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ dbo.PadLeft(b.班组ID, @班组ID_Len, '0')
+ @职员Format AS Code
, a.班组 As [Name]
FROM [Base].部门_班组 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.班组ID = b.班组ID
--取职员
INSERT INTO @CodeTable
SELECT
dbo.PadLeft(b.部门ID, @部门ID_Len, '0')
+ dbo.PadLeft(b.班组ID, @班组ID_Len, '0')
+ dbo.PadLeft(b.姓名ID, @职员ID_Len, '0') AS Code
, a.姓名 As [Name]
FROM [Base].职员 a
INNER JOIN [SalaryFunction].[基本情况](@当前时间, @公司ID) b
ON a.姓名ID = b.姓名ID
--输出Code,Name表
SELECT *
FROM @CodeTable
ORDER BY Code
END
使用时(示意代码):
Public Class GetDepartTeamEmployeeService
Private gProvider As ServiceProvider
Sub New(ByVal loginInformation As LzmTW.uSystem.uData.uSql.LoginInformation)
gProvider = New ServiceProvider(loginInformation)
End Sub
Public Sub FillDataSet(ByVal ds As DataSet, ByVal salaryInformation As EmployeeWorksCommon.SalaryInformation)
Using mCommand As SqlClient.SqlCommand = gProvider.CreateCommandByCommandType(CommandType.StoredProcedure, Constance.PROCEDURE_DEPARTTEAMEMPLOYEE)
With gProvider
.AddInParameter(mCommand, "当前时间", SqlDbType.NVarChar, salaryInformation.发放时间)
.AddInParameter(mCommand, "公司ID", SqlDbType.SmallInt, salaryInformation.Company.公司ID)
.LoadDataSet(mCommand, ds, "CodeFormat", "Code")
End With
End Using
End Sub
End Class
Private gProvider As ServiceProvider
Sub New(ByVal loginInformation As LzmTW.uSystem.uData.uSql.LoginInformation)
gProvider = New ServiceProvider(loginInformation)
End Sub
Public Sub FillDataSet(ByVal ds As DataSet, ByVal salaryInformation As EmployeeWorksCommon.SalaryInformation)
Using mCommand As SqlClient.SqlCommand = gProvider.CreateCommandByCommandType(CommandType.StoredProcedure, Constance.PROCEDURE_DEPARTTEAMEMPLOYEE)
With gProvider
.AddInParameter(mCommand, "当前时间", SqlDbType.NVarChar, salaryInformation.发放时间)
.AddInParameter(mCommand, "公司ID", SqlDbType.SmallInt, salaryInformation.Company.公司ID)
.LoadDataSet(mCommand, ds, "CodeFormat", "Code")
End With
End Using
End Sub
End Class
Public Class Employee
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(Of Integer)
Sub New()
End Sub
Sub New(ByVal code As String, ByVal name As String)
MyBase.New(code, name)
End Sub
End Class
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(Of Integer)
Sub New()
End Sub
Sub New(ByVal code As String, ByVal name As String)
MyBase.New(code, name)
End Sub
End Class
下面这段代码便可输出为部门、班组、人员树:
Private Sub gEnvironment_CurrentSalaryInformationChanged(ByVal sender As Object, ByVal current As EmployeeWorksCommon.SalaryInformation) Handles gEnvironment.CurrentSalaryInformationChanged
Me.gComponentUI.ShowInformation(current)
Dim ds As New DataSet
Me.gServiceManager.FillDepartTeamEmployeeTo(ds, current)
Dim mCodeFormatTable As DataTable = ds.Tables("CodeFormat")
Dim mCodeNameTable As DataTable = ds.Tables("Code")
Dim mCodeFormat As String
mCodeFormat = mCodeFormatTable.Rows(0).Item("CodeFormat").ToString
Dim mSinceLinkCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection(Of Integer, Employee)(mCodeFormat)
mSinceLinkCollection.AppendItemsFromCodeNameTable(mCodeNameTable)
With Me.gComponentUI.EmployeeTreeView.TreeView
.BeginUpdate()
.Nodes.Clear()
.Nodes.AddRange(mSinceLinkCollection.Node.ConvertToTreeNodes("Name", True))
.EndUpdate()
End With
End Sub
Me.gComponentUI.ShowInformation(current)
Dim ds As New DataSet
Me.gServiceManager.FillDepartTeamEmployeeTo(ds, current)
Dim mCodeFormatTable As DataTable = ds.Tables("CodeFormat")
Dim mCodeNameTable As DataTable = ds.Tables("Code")
Dim mCodeFormat As String
mCodeFormat = mCodeFormatTable.Rows(0).Item("CodeFormat").ToString
Dim mSinceLinkCollection As New LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemCollection(Of Integer, Employee)(mCodeFormat)
mSinceLinkCollection.AppendItemsFromCodeNameTable(mCodeNameTable)
With Me.gComponentUI.EmployeeTreeView.TreeView
.BeginUpdate()
.Nodes.Clear()
.Nodes.AddRange(mSinceLinkCollection.Node.ConvertToTreeNodes("Name", True))
.EndUpdate()
End With
End Sub
示意图: