MS Access:连接运算符的麻烦

问题描述

我的问题是连接运算符 & 和 +。

我必须使用以下最终结构连接名称为 txt1、tx11、txt2、txt21、txt3、txt31 等的文本框:

**txt1 (txt11),txt2 (txt21),txt3 (txt31)**

其中 txt1 始终存在,并且它是唯一存在且永远不会为 Null 的。 所有其他文本框可能为 Null,但如果有一个两位数的 txt(即 txt11、txt21、txt31),那么它需要在前面加一个逗号和括号(除了第一个,txt11,只需要括号)以重新创建上述结构。

问题是我找不到合适的 & 和 + 组合来实现我的目标,有时缺少文本框,有时括号内没有文本框,诸如此类。

对如何进行有任何建议吗?

解决方法

这应该有效:

 Public Function GetControls

  Dim strResult     As String
  Dim i             As Integer
  Dim strF          As String
  
  strResult = ""
  
  For i = 1 To 33
     
     strF = "txt" & i    ' setup text box name
     
     If Nz(Me(strF),"") <> "" Then
        If strResult <> "" Then strResult = strResult & ","
        
        If i >= 11 Then
           strResult = strResult & "(" & Me(strF) & ")"
        Else
           strResult = strResult & Me(strF)
        End If
  
  Next i
 GetControls = strResult

End Function

所以上面的内容可以作为公共函数放在一个表单中。

然后,要以该形式显示在文本框中,请将控件源设置为

=GetControls()

所以这只是循环 1 到 33。

比如说,如果前 5 个没有,那么我们什么都没有。

如果我们有一个或多个,那么当然我们在这个检查中添加“,”

  If strResult <> "" Then strResult = strResult & ","

(是的,这是一段 VBA 单行代码!)

然后我们检查是否为 11 或更大,从而将 "() 放在值周围。但是添加 "," 和 "()" 的概念是不同的任务。

另外,有 1 到 33 个控件?好吧,我将在此演讲中简短说明缺乏标准化数据。

您将永远被降级为编写各种例程来处理此类问题。并且其中近 99% 是不需要的——尤其是当你试图报告这些数据时——你会在这里受苦。因此,这样的数据是个坏主意,也是一个糟糕的设计。使用规范化数据,您无需编写这么多循环。现在,在这种情况下,我承认您需要对子表进行与上述类似的循环,但您不会被限制为 33 个值,您可以有 2 个或 40 个。但是到了查询时间,使用规范化数据,您可以使用 sum()、counts() 甚至分组数据 - 如果您决定使用 2 或 40 个值,则无需更改代码、报告或其他任何内容。