Access 2013计算字段过于复杂

时间:2015-06-13 17:55:24

标签: ms-access ms-access-2013

显然,计算字段是复杂的方法。谁能建议一个更好的方法来完成我想要做的事情?

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

[强度]数字字段 [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)

2 个答案:

答案 0 :(得分:1)

以下是一些使用非计算数据字段类型的建议。

更新查询w / LOOKUP表

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

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

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

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

更新查询没有查看表

将计算的字段类型替换为[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))))))))))))))))

VBA LOGIC

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

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 Server, MySQL的)。

答案 1 :(得分:0)

我无法检查,但你会明白这个想法:

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

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

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

但是如果记录不时添加到表中,您还需要运行更新。