首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

100算法?DOS时代画了一个表参考

2012-01-03 
100求一个算法?DOS时代画了一个表参考现有一个树状数据存在数据库中.编码名称001a001001b001002c001003d00

100求一个算法?DOS时代画了一个表参考
现有一个树状数据存在数据库中.
编码                                       名称
001                           a
001001                     b
001002                     c
001003                     d
001003001               e
001003002               f
001004                     g
001005                     h
001006                     i
001006001               j
001006001001         k
001006001002         l
001006002               m

001001是001的子级,以此类推.如001是所有级的父级.

现需求如下:将数据形成表格的算法.
---------------------------------------------|------------|
                          类别                                                         |         数量         |  
------|--------------------------------------|------------|
            |           001001                                                       |         1               |  
            |--------------------------------------|------------|
            |           001002                                                       |         2               |
            |----------|---------------------------|------------|
            |                     |   001003001                                   |         1               |
            |                     |---------------------------|------------|  
            |   001003       |   001003002                                   |         5               |
            |                     |---------------------------|------------|
            |                     |                   合       计                       |         6               |


            |----------|---------------------------|------------|
            |           001004                                                       |         5               |
            |--------------------------------------|------------|
001       |           001005                                                       |         7               |
            |---------|-------------|--------------|------------|
            |                   |                           |   001006001001   |         4               |
            |                   |                           |--------------|------------|
            |                   |     001006001     |   001006001002   |         2               |
            |                   |                           |--------------|------------|
            |     001006   |                           |           合计           |         6               |  
            |                   |-------------|--------------|------------|
            |                   |                                 001006002       |         4               |
            |                   |----------------------------|------------|
            |                   |                   合       计                         |         10             |  
            |---------|----------------------------|------------|  
            |                       合               计                                 |         31             |  


------|--------------------------------------|------------|

第一个级别有一个合计.
怎样才能让表格成这种样子.表格具有合并的功能(类似电子表格).




[解决办法]
如果001003是001003001和001003002的父项,那个001003本身是没有值的吧
那么只要是父项 都是没有值的。是这样吗?
[解决办法]
好像很复杂啊,顶起来
[解决办法]
顶,学习中
[解决办法]
很典型的递归


[解决办法]
就生成一棵树,再递归生成表格吧.
[解决办法]
关注LZ,友情UP一下
[解决办法]
更好的办法? 我觉得这玩意最好就是用递归了.
generate(currentnode)
{
if (currentnode.haschild)
generate(currendnode,child)
else
print "XXxXX "

}
大概如此吧.
[解决办法]
类似MRP里的BOM展阶.
[解决办法]
你这个是什么意思??如果你做个无限树跟统计树节点数目的话..我做过!!

[解决办法]
Option Explicit

Private Sub CmdLoad_Click()
CreatCellHeadThree
End Sub

Private Sub Form_Load()


' '创建表,你自己在SQL上运行
' ' CREATE TABLE [Subject] (
' ' [Code] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
' ' [Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
' ' [Num] [decimal](18, 2) NULL CONSTRAINT [DF_Subject_Num] DEFAULT (0),
' ' CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED
' ' (
' ' [Code]
' ' ) ON [PRIMARY]
' ' ) ON [PRIMARY]
' ' GO


Cell.Height = Me.ScaleHeight - Cell.Top
Cell.Width = Me.ScaleWidth
End Sub

Private Sub Form_Resize()
Cell.Height = Me.ScaleHeight - Cell.Top
Cell.Width = Me.ScaleWidth
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Connect.State = 1 Then Connect.Close
Unload Me
End Sub

Private Sub CreatCellHeadThree()

Dim HeadRs As New ADODB.Recordset ' '表头记录集,由此记录集创建表头
Dim End_subjects As Long ' '末级科目数
Dim Sum_Items As Long ' '合计项数
Dim TotalsCol As Long
Dim Layer As Long ' '层数
Dim TheSqlStr As String
Dim I As Long

' '横报表表头所占行数为科目层数
' '横报表表头所占列数为:末级科目数+合计项数=总列科目数
' 'Select Max(Len(Code))/Min(Len(Code)) From Subject--层数

' '表固定列第一列季度,第二列总计
With Cell
' '清除表格
.ClearArea 1, 1, 5, 6, 0, 32
.SetRows 4, 0 ' '初始行数据
.SetCols 5, 0 ' '初始列数

.SetCurSheet 0
.SetFixedRow 1, 5 ' ' '一到四行为固定行
.RdonlyCellColor = RGB(255, 255, 255)
.ShowSheetLabel 0, 0 '不显示页
.SetRowHeight 1, 50, 1, 0
.DrawGridLine 1, 3, .GetCols(0) - 1, .GetRows(0) - 1, 0, 2, -1


If HeadRs.State = 1 Then HeadRs.Close: Set HeadRs = Nothing
TheSqlStr = "select Count(*) as Cols ,Max(Len(Code))/Min(Len(Code))as Layers from Subject " ' '总列数



HeadRs.Open TheSqlStr, Connect, adOpenKeyset, adLockOptimistic
TotalsCol = HeadRs.Fields( "Cols ").Value ' '总列数 表头列数
Layer = HeadRs.Fields( "Layers ").Value ' '总层数 表头行
.SetRows Layer + 2, 0 ' '初始行数据
.SetCols TotalsCol + 1, 0 ' '初始列数

' ' '以上确定了报表的行和列

TheSqlStr = "Select Code,Name,Num, " & vbCrLf & _
"子科目数= (Select Count(*)-1 from Subject where Code like rtrim(A.Code)+ '% ') " & vbCrLf & _
",层数=(select len(Code)/3) " & vbCrLf & _
"From Subject A Order by Code "


If HeadRs.State = 1 Then HeadRs.Close: Set HeadRs = Nothing
HeadRs.Open TheSqlStr, Connect, adOpenKeyset, adLockOptimistic

' 'Code , Name, Num, 子科目数,层数

For I = 1 To HeadRs.RecordCount
.S I, HeadRs.Fields( "层数 ").Value, 0, HeadRs.Fields( "Name ").Value ' ' '& "( " & HeadRs.Fields( "Code ").Value & ") " ' '标题头
.D I, Layer + 1, 0, GetTatol(HeadRs.Fields( "Code ").Value)

If HeadRs.Fields( "子科目数 ") > 0 Then
.S I, HeadRs.Fields( "层数 ").Value + 1, 0, "合计: "
.SetCellTextColor I, HeadRs.Fields( "层数 ").Value + 1, 0, .FindColorIndex(RGB(255, 0, 0), 1) ' '上色
.MergeCells I, HeadRs.Fields( "层数 ").Value, I + HeadRs.Fields( "子科目数 ").Value, HeadRs.Fields( "层数 ").Value
End If
HeadRs.MoveNext
Next


End With

End Sub

Private Function GetTatol(ItemCode) As Double
Dim TheRs As New ADODB.Recordset
Dim TheSql As String
GetTatol = 0
TheSql = "select sum(Num)as 合计数 From Subject where Code Like ' " & ItemCode & "% ' "
TheRs.Open TheSql, Connect, adOpenKeyset, adLockReadOnly
GetTatol = TheRs.Fields( "合计数 ").Value
TheRs.Close
Set TheRs = Nothing

End Function

热点排行