使用参数从报告中导出查询以访问 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.OpenForm
或 DoCmd.OpenReport
有参数 WhereCondition
,但 DoCmd.OutputTo
或 DoCmd.TransferSpreadsheet
没有。
最简单的方法是使用 "Export query",您可以在其中将其 SQL 属性 动态设置为过滤列表。使用虚拟 SQL 手动创建此查询,之后 SQL 将在每次导出时被覆盖。
改编自 Allen Browne 的 newsgroup post:
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
编辑:
也许我开始明白你所说的 "Report ID" 和 "Query 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]")
在导出代码中。
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.OpenForm
或 DoCmd.OpenReport
有参数 WhereCondition
,但 DoCmd.OutputTo
或 DoCmd.TransferSpreadsheet
没有。
最简单的方法是使用 "Export query",您可以在其中将其 SQL 属性 动态设置为过滤列表。使用虚拟 SQL 手动创建此查询,之后 SQL 将在每次导出时被覆盖。
改编自 Allen Browne 的 newsgroup post:
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
编辑:
也许我开始明白你所说的 "Report ID" 和 "Query 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]")
在导出代码中。