Sql 以参数作为子窗体源对象显示交叉表查询

Sql 以参数作为子窗体源对象显示交叉表查询,sql,ms-access,crosstab,Sql,Ms Access,Crosstab,好的,请点击这里 我有一个交叉表,我们称之为“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

好的,请点击这里

我有一个交叉表,我们称之为“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];
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;
如上所述,它的源查询称为“TestQuery”,如下所示:

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];
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”,交叉表将失去对“参数”的需要,并正常显示为子窗体源对象。使用“参数”中的某些内容不允许显示交叉表

有什么办法可以解决这个问题吗?将源查询和交叉表合并成一个大怪物能解决这个问题吗


谢谢你的意见

据我所知,您不能在子窗体中引用带有参数的交叉选项卡。但是,您可以在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

 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

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

DoCmd.RunSQL ("SELECT * INTO CRTTable FROM CrosstabQ")
Forms!myForm!Subform.SourceObject = "table.CRTTable"
事先放下CRTTable
当交叉表查询中的列数不同时,可以使用该方法。

另一种方法是从交叉表中创建一个表,并将其用作源对象

DoCmd.RunSQL ("SELECT * INTO CRTTable FROM CrosstabQ")
Forms!myForm!Subform.SourceObject = "table.CRTTable"
事先放下CRTTable
在交叉表查询中,由于列数不同而起作用。

据我所知,问题在于参数语句。在VBA中为交叉表构建sql并显示结果,您感觉如何?这样,您就不需要参数,因为它将被写入sql。这听起来像是一个很好的解决方案。是否可以使用查询中的语法并将它们“移植”到VBA?因为表单控件“TextDaysPast”在表单的VBA中很容易访问,所以交叉表不需要参数,对吗?是的,只需将sql复制到VBA,注意引号并将引用附加到TextDaysPast:
WHERE Date()-“&Me.TextDaysPast&”…
保留查询并只更新sql:
CurrentDB.Querydefs(“MyXTab”).sql=sSQL
据我所知,问题在于参数语句。在VBA中为交叉表构建sql并显示结果,您感觉如何?这样,您就不需要参数,因为它将被写入sql。这听起来像是一个很好的解决方案。是否可以使用查询中的语法并将它们“移植”到VBA?因为表单控件“TextDaysPast”在表单的VBA中很容易访问,所以交叉表不需要参数,对吗?是的,只需将sql复制到VBA,注意引号并将引用附加到TextDaysPast:
WHERE Date()-“&Me.TextDaysPast&”…
保留查询并只更新sql:
CurrentDB.querydfs(“MyXTab”).sql=sSQL
好的,我将着手修改表单的VBA。将SQL放在它自己的函数/调用中,还是只放在使用它的地方(本例中是命令按钮),这是更好的做法?谢谢,我会随时通知你的!这在很大程度上取决于您正在执行的操作,您甚至可以将sql保留在查询中,保存sql字符串,使用新sql更新查询,然后将其设置回原来的状态。好的,在VBA中使用sql进行处理后,我只需使用“&Me.TextDaysPast&”动态修改我的源查询,工作原理与表单控件引用相同,只是现在交叉表不需要参数(Me.TextDaysPast必须作为静态引用传递)。美丽的!非常感谢你!好的,我将着手修改表单的VBA。将SQL放在它自己的函数/调用中,还是只放在使用它的地方(本例中是命令按钮),这是更好的做法?谢谢,我会随时通知你的!这在很大程度上取决于您正在执行的操作,您甚至可以将sql保留在查询中,保存sql字符串,使用新sql更新查询,然后将其设置回原来的状态。好的,在VBA中使用sql进行处理后,我只需使用“&Me.TextDaysPast&”动态修改我的源查询,工作原理与表单控件引用相同,只是现在交叉表不需要参数(Me.TextDaysPast必须作为静态引用传递)。美丽的!非常感谢你!