带有WHERE子句的SQL语句中的LookupRecord不起作用

时间:2015-03-26 17:31:34

标签: sql database macros

背景
我正在创建一个数据库来跟踪实验室样本。我希望制定一项限制措施,防止技术人员报告同一样本的多个结果。

当前策略
我的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吗?感谢您的投入。

2 个答案:

答案 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