访问帮助以动态确定跨字段的记录日期更改

Posted

技术标签:

【中文标题】访问帮助以动态确定跨字段的记录日期更改【英文标题】:access help to dynamicaly determin a records date changes across fields 【发布时间】:2010-12-30 20:13:03 【问题描述】:

我有一个带有如下表的 MS 访问数据库,我试图找出确定每个缺陷 ID 记录的所有字段中日期更改的总次数所需的 sql。

另外,请注意,我每天都会在表格中添加一个字段,因此如果可以将其设为动态,那将是最好的。

当没有日期时,我希望结果显示 0(零)

谢谢大家

【问题讨论】:

每天向表中添加一个新字段是一种非常糟糕的设计方式。规范化不是最适合这种情况吗? 【参考方案1】:

这里肯定有标准化问题。

您应该考虑将日期移动到另一个表 - 可能类似于以下内容:

Retest Estimate
-----------------
defect_id
estimate_date
ready_date

【讨论】:

【参考方案2】:

您将数据库视为电子表格。最好在这些行上设置一个表格:

DefectID
TestDate
Est_ReadyForRetest

这意味着您每天都在添加记录,而不是字段。这也将使查询更容易。

【讨论】:

【参考方案3】:

我同意数据应该被规范化的建议,但是你在回答这个问题时遇到了一个不同的问题,我不确定你会如何在 SQL 中做到这一点(因为它基于记录顺序)。也就是说,你必须走一个记录集才能做到这一点。我想一个相关的子查询可以解决问题,但它必须基于可以订购的东西。

我的 SQL 技能并不出色,所以在摘要中我不会建议 SQL 解决方案,但也许其他人会。

相反,我将建议一个可以在原始非规范化数据结构中返回答案的函数。我将其基于我现有的 iMax() 函数,如下所示:

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID 
  '   rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    Dim i As Long
    Dim lngUBound As Long
    Dim v As Variant

    v = p(LBound(p))
    lngUBound = UBound(p)
    For i = LBound(p) + 1 To lngUBound
      If v < p(i) Then
         v = p(i)
      End If
    Next
    iMax = v
  End Function

这个想法是使用参数数组将值传递给函数,然后遍历数组以获取所需的信息。在这种情况下,您需要遍历数组并计算它更改的次数,如下所示:

  Public Function CountChange(ParamArray varInput()) As Long
    Dim varValue As Variant
    Dim varPrevious As Variant
    Dim lngCount As Long

    varPrevious = varInput(0)
    For Each varValue In varInput()
      If varValue <> varPrevious Then
         lngCount = lngCount + 1
      End If
      varPrevious = varValue
    Next varValue
    CountChange = lngCount
  End Function

我还没有对它进行过彻底的测试,它根本不处理 Null,但这就是想法 - 对于比较单行中的字段中的数据来说,这是一个非常有用的概念。

【讨论】:

以上是关于访问帮助以动态确定跨字段的记录日期更改的主要内容,如果未能解决你的问题,请参考以下文章

访问表单不显示所有数据

如何在 extjs 日期字段或日期选择器中访问更改月份事件

ms 根据先前记录的日期访问自动填充日期字段

如何要求用户确认对访问记录的编辑

访问:基于结束日期的下拉列表

在同一连接中跨函数调用访问数据