Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表达太复杂了?_Sql_Ms Access 2007 - Fatal编程技术网

Sql 表达太复杂了?

Sql 表达太复杂了?,sql,ms-access-2007,Sql,Ms Access 2007,我有一个运行下面SQL的报告。硬编码值时运行正常。但是,当我通过接受日期的表单提供值时,我会得到错误 此表达式键入错误,或太复杂而无法计算。例如,数值表达式可能包含太多复杂的元素。尝试通过将表达式的一部分指定给变量来简化表达式 此外,我还得到了工作日期的提示。我的方法有什么问题 SELECT Employees.EmployeeId, Employees.EmployeeName, TasksEntries.Project, TasksEntries.Task, SUM(TimeTracker.

我有一个运行下面SQL的报告。硬编码值时运行正常。但是,当我通过接受日期的表单提供值时,我会得到错误

此表达式键入错误,或太复杂而无法计算。例如,数值表达式可能包含太多复杂的元素。尝试通过将表达式的一部分指定给变量来简化表达式

此外,我还得到了工作日期的提示。我的方法有什么问题

SELECT Employees.EmployeeId, Employees.EmployeeName, TasksEntries.Project,
TasksEntries.Task, SUM(TimeTracker.WorkHours) AS TotalWorkHours
FROM Employees INNER JOIN (TasksEntries INNER JOIN TimeTracker ON  
(TasksEntries.EmployeeId=TimeTracker.EmployeeId) AND 
(TasksEntries.TaskID=TimeTracker.TaskId)) ON 
(Employees.EmployeeId=TimeTracker.EmployeeId) AND 
(Employees.EmployeeId=TasksEntries.EmployeeId)
 WHERE TimeTracker.WorkDate>="#" & Forms!frmManagerReport!txtMgrRptStartDate 
 & "#" And TimeTracker.WorkDate<="#" & 
 Forms!frmManagerReport!txtMgrRptEndDate & "#"
 GROUP BY Employees.EmployeeId, Employees.EmployeeName, 
 TasksEntries.Project, TasksEntries.Task;

我已经多年没有在Access工作了,但我希望这会有所帮助。1-错误表达式-在调试器执行之前,但在收集值之后,在调试器中捕获内置表达式。然后,您可以直接在Access中检查并运行构建的字符串。这样您可能会更好地看到错误。2-提示输入Workdate-可能是因为查询中没有它。它区分大小写吗?是表格!frmManagerReport!TXTMGRPTStartDate和表单!frmManagerReport!TxtMgrPtendDate是否已实际填写,是否为有效日期?

您已将所有加入条件组合在一起,这将不起作用

而是使用它们所属的联接对它们进行编码:

SELECT e.EmployeeId, e.EmployeeName, te.Project, te.Task, SUM(TimeTracker.WorkHours) AS TotalWorkHours
FROM Employees e
JOIN TasksEntries te ON te.EmployeeId = e.EmployeeId
JOIN TimeTracker tt ON tt.EmployeeId = e.EmployeeId
  AND te.TaskID = tt.TaskID
WHERE tt.WorkDate BETWEEN "#" & Forms!frmManagerReport!txtMgrRptStartDate & "#" AND "#" & Forms!frmManagerReport!txtMgrRptEndDate & "#"
GROUP BY e.EmployeeId, e.EmployeeName, te.Project, te.Task;

我还添加了表别名,并引入了中间值,以使查询更具可读性。

我能够解决的一件事是结果正确。查询不需要这些标志。但是我仍然会得到TimeTracker.Workdate的提示。