使用参数作为子表单源对象显示交叉表查询

时间:2013-02-20 14:13:58

标签: sql ms-access crosstab

Ok Access 2010 here。

我有一个交叉表,我们称之为“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”的东西不允许显示交叉表。

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

感谢您的投入!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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