三级次数据(一):在数据库使用存储过程输出为自联表形式

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(50PRIMARY 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

 

Public Class Employee
    
Inherits LzmTW.uSystem.uCollection.SinceLink.SinceLinkItemBase(Of Integer)
    
Sub New()
    
End Sub
    
Sub New(ByVal code As StringByVal name As String)
        
MyBase.New(code, name)
    
End Sub
End Class

下面这段代码便可输出为部门、班组、人员树:

    Private Sub gEnvironment_CurrentSalaryInformationChanged(ByVal sender As ObjectByVal 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

示意图:

 三级次数据(一):在数据库使用存储过程输出为自联表形式