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 创建以下更新查询 运行 在 AfterUpdate
和 AfterInsert
数据宏中 table 或相同主要 table 形式的事件。
UPDATE maintableName INNER JOIN StrengthLookUp
ON maintableName.Strength = StrengthLookup.StrengthValue
SET maintableName.StrMod = StrengthLookUp.StrengthCategory
更新查询w/o查找TABLE
将 [StrMod] 的计算字段类型替换为常规数字字段,并在 AfterUpdate
和 AfterEvent
事件中简单地使用更新查询:
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 表单的 AfterInsert
和 AfterUpdate
事件中使用 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)。
显然,计算字段太复杂了。谁能建议一种更好的方法来完成我正在尝试做的事情?
目标:在强度字段中输入的值决定了计算字段中显示的值。在此先感谢您的帮助!
[强度]数字字段 [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 创建以下更新查询 运行 在 AfterUpdate
和 AfterInsert
数据宏中 table 或相同主要 table 形式的事件。
UPDATE maintableName INNER JOIN StrengthLookUp
ON maintableName.Strength = StrengthLookup.StrengthValue
SET maintableName.StrMod = StrengthLookUp.StrengthCategory
更新查询w/o查找TABLE
将 [StrMod] 的计算字段类型替换为常规数字字段,并在 AfterUpdate
和 AfterEvent
事件中简单地使用更新查询:
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 表单的 AfterInsert
和 AfterUpdate
事件中使用 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)。