c#根据表格导出报表
它通常在Access开发环境中发生:您正在一个数据库中工作,并且意识到要在您或您的公司也在开发的另一个数据库中使用表单或报表。 但是,当您导入/导出对象时,您会发现它依赖的许多对象(表,查询,子表单/子报表)不在另一个数据库中,并且也需要导入/导出。 最终,您将一切转移了,但是想知道这是否真的值得所有麻烦。
答案是:“不,不是。” 那不是用VBA可以完成的全部工作! 通过访问对象的Dependencies集合,我们可以查找和导出表单或报表需要运行的每个对象。
依赖关系保存在数据库系统表中,而不保存在对象定义本身中,因此必须使用[object] .GetDependencies将它们填充到自己的对象中。 从那里开始,只需遍历所有依赖项即可。
以下三个代码过程完成了将每个依赖关系对象导出到专门创建的数据库的工作。 然后,您可以将软件包发送给另一位开发人员,或者将其批量复制到另一个工作数据库中。 将代码粘贴到新模块中以使用它。
第一个过程创建导出数据库,并将顶级对象传递给打包过程。 DepColl数组和DepI迭代器用于保存对所有转换对象的引用,以防止由于多个依赖项而转换相同对象。 在此过程中,我们还确保将“跟踪名称自动更正信息”设置为True(1),因为这将创建存储所有对象依赖项的系统表。
'PackageObjects Module
'Example: PackageObject([Object Name],"Form" or "Report")
'2014 Topher Ritchie
'This code is free for use in development and must
'retain this section.
'=========================================================
'Module Declarations section
'=========================================================
Option Compare Database
Option Explicit
Public DepColl() As String
Public DepI As Long
Public Sub PackageObject(strObject As String, strType As String)
Dim db As Object
Application.SetOption "Track Name AutoCorrect Info", 1
Access.DBEngine.CreateDatabase "F:\MyDatabases\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", DB_LANG_GENERAL
Set db = Application.CurrentProject
If strType = "Form" Then
OutputItem strObject, -32768
PackageDependencies db.AllForms.Item(strObject)
ElseIf strType = "Report" Then
OutputItem strObject, -32764
PackageDependencies db.AllReports.Item(strObject)
End If
ReDim DepColl(0)
DepI = 0
End Sub
下一个过程是模块的“肉”。
这将使用依赖项集合填充对象,然后遍历每个对象依赖项以确保尚未将其导出。
如果还没有,则代码将其导出,然后使用导出的对象递归调用自身,以获取主对象的所有n级依赖关系。
不幸的是,这是代码遇到麻烦的地方。
它可能会遇到无限循环,在该循环中它会继续调用自身,但是不会输出任何新对象。
幸运的是,如果您正在查看即时窗口,您将看到何时开始发生,因为那里没有新的对象出现。
这不是最佳解决方案,但是由于此代码仅用于开发目的,而不是用于生产系统,因此,只需在此时中断代码并停止它即可。
Public Sub PackageDependencies(objObject As Object)
Dim DepObj As Object
Dim DepObjColl As Object
Dim i As Long
On Error GoTo Err_Exit:
Set DepObjColl = objObject.GetDependencyInfo
For Each DepObj In DepObjColl.Dependencies
For i = 1 To DepI
If DepObj.name = DepColl(i) Then GoTo SkipObj
Next i
DepI = DepI + 1
ReDim Preserve DepColl(DepI)
DepColl(DepI) = DepObj.name
OutputItem DepObj.name, DLookup("Type", "MSysObjects", "NAME = '" & DepObj.name & "'")
PackageDependencies DepObj
SkipObj:
Next DepObj
Err_Exit:
End Sub
最终代码过程将实际导出到保留数据库。
与原始过程调用类似,它传递了一个对象名称和类型,但是在这种情况下,该类型(不是纯文本)是使用上述DLookup语句从系统表中提取的整数值。
为了清楚起见,此最终过程只是将Type转换为acObjectType常量声明。
Public Sub OutputItem(strName As String, lngType As Long)
Debug.Print strName, lngType
If lngType = 1 Or lngType = 6 Then
DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acTable, strName, strName
ElseIf lngType = 5 Then
DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acQuery, strName, strName
ElseIf lngType = -32768 Then
DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\PRISM\PRISM Support Programs\Development\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acForm, strName, strName
ElseIf lngType = -32764 Then
DoCmd.TransferDatabase acExport, "Microsoft Access", "F:\MyDatabases\dbExport_" & Format(Date, "yyyy-mm-dd") & ".accdb", acReport, strName, strName
End If
End Sub
使用此代码,您将能够输出完整的表单或报表,并且其所有依赖关系都完整无缺,可以使用。
通过在第一个过程中添加几行代码,如果您愿意,还可以使用它来传输查询,但这超出了我的原始范围。
翻译自: https://bytes.com/topic/access/insights/954635-how-export-form-report-package
c#根据表格导出报表