【问题标题】:MS Access Insert Calculated Field to Table FieldMS Access 将计算字段插入表字段
【发布时间】:2023-04-01 14:26:01
【问题描述】:

我正在尝试获取一个执行以下操作的表单控件作为控件源,以将其添加到关联表中的字段中。

=[Company] & " " & IIf([Cable]="Fiber","FO Cable","CC Cable") & " " & [CableStartPoint] & "-" & [CableEndPoint]

当输入关联字段时,上面会在表单上的控件中显示以下内容 -> 公司 FO 电缆开始-结束

我尝试在 After Update 和其他 On ... 属性中使用表达式。这给我留下了一个空白值。

我的下一个目标是使用 VBA,我尝试使用这个问题 (Access form calculated fields) 中的 VBA 方法,但我的 VBA 技能似乎有所下降,我不确定如何继续满足我的要求需要... :(

我的主要目标是不必为此手动输入信息,以防止输入错误并输入已存储在数据库中的冗余信息,例如公司、起点和终点。

如果这可以通过 SQL 完成,我也对该解决方案感兴趣。这是我认为我的 SQL 所需要的,尽管我不确定它需要去哪里更新记录(之后、之前,或者只使用代码生成器)。

UPDATE tblCableDetails
SET CompletedLabel=Form!CableDetails!Label.Value
WHERE CableDetailsID=Form!CableDetailsID.Value

我想将这些存储在数据库中而不是在需要时运行表达式的原因是,我想在另一个表中使用这个值作为查找另一个表单来跟踪有关电缆的细节。

感谢大家的宝贵时间!

【问题讨论】:

    标签: sql sql-server vba ms-access


    【解决方案1】:

    如果所有字段都在同一个表中,则 Access Tables 具有可在表的设计视图中访问的计算数据类型,这将非常容易地处理这个问题。这将是您最简单的路线;只需在计算字段中使用您的表达式,如下图所示。请注意,计算字段在未来还有其他潜在的限制,但我不会太担心这一点。计算字段的名称为 CompletedLabel,Access 将根据表达式中其他字段的当前值维护其值。

    如果字段不在同一个表中并且表单已绑定并且 Access 正在处理 Saves(这意味着表单具有 RecordSource 属性,并且当用户更改值时您让 Access 处理记录的保存,他们导航到新记录,他们关闭表单等),您可以添加一个 VBA BeforeUpdate 事件,该事件在 Access 自动保存字段之前标记列。只需将 CompletedLabel 字段添加到表单中(可以隐藏),然后创建更新前事件:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
       Me!CompletedLabel = [Company] & " " & IIf([Cable]="Fiber","FO Cable","CC Cable")    & " " & [CableStartPoint] & "-" & [CableEndPoint]
    End Sub
    

    在某些情况下,您甚至不需要表单上的 CompletedLabel 文本框,但它必须位于表单所基于的记录源(查询或表)中。它还必须是可编辑的,这可能已经是这样了。

    您可以按照您的建议使用 SQL 执行此操作,也许在更新后事件中。

    UPDATE 
    tblCableDetails
    SET 
    CompletedLabel=[Company] & " " & IIf([Cable]="Fiber","FO Cable","CC Cable") & " " & [CableStartPoint] & "-" & [CableEndPoint]
    WHERE 
    CableDetailsID=Form!CableDetailsID.Value
    

    或者在表单打开或关闭时使用外部查询,例如:

    UPDATE 
         tblCableDetails
    SET 
         CompletedLabel=[Company] & " " & IIf([Cable]="Fiber","FO Cable","CC Cable")    & " " & [CableStartPoint] & "-" & [CableEndPoint]
    WHERE 
         CompletedLabel = null Or Nz(CompletedLabel,"") = ""
    

    您还可以创建一个包含表达式的查询,并在您需要查看计算值的位置使用它。

    很多可能性。祝你好运,标签!

    【讨论】:

    • 感谢您的帖子!计算字段是我最初尝试过的,尽管当我的需求发生变化时被解雇了。该表单基于使用三个表的查询。我正在尝试使用您关于将 SQL 命令添加到更新后的建议,尽管这并没有按预期传输。在那个领域,任何帮助都会很棒。使用您的第三个选项,我将创建一个查询以提供我想要的值,然后以一种形式使用它,该表格将使用跟踪电缆细节所需的表。然后我可以使用 CableDetailsID 将记录链接在一起。
    • 那里的空间用完了...当然,如果我什至需要链接记录的话。我很可能不会。我会根据新表运行基于电缆标签的单根电缆详细信息的报告...我希望... :) 再次感谢!
    • 请忽略我的错字以防止进一步混淆。我正在使用您的第三个选项,我相信这会解决我的问题。感谢您的宝贵时间。
    • 太棒了,标签。您是否遇到了选项 3 的任何障碍?
    • 我想我通过选项 3 得到了它。实际上,在我将它创建为 SharePoint 中的 Access Web 应用程序之前,我将它作为一个概念放在一起。这就是我对 SQL 解决方案感兴趣的原因。 :)
    【解决方案2】:

    这不是通过执行计算的事件属性中的表达式来完成的。

    保存计算数据需要宏或VBA代码,我更喜欢VBA。

    此表单是否绑定到您要保存数据的表?如果是这样,适当的方法很简单:

    Me!fieldname = Me.textboxname

    正如您所发现的,真正的诀窍是找出正确的事件来将此代码放入其中。在首选事件属性中选择[事件过程],然后单击省略号 (...) 以转到 VBA 过程并键入所需的代码。

    【讨论】:

    • 感谢您的帖子!参考中的表格基于使用三个表的查询。我尝试了您之前建议的方法,但无法使其正常工作。我也更喜欢 VBA,只是不能让它工作...... :)
    • 基于3个表的数据录入表单? 2个表格只是为了显示相关信息吗?在此表单上添加新记录没问题吗? “无法让它工作”是什么意思 - 错误消息,错误结果,什么也没有发生? DanielG 提供了很多很好的信息。要添加它,请查看使用 CurrentDb.Execute 在 VBA 中运行 SQL 操作查询。
    • 大声抱歉 2 张桌子!是的,问题是它不会在控件中显示任何内容,并且当表单关闭或使用新记录更新时它不会输入数据。
    • 这个效率不高,确实需要分析db结构、查询、表单设计。如果你想提供 db,我喜欢 Box.com 文件共享网站。
    • 在我的错字之后你会这么说。 :) 我可以提供数据库,尽管我很确定我现在从 DanielG 的第三个选项走在正确的轨道上。不过还是谢谢你。如果您确实想要一份副本,请使用 box.com 帐户向我发送消息,我会发送给我。虽然这是一个简单的数据库。一个表格用于公司信息,另一个用于子表格中与公司相关的电缆详细信息。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多