2

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

3 回答 3

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]
        )
于 2013-09-20T22:47:55.977 回答
1

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

[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]
)

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

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 查询进行检查。您还可以将此日期顺序强制为checkAccess 中的表约束。如果您需要更多信息,请告诉我。

于 2013-09-20T23:31:18.187 回答
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。

于 2013-09-20T22:52:02.493 回答