【问题标题】:Adding a unit toggle to MS Access Form将单位切换添加到 MS Access 表单
【发布时间】:2016-11-08 20:32:02
【问题描述】:

TL;DR

我正在尝试对输入到数据输入表单的值执行一些计算,然后再将它们保存到表格中。


背景

我在 MS Access 中有一个表单,用作将数据输入数据库的前端。它主要是基准和各种对象之间的距离数据。数据库和使用该数据的应用程序都已建立,期望所有测量值以英尺为单位,但我们的许多数据来源都是以米为单位的。过去,用户必须在将数据输入到表单之前自行转换数据。这一额外步骤会降低工作效率,并增加用户出错的可能性。

我想要做的是在我的表单中添加一个单选按钮,让用户在米和英尺之间切换。当它被交换为米时,该记录的所有值在显示在屏幕上之前都会转换为它们的米当量。如果用户更改记录或创建新记录,表单将需要在更新表格之前将值转换回英尺。表中的值始终以英尺为单位非常重要。

我找到了this article,它描述了如何在表格的记录源之间进行交换。我想我可以只设置 2 个查询 - 一个直接从表中提取数据,一个执行转换 - 并在用户切换单选按钮时在查询之间交换作为我的记录源。


问题

此设置的问题在于,由于我必须在查询中使用别名来执行转换,因此当径向切换为米时,用户无法输入数据。如果我尝试更新其中一个字段,我只会得到一个 bing 噪音并且输入被忽略。 当径向切换到米时,有什么办法允许输入吗? 正如我上面所说,表格中的数据始终以英尺为单位很重要,所以如果用户有“米”选择选项并输入一个类似500的值,输入到表格中的值应该是1640,这是转换为英尺的结果。


示例

这是我的查询的简化示例

FEET 查询

SELECT A,B,C AS LEN,D,E
FROM TABLE1

METERS 查询

SELECT A,B,C/0.3048 AS LEN,D,E
FROM TABLE1

【问题讨论】:

    标签: vba ms-access ms-access-2003


    【解决方案1】:

    只需更改文本框中显示的内容。设置文本框有一个控制源

    =Length*txtConversionFactor
    

    txtConversionFactor 是一个隐藏的文本框,如果您的单位以英尺为单位显示,则其中包含 1,如果以米为单位显示,则为 0.3048。它甚至可以是绑定到这样的表格的组合框

    MultiplyFeetByToGetOutputUnits    OutputUnits
    1                                 ft
    0.3048                            m
    12                                in
    0.000189394                       mile
    

    然后你可以在不改变你的形式的情况下转换成你想要的任何东西。

    【讨论】:

    • @Gustav 好吧,我没有编辑这个,因为你的回答基本上是我会做的,除了我会桌面驱动器。
    • 感谢您的回复,但是是的,这与我尝试过的事情之一相似,正如 Gustav 指出的那样,它仍然不允许您编辑值。
    【解决方案2】:

    仅使用此查询:

    SELECT A,B,C AS LEN,D,E
    FROM TABLE1
    

    在您的表单上,隐藏绑定到 LEN 的文本框。

    创建一个新的未绑定文本框,例如 txtLEN。

    现在使用这样的代码,其中 SelectMetric 是使用度量值时要标记的复选框:

    Private Sub Form_Current()
    
        Dim Factor As Currency
    
        If Me!SelectMetric.Value = True Then
            Factor = 0.3048
        Else
            Factor = 1
        End If        
        Me!txtLen.Value = Factor * Me!LEN.Value
    
    End Sub
    
    Private Sub txtLen_AfterUpdate()
    
        Dim Factor As Currency
    
        If Me!SelectMetric.Value = True Then
            Factor = 0.3048
        Else
            Factor = 1
        End If        
        Me!Len.Value = Me!txtLEN.Value / Factor
    
    End Sub
    

    【讨论】:

    • 感谢您的回复!我曾尝试过这样的事情(使用 1 个查询和一个隐藏的文本框),但我没有将转换放入代码中,而是尝试在 txtLen 的控制源中进行,得到的结果与使用2个查询。我按照您的方式进行了尝试,并将其移至代码中,看起来它运行良好。谢谢!
    • 需要注意的一点:看起来我需要在AfterUpdate 事件中为我的径向按钮设置一个Me.Requery,以便在用户在单位之间切换后立即刷新屏幕。
    • 是的,忘记了,抱歉。您也可以直接拨打Form_Current - 应该会快很多。
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多