【问题标题】:MS Access: Save form data to 2 tables at the click of a buttonMS Access:单击按钮将表单数据保存到 2 个表中
【发布时间】:2013-01-26 20:00:19
【问题描述】:

我正在创建一个包含 2 个表(Assets 和 AssetMovements)和一个表单(Assets)的资产管理数据库。 我需要保留每次资产移动的记录,因此每次将新资产添加到 Assets 表或修改现有资产记录的“位置”值时,都应将记录保存到 AssetMovements 表中。 AssetMovements 表就是用来记录交易的。

我怎样才能做到这一点?我会很感激我能得到的任何指示,或者如果有人能提出更好的方法来保存运动记录。 谢谢。

【问题讨论】:

  • 你使用哪种编程语言????
  • 嗨 NidhishKrishnan,我正在使用 Microsoft Access。

标签: ms-access ms-access-2010


【解决方案1】:

看到您使用的是 Access 2010,这似乎是 Data Macro 的一个很好的借口,即使数据是从 MS Access 外部更新的,数据宏也会运行。

我创建了一个 Assets 表和一个 AssetMovements 表,AssetMovements 表有一个 ActionDate 字段,其默认值为 Now(),用于设置动作发生的日期。

您需要在 Assets 表上使用两个宏:

这就是您需要做的所有事情,如下所示。

添加或更改记录后,数据会自动记录在 AssetMovements 表中:

您可以运行一个小示例 VBScript ...

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=z:\docs\demo.accdb" 

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon
sSQL="INSERT INTO Assets (Asset,Location) Values ('Printer',7)"
cn.Execute sSQL

sSQL="Update Assets Set Location=5 Where Asset='Printer'"
cn.Execute sSQL

看到这也更新了 AssetMovements 表。

还有一个 LogEvent 数据宏,用于更完整地记录更改。

【讨论】:

    【解决方案2】:

    该按钮有一个单击事件,当您单击它时会触发该事件。使用 VBA 编写一些在单击按钮时执行的代码。
    当您单击该按钮时,您会将记录保存到资产。然后使用查询将该记录复制到 AssetMovements 表。因此,代码将如下所示:

    Dim OldLocation As String    
    
    Private Sub CmdSave_Click()
       DoCmd.RunCommand acCmdSaveRecord
    End Sub
    
    Private Sub Form_AfterUpdate()
       Dim strSQL
       If OldLocation <> Location.Value Then
          strSQL = "INSERT INTO AssetMovements SELECT T1.* FROM Assets WHERE Assets.ID = "
          strSQL = strSQL & Me.ID
          CurrentDb.Execute strSQL
       End If
    End Sub
    
    Private Sub Form_BeforeUpdate(Cancel As Integer)
       OldLocation = Me.Location.OldValue
    End Sub
    
    Private Sub Form_Current()
       OldLocation = Me.Location.Value
    End Sub
    

    然后,这将使用唯一 ID(我猜是 AssetID)将表单的当前记录复制到 AssetMovement 表中。

    【讨论】:

    • 谢谢汤姆。如何确保它只复制“位置”值已更改的记录?
    • 比较 Location.Value 和 Location.OldValue。如果不同,则复制记录。
    • 谢谢汤姆。你介意告诉我如何进行比较吗?我是这方面的绝对新手。
    • 代码已更新。顺便说一句,If 语句非常基本。我强烈建议您至少学习 VBA 初学者教程,否则您会发现自己迷失了很多。
    • 嗨,汤姆。它没有将记录保存到 AssetMovements 表中。我也没有收到任何错误消息。两个表都使用“ID”作为唯一 ID。下面是我的最终代码:Dim strSQL DoCmd.RunCommand acCmdSaveRecord If Location.OldValue &lt;&gt; Location.Value Then strSQL = "INSERT INTO AssetMovements SELECT Assets.* FROM Assets WHERE Assets.ID = " strSQL = strSQL &amp; me.ID CurrentDB.Execute strSQL End If 感谢到目前为止的所有帮助。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多