【Access小品】越俎代庖--递归函数示例,Access树控件制作家谱的示例,Access家谱数据库-煮江品茶
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> 源码示例


【Access小品】越俎代庖--递归函数示例,Access树控件制作家谱的示例,Access家谱数据库

发表时间:2015/6/4 15:19:25 评论(1) 浏览(9444)  评论 | 加入收藏 | 复制
   
摘 要:【Access小品】越俎代庖 --- 递归函数示例。
正 文:
  越俎代庖这个成语中有两个角色,一个是神汉一个大厨,意思是说在祭祀活动中神汉和大厨是有分工的,神汉不应直接代替大厨的工作。在Vba中实现一些功能,也有两种东西,一个叫做子程序(Sub),一个叫做函数(Function)。子程序用来完成某些动作,函数用来返回需要的数据,通常来说这样理解没什么大的问题。不过有时候我们需要用函数来越俎代庖,实现子程序完成某些动作的功能。

  从道理上讲,函数是可以替代子程序的。原因在于函数体和子程序体的构成是没有什么大的差别的,唯一不同的是函数体中可以存在一条返回数据的语句。也就是说子程序能实现的功能,函数都是可以实现的。而函数能实现的功能,子程序并不一定都能实现。这样说来,子程序的存在只是为了保留一种概念上的功能区分。

  版友付谦同志昨日里问了一个关于家谱用TreeView呈现方面的问题。我们知道家谱是一个不定级的层次结构,最适于用递归的方法来得到一个树形结构。所以我们通常可以用一个递归子程序来实现TreeView节点的加载。假如我们希望在每个节点上,反映出这个节点的所有后代成员的总数,这就不是一个简单的事情了。说它不简单,是因为它所要做的动作是向节点的Text属性写入一个统计出来的数据,递归动作本身比较难以统计这个数据。在这个特定的情况下,递归子程序比较难以实现边统计变写入的功能。

  怎么办呢?答案很简单,将递归子程序改为递归函数,这个问题就很简单的可以解决了。函数是可以一边做一些动作,一边进行计算并返回数据的,这些返回的数据可以容易的参与递归运算。我们可以将代码大体写成如下:

Private Function SetNodes(ByRef tree As TreeView, ByRef n As Node) As Long
    Dim cn As Node
    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
    Dim cnt As Long

    ssql = "select * from 族人信息 where " & n.Tag
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

    cnt = rs.RecordCount
    For i = 1 To rs.RecordCount
        Set cn = tree.Nodes.Add(n.Key, 4, "b" & rs!族人代码.Value, rs!姓名.Value)
        cn.Tag = "nz(父代码,0)=" & rs!族人代码.Value
        '递归运算
        cnt = cnt + SetNodes(tree, cn)
        rs.MoveNext
    Next
    '写入节点的Text属性
    n.Text = n.Text & " (" & n.Children & "/" & cnt & ")"

    SetNodes = cnt

    rs.Close: Set rs = Nothing
    Set cn = Nothing

End Function


示   例:

点击下载此附件


视   图:



Access软件网交流QQ群(群号:198465573)
 
 相关文章
【access小品】蜻蜓咬尾---多端点配线路径递归计算示例  【煮江品茶  2012/2/26】
【Access函数】列表文件递归  【亚伦·布朗  2012/8/30】
【Access小品】活该挨骂--生产进度管理示例  【煮江品茶  2014/3/4】
【Access小品】亚投行--事件概述  【煮江品茶  2015/3/30】
【SQL SERVER小品】跟踪追击--SQL SERVER递归查...  【煮江品茶  2015/4/30】
【Access小品】搞球不清--Null的概述  【煮江品茶  2015/5/28】
常见问答
技术分类
相关资源
文章搜索
关于作者

煮江品茶

文章分类

文章存档

友情链接