【问题标题】:Input mask in Access databaseAccess数据库中的输入掩码
【发布时间】:2015-02-02 16:41:38
【问题描述】:

我有一个客户 ID 的字段,其格式应为 C0000000001,其中开头有一个字母,字母后面最多有 10 个数字,字母和数字之间有前导零。我希望用户能够放入 C1 并让表格保存 C0000000001 或 C1234 并让表格保存 C0000001234。

我希望对表中的硬数据进行限制。该表应包含完整的客户 ID,但我只希望用户在输入/搜索客户时必须输入 C 和客户编号。我正在使用 Access 2010。

我相信第一个字符将始终是 C,但无论哪种方式,如果不是,它只会是一个字母字符。

我理解您的意思,但大部分数据(数千条记录)将来自以这种方式存储它们的另一个系统。这样做会限制我的误差范围。否则,来自其他系统的导出将需要在导入数据库之前手动更改,反之亦然。

仅搜索将以 C0000001234 格式保存的现有记录,但我希望用户在输入搜索条件时能够省略前导零。

【问题讨论】:

  • 你需要澄清这个问题。你想在哪里施加限制?在表格上?在 VBA 中?作为对表的硬数据限制?
  • 这听起来不像是输入掩码的工作。你确定这就是你想要的吗?
  • 为自己省去很多麻烦,不要这样做。使用格式化将数据显示为 C.....数字,但将其存储为整数。我以前在 Access 中使用过这样的混合键,这会导致很多麻烦。
  • 第一个字母总是'C'吗?
  • 在我看来您有两个问题:更改存储的内容(C1234 存储为 C0000001234);和搜索 --- 在搜索之前,您可能没有在表中存储任何内容。

标签: ms-access ms-access-2010


【解决方案1】:

这个问题,结合您之前的问题here,向我建议您正在努力使您的 Access 数据库中的数据结构完全匹配您从中接收批量的旧系统更新。这可能不是必需的,甚至是不可取的。

例如,与其将 CustomerId 维护为 Text(11)(如在旧系统中),您可以将其存储在 Access 数据库中为

  • CustomerIdPrefix:Text(1),和
  • CustomerIdNumber: Long Integer 或者 Decimal 如果数字部分真的可以超过 2,147,483,647

Access 中的客户表还可以包含一个名为 CustomerId 的计算字段

[CustomerIdPrefix] & Right("0000000000" & [CustomerIdNumber], 10)

为您提供一个“C0000012345”值用于显示目的。

对于搜索,您的表单可以有一个用于前缀的文本框(默认值:'C')和另一个用于数字部分的文本框。然后搜索可以使用类似的条件

[CustomerIdPrefix] = txtPrefix.Value AND [CustomerIdNumber] = txtNumber.Value

或者,如果用户想在表单(或数据表视图)上创建过滤器,那么只过滤数字部分可能就足够了。

如果您需要将信息反馈给旧系统,您只需导出一个包含 [CustomerId] 计算字段(并省略 [CustomerIdPrefix] 和 [CustomerIdNumber])的查询,就可以了。

【讨论】:

  • 我能问一下为什么不希望将数据保持与将要使用的相同格式吗?仅仅是因为保持这种方式的复杂性,还是有其他问题?
  • 数据将以两种不同的方式“使用”:一旦导入 Access,它将在 Access 中“使用”(在某种程度上),如果更新的信息被反馈给旧应用程序,它也会在那里“使用”。您可以在导入时应用一些简单的转换,在导出时使用相应的逆变换,可以让您摆脱遗留应用程序设计带来的复杂性和限制。您获得了更好的 Access 应用程序,并且在此过程中不会丢失任何内容。
【解决方案2】:

我的建议是使用带有 FORMAT 函数的关联查询的表单。

您确实需要说明您希望在何处实现此功能,但我假设您已经设置了一个表格并且您希望能够从表格中输入/搜索数据。

我将为输入 frmAdd 创建一个表单。对于输入表单,我创建了一个查询,该查询将在按下表单上的按钮时运行。将两个文本框newIDnewOther 添加到无限制但用户可以用来输入数据的表单中。然后查询将提取该数据并以更改的格式将其附加到您的表中。这是该查询的 SQL:

INSERT INTO Customers ( [Customer ID], [Other Field] )
SELECT Left([Forms]![frmAdd]![newID].[value],1) 
& Format(Right([Forms]![frmAdd]![newID].[value],Len([Forms]![frmAdd]![newID].[value])-1),"0000000000") 
AS Expr1, Forms![frmAdd]!newOther AS Expr2
FROM Customers;

我不确定您正在寻找的搜索功能究竟是什么,但此查询会提取与 frmSearch 匹配的记录数据,并带有文本框 search,其格式为 C### 或其他格式输入:

SELECT Left([Customers].[Customer ID],1) & Replace(LTrim(Replace(Right([Customers].[Customer ID],9),'0',' ')),' ','0') 
AS Expr1, Customers.[Other Field]
FROM Customers
WHERE (((Customers.[Customer ID])=Left([Forms]![frmSearch]![search].[value],1) 
& Format(Right([Forms]![frmSearch]![search].[value],Len([Forms]![frmSearch]![search].[value])-1),"0000000000")));

应用输入掩码只是确保您的数据正确的一种方式。如果您觉得需要使用一个,请转到设计视图中的表格,然后单击客户 ID 字段的数据类型框。在字段属性 -> 常规下找到输入掩码并单击它。然后点击转到工具栏->设计选项卡->生成器。这将引导您完成它。

【讨论】:

    【解决方案3】:

    输入掩码不是这个问题的答案。输入掩码强制用户以某种方式输入数据。您需要一些 VBA 代码在窗体上的 AfterUpdate 事件中运行。表格内无法强制数据进入此模式,允许您请求的输入法。

    可能有一种更有效的方法可以做到这一点,但这确实有效。

    http://pineboxsolutions.com/access/customeriddemo.accdb

    【讨论】:

    • 在此服务器上找不到请求的 URL /access/customeriddemo.accdb。
    • re: “表中没有办法强制数据进入这种模式” - 实际上,在 Access 2010 中,可以使用更改前data macro 来完成,但这可能不是我解释我对这个问题的答案的最佳方法。
    • 虽然我承认数据宏可能有效,并且我同意您的方法可能是更好的方法,但这并不是 OP 真正要求的。用户希望能够以该模式输入“C1”或“C1234”或其他内容,并使其符合列出的格式。在某些方面,我的答案也不是,所以我猜最终用户想要做的并不是 Access 所适应的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2012-11-14
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多