【发布时间】:2011-04-20 18:46:41
【问题描述】:
我可能想多了,但我看到了各种潜在的问题......
我有一张桌子,我会叫主人。在其他项目中,它包含一个名为 Serial 的字段。我认为这将是一个静态项目 - 即,对于 Master 中的任何给定行,它永远不会改变(一旦最初分配)。我现在发现它可以更改,不仅如此,我还需要存储这些更改的历史记录。
我可以将 Serial 分成一个单独的表,其中每一行都有一个 MasterId、EffectiveDate 和 Termination Date(Master 行的当前 Serial 将是具有空终止日期)。到目前为止,一切都很好......
现在我要问的问题是:我有一个基于 Select from Master 的绑定表单,其中包括 Serial。
我认为我想要做的是使这种可变性对用户透明,是短路对 Serial 文本框所做的任何更改,可能在文本框 BeforeUpdate 事件中.然后,我将使用代码终止 Serial 表中的当前行并插入一个新行,该行变为当前行并显示在文本框中。我会(我认为)需要取消表单记录集中的更新,不会丢失用户对其他字段所做的任何更改......
此时我的大脑开始吃午饭了,因为我仍然对未绑定的表单和保存按钮感到更加自在。我可以按照建议这样做吗?我需要了解哪些技巧和陷阱?如果需要,我可以将表单上的 Serial 字段设为只读,并要求弹出窗口进行编辑,但如果可以的话,我宁愿避免这样做。
**编辑
希望这会有所帮助:
之前
table Master
Id AutoNumber PK
Serial Text(20)
--other fields
当前frmMaster RecordSource:
SELECT Id, Serial, yada, yada FROM Master WHERE blahBlah
之后
table Master
Id AutoNumber PK
--other fields
table Serial
Id AutoNumber PK
MasterId Long
Serial Text(20)
EffDt Date/Time
TermDt Date/Time
新的 frmMaster RecordSource:
SELECT Master.Id, Serial.Serial, yada, yada
FROM Master LEFT JOIN Serial ON Master.Id = Serial.MasterId
WHERE Serial.TermDt is Null AND blahBlah
表单上的“编辑”应导致:
- 序列中的选定行填充了 TermDt (Now())。不会更改此行上的 Serial.Serial 的值。
- 在 Serial 中创建了一个新行,具有新的 Serial、相同的 MasterId 和 EffDt = Now()
- 新序列显示在表单上,最好让用户看起来好像他们刚刚在适当的位置编辑过一样。
- 对表单上其他字段所做的任何更改都会保存。
再次编辑
好的,HansUp 给出的答案似乎涵盖了我需要的大部分内容。我剩下的绊脚石甚至可能不是问题(但如果是这样,有人可以解释原因吗?)。
添加 Master 的用例非常简单,但在更改 Serial 的更新用例中,我仍然感到困惑:如果 txtSerial 绑定到 Serial.Serial,并且用户更改了txtSerial,Access 不会尝试更新 Serial.Serial 的内容以匹配吗?如何在更改时添加序列行(看起来应该是一种享受),如何防止现有序列行的更新?
【问题讨论】:
-
这很难想象,IMO。向我们展示您的 Master 和 SerialHistory 表中包含相关字段的示例。
-
在您的示例中,串行字段是否成为主表和串行表的一部分?
-
什么是 EffDt 以及如何发音?
-
在我看来 Master 应该有一个字段 Serial_ID 作为 Serial.ID 的外键。
-
EffDt 是 EffectiveDate--我有一个习惯,就是在我与 DBA 合作时留下的需要它。