设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5417|回复: 13
打印 上一主题 下一主题

[ActiveX] 如何按树的上下顺序重新编号

[复制链接]
跳转到指定楼层
1#
发表于 2021-4-9 14:10:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 付谦 于 2021-4-10 08:03 编辑

见附件
表记录字段:族人代码,承上码,世代,姓名,重编号
从前表记录是按照世代的先后顺序编号的(族人代码),现在想按照树的上下顺序重新编个号,为此在表中建立了重编号字段,点击"按树上下顺序编号"命令按钮,实现重编号字段是按树上下顺序编的号,如1,2,3......

网上说用递归可以做到,我对递归知识一点不懂,无从入手.请高手帮助


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
14#
 楼主| 发表于 2021-4-12 09:11:05 | 只看该作者
感谢aslxt 大师助人为乐!帮我解决了大难题
13#
 楼主| 发表于 2021-4-12 09:09:12 | 只看该作者
感谢aslxt 大师助人为乐!帮我解决了大难题
12#
 楼主| 发表于 2021-4-12 09:08:12 | 只看该作者
感谢aslxt 大师助人为乐!帮我解决了大难题
11#
 楼主| 发表于 2021-4-12 09:07:49 | 只看该作者
感谢aslxt 大师助人为乐!帮我解决了大难题
10#
发表于 2021-4-11 21:30:56 | 只看该作者
建议:表中再增加"排行"字段,重编码,生成树,输出到Excel/Word/visio等更方便.
9#
发表于 2021-4-11 21:28:01 | 只看该作者
新建窗体,新建按钮(Command0),代码如下:

Private Sub Command0_Click()
    开始重编号
End Sub

Function Conn() As ADODB.Connection    '仅为了其他地方书写方便
    Set Conn = CurrentProject.Connection
End Function

Function 开始重编号()
    Dim Rec As New ADODB.Recordset, i, sql, str, maxID
    sql = "update 族人信息 set 重编号=0,新承上码=0"    '清空字段
    Conn.Execute sql
    sql = "select * from 族人信息 where nz(承上码,0)=0 order by 世代,族人代码"    '选择没有承上码或=0的,表示他为始祖
    Rec.Open sql, Conn, adOpenStatic, adLockReadOnly
    For i = 1 To Rec.RecordCount
        maxID = DMax("重编号", "族人信息")    '获得已有的新编码的最大值
        sql = "update 族人信息 set 重编号=" & maxID + 1 & " where 族人代码=" & Rec!族人代码    '根节点无须更新[新承上码]
        Conn.Execute sql
        递归重编号 Rec!族人代码    '调用递归函数
        Rec.MoveNext
    Next i
End Function

Function 递归重编号(CSM)
    Dim Rec As New ADODB.Recordset, i, sql, str, maxID, newCSM
    sql = "select  * from 族人信息 where 承上码=" & CSM & " order by 族人代码"    '只是打开承上码等于参数CSM的记录
    Rec.Open sql, Conn, adOpenStatic, adLockReadOnly
    For i = 1 To Rec.RecordCount
        maxID = DMax("重编号", "族人信息")    '获得已有的新编码的最大值
        newCSM = DLookup("重编号", "族人信息", "族人代码=" & CSM)    '获得CSM参数代表的成员的新编码
        sql = "update 族人信息 set 重编号=" & maxID + 1 & ",新承上码=" & newCSM & " where 族人代码=" & Rec!族人代码
        Conn.Execute sql
        递归重编号 Rec!族人代码    '调用自己,这就是递归
        Rec.MoveNext
    Next i
End Function


8#
 楼主| 发表于 2021-4-11 17:47:31 | 只看该作者
递归不会,大师能否帮助,谢!
7#
发表于 2021-4-11 17:03:22 | 只看该作者
本帖最后由 aslxt 于 2021-4-11 17:09 编辑

递归要快一些,1:5左右
6#
 楼主| 发表于 2021-4-11 16:17:28 | 只看该作者
ASLXT大师:
  我树图共19000条记录,按上述方法共花了21分钟,是否还有其他方法提高速度?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-5 20:51 , Processed in 0.103475 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表