【问题标题】:Update Second Table from Access Form从访问表单更新第二个表
【发布时间】:2017-08-02 03:49:39
【问题描述】:

我是第一次使用 Access 和 VBA。我有两张表(VhTr),我有一个基于Tr 表的表格。

Tr 表中有一个我正在尝试更新的 Vh_Id 字段(Vh 表反之亦然)。在Edit Tr 表单上,我有一个下拉列表,其中包含Vh 表中的所有ID,并且一旦更改此下拉列表,我就会运行一些SQL 设置。我收到一个对话框,告诉我 1 行将受到影响,尽管说是,但我从未看到 Vh 表中发生任何更改。

如何获取以下代码来实际更新 Vh 表中选择的记录,以使用当前记录更新它的 Tr_Id 字段?

Dim command As String
command = "UPDATE Vh SET Tr_Id = " + Me.Tr_Id + " WHERE PK = " + Str(Me.Vh_Id)
DoCmd.RunSQL (command)

【问题讨论】:

  • “反之亦然”是什么意思 - 为什么 Vh 表会有一个 Tr_Id 字段?表不能有双向关系。

标签: sql ms-access vba ms-access-2016


【解决方案1】:

试试这个:

Dim command As String
command = "UPDATE Vh SET Tr_Id = " & Me.Tr_Id & " WHERE Vh_Id = " & Me.Vh_Id
DoCmd.RunSQL (command)

edit:看起来Str() 函数是罪魁祸首,所以最好不要在 where 子句中使用它。根据Str()documentation,'当数字转换为字符串时,前导空格总是为数字的符号保留'。

【讨论】:

  • 我还是有同样的问题。 Access 告诉我 You are about to update 1 row(s),当我单击是并打开 Vh 表时,没有任何更新。
【解决方案2】:

在尝试解决此问题之前,我认为您需要先停下来认真考虑一下您的餐桌关系。在我看来,您试图通过 Vh 和 Tr 之间的交叉引用 ID 实现的是某种一对一的关系。也就是说,Vh 中的每条记录在 Tr 中只能有一个等价物,反之亦然。这是完全可以接受的,但是您对代码的尝试将导致您直接陷入问题。你想允许,我所说的,孤儿吗?也就是说,Vh中的某些记录是否可能在Tr中没有等价物,反之亦然?

为了说明我的观点,假设每个记录有 5 条。 PK 1 到 5 和交叉引用 ID 1 到 5。现在假设您在 Tr 上有您的 Edit 表单,并且您想将 Tr 中第一条记录的 Vh_Id 更改为 5(Vh 中的最后一条记录)。在 Tr 中进行了更改后,Tr 中现在有两条记录(PK 1 和 5)指向 Vh 中的相同记录(PK 5)。如果您现在更新(如您所建议的)Vh 使得 PK 5 具有 Tr_ID 1,那么您将面临以下问题。 Tr 中的两条记录指向 Vh (PK 5) 中的同一条记录,但 Vh PK 5 仅指向其中一条记录 (Tr PK 1)。 Vh PK 1 仍指向 TR_ID 1,但 Tr PK 1 指向 Vh_ID 5。Tr 中没有指向 Vh PK 1 的条目。即您的交叉引用系统仅因一次编辑而完全损坏。

请考虑一下您真正想要做什么,回到这里,我们会尽力为您解决问题。

【讨论】:

  • 我正在尝试实现一对一的关系。有一个孤儿不会是一个杀手,但我希望看到这种情况不会发生。比如 Vh 5 从 Tr_Id 2 变为 Tr_Id 3,那么 Tr 2 的 Vh_Id 字段将变为空, Tr 3 将被更新。
  • 在访问中定义表时,是否添加了这种关系?
  • 所以这里马上就有问题了。您不能将字段设置为 null,因为这会破坏关系。
  • 通常当人们创建一对一的关系时,这是因为他们想要有效地将表一分为二。也许有很多列,也许这些列通常只需要作为组。当他们这样做时,他们不想要的一件事是用户可以混合 ID。这是没有意义的。我仍然不明白你想做的事情背后的想法。 (我要离开大约 2 小时)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多