预先感谢您的协助。我对 Access、SQL 和 VBA 的了解足以让自己陷入困境。这就是我想要做的。
我想创建一个从某一年开始的查询,然后列出每年直到今年。问题是我希望查询随着时间的推移自动更新。换句话说,假设开始年份是 2009 年,我希望我的查询列出 2009、2010、2011、2012 和 2013 年,因为我们目前处于 2013 年。明年,列表将扩大到包括 2014 年。我怀疑这一点可以在 SQL 中使用查询,但不确定如何正确编码。
预先感谢您的协助。我对 Access、SQL 和 VBA 的了解足以让自己陷入困境。这就是我想要做的。
我想创建一个从某一年开始的查询,然后列出每年直到今年。问题是我希望查询随着时间的推移自动更新。换句话说,假设开始年份是 2009 年,我希望我的查询列出 2009、2010、2011、2012 和 2013 年,因为我们目前处于 2013 年。明年,列表将扩大到包括 2014 年。我怀疑这一点可以在 SQL 中使用查询,但不确定如何正确编码。
所以我设法创建了一个查询条件来满足我的需要。
Like (Right(Year(Now()),2)-3) & "- " 或 Like (Right(Year(Now()),2)-2) & "- " 或 Like (Right(Year(Now( )),2)-1) & "- " 或者像 Right(Year(Now()),2) & "- "
谢谢大家的努力。
我敢打赌,这个简单的过程没有简单的解决方案。我们必须使用 VBA 来执行以下步骤:
CREATE Table tblTmpYears (
ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY,
Year Long
);
在 VBA 中:
Dim strSQL
strSQL = "CREATE Table tblTmpYears (" _
& " ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY," _
& " Year Long" _
& ");"
CurrentDb.Execute strSQL, dbFailOnError
INSERT INTO tblTmpYears (year) VALUES (2009);
INSERT INTO tblTmpYears (year) VALUES (2010);
INSERT INTO tblTmpYears (year) VALUES (2011);
INSERT INTO tblTmpYears (year) VALUES (2012);
INSERT INTO tblTmpYears (year) VALUES (2013);
在 VBA 中,有效期为 5 年,即使在我们生命存在 100 年后仍然有效:
Dim y as long, ymin, ymax, strSQL
ymax = Year(Date)
ymin = ymax - 4
For y = ymin to ymax
strSQL = "INSERT INTO tblTmpYears (Year) VALUES (" & y & ");"
CurrentDb.Execute strSQL, dbFailOnError
Next
SELECT * FROM tblStudents INNER JOIN tblTmpYears
ON tblStudents.Year=tblTmpYears.Year
ORDER BY Year;
在像这样的VBA中:
Dim qdf, strSQL
strSQL = "SELECT * FROM tblStudents INNER JOIN tblTmpYears" _
& " ON tblStudents.Year=tblTmpYears.Year" _
& " ORDER BY Year;"
Set qdf = CurrentDB.CreateQueryDef("qrySelTemporary", strSQL)
DoCmd.OpenQuery qdf.Name
在这里,您将拥有带有学生列表的查询数据表窗口,它是可打印的。更好的是,您可以将其用作
MyReport.RecordSource = "qrySelTemporary"
在带有精美演示文稿的访问报告中。
DROP TABLE tblTmpYears;
在 VBA 中:
Dim strSQL
strSQL = "DROP TABLE tblTmpYears;"
CurrentDb.Execute strSQL, dbFailOnError
只有 VBA 可以做到这一点……而不是单个 SQL 查询。
这个怎么样 - 一个小的 VBA 函数,它为适当的 UNION 查询输出 SQL,然后您可以将其分配为组合框的 RowSource,用作另一个动态生成的查询中的子查询,或其他任何东西:
Function CreateYearsToCurrentSQL(From As Integer) As String
Dim I As Integer, S As String
For I = From To Year(Date)
If I <> From Then S = S + "UNION "
S = S + "SELECT " & I & " AS Year FROM MSysObjects" + vbNewLine
Next I
CreateYearsToCurrentSQL = S
End Function
这FROM MSysObjects
是因为如果没有子句,Access 会抱怨没有FROM
子句,并且MSysObjects
必然是 Access 上下文中的现有表(如果您愿意,请将其替换为任何其他表的名称)。