我在MS访问中有一个包含多个字段的表。这些字段的字段名称代表时间段,例如2011_2,2011_3,...,2013_9,2013_10,...,2015_1,2015_2 ......
如何根据今天的日期运行选择接下来12个月作为所需字段的查询?即,如果今天是2013年12月22日,它会选择字段:2013_12,2014_1,2014_2,...,2014_12?
非常感谢。
答案 0 :(得分:1)
如果在Access中有一个带有按钮的表单,则可以在代码中以字符串形式创建SQL语句,例如:
MyString = "SELECT " & Year(Now) & "_9" & " FROM myTable....."
然后您可以通过代码执行它。
您将无法创建动态构建要选择的字段列表的“标准”查询。
答案 1 :(得分:1)
您的问题的简短回答是,您无法在“访问查询”构建器中拥有动态字段名称。理想情况下,您应该修改数据,以便有一个日期字段。这样,您就可以在查询条件中为该字段指定不需要下面体操的日期范围。
如果这不可能,那么很长的答案是您需要使用VBA代码来构建查询。下面的代码应该在您的数据库中创建一个新查询(巧妙地称为" YourQuery"),它将包含您需要的字段。
由于我不知道你的桌子叫什么,所以它会是" table"在这个例子中。如果您使用此代码,则应将其更改为您的表格。
您需要在数据库的VBA模块中安装此代码,然后设计一些调用该函数的方法来生成新查询。例如,您可以使用" RunCode"创建一个宏。使用" DynamicQuery()"的动作作为运行的程序。请注意,如果本月的查询已经存在,则函数调用将失败,因此如果由于某种原因需要再次运行它,请手动删除(您还可以添加其他代码来实现此功能)。
同样,仅仅因为你可以做某事并不意味着你应该这样做。你真的应该重新设计你的桌子,这样你就不必采用这样的解决方法。
Public Function DynamicQuery()
Dim strSQL As String
dim datFieldDate As Date
Dim strYearMonth As String
Dim strThisMonth As String
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim i As Integer
Set dbs = CurrentDb
strThisMonth = Year(Date) & "_" & Month(Date)
strSQL = "SELECT table." & strThisMonth
For i = 1 to 12
datFieldDate = DateAdd("m",i,Date)
strYearMonth = Year(datFieldDate) & "_" & Month(DatFieldDate)
strSQL = strSQL & ", table." & strYearMonth
Next i
strSQL = strSQL & " FROM table;"
Set qdf = dbs.CreateQueryDef("YourQuery_" & strThisMonth, strSQL)
Set qdf = Nothing
Set dbs = Nothing
End Function