在Query中使用SQL自动更新

时间:2013-10-17 20:37:59

标签: ms-access ms-access-2007

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

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

3 个答案:

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

在具有精美演示文稿的Access报告中。

打印后删除临时表,例如:

DROP TABLE tblTmpYears;

在VBA中:

Dim strSQL
strSQL = "DROP TABLE tblTmpYears;"
CurrentDb.Execute strSQL, dbFailOnError

只有VBA才能完成此任务...而不是单个SQL查询。

答案 1 :(得分:0)

这个怎么样 - 为适当的UNION查询输出SQL的小型VBA函数,然后可以将其指定为组合框的RowSource,用作另一个动态生成的查询中的子查询,或者其他: / p>

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是因为如果不存在FROM子句,Access会发出无关MSysObjects子句,并且{{1}}必然是Access上下文中的现有表(如果您愿意的话)但是,将其替换为任何其他表的名称。)

答案 2 :(得分:0)

所以我设法创建了一个可以满足我需要的查询标准。

喜欢(右(年(现在()),2)-3)&amp; “ - ”或喜欢(右(年(现在()),2)-2)&amp; “ - ”或喜欢(右(年(现在()),2)-1)&amp; “ - ”或喜欢正确(年(现在()),2)&amp; “ -

感谢大家的努力。