【问题标题】:Access 2007 embedded Iif statementAccess 2007 嵌入式 Iif 语句
【发布时间】:2013-09-20 22:23:05
【问题描述】:

使用 Access 2007 我的表有 9 列。我需要使用 4 列来根据其他 3 列中的日期选择一个值。简而言之,我需要在最后一列(Current_Cost)中显示最新的成本。我尝试了几个嵌入式 Iif 语句无济于事。我不知道我是否已经看这个太久了,我只是没有看到我的错误,或者我是否偏离了基础。

表格中的列:

  • 项目编号
  • 原价
  • 原始日期
  • 成本 1
  • 日期 1
  • 成本 2
  • 日期 2
  • 成本 3
  • 日期 3
UPDATE MyTable 
SET Current_Cost =
    IIf([MyTable]![DATE3]>[MyTable]![DATE 2],[MyTable]![COST 3],
    IIf([MyTable]![DATE2]>[MyTable]![DATE 1],[MyTable]![COST 2],
    IIf([MyTable]![DATE1]>[MyTable]![ORIGINAL DATE],[MyTable]![COST 1],
    [MyTable]![ORIGINAL COST])));
  • 仅供参考 - 我继承了这张桌子,所以请不要因为它的设置方式而抨击我!

【问题讨论】:

  • 如果您觉得答案充分回答了您的问题,请记住将其标记为已接受 :-)

标签: ms-access ms-access-2007


【解决方案1】:

我认为Switch 比一堆嵌套的IIf 表达式更容易管理。

首先尝试一个SELECT 查询来计算Switch 逻辑。我认为这接近您的目标:

SELECT
    Switch
        (
            [DATE 3]>[DATE 2], [COST 3],
            [DATE 2]>[DATE 1], [COST 2],
            [DATE 1]>[ORIGINAL DATE], [COST 1],
            True, [ORIGINAL COST]
        ) AS test_expression,
    *
FROM MyTable;

拥有正确的Switch 表达式后,您可以在UPDATE 中使用它。

UDATE MyTable
SET Current_Cost =
    Switch
        (
            [DATE 3]>[DATE 2], [COST 3],
            [DATE 2]>[DATE 1], [COST 2],
            [DATE 1]>[ORIGINAL DATE], [COST 1],
            True, [ORIGINAL COST]
        )

【讨论】:

  • 感谢您的帮助。我实际上使用了 Switch,它运行良好。最重要的是,我与从未使用过 Switch 的同事分享了这一点。感谢您的帮助!
【解决方案2】:

有趣的问题,因为有多个日期。首先:您能否保证以下语句始终适用于您的表:

[ORIGINAL DATE] <= [DATE1] <= [DATE2] <= [DATE3]

如果是这样,您的查询将是一个简单的switch 语句,根据@HansUp 的回答。* 如果它不是,那么事情会变得更有趣。我的方法是(请注意,这只能在与查询相同的 Access 数据库文件中工作)定义一个 VBA 函数,该函数接受两个值并返回它们的最大值,我们称之为Max2,然后使用此函数查找表中每一行的最新日期,然后选择与该日期对应的成本:

update MyTable
set Current_Cost = switch(
  DATE3 = Max2(Max2(Max2([ORIGINAL DATE], DATE1), DATE2), DATE3), [COST 3]
, DATE2 = Max2(Max2(Max2([ORIGINAL DATE], DATE1), DATE2), DATE3), [COST 2]
, DATE1 = Max2(Max2(Max2([ORIGINAL DATE], DATE1), DATE2), DATE3), [COST 1]
, true, [ORIGINAL COST]
)

Max2 VBA 函数(可以在任何模块中定义):

public sub Max2(v1 as variant, v2 as variant) as variant
  if v1 < v2 then
    Max2 = v2
  else
    Max2 = v1
  end if
end sub

顺便说一句,为什么是Max2 而不仅仅是Max4?可重用性。您可以在许多不同的地方使用这样的功能。

* 你可以用一个简单的 SQL 查询来检查。您还可以将此日期顺序强制为 Access 中的表 check 约束。如果您需要更多信息,请告诉我。

【讨论】:

  • 我确信日期会增加......这次。但由于我们将再次使用此代码,情况可能并非如此。如果权力允许的话,我希望我能够将表格修改为更有用的东西。但如果不是,从长远来看,您的方法会更好。
  • 当然。请记住,您可以在 Access 中创建一个表约束来强制执行此递增日期规则。类似alter table MyTable add constraint MyTable_DatesMustIncrease check ([ORIGINAL DATE] &lt;= DATE1 and DATE1 &lt;= DATE2 and DATE2 &lt;= DATE3)。但是你只能通过 DAO Execute 方法来做到这一点,例如CurrentProject.Connection.Execute.
  • 非常感谢您的帮助!
【解决方案3】:

让我们评估一下 IIF 的作用:

IIF(SOME_CHECK,true_condition,false_condition)

查看您的代码,我们看到: 如果

[MyTable]![DATE3]>[MyTable]![DATE 2]

然后将 Current_cost 设置为:

[MyTable]![COST 3]

否则继续下一个检查.. 如果

[MyTable]![DATE2]>[MyTable]![DATE 1]

然后将 Current_cost 设置为:

[MyTable]![COST 2]

否则继续下一个检查.. 如果

[MyTable]![DATE1]>[MyTable]![ORIGINAL DATE]

然后将 Current_cost 设置为:

[MyTable]![COST 1]

其他设置为

 [MyTable]![ORIGINAL COST]

那么,这就是你要找的吗?

如果不是,您可能需要颠倒您的逻辑。而不是成本 3、成本 2、成本 1,然后更改为成本 1、成本 2 和成本 3..

【讨论】:

  • 是的,我明白你在说什么。谢谢。我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多