Private Sub mytree()

Dim strsql As String
Dim strwh As String
Dim str1 As String, str2 As String, str3 As String, str4 As String, str5 As String

'组织机构 是一个临时的空表,通过对此表数据的更改,来改变窗体中列表控件的数据源,从而达到树形目录的变化。
'可通过设置断点,观察 组织结构 的数据变化来理解此作法。
'机构列表 是窗体中列表控件的名字。

Select Case Me.机构列表.Column(3)
    Case "公司"
        str1 = "一级部门ID"
        str2 = "一级部门"
        str3 = "公司ID"
        str4 = ".."
    Case "一级部门"
        str1 = "二级部门ID"
        str2 = "二级部门"
        str3 = "一级部门ID"
        str4 = "...."
    Case "二级部门"
        str1 = "三级部门ID"
        str2 = "三级部门"
        str3 = "二级部门ID"
        str4 = "......"
End Select

If Me.机构列表.Column(3) = "二级部门" Then      '点击 倒数第二层部门,初始标识str5为 '-',执行strsql向组织机构表添加最后一层部门时,标识为 '-'
    str5 = "-"
Else
    str5 = "+"
End If

If Me.机构列表.Column(3) = "三级部门" Then      '如果是最下层部门,则直接跳出。
    Exit Sub
End If

'以下需注意:
'一级部门、二级部门、三级部门表中的字段:一级部门、二级部门、三级部门 必须与 表名 一直!方便数据操作!
'注意: '" &  & "' 与 " &  & " 的区别!!
If Me.机构列表.Column(1) = "+" Then     '父目录展开
    strsql = "insert into 组织机构(ID,标识,机构,表名)"
    strsql = strsql & " select '" & Me.机构列表.Column(0) & "' & '-' & " & str1 & ",'" & str5 & "','" & str4 & "' & " & str2 & ",'" & str2 & "'"    'ID为"父目录ID - 子目录ID",排序需要。
    strsql = strsql & " from " & str2
    strsql = strsql & " where " & str3 & "=" & "'" & Mid(Me.机构列表.Column(0), InStrRev(Me.机构列表.Column(0), "-") + 1) & "'"     '注意instrrev
    CurrentDb().Execute strsql
   
    '标识符号变换,此处父级目录展开, + 变化成 -
    strsql = "update 组织机构 set 标识='-'"
    strsql = strsql & "where 组织机构.ID='" & Me.机构列表.Column(0) & "'"
    CurrentDb().Execute strsql
   
Else                                    '子目录收回
    strsql = "delete * from 组织机构 "
    strsql = strsql & "where instr(ID,'" & Me.机构列表.Column(0) & "')>0 and 表名 <>'" & Me.机构列表.Column(3) & "'"        '注意instr
    CurrentDb().Execute strsql
   
    strsql = "update 组织机构 set 标识='+'"
    strsql = strsql & "where 组织机构.ID='" & Me.机构列表.Column(0) & "'"
    CurrentDb().Execute strsql
   
End If

Me.机构列表.RowSource = "组织机构"      '刷新列表控件数据源

End Sub