Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> ADO/DAO/ADO.NET  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701939
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何用代码创建“子数据表”使主表每行左面多一个加号

作者:cg1  摘自:access911.net  :cg1  更新日期:2007-1-3  浏览人次:

 

问题:

如何用代码创建“子数据表”使主表每行左面多一个加号?
打开某个表,菜单 -> 插入 -> 子数据表 ,可以插入一个子数据表,实现数据表视图下每行左面有一个加号,单击加号可以展开与当前记录相关的子数据表,该功能如何用 VBA 代码来实现?

 

回答:


其实本问题在本站(http://access911.net) 上早就有很多文章论述,你只要将多篇文章中的代码组合一下就能实现。以下先给出所有的代码,然后给出参考示例,最后给出所有本站的参考文章。代码比较长,请耐心看完。

新建一个模块,将以下代码复制进去

'===========================================================
' 过程及函数名:  RunTest1
' 版本号      :  --
' 说明        :  演示,调用菜单半自动创建某个表的子数据表
'
'                 详细内容请参考以下文章:
'                     runcommand方法参数列表
'                     http://access911.net/index.asp?u1=a&u2=78FAB01E13DC
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function RunTest1()
'请将鼠标停留在这里,并按 F5 键运行演示代码
    DoCmd.OpenTable "单位"
    DoCmd.RunCommand acCmdInsertSubdatasheet
End Function


'===========================================================
' 过程及函数名:  RunTest2
' 版本号      :  --
' 说明        :  演示,调用自定义函数DisplayFieldInfor_DAO
'                 列出“单位”的所有属性,包括“子数据表(SubdatasheetName)”属性
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function RunTest2()
'请将鼠标停留在这里,并按 F5 键运行演示代码
'结果将打印在“立即窗口”,按 CTRL + G 可以打开或者关闭立即窗口

    DisplayFieldInfor_DAO "单位"
End Function

'===========================================================
' 过程及函数名:  RunTest3
' 版本号      :  --
' 说明        :  演示,调用自定义函数 DelSubdatasheetNameProperty
'                 删除“单位”表的“子数据表”
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function RunTest3()
'请将鼠标停留在这里,并按 F5 键运行演示代码
'结果将打印在“立即窗口”,按 CTRL + G 可以打开或者关闭立即窗口

    DelSubdatasheetNameProperty "单位"
End Function


'===========================================================
' 过程及函数名:  RunTest4
' 版本号      :  --
' 说明        :  演示,调用自定义函数 SetTableProperty
'                 创建“单位”的“子数据表(SubdatasheetName)”,让每一行左面出现加号(+)
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function RunTest4()
'请将鼠标停留在这里,并按 F5 键运行演示代码
'结果将打印在“立即窗口”,按 CTRL + G 可以打开或者关闭立即窗口

    Dim tdf As New DAO.TableDef
    Dim dbs As DAO.Database
    Set dbs = CurrentDb
    Set tdf = dbs.TableDefs("单位")
    SetTableProperty tdf, "SubdatasheetName", "Table.部门"   '设定子数据表为 “部门”
    SetTableProperty tdf, "LinkChildFields", "单位编号"      '设定链接子字段为“单位编号”
    SetTableProperty tdf, "LinkMasterFields", "编号"         '设定链接主字段为“编号”
End Function


'--------------------------------------------------------------------
'------  以上为演示代码,下面是演示代码中需要用到的自定义函数  ------
'--------------------------------------------------------------------


'===========================================================
' 过程及函数名:  DelSubdatasheetNameProperty
' 版本号      :  1.0
' 说明        :  本函数调用 DAO 删除某个表的子数据表属性
' 引用        :  Microsoft DAO 3.6 Object Library
' 输入参数    :  TableName     文本,填写某个表的名称。
' 输出值      :  --
' 返回值      :  --
' 测试环境    :  简体中文 Access 2003 + 简体中文 Windows 2003
' 调用演示    :  DelSubdatasheetNameProperty "表1"
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function DelSubdatasheetNameProperty(ByVal TableName As String)
On Error Resume Next
    Dim tdf As New DAO.TableDef
    Dim dbs As DAO.Database
    Set dbs = CurrentDb
    Set tdf = dbs.TableDefs(TableName)
    tdf.Properties.Delete "LinkChildFields"
    tdf.Properties.Delete "LinkMasterFields"
    tdf.Properties.Delete "SubdatasheetName"
End Function

'===========================================================
' 过程及函数名:  DisplayFieldInfor_DAO
' 版本号      :  2.0
' 说明        :  本函数调用 DAO 列出数据库中所有表的所有字段的所有属性的值
' 引用        :  Microsoft DAO 3.6 Object Library
' 输入参数    :  TableName     可选,文本,填写某个表的名称。
'                               如果不填写,则列出所有的表
'                 ListAllField  可选,布尔值。
'                               True 列出所有的字段;
'                               False 默认,不列出字段信息。
' 输出值      :  --
' 返回值      :  --
' 测试环境    :  简体中文 Access 2003 + 简体中文 Windows 2003
' 调用演示    :  DisplayFieldInfor_DAO
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function DisplayFieldInfor_DAO(Optional ByVal TableName As String, _
                               Optional ByVal ListAllField As Boolean)

On Error Resume Next

    Dim tdf As New DAO.TableDef
    Dim fld As DAO.Field
    Dim p As DAO.Property
    For Each tdf In CurrentDb.TableDefs
        If TableName = "" Or tdf.Name = TableName Then
            '以下代码能够获取在 Access 界面中表中手动进行的排序和筛选的条件
            For Each p In tdf.Properties
                Debug.Print tdf.Name, p.Name, p.Value
                DoEvents
            Next
            '显示所有字段信息
            If ListAllField = True Then
                For Each fld In tdf.Fields
                    For Each p In fld.Properties
                        Debug.Print "表名:" & tdf.Name, _
                                    "字段名:" & fld.Name, _
                                    "属性名:" & p.Name & _
                                    "属性值:" & p.Value
                        DoEvents
                    Next
                Next
            End If
        End If
    Next
End Function

'===========================================================
' 过程及函数名:  SetTableProperty
' 版本号      :  2.0
' 说明        :  本函数调用 DAO ,通过错误陷阱设置或者创建表的属性
' 引用        :  Microsoft DAO 3.6 Object Library
' 输入参数    :  tdf               TableDef 对象,需要设定属性的表。
'                 PropertyName      文本,需要设定或者创建的属性名称。
'                 valPropertyValue  Variant,属性的值。
' 输出值      :  --
' 返回值      :  --
' 测试环境    :  简体中文 Access 2003 + 简体中文 Windows 2003
' 调用演示    :  SetTableProperty MyTdf,"SubdatasheetName","Table.表1"
' 最后修改日期:  2007-1-3 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEBF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Sub SetTableProperty(tdf As DAO.TableDef, _
                     PropertyName As String, _
                     valPropertyValue As Variant)

    Dim prpNew As Property
    Dim errLoop As Error
    
    '尝试设置某个属性,并用错误陷阱捕捉出现的错误
    On Error GoTo Err_Property
    tdf.Properties(PropertyName) = valPropertyValue
    On Error GoTo 0
    
    Exit Sub

