我正在使用带有Sharepoint列表的Microsoft Access 2013,我有两个表:
=>有很多学生有不同的开始日期
=>在每个学生的学习时间里,他们可能会有一些“休假”,这些都没有计入他们学习的总周数中。
我正在创建一个查询来计算学生从Start_Date
开始学习的周数。
SELECT
students.ID,
students.[Full name],
students.Mobile,
students.Start_Date,
Round((Date()-students.[Start_Date])/7,0) -
( SELECT SUM(
IIF( [Weeks Off].[From Date]> students.[Start_Date] and [Weeks Off].[From Date]<Date(),
[Weeks Off].[Number of Weeks], 0 )
)
FROM [Weeks Off]
) AS [Studied Weeks],
FROM students;
现在的问题是,即使查询成功显示所有学生显示其“已学习周”的列,Recordset也不可更新。
如何让它再次更新?
来自评论:
我将其改为:
(Round( ( Date()- students.Start_Date)/7,0) -
DSum("[Number of Weeks]", "[Weeks Off]",
"[From Date]>= students.Start_Date And [From Date]<= Date()")
) AS [Studied Weeks]
但是它说:微软找不到名字student.Start_Date你在表达式中输入了。所以我仍然被困在这里。
答案 0 :(得分:2)
请参阅:Dealing with Non-Updateable Microsoft Access Queries和Allen Browne: Why is my query read-only?
来自后者:
它在SELECT子句中使用First(),Sum(),Max(),Count()等。聚合记录的查询是只读的。
如果您将计算放入单独的查询并将其(在Student.ID上)加入Students表,它可能会有效。
如果将SUM计算转换为DSum()
表达式,它将起作用(但可能会更慢)。然后只有该列才是只读的。
修改强>
students.Start_Date
是DSum
调用中的变量,因此它必须位于条件中的常量字符串之外。
使用Gustav的CSql()
function格式化日期并将其与其余日期连接起来。
(Round( ( Date()- students.Start_Date)/7,0) -
DSum("[Number of Weeks]", "[Weeks Off]",
"[From Date]>=" & CSql(students.Start_Date) & " And [From Date]<= Date()")
) AS [Studied Weeks]
应该这样做。