访问帮助以动态确定跨字段的记录日期更改
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,但这就是想法 - 对于比较单行中的字段中的数据来说,这是一个非常有用的概念。
【讨论】:
以上是关于访问帮助以动态确定跨字段的记录日期更改的主要内容,如果未能解决你的问题,请参考以下文章