0

预先感谢您的协助。我对 Access、SQL 和 VBA 的了解足以让自己陷入困境。这就是我想要做的。

我想创建一个从某一年开始的查询,然后列出每年直到今年。问题是我希望查询随着时间的推移自动更新。换句话说,假设开始年份是 2009 年,我希望我的查询列出 2009、2010、2011、2012 和 2013 年,因为我们目前处于 2013 年。明年,列表将扩大到包括 2014 年。我怀疑这一点可以在 SQL 中使用查询,但不确定如何正确编码。

4

3 回答 3

0

所以我设法创建了一个查询条件来满足我的需要。

Like (Right(Year(Now()),2)-3) & "- " 或 Like (Right(Year(Now()),2)-2) & "- " 或 Like (Right(Year(Now( )),2)-1) & "- " 或者像 Right(Year(Now()),2) & "- "

谢谢大家的努力。

于 2013-10-29T21:38:52.783 回答
0

我敢打赌,这个简单的过程没有简单的解决方案。我们必须使用 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 查询。

于 2013-10-17T21:06:32.210 回答
0

这个怎么样 - 一个小的 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 上下文中的现有表(如果您愿意,请将其替换为任何其他表的名称)。

于 2013-10-17T23:11:44.653 回答