如何在每次对其行进行更改时更新具有日期的访问字段?

时间:2009-07-17 18:49:52

标签: ms-access

嗨,谢谢你的帮助,

注意:我使用的是Access 2002

我正在尝试使用NOW()日期/时间戳更新我的“LastUpdatedDate”字段,如果其行有变化的话。

现在,我已经按照Doanair给另一个人试图解决这个问题的指示:

DATETIME to the table e.g. named LastUpdatedDate that indicates the last updated date/time of each row. Make it NOT NULL so that you will have to write an updated DATETIME value to that column for each INSERT or UPDATE. Also, set the column to have a default of DATE() for the current date stamp or NOW() for the current date/time stamp.

不幸的是,如果行上的某些内容发生了变化,它仍然不会更改字段。他提到我应该:

Then add a Validation Rule or CHECK constraint e.g. CHECK (LastUpdatedDate = NOW()) to ensure the column is actually updated on each UPDATE and INSERT.

但是我知道在Access XP中没有检查功能。

任何想法的家伙/加尔斯?

谢谢, 将

5 个答案:

答案 0 :(得分:1)

Access团队还没有提供使用Access GUI或DAO创建CHECK约束的方法(这里希望Access2010!)

您必须使用SQL DDL创建CHECK约束,例如

ALTER TABLE MyTable ADD
   CONSTRAINT LastUpdatedDate__must_be_current_timestamp
      CHECK (LastUpdatedDate = NOW())

要运行上述内容,您必须使用ANSI-92 Query Mode

请注意,您还可以使用Access GUI中的表设计器创建行级验证规则:

LastUpdatedDate = NOW()

只是为了澄清:在表的属性的Access UI中定义了行级验证规则;在ADOX代码中,它被混淆地称为表格验证规则(不确定它在DAO或ACEDAO中是什么)。每次行UPDATE d时都会触发。

由于每个表只能定义一个行级验证规则,IMO最好使用表级CHECK约束,只要有一行或多行,就会检查表中的每一行{ {1}} d。您可以为每个表定义多个UPDATE约束,并为其提供有意义的名称(CHECKLastUpdatedDate__must_be_current_timestamp等),您将能够以比验证规则更大的粒度提供用户反馈

答案 1 :(得分:0)

根据我的理解,您必须将LastUpdated字段的值显式设置为NOW()。它不会在UPDATE自动执行。

您可以将LastUpdated字段的默认值设置为NOW() - 这应该处理INSERT。

答案 2 :(得分:0)

我认为Table存储在MDB文件中,即Native Access不在SQL Server中?

如果是SQL Server,您可以创建更新触发器 - 在Access Tables(或Jet数据库引擎)中没有这样的选项。

这意味着您可以选择在客户端的表单事件中更新记录的位置设置值。

例如。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Me.txtLastUpdated = Now()
End Sub

其中Me.txtLastUpdated是文本框控件的名称。

请注意,Check Constraint没有设置值 - 如果Check失败,它只会阻止更新行。

答案 3 :(得分:0)

感谢您的所有帮助。我决定只在= now()的报告上添加一个文本字段,并向他们发送该报告的pdf。 Adobe 1 Tech Guy 0

威尔

答案 4 :(得分:0)

我没有看到有人在这里给出了非常明确的答案。

Jet / ACE没有触发器,因此无法在表级别定义每次更新记录时都会更新的字段。

相反,您必须使用Access表单的事件执行此操作。表单的正确事件是BeforeUpdate事件,您只需将LastUpdatedDate设置为Now()即可。你已经将默认值设置为Now(),这样就可以了,但正如你所说,只有在插入记录时才会填充字段。

您需要考虑的一个问题是,对于新插入,Now()作为默认值将为您提供启动记录插入的日期/时间。也就是说,您可以启动新记录,LastUpdatedDate将设置为当前日期/时间,如果您走了5个小时并保存记录,则时间将过时5个小时。因此,将默认值设置为Now()可能没有用 - 您实际上只能通过使用用于编辑它的表单的BeforeUpdate事件来确保获得正确的值。