Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从动态交叉表查询和vba访问报告到;“手动”;生成报告_Sql_Ms Access_Vba_Report - Fatal编程技术网

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暂时停止了抱怨(有人能澄清一下吗?这正常吗?我应该不担心它并将其用作记录源,还是应该避免它?)

有两个选项可以实现我想要的(我现在可以看到):

  • 创建一个没有记录源和大量未绑定字段的报告,通过几个事件(报告打开、节格式等)并在DAO的帮助下,手动设置这些字段的值。也可以通过VBA更改图表的数据系列
  • 将记录源设置为查询,并创建一些疯狂而混乱的VBA代码来处理数据并实现我需要的一切
  • 在我看来,选项2将是一个巨大的头痛和浪费时间的问题,我认识到选项1非常类似于写入Excel文件(因为所有数据都是通过DAO获得的),这将更容易,因为我对那里的几乎所有内容都有更多的控制(但出于许多其他原因,我们希望所有内容都在access报告中)

    虽然我有偏见并打算选择选项1,但我发现该选项存在一些问题,例如:

  • 我找不到使用VBA在报告中创建新页面的方法,因此我仅限于第一页
  • 缺乏关于VBA和Access报告的免费、在线、体面和完整的文档
  • 另外,如果选择2更可行,我当然愿意接受,但我也需要一些建议,也许还有一些解决我在这个问题中提到的问题的技巧

    因此,问题是:

    • 我在哪里可以找到一些关于Access报告和VBA的完整文档
    • 如何在access报告中创建页面,并选择要写入的页面
    • 有了这个问题,我是否会遇到任何我应该知道的瓶颈?我是否已经在考虑访问报告的替代方案(例如,写电子表格?)
    听起来您想要避免所有的虚拟文本框。

    关于:

    我找不到创建新页面的方法 在VBA的报告中,因此我 仅限于第一页

    您的解决方案#1似乎假设一个未绑定的报告

    我认为我应该做的是将交叉表的表单作为行源,这样您就可以有记录来生成页面,然后定义报表的控件,而不使用任何控件源(绑定到交叉表中始终存在的字段的控件除外)。然后,您可以在运行时根据特定列分配ControlSources。以下是从我正在使用的应用程序中获取的交叉表SQL:

      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