在 Access 查询中使用退格键 - CHR(8)
Using backspace - CHR(8) - in Access Query
我有一个部件管理 MS Access 数据库。其中一个字段很少使用 - 它存储库存中的零件是否实际上是更常见零件的罕见变体。通常,该字段用作主要部件号的后缀,数据库在将父部件存储在数据库中的同时在报告中生成该字段。 (一个控制部件号的主数据库不包含任何关于变体的信息,但存储它很重要,因为店面数据库包含这些信息。)
我发现在某些情况下变体 而不是 只是一个后缀。在某些情况下,正确的变体零件号会从父零件中删除一个字符。例如部分“3069b”有一个变体“3069bpb198”。但我发现“30361c”部分有一个变体“30361pb016”,它消除了 "c".
我的首选解决方案是将退格字符编码到需要它的变体的字段中。然后,当我将父部件号与变体号连接时,“30361c”和“\bpb016”变为“30361pb016”。然而,我在 Access 查询中得到的输出是“30361c□pb016”。
我试过的查询中的连接公式是:
PartNum: [pl].[PartID] & [variant] 'returns "30361c\bpb016"
PartNum: Replace([pl].[PartID] & [variant],"\b",Chr(8))
我想做的事情可行吗?如果是这样,我做错了什么?
我真的很想避免更改数据库,因此变体包含完整的零件号而不是后缀。
怎么样:
PartNum: left([pl].[PartID],len([pl].[PartID])-1) & [variant]
好吧,您也许可以连接退格键,但是如何以及是否会影响数据的显示是一个巨大的不同问题。 ctrl-H 的使用可以追溯到绿屏时代,甚至是电传时代。换句话说,您想要一种可选择删除字符的方法,并且将 ctrl-H 与现代 GUI 和实际上不代表 ASCII 字符流的系统一起使用意味着问题不在于如何使 ctrl-H 工作以切断字符char,但是如何根据某种信息截断一个字符。
换句话说,除非您使用 ASCII 绿屏或打印机,否则 ctr-H 是一种疯狂的方法。
我也不会在该数据中引入不可打印的字符,因为您无法将该信息输入到字段中,更糟糕的是,您因此无法搜索、排序和处理该列作为数据。
情况变得更糟。您的业务规则是,一列中的 "some" 数据会影响另一列的显示!!!!这严重破坏了关系数据模型,一点都不好笑。
您需要的是添加一个位列(true/false)。事实上,真正需要发生的是第一列的选择需要考虑到第二列,并且应该在这里做出不同的选择。
现在这个 trick/idea 可能在 25 年前有用,当时大多数计算机都是 ASCII,使用绿色屏幕工作,并输出到 screen/terminal 或者甚至疯狂地使用电传打字机?好吧,那么 ctrl-H 就可以了。
现代系统以图形格式显示数据,并且数据不再是真正的 ASCII - 而是以 uni-code 保存。 (允许以几乎任何语言或地区显示)。
现在,假设遭受严重脑损伤的人考虑以这种方式污染数据?
嗯,你可以使用这个功能:
Public Function vScrub(ByVal s As Variant) As String
Dim c As Integer
If IsNull(s) Then
vScrub = ""
Exit Function
Else
c = InStr(s, Chr(8))
Do While c <> 0
s = Left(s, c - 2) & Mid(s, c + 1)
c = InStr(s, Chr(8))
Loop
End If
vScrub = s
End Function
所以,将上面的代码放在标准代码模块中(不是 class 模块,也不是表单模块)。
一旦完成,任何表格、任何报告,甚至任何查询都可以简单地用上面的字符串表达式包装起来
例如:
vScrub([Col1] & [col2])
编辑:
修改例程以适用于字符串中的多个 chr(8)。
我有一个部件管理 MS Access 数据库。其中一个字段很少使用 - 它存储库存中的零件是否实际上是更常见零件的罕见变体。通常,该字段用作主要部件号的后缀,数据库在将父部件存储在数据库中的同时在报告中生成该字段。 (一个控制部件号的主数据库不包含任何关于变体的信息,但存储它很重要,因为店面数据库包含这些信息。)
我发现在某些情况下变体 而不是 只是一个后缀。在某些情况下,正确的变体零件号会从父零件中删除一个字符。例如部分“3069b”有一个变体“3069bpb198”。但我发现“30361c”部分有一个变体“30361pb016”,它消除了 "c".
我的首选解决方案是将退格字符编码到需要它的变体的字段中。然后,当我将父部件号与变体号连接时,“30361c”和“\bpb016”变为“30361pb016”。然而,我在 Access 查询中得到的输出是“30361c□pb016”。
我试过的查询中的连接公式是:
PartNum: [pl].[PartID] & [variant] 'returns "30361c\bpb016"
PartNum: Replace([pl].[PartID] & [variant],"\b",Chr(8))
我想做的事情可行吗?如果是这样,我做错了什么?
我真的很想避免更改数据库,因此变体包含完整的零件号而不是后缀。
怎么样:
PartNum: left([pl].[PartID],len([pl].[PartID])-1) & [variant]
好吧,您也许可以连接退格键,但是如何以及是否会影响数据的显示是一个巨大的不同问题。 ctrl-H 的使用可以追溯到绿屏时代,甚至是电传时代。换句话说,您想要一种可选择删除字符的方法,并且将 ctrl-H 与现代 GUI 和实际上不代表 ASCII 字符流的系统一起使用意味着问题不在于如何使 ctrl-H 工作以切断字符char,但是如何根据某种信息截断一个字符。
换句话说,除非您使用 ASCII 绿屏或打印机,否则 ctr-H 是一种疯狂的方法。
我也不会在该数据中引入不可打印的字符,因为您无法将该信息输入到字段中,更糟糕的是,您因此无法搜索、排序和处理该列作为数据。
情况变得更糟。您的业务规则是,一列中的 "some" 数据会影响另一列的显示!!!!这严重破坏了关系数据模型,一点都不好笑。
您需要的是添加一个位列(true/false)。事实上,真正需要发生的是第一列的选择需要考虑到第二列,并且应该在这里做出不同的选择。
现在这个 trick/idea 可能在 25 年前有用,当时大多数计算机都是 ASCII,使用绿色屏幕工作,并输出到 screen/terminal 或者甚至疯狂地使用电传打字机?好吧,那么 ctrl-H 就可以了。
现代系统以图形格式显示数据,并且数据不再是真正的 ASCII - 而是以 uni-code 保存。 (允许以几乎任何语言或地区显示)。
现在,假设遭受严重脑损伤的人考虑以这种方式污染数据?
嗯,你可以使用这个功能:
Public Function vScrub(ByVal s As Variant) As String
Dim c As Integer
If IsNull(s) Then
vScrub = ""
Exit Function
Else
c = InStr(s, Chr(8))
Do While c <> 0
s = Left(s, c - 2) & Mid(s, c + 1)
c = InStr(s, Chr(8))
Loop
End If
vScrub = s
End Function
所以,将上面的代码放在标准代码模块中(不是 class 模块,也不是表单模块)。
一旦完成,任何表格、任何报告,甚至任何查询都可以简单地用上面的字符串表达式包装起来
例如:
vScrub([Col1] & [col2])
编辑:
修改例程以适用于字符串中的多个 chr(8)。