Sql 从动态交叉表查询和vba访问报告到;“手动”;生成报告
我曾经遇到过生成复杂访问报告的问题(我所说的复杂是指数据处理、可变字段数等等)。Sql 从动态交叉表查询和vba访问报告到;“手动”;生成报告,sql,ms-access,vba,report,Sql,Ms Access,Vba,Report,我曾经遇到过生成复杂访问报告的问题(我所说的复杂是指数据处理、可变字段数等等)。 让我更详细地解释我需要实施的一些事情: 根据查询中的某些值,某些字段不应显示 如果某个记录不存在,则应显示一条颜色鲜艳(非常明显)的消息,而不是出现的值(例如,假设日期字段中存在一条2009年3月4日的记录,日期字段中也存在一条2009年3月6日的记录,但不存在2009年3月5日的记录。在显示与上一条记录相关的数据之前,我应该打印类似“2009年3月5日未显示”的内容) 一种条形图,其数据不是记录中的值,而是在一
让我更详细地解释我需要实施的一些事情:
- 根据查询中的某些值,某些字段不应显示
- 如果某个记录不存在,则应显示一条颜色鲜艳(非常明显)的消息,而不是出现的值(例如,假设日期字段中存在一条2009年3月4日的记录,日期字段中也存在一条2009年3月6日的记录,但不存在2009年3月5日的记录。在显示与上一条记录相关的数据之前,我应该打印类似“2009年3月5日未显示”的内容)
- 一种条形图,其数据不是记录中的值,而是在一组记录上计算的其他数据(如某一日期所有等级的平均值)。此图表中的系列数也因记录中的值而异,此图表不在详细信息部分,而是在页面标题或某种组标题中
- 我在哪里可以找到一些关于Access报告和VBA的完整文档
- 如何在access报告中创建页面,并选择要写入的页面
- 有了这个问题,我是否会遇到任何我应该知道的瓶颈?我是否已经在考虑访问报告的替代方案(例如,写电子表格?)
TRANSFORM First(impNoMatch.PersonID) AS FirstOfPersonID
SELECT impNoMatch.LastName, impNoMatch.FirstBame
FROM impNoMatch
GROUP BY impNoMatch.LastName, impNoMatch.FirstName
PIVOT impNoMatch.Status;
现在,您知道SELECT子句中的字段将始终存在,因此,如果您在正在使用的SQL字符串上打开一个记录集,并计算记录集的字段集合中的字段数(您不能使用报表的记录集,除非它是ADO记录集,即未绑定到记录源):
因此,由于您知道SELECT语句中的字段数(即行标题),因此可以计算要分配的动态控件数,并且可以使用此记录集的“字段”集合分配控件源并取消隐藏控件
首先,您需要设置所有显示动态字段的控件,使其Visible属性为FALSE。您还需要为这些控件使用命名约定。在下面的代码中,我使用了txtNN,其中NN是字段集合中格式为2位数字的数字索引。下面是代码(在上面列出的内容中添加行,并在OnOpen事件中运行):
现在,如果你想变得有趣,你可以重新格式化控件,改变宽度和水平/垂直位置。如果你这样做,你必须在不同的事件中进行,选择它有点棘手。唯一可以放置它的地方是报表组标题的OnFormat事件。如果你没有任何分组,你可以添加一个没有o任何内容。在我的交叉表中,对Lastname和Firstname进行两级排序,并在Firstname组中设置一个标题,其中不包含任何内容,这是使用OnFormat事件更改报表上控件的外观/布局的好地方
至于你关于如何学习如何做到这一点的问题,我建议你读一本中级/高级Access编程书。Access开发者手册是这方面的黄金标准,其中包括大量examp
Dim strSQL As String
Dim rsFields As DAO.Recordset
Dim lngFieldCount As Long
strSQL = Me.Recordsource
Set rsFields = CurrentDB.OpenRecordset(strSQL)
lngFieldCount = rsFields.Fields.Count
Dim strSQL As String
Dim rsFields As DAO.Recordset
Dim lngFieldCount As Long
Dim l As Long
Dim strControlName As String
strSQL = Me.RecordSource
Set rsFields = CurrentDb.OpenRecordset(strSQL)
lngFieldCount = rsFields.Fields.Count
For l = 2 To lngFieldCount - 1
strControlName = "txt" & Format(l, "00")
Me(strControlName).ControlSource = rsFields.Fields(l).Name
Me(strControlName).Visible = True
Next l
rsFields.Close
Set rsFields = Nothing