MS Access 2007/2010:需要根据最近的5个其他日期字段设置日期字段

时间:2014-03-04 02:08:34

标签: ms-access expression

我似乎有一个问题,我之前没有遇到过同一条记录。我需要根据5个其他日期字段的最近日期设置日期字段值。我想在查询级别执行此操作,以便我可以分配最近的日期并将其存储在字段中,但我不确定它是否可行。如果我必须在表单中执行它,那么我不确定如何写出Case语句。任何帮助表示赞赏!

我现在要做的是写一个表达式,其内容大致如下:

ESA Exp Date: IIf([1-Record Search Date]>[2-Site Reconnaissance Date] And [1-Record Search Date]>[3-Owner Interview Date] And [1-Record Search Date]>[4-Lien/AUL Search Date] And [1-Record Search Date]>[5-User Questionnaire Date],[1-Record Search Date],IIf([2-Site Reconnaissance Date]>[1-Record Search Date] 

等等......但是,表达式有字符限制,所以有人在一个不相关的问题中写了一个函数。我不知道在我的情况下这会怎么样。

再次感谢 罗布

2 个答案:

答案 0 :(得分:2)

这看起来如此困难的原因是因为您的表结构不是关系查询的最佳选择。假设您当前的表格(date_values)包含d1d5列,所有日期。你需要像这样规范化表(请注意,这不会改变你的实际表,它只是'将它重新打包'在内存中变成一个更易于查询的形式):

select entity_id, 'type 1' as date_type, d1 as date_value
from date_values
where d1 is not null
union all
select entity_id, 'type 2' as date_type, d2 as date_value
from date_values
where d2 is not null
union all
select entity_id, 'type 3' as date_type, d3 as date_value
from date_values
where d3 is not null
union all
select entity_id, 'type 4' as date_type, d4 as date_value
from date_values
where d4 is not null
union all
select entity_id, 'type 5' as date_type, d5 as date_value
from date_values
where d5 is not null

请注意,entity_id是唯一标识表中行的字段。一旦您获得标准化形式的数据,查询就很容易:*

update date_values as d
inner join (
  select ssq.entity_id, max(ssq.date_value) as max_date
  from (
    ... the query I show above ...
  ) as ssq
  group by ssq.entity_id
) as sq
on d.entity_id = sq.entity_id
set d.[ESA Exp Date] = sq.max_date
where entity_id = [... the entity you wish to update ...]

上面的最后一个句子where子句将修改限制为您可以指定的单个行。您可以在Access提示时手动输入它,也可以让它引用表单中的字段。有很多选择。

*好的,easi_er _。

答案 1 :(得分:2)

如果无法更改您的表格结构,那么您可以使用类似Allen Browne http://allenbrowne.com/func-09.html创建的函数的功能,网页上有更全面的说明。

在查询中将其称为:(我建议不要在不需要时添加空格,这将有助于在VBA中进一步下线)

ESAExpDate: MaxOfList([1-Record Search Date],_
[2-Site Reconnaissance Date],[3-Owner Interview Date],[4-Lien/AUL Search Date], _
[5-User Questionnaire Date])

如果链接死亡,我已粘贴到下面。

Function MaxOfList(ParamArray varValues()) As Variant
    Dim i As Integer        'Loop controller.
    Dim varMax As Variant   'Largest value found so far.

    varMax = Null           'Initialize to null

    For i = LBound(varValues) To UBound(varValues)
        If IsNumeric(varValues(i)) Or IsDate(varValues(i)) Then
            If varMax >= varValues(i) Then
                'do nothing
            Else
                varMax = varValues(i)
            End If
        End If
    Next

    MaxOfList = varMax
End Function