【问题标题】:MS Access Calc Field with combined fields具有组合字段的 MS Access Calc 字段
【发布时间】:2015-07-26 21:58:15
【问题描述】:

我一直在尝试解决这个 calc 字段问题大约 30 分钟,看起来我的表达式中的单个字段条件是正确的,例如 [points] 和 [contrib] 但组合的 ([points]+[contrib ]) 字段不满足将字段设置为正确成员类型的要求,因此当添加这些成员时,它会返回一些其他成员类型作为基本类型。我可以在添加字段的情况下使用 between 运算符吗...?我试过了,但有一些构图错误。所以换句话说,如果你得到 45 分,它会将你设置为 basic,只在 points 字段中命名,如果你的 contrib 为 45,你将在 calc 字段中设置为 basic,但如果它是 50 + 50,那么它是当它应该是“更好”的成员标签时设置为基本。否则,这个简单的陈述应该看起来是正确的,但是添加时计算机没有读取它。由于某种原因,它一定不能识别组合值,并且 calc 字段没有 sum() 函数。 重点在这里:(([points]+[Contrib]) >= 45 And ([points]+[Contrib])

IIf(([points] >=45 And [points]<100) Or ([Contrib] >=45 And [Contrib] <100) Or (([points]+[Contrib]) > = 45 And ([points]+[contrib] < 100),"Basic",
IIf(([points] >=100 And [points] <250) Or ([Contrib] >=100 And [Contrib] <250) Or ((([points]+[Contrib]) >=100) And (([points]+[Contrib])<250)),"Better",
IIf(([points] >=250 And [points]<500) Or ([Contrib] >=250 And [Contrib] <500) Or ((([points]+[Contrib]) >=250) And (([points]+[Contrib])<500)),"Great",
IIf(([points] >=500) Or ([Contrib] >=500) Or (([points]+[Contrib]) >=500),"Best","Non-member"))))

【问题讨论】:

  • 这很难理解,但有具体的错误信息吗?请注意,最后一个表达式(在“Focus here:”之后)是不等价的。之间包括在内,因此包括 44 和 100 (50+50)。
  • 虽然不是这个复杂的表达式,我会建立一个小表并查找成员状态。这应该是可能的,匹配点和 Contrib 位于特定边界之间的位置。
  • 请忽略使用中间的第一部分,那是一个实验。范围应该是 >= 45 到
  • 在最上面一行,([points]+[Contrib])多了一个括号。
  • 它属于表格,随着点数的输入而更新。过去的点和贡献没有按照给定点和贡献的总和更新到正确的标签级别。

标签: ms-access field ms-access-2013


【解决方案1】:

这是来自 Access 2010 表的数据样本,其中包含一个名为 member_type 的计算字段:

id points Contrib member_type
-- ------ ------- ----------
 1      1       1 Non-member
 2     50       1 Basic
 3    200       1 Better
 4    300       1 Great
 5    600       1 Best

如果这是您想要的计算字段,这里是我用于 member_type 的表达式:

IIf([points]+[Contrib]>=45 And [points]+[Contrib]<100,'Basic',IIf([points]+[Contrib]>=100 And [points]+[Contrib]<250,'Better',IIf([points]+[Contrib]>=250 And [points]+[Contrib]<500,'Great',IIf([points]+[Contrib]>=500,'Best','Non-member'))))

如果我没有完全正确,这里是相同的表达式格式,以便您可以更好地查看需要更改的位置:

IIf([points]+[Contrib]>=45 And [points]+[Contrib]<100,'Basic',
IIf([points]+[Contrib]>=100 And [points]+[Contrib]<250,'Better',
IIf([points]+[Contrib]>=250 And [points]+[Contrib]<500,'Great',
IIf([points]+[Contrib]>=500,'Best','Non-member'
))))

注意如果 pointsContrib 为 Null,member_type 将显示 "Non-member"。如果这不是您想要的行为,您将需要一个更复杂的表达式。由于计算字段表达式不能使用Nz(),因此您必须将IIf([points] Is Null,0,[points]) 替换为[points] 的每次出现,将IIf([Contrib] Is Null,0,[Contrib]) 替换为[Contrib]

为这些字段禁止 Null 会更简单(将它们的 Required 属性设置为 Yes)并将 Default Value 设置为零。

【讨论】:

  • 伟大的工作,但我们还没有完成。如果一个字段中有空值,它将不会添加,因此您需要执行我之前所做的操作,该字段的单独表达式肯定在某处混淆了它。
  • 我认为我的解决方案是做你所拥有的,但查询将空值填充为 0 以使其在添加时计算一些东西而不是什么。
【解决方案2】:

如果您正在测试的值 >= 或

如果您正在查看 50+50,那么总数 = 100,您介于 44 到 100 之间。这将导致答案为“基本”。将 ([points]+[Contrib]) 介于 44 和 100 之间)的范围更改为 ([points]+[Contrib]) 介于 44 和 99 之间)

【讨论】:

  • 是的,我试过了,但它不会读取代码......不知道为什么。可能是因为语法的混合?那应该没关系。
  • 我刚试过这个,它有效:zz: IIf((([points]+[Contrib])>=45) And (([points]+[contrib])
  • 你有没有试过评估另一个嵌套的来检查它会不会做?它不会评估单独的和组合的,所以我添加了这些。试试看它编译。也许某处有一个松散的括号会混淆这些步骤。
  • 我可能会尝试删除其他级别的成员,一次从一个开始,然后再次小心地嵌套这些......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多