Access 2013计算字段太复杂

Access 2013 calculated field too complex

显然,计算字段太复杂了。谁能建议一种更好的方法来完成我正在尝试做的事情?

目标:在强度字段中输入的值决定了计算字段中显示的值。在此先感谢您的帮助!

[强度]数字字段 [StrMod] 计算字段

下面是我尝试构建以支持 [StrMod] 计算字段的表达式。

IIf([Strength]=1,-5,
IIf([Strength]>=2 And [Strength]<=3,-4,
IIf([Strength]>=4 And [Strength]<=5,-3,
IIf([Strength]>=6 And [Strength]<=7,-2,
IIf([Strength]>=8 And [Strength]<=9,-1,
IIf([Strength]>=10 And [Strength]<=11,0,
IIf([Strength]>=12 And [Strength]<=13,1,
IIf([Strength]>=14 And [Strength]<=15,2,
IIf([Strength]>=16 And [Strength]<=17,3,
IIf([Strength]>=18 And [Strength]<=19,4,
IIf([Strength]>=20 And [Strength]<=21,5,
IIf([Strength]>=22 And [Strength]<=23,6,
IIf([Strength]>=24 And [Strength]<=25,7,
IIf([Strength]>=26 And [Strength]<=27,8,
IIf([Strength]>=28 And [Strength]<=29,9,
IIf([Strength]=30,10,Null)

我无法检查,但你会明白的:

iif(strength/2 >= 15, null, -5 + INT(strength/2))

您想简化还是复杂化?如果您只想更新 table 一次,那么您不需要任何查找 tables...

update table 
set StrMode = iif(strength/2 >= 15, null, -5 + INT(strength/2))

但如果不时将记录添加到 table,您也需要 运行 更新。

这里有一些建议都使用非计算数据字段类型。

通过查找更新查询 TABLE

将 [StrMod] 的计算字段类型替换为常规数字字段。创建强度查找 table:

StrengthValue  | StrengthCategory 
1                 -5 
2                 -4 
3                 -4
4                 -3  
5                 -3
6                 -2
...               ...

然后使用此 table 创建以下更新查询 运行 在 AfterUpdateAfterInsert 数据宏中 table 或相同主要 table 形式的事件。

UPDATE maintableName INNER JOIN StrengthLookUp 
       ON maintableName.Strength = StrengthLookup.StrengthValue 
SET maintableName.StrMod = StrengthLookUp.StrengthCategory

更新查询w/o查找TABLE

将 [StrMod] 的计算字段类型替换为常规数字字段,并在 AfterUpdateAfterEvent 事件中简单地使用更新查询:

UPDATE maintableName 
SET maintableName.StrMod =    
    IIf([Strength]=1,-5,
    IIf([Strength]>=2 And [Strength]<=3,-4,
    IIf([Strength]>=4 And [Strength]<=5,-3,
    IIf([Strength]>=6 And [Strength]<=7,-2,
    IIf([Strength]>=8 And [Strength]<=9,-1,
    IIf([Strength]>=10 And [Strength]<=11,0,
    IIf([Strength]>=12 And [Strength]<=13,1,
    IIf([Strength]>=14 And [Strength]<=15,2,
    IIf([Strength]>=16 And [Strength]<=17,3,
    IIf([Strength]>=18 And [Strength]<=19,4,
    IIf([Strength]>=20 And [Strength]<=21,5,
    IIf([Strength]>=22 And [Strength]<=23,6,
    IIf([Strength]>=24 And [Strength]<=25,7,
    IIf([Strength]>=26 And [Strength]<=27,8,
    IIf([Strength]>=28 And [Strength]<=29,9,
    IIf([Strength]=30,10,Null))))))))))))))))

VB一个逻辑

将 [StrMod] 的计算字段类型替换为常规数字字段。然后,在主 table 表单的 AfterInsertAfterUpdate 事件中使用 SELECT CASE 语句:

SELECT CASE Me.Strength

    Case 1
    Me.StrMod = -5

    Case 2 To 3
    Me.StrMod = -4

    Case 4 To 5
    Me.StrMod = -3

    Case 6 To 7
    Me.StrMod = -3

    Case 8 To 9
    Me.StrMod = -1

    Case 10 To 11
    Me.StrMod = 0

    Case 12 To 13
    Me.StrMod = 1

    ...

END SELECT

严格来说是我的偏好,但我从不使用计算字段以考虑数据库兼容性(即 MS Access 2007 accdb 用户)和使用编程语言(PHP、Python、VB ODBC 连接)和其他 RDMS(SQL 服务器,MySQL)。