我是使用Access的新手,并且不知道它能够使用的许多功能,所以我的问题可能不是最清楚的,但是这里有...
我正在尝试设计一个数据库来统计监控输入的值。即我有一个数据输入表格,控制图表和表格都包含数字字段。
我想要的一个功能是它能够标记数据中的趋势。 例如:如果某个字段中的最后5个值向上趋势(最后一个值高于之前的值,高于之前的值,更高等等)或向下,那么我希望出现一个彩色文本框(或某事)。
我有一个想法,我知道如何在Excel中执行此操作:我将引用特定值(单元格)并具有以下代码:
If .Cells(iRow, 1).Value > .Cells(iRow - 1, 1)
And .Cells(iRow - 1, 1).Value > .Cells(iRow - 2, 1) etc etc Then
Sheets("Box1").Range("AA15").Interior.ColorIndex = 44
Trends = "3 consecutive points increasing"
我对Access的运作方式并不是很了解,但我似乎只能编写一个查询来选择输入的最新5条记录......然后我就被卡住了!
有没有办法在SQL中编写可以执行此操作的内容?谁能给我一些建议!或者让我指出一些可以实现这一目标的技术方向?
感谢。
我正在使用的数据表中列出了字段:ID,批处理,日期,字段4,字段5,字段6.
所有都是数字。
我想知道Field 4,5,6和7的最后5条记录是否有趋势。
Cross发布于:http://www.access-programmers.co.uk/forums/showthread.php?p=1421356#post1421356
答案 0 :(得分:0)
一种可能的解决方案是使用运行计数。这是使用嵌套的subquery完成的,其中源表与自身进行比较(注意不同的别名 - t1
和t2
)。
但是,它实际上取决于您想要如何连续排序字段。下面,我假设您希望按订购日期查找每个ID的增加字段值。或者,您可以比较批次日期。
SELECT t1.ID, t1.[Date], t1.Field4,
(SELECT Count(*)
FROM SrcTable As t2
WHERE t1.Field4 > t2.Field4 AND t1.[Date] > t2.[Date]
AND t1.ID = t2.ID ) As RowCount
FROM SrcTable As t1
ORDER BY t1.[Date];
将此查询保存为存储查询或VBA记录集,然后找到RowCount为5的ID。此ID将连续增加5个字段值。此外,以上仅适用于Field4。复制其他字段。并将SrcTable修改为实际的表名。
最后,虽然我不知道您的用户界面是什么样的,但您可以有条件地格式化文本框。您可以在表单的“设计视图/格式”选项卡(功能区)下选择文本框控件。将“表达式”构建器设置为DLookup
值5:
Expression Is:
DLookUp("RowCount", "SavedQuery", "ID =" & Forms!yourformname!ID") >= 5
DLookUp是一系列函数中的Access函数:DSum,DAvg,DCount,DFirst,DLast。它们允许根据标准在任何数据库存储的表和查询中进行快速字段值搜索。您可以在SQL脚本,VBA代码和Expression构建器中使用它们。
另外一项:当您编辑现有数据或输入新数据时,表单上的条件格式不会立即更新,因为DLookUp仅在表单开头计算。在教科书的AfterUpdate事件和表单的AfterInsert事件中包含以下VBA,其中包含新数据值:
DoCmd.RunCommand acSaveRecord
Me!textboxname.Requery
Requery是一种重新计算各种对象的控制源,行源或记录源的方法。
答案 1 :(得分:0)
所以对于那些正在阅读并会找到这个有用的答案的人来说......
我做了以下工作来突出我收集的数据中的任何趋势,因为我无法得到任何其他工作:
首先,我通过在我的表单的on load属性中包含以下代码来创建包含我感兴趣的值的文本框(我表中的最后5个值):
Me.Trend1 = DLookup("[Field]", "Table", "[ID]=Forms![Formname]![Subformname].Form.[ID]")
Me.Trend2 = DLookup("[Field]", "Table", "[ID]=Forms![Formname]![Subformname].Form.[ID]-1")
Me.Trend3 = DLookup("[Field]", "Table", "[ID]=Forms![Formname]![Subformname].Form.[ID]-2")
etc.
然后我使用下一段代码将值相互比较并有条件地格式化我的文本框:
If Me.Trend1.Value > Me.Trend2.Value And Me.Trend2.Value > Me.Trend3.Value And Me.Trend3.Value > Me.Trend4.Value And Me.Trend4.Value > Me.Trend5.Value _
Or Me.Trend1.Value < Me.Trend2.Value And Me.Trend2.Value < Me.Trend3.Value And Me.Trend3.Value < Me.Trend4.Value And Me.Trend4.Value < Me.Trend5.Value _
Or Me.Trend1.Value > [Value] And Me.Trend2.Value > [Value] And Me.Trend3.Value > [Value] And Me.Trend4.Value > [Value] And Me.Trend5.Value > [Value] _
Or Me.Trend1.Value < [Value] And Me.Trend2.Value < [Value] And Me.Trend3.Value < [Value] And Me.Trend4.Value < [Value] And Me.Trend5.Value < [Value] Then
Me.textbox.BackColor = vbRed
Else: Me.textbox.BackColor = 5753088
End If