【问题标题】:Displaying a Crosstab Query with a Parameter as Subform Source Object显示带有参数作为子表单源对象的交叉表查询
【发布时间】:2013-02-05 13:54:15
【问题描述】:

在这里可以访问 2010。

我有一个交叉表,我们称之为“TestCrosstab”,它有一个参数来访问它用作参考的查询中的表单控件。它看起来像这样:

PARAMETERS [Forms]![TestForm]![TextDaysPast] Short;
TRANSFORM max(val) AS MaxValue
SELECT col AS Criteria
FROM (SELECT [Date], 'Crosstab Column Name 0' as Col, [Query Column Name 0] as  val
  FROM TestQuery
  UNION ALL
  SELECT [Date], 'Crosstab Column Name 1' as Col, [Query Column Name 1] as  val
  FROM TestQuery
  UNION ALL
  '... etc ...
)
GROUP BY col
PIVOT [Date];

如上所示,它的源查询称为“TestQuery”,它看起来像这样:

SELECT SourceDatabase.Date, 
Count(*) AS [Query Column Name 0], 
Sum(IIf(Stuff=Stuff And Stuff=Stuff,1,0)) AS [Query Column Name 1], 
'... etc ...
FROM SourceDatabase INNER JOIN SecondDatabase ON SourceDatabase.ID = SecondDatabase.ID
WHERE (((SourceDatabase.Date) Between Date() And Date()-Forms!TestForm!TextDaysPast))
GROUP BY SourceDatabase.Date;

当用户在表单控件“TextDaysPast”中输入数字并且您在“弹出窗口”中手动运行查询时,它们都可以很好地工作。

我要做的是将上面的交叉表附加为子表单的源对象,纯粹用于显示目的。在 VBA 中,当用户在“TextDaysPast”中输入一个数字后,会调用这一行来将交叉表附加到子表单:

Me.SubformDisplay.SourceObject = "Query.TestCrosstab"
Me.SubformDisplay.Requery

在“TextDaysPast”中输入一个数字并使用命令按钮执行查询后,表单似乎可以正常工作(没有错误),但不会显示交叉表。如果我将源查询更改为静态“WHERE”,则交叉表将不再需要“PARAMETERS”,并正常显示为子表单源对象。使用“PARAMETERS”的某些东西不允许显示交叉表。

关于如何解决这个问题的任何想法?将源查询和交叉表组合成一个大怪物可以解决这个问题吗?

感谢您的意见!

【问题讨论】:

  • 据我所知,问题出在参数语句上。您对在 VBA 中为交叉表构建 sql 并显示结果有何感想?这样,您将不需要参数,因为它将被写入 sql。
  • 这听起来像是一个很好的解决方案。是否可以使用我在查询中的语法并将它们“移植”到 VBA?因为表单控件“TextDaysPast”在表单的 VBA 中很容易访问,所以交叉表不需要 PARAMETER,对吗?
  • 是的,只需将 sql 复制到 vba,注意引号并将引用附加到 TextDaysPast:WHERE Date()-" & Me.TextDaysPast & "... 保留查询并更新 sql:CurrentDB.Querydefs("MyXTab").SQL=sSQL

标签: sql ms-access crosstab


【解决方案1】:

据我所知,您不能在子表单中引用带有参数的交叉表。但是,您可以在 VBA 中构建查询,这样就不需要参数并更新子表单引用的交叉表查询的 sql。

 sSQL="TRANSFORM Sum(Table1.ANumber) AS SumOfANumber " _
     & "SELECT Table1.AText FROM Table1 " _
     & "WHERE Table1.AText='" & Me.txtText & "' " _
     & "GROUP BY Table1.AText PIVOT Table1.AText2"

''Permanently change the sql for MyXtab
CurrentDB.Querydefs("MyXtab").SQL=sSQL
Me.MySubformControlName.Requery

【讨论】:

  • 好的,我开始修改表单的 VBA。将 SQL 放在它自己的函数/调用中还是将它放在使用它的地方(在这种情况下是命令按钮)是更好的做法吗?谢谢,我会及时通知你的!
  • 这在很大程度上取决于您在做什么,您甚至可以将 sql 保留在查询中,保存 sql 字符串,使用新 sql 更新查询,然后将其重新设置。
  • 好的,在 VBA 中使用 SQL 工具后,我刚刚使用 '" & Me.TextDaysPast & "' 即时修改了我的源查询,除了现在之外,它的工作方式与表单控件引用相同交叉表不需要参数( Me.TextDaysPast 必须作为静态引用传递)。美丽的!非常感谢!
【解决方案2】:

另一种方法是从交叉表创建一个表并将其用作 SourceObject

DoCmd.RunSQL ("SELECT * INTO CRTTable FROM CrosstabQ")
Forms!myForm!Subform.SourceObject = "table.CRTTable"

预先删除 CRTTable 随着交叉表查询中的列数不同而起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2010-11-11
    • 2021-11-11
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多