Access 2007嵌入式Iif语句

时间:2013-09-20 22:23:05

标签: ms-access ms-access-2007

使用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])));
  • 仅供参考 - 我继承了这张桌子,所以请不要因为它的设置方式而抨击我!

3 个答案:

答案 0 :(得分: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]
        )

答案 1 :(得分:1)

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

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

如果确实如此,根据@ HansUp的回答,您的查询将是一个简单的switch语句。*如果,那么事情会变得更有趣。我的方法是(并注意这只会在与查询相同的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约束。如果您需要更多信息,请告诉我。

答案 2 :(得分:0)

让我们评估一下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 ..