繁体   English   中英

从报表中导出查询以使用参数访问Excel

[英]Export query from a report in access to excel with parameters

Private Sub txtExportCleanRecords_Click()

DoCmd.OutputTo acOutputQuery, "vCleanRecordsExport", "Excel97- Excel2003Workbook(*.xls)", "", 
True, "", , acExportQualityPrint    

End Sub

我在访问报告上创建了一个按钮,并且尝试导出已经创建的查询。 查询的目的是收集已经验证和批准的数据,因此数据库不会变得很麻烦。 报告按日期范围过滤了批准的数据,我只需要导出与报告匹配的记录。 因此,查询ID必须与报告ID匹配,并且我只需要导出与报告ID匹配的记录。 到目前为止,我的报告所做的只是导出整个查询,我无法弄清楚如何在acOutputQuery命令上放置where子句以过滤导出。 关于如何调整代码以便可以根据与查询ID匹配的报表ID进行导出的任何想法?

Private Sub txtExportCleanRecords_Click()

Const strcExportQuery = "ExportQuery"    ' Name of the query for exports.
Dim S As String
Dim strFile As String

' Adapt to your actual fields / filter
S = "SELECT vMayClean.LogID As 'CleanRecordsID', vMayClean.[Mark Read],    vMayClean.[Report Available], vMayClean.[Has Images], vMayClean.[Performing Resource], vMayClean.Org, " & _
"vMayClean.[Exam Date/Time], vMayClean.[Patient Nam], vMayClean.[Accession  #], vMayClean.MRN, vMayClean.Modality, vMayClean.[Exam Description], vMayClean.[Exam Status], " & _
"vMayClean.[Referring Phys], vMayClean.[Ordering Location], vMayClean.COMMENTS, vMayClean.STATUS, vMayClean.Exceptions, vMayClean.CR, vMayClean.[CPU/ Spreadsheets], vMayClean.PACs, vMayClean.Facility, " & _
"CodeRyteID, [Patient MRN], [Patient Name], [Account Number], [Patient DOB],[Signing Physician Location], [Referring Physician], [Pri Ins Name], " & _
"[Accident Code], [Accident Event], [Accident Date], [Admit Date], [Signing Physician], [Date Of Service], Service, [Stay Type], " & _
"[Accession Number], [Order CPT], [CPT Annotation], CPT4, Modifiers, ICD1, ICD2, ICD3, ICD4, [ICD10-1], [ICD10-2], " & _
"[ICD10-3], [ICD10-4], Units, [Override Queue Level], [Manual Route Queue], [Note Handle] FROM vCleanRecordsExport " & _
"WHERE vMayClean.LogID = " & Me.ID
' Set SQL of export query. This is all it takes, no explicit "Save" needed.
CurrentDb.QueryDefs(strcExportQuery).SQL = S

strFile = "T:\Users\Reuben\Reconciliation Testing\ExportQuery"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9,   strcExportQuery, strFile
DoCmd.OutputTo acOutputQuery, "ExportQuery", "Excel97-Excel2003Workbook (*.xls)", "", True, "", , acExportQualityPrint

DoCmd.OpenQuery "vCleanRecordsDelete", acViewNormal, acEdit

End Sub

修复SQL语句后,除了将vMayClean.LogID与之进行比较的数据外,其他所有内容均正常运行。

"Where vMayClean.LogID = " & Me.ID

此行代码将查询ID仅与当前报告ID进行比较。 我需要的是导出包含与所有报告ID匹配的所有查询ID,而不仅仅是一个。 让我知道是否需要提供其他信息。

新编辑

我添加了用于过滤报告的代码。 该报告使用vCleanRecords查询,并且我正在导出vCleanRecordsExport查询,该查询应该具有vCleanRecords查询中的所有记录,但是包含更多数据,因为我正在导出以从数据库中删除。 该报告是根据与服务日期匹配的开始日期和结束日期进行过滤的。

我了解您在说让where子句与日期过滤器where子句匹配,但是我该如何调整它使其适用于报表呢?

Dim strReport As String
Dim StrDateField As String
Dim strWhere As String
Const strcDateConst = "\#mm\/dd\/yyyy\#"

strReport = "rptCleanRecords"
StrDateField = "[DateOfService]"

If IsDate(Me.txtStartDate) Then
strWhere = "(" & StrDateField & " >= " & Format(Me.txtStartDate,  strcDateConst) & ")"
End If

If IsDate(Me.txtEndDate) Then
If strWhere <> vbNullString Then
    strWhere = strWhere & " AND "
End If
strWhere = strWhere & "(" & StrDateField & " < " & Format(Me.txtEndDate + 1, strcDateConst) & ")"
End If

DoCmd.OpenReport strReport,acViewReport,strWhere,strWhere

这不直接起作用。 DoCmd.OpenFormDoCmd.OpenReport具有参数WhereCondition ,但DoCmd.OutputToDoCmd.TransferSpreadsheet没有。

最简单的方法是拥有一个“导出查询”,您可以在其中将其SQL属性动态设置为过滤后的列表。 使用虚拟SQL手动创建此查询,此后每次导出都会覆盖该SQL。

摘自艾伦·布朗的新闻组帖子

Const strcExportQuery = "ExportQuery"    ' Name of the query for exports.
Dim S As String
Dim strFile As String

' Adapt to your actual fields / filter
S = "SELECT * FROM vCleanRecordsExport " & _
    "WHERE QueryID = " & Me.ReportID
' Set SQL of export query. This is all it takes, no explicit "Save" needed.
CurrentDb.QueryDefs(strcExportQuery).SQL = S

strFile = "C:\Data\MyExport.xls"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strcExportQuery, strFile

编辑:
也许我开始理解“报告ID”和“查询ID”的含义。
您的报告列出了一些记录,按日期过滤?
导出查询应该导出相同的记录集(即具有相同ID的记录)吗?

然后: 报告的记录源是什么?

如果是这样的话

SELECT Fields FROM Table WHERE someDate BETWEEN x AND y

那么您应该对导出查询使用相同的过滤器或WHERE子句( someDate BETWEEN x AND y )。

如果我错了:报告的ID来自何处?


编辑2
因此,您已经在构造WHERE字符串(strWhere),并将其作为OpenArgs传递给报表。

然后,您可以简单地使用该字符串而不是vMayClean.LogID = " & Me.ID

您在导出代码中的字段为[Date Of Service]
在报告代码中为StrDateField = "[DateOfService]"
如果无法在两个查询中使用相同的名称,则可以执行

strWhere = Replace(Me.OpenArgs, "[DateOfService]", "[Date Of Service]")

在导出代码中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM