MS Access: проблема с объединением операторов

#ms-access

#ms-access

Вопрос:

моя проблема здесь связана с объединением операторов amp; и .

Я должен объединить текстовые поля с такими именами, как txt1, tx11, txt2, txt21, txt3, txt31 и так далее со следующей окончательной структурой:

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

где txt1 всегда присутствует, и это единственный, который будет присутствовать и никогда не будет нулевым.
Все остальные текстовые поля могут иметь значение Null, но если есть текст с двузначным значением (например, txt11, txt21, txt31), то перед ним нужна запятая и круглые скобки (кроме первого, txt11, для которого нужны только круглые скобки), чтобы воссоздать приведенную выше структуру.

Проблема в том, что я не могу найти правильную комбинацию amp; и для достижения своей цели, иногда отсутствуют текстовые поля, иногда круглые скобки без текстовых полей внутри и тому подобное.

Есть предложения о том, как действовать дальше?

Ответ №1:

Это должно сработать:

  Public Function GetControls

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

End Function
 

Таким образом, вышеуказанное можно поместить в форму как общедоступную функцию.

Затем, чтобы отобразить в текстовом поле в этой форме, установите для источника управления значение

=GetControls()

Таким образом, это просто перебирает от 1 до 33.

Скажем, если у первых 5 нет ни одного, то у нас ничего нет.

Если у нас есть один или несколько, то, конечно, мы добавляем «,» с этой проверкой

   If strResult <> "" Then strResult = strResult amp; ","
 

(да, это однострочный фрагмент кода VBA!)

Затем мы проверяем, является ли 11 или больше, и, таким образом, помещаем «() вокруг значения. Но концепция добавления «,» и «()» — это своего рода отдельные задачи.

Кроме того, от 1 до 33 элементов управления? Что ж, я буду держать эту лекцию короткой об отсутствии нормализованных данных здесь.

Вы навсегда будете вынуждены писать всевозможные процедуры для решения таких проблем. И около 99% из них не потребуются — особенно когда дело доходит до того, что вы пытаетесь сообщить об этих данных — вы будете страдать здесь. Таким образом, такие данные таким образом — плохая идея и плохой дизайн. С нормализованными данными вы не будете писать так много циклов. Теперь в этом случае я признаю, что вам понадобится аналогичный цикл, как указано выше, для дочерней таблицы, но вы не будете ограничены 33 значениями, и у вас может быть 2 или 40. Но во время запроса с нормализованными данными вы можете использовать sum() , counts() и даже группировать данные — и вам не нужно менять код, отчеты или что-то еще, если вы решите использовать 2 или 40 значений.

Комментарии:

1. Спасибо, честно говоря, я вообще не рассматривал VBA, я думал о чем-то более приземленном, например, о создании новой текстовой метки и ручном объединении каждой из других текстовых меток с соответствующими операторами, amp; и

2. Ну, вы могли бы — но с более чем 30 элементами управления, это было бы довольно выражением Гарри Болла. Как уже отмечалось, вы МОЖЕТЕ поместить «= MyFunctionName()» в качестве выражения в текстовое поле, и оно будет работать в форме. Но для формы continues, или, скажем, list или report, тогда, вероятно, возможно длинное ужасное выражение.

3. Я понимаю, и я принял к сведению, но моих элементов управления на самом деле всего 6, я назвал их txt11, txt21 .. с двузначными цифрами, чтобы показать, что они должны следовать соответствующим однозначным — txt1, txt2… — вот почему я все еще ищу более быстрый и аккуратный способ использования amp; и для использования в источнике управления (в данных).