Err_Property:

    '错误号 3270 表示该属性没有被找到(不存在)
    If Err.Number = 3270 Then
        '用 CreateProperty 方法建立属性,并设定该属性的值
        '然后将新建的属性添加到“表”的属性集合

        Debug.Print "未找到" & PropertyName & "现在创建该属性"
        Set prpNew = tdf.CreateProperty(PropertyName, dbText, valPropertyValue)
        tdf.Properties.Append prpNew
        Resume Next
    Else
        '如果是其他错误,则显示所有的错误消息
        For Each errLoop In Errors
           MsgBox "Error number: " & errLoop.Number & vbCr & _
              errLoop.Description
        Next errLoop
        End
    End If

End Sub


示例下载:
http://access911.net/down/eg/eg_SetSubDatasheet_DAO.rar
 (19KB)


可以参考的文章:
    ado如何取得表的所有字段信息?(附DAO实现相同功能的代码)《VBA》
    http://access911.net/index.asp?u1=a&u2=74FAB11E10DC

提示:
    如果是要对查询插入子数据表,则只要将文章中的 DAO.TableDef 对象更改为 DAO.QueryDef 即可。
    另外,创建关系后,主表的每行旁边也会出现加号,该功能请参考 ACCESS 帮助,编程内容请参考以下地址:

    如何用sql语句建立删除表关系?《查询》
    http://access911.net/index.asp?u1=a&u2=72FABF1E1ADC

    关系如何用VBA程序来建立《其他》
    http://access911.net/index.asp?u1=a&u2=75FAB41E10DC

    数据库中是否有必要建立“关系”《表》
    http://access911.net/index.asp?u1=a&u2=72FABE1E11DCEBF3

 

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利