访问 - 条件声明

时间:2017-06-08 23:31:08

标签: ms-access if-statement

来自excel世界,如何创建条件语句以根据另一个字段的值填充一个字段,这在excel中看起来像:

=if(A1="A","Yes","No")

谢谢

编辑:

好的,我已经完成了以下工作:

=IIF([FundingStream]="A", "N/A", "Student Finance")

但我有错误: 无效的SQL语法 - 不能在列级CHECK约束中使用多个列

我在N / A或学生财务应出现的字段属性的验证规则中输入此表达式。

编辑2:

我按照以下建议完成了。当我输入FundingStream时,它根本不会改变LoanCRN字段。请参见下面的截图: enter image description here

1 个答案:

答案 0 :(得分:3)

虽然它们可以用于某些相同的目的,但关系数据库系统需要不同的范例。与电子表格相比,基于另一个设置一个列值的简单想法实际上相当复杂。如果您尝试按字面意思转换电子表格,则只会面临持续的挫败感。

验证规则中的以下语句是不是赋值,而是一个布尔比较操作:它返回true或false。它约束可以保存到数据库的值,但不会更改列值。

[Field1] = Iif([FundingStream]="A", "N/A", "Student Finance")

作为进一步的注释,一些语言有两个不同的符号用于赋值和比较,例如:=用于赋值,==用于相等比较。但是许多语言(如VBA)根据上下文解释单个=。如果你理解了这种差异,那么上下文通常会变得明显,在特定情况下等号意味着什么。

根据另一个字段更改一个字段的值需要其他技术。任何代码或宏驱动环境(如Access)的灵活性提供了各种方法,这些都不能在此概述。然而,最令人浮现的两个问题是:

表单模块中的VBA代码

可能最直接的方法是在AfterUpdate事件中:

Private Sub FundingStream_AfterUpdate()
    If Me.FundingStream = "A" Then
        Me.LoanCRN = "N/A"
    Else
        Me.LoanCRN = "Student Finance"
    End If
End Sub

这假设您的表单至少有两个控件:FundingStream和LoanCRN。这将做你想要的......最初。但是,现在您需要考虑用户是否也可以直接更新LoanCRN。如果他们永远不应该直接更新LoanCRN,你可以1)设置控件属性Locked = True,或2)隐藏表单上的控件,以便用户甚至看不到它,或者3)消除实际控制和只是直接引用记录源列属性,如Me![LoanCRN]。任何这些技术的更多细节都超出了这个问题。

但这不是全部!您需要考虑适当的默认值。如果用户从未真正更改过FundingStream控件会发生什么?那么你的代码永远不会运行,所以LoanCRN可能没有正确设置。最后,您可能需要在表单的其他位置使用其他代码,例如:在Form_AfterUpdate(),Form_Current等

这种方法的好处在于,您可以灵活地使用数据输入表单来精确调整数据的流动方式。困难在于避免表单上的缺失和冲突行为。这种技术最终需要适当使用表和列约束(即验证规则和索引)以及熟悉表单和控制事件。

这也适用于特定形式。如果您有其他表单或VBA代码更改FundingStream值,您还需要在所有这些位置添加相同的代码,以确保LoanCRN值始终有效。

更改数据宏之前

在表上定义Before Change宏以更新值。使用IfSetField宏操作根据FundingStream设置LoanCRM。

从幼稚的角度来看,这实际上是最直接,最简单的方法。无论是在表单上还是在VBA代码中更新数据宏,都会在每次保存记录时自动调用

这也有许多限制,并且不允许添加许多动态条件的灵活性,尤其是数据输入时出现的条件。 如果宏逻辑不健壮,可能会导致不必要的错误,从而无法保存整个数据集。