背景
我正在创建一个数据库来跟踪实验室样本。我希望制定一项限制措施,防止技术人员报告同一样本的多个结果。
当前策略
我的qselReport查询列出了所有报告的样本。
SELECT tblResult.strSampleName, tblResult.ysnReport FROM tblResult WHERE (((tblResult.ysnReport)=True));
当技术人员希望报告给定样本的结果时,我使用Before Change Event在qselReport中检查该样本(下面的代码块是我的事件宏N.B.它不是VBA)。
If Updated("ysnReport") And Old.[ysnReport]=False Then
Look Up A Record In qselReport
Where Condition = [strSampleName]=[tblResult].[strSampleName]
Alias
RaiseError
Error Number 1
Error Description This sample is already being reported.
End If
一切都很好,花花公子。如果选择第二个结果来报告样本,则会弹出错误消息。
问题
我喜欢让事情尽可能保持光滑,所以我不想要qselReport,除非它绝对必要。所以我对LookupRecord块稍作调整,以便它在SQL语句而不是查询上运行。这看起来像什么(再次N.B.不是VBA,只是一个宏):
If Updated("ysnReport") And Old.[ysnReport]=False Then
Look Up A Record In SELECT tblResult.strSampleName, tblResult.ysnReport FROM tblResult WHERE [tblResult].[ysnReport]=True;
Where Condition = [strSampleName]=[tblResult].[strSampleName]
Alias
RaiseError
Error Number 1
Error Description This sample is already being reported.
End If
现在每次报告结果时都会收到错误消息,即使它是该样本的第一个实例。据我所知,问题是SQL语句WHERE子句不会将记录过滤到只有ysnReport = True的记录。
任何人都可以解释为什么我可以在查询中执行LookupRecord但不能在相同的SQL语句中执行LookupRecord吗?感谢您的投入。
答案 0 :(得分:0)
如果你希望事情尽可能顺畅,至少在性能方面,存储的查询原则上应该优于动态SQL。
语法方面,我不熟悉宏构造,但是如果它接受它们并且还添加了显式别名,我会考虑将select语句括在括号中。我怀疑在你的WHERE条件中需要引用别名:
Where Condition = MySelect.[strSampleName]=[tblResult].[strSampleName]
Alias MySelect
答案 1 :(得分:0)
我找到了解决问题的方法。需要将SQL语句where子句移动到LookupRecord数据块Where条件。这有效:
If Updated("ysnReport") And Old.[ysnReport]=False Then
Look Up A Record In SELECT tblResult.strSampleName, tblResult.ysnReport FROM tblResult;
Where Condition = [ysnReport]=True And [strSampleName]=[tblResult].[strSampleName]
Alias
RaiseError
Error Number 1
Error Description This sample is already being reported.
End If