Как отфильтровать нулевые элементы массива в MS Access

Я генерирую заголовки из нескольких других полей, и мне нужен «правильный» способ:

Me.Title.Value = Join(Array([Conference], [Speaker], partstr), " - ")

За исключением того, что любой из [конференция], [докладчик] или partstr может иметь значение null, и мне не нужны лишние "-". Есть ли какие-нибудь функции, которые упростят эту работу?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
0
1 419
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет - вам нужно будет проверить каждую, а затем очистить в конце

Dim Temp As String

If Not IsNull([Conference]) Then
  Temp = Temp & [Conference] & " - "
End If

If Not IsNull([Speaker]) Then
  Temp = Temp & [Speaker] & " - "
End If

If Not IsNull(partstr) Then
  Temp = Temp & partstr & " - "
End If

If Temp > "" then
  Me.Title.Value = Left(Temp, Len(Temp) - 3)
Else
  Me.Title.Value = Null
End If

Пересмотрено с общей функцией:

Public Function JoinEx(ByVal pArray As Variant, ByVal pDelimiter As String) As String

  Dim sTemp As String
  Dim iCtr As Integer

  For iCtr = 0 To UBound(pArray)
    If Not IsNull(pArray(iCtr)) Then
      sTemp = sTemp & pArray(iCtr) & pDelimiter
    End If
  Next

  If sTemp > "" Then
   JoinEx = Left(sTemp, Len(sTemp) - Len(pDelimiter))
  End If

End Function

Пример вызова:

 JoinEx(Array("one","two","three"), " - ")  'Returns "One - Two - Three"
 JoinEx(Array(null,"two","three"), " - ")  'Returns "Two - Three"

Я все еще надеюсь на лучший ответ, я сделаю это несколько раз и не хочу дублировать столько кода.

Thelema 25.11.2008 22:24

Я чувствую вашу боль - однако, приложив немного больше усилий, вы могли бы создать общую функцию, которая принимает массив и разделитель и возвращает строку.

DJ. 25.11.2008 22:27

ах, это больше похоже на это. Я бы дал вам еще один голос, если бы мог.

Thelema 25.11.2008 22:50

Эксперты говорят, что объединение поля, возможно, Null, со строкой нулевой длины и проверка ее длины быстрее, чем простая проверка на Null или сравнение объединенного результата с ZLS. И, кстати, всякий раз, когда вам понадобится ZLS в Access VBA, обязательно используйте константу vbNullString вместо "".

David-W-Fenton 28.11.2008 06:40

Полное переписывание и на этот раз должным образом протестировано:

 IIf(IsNull(Partstr), IIf(IsNull(Conference), Speaker, Conference & " - " + Speaker), Conference + " - " & Speaker + " - " & Partstr)

Если один из элементов имеет значение NULL, это превращает весь результат в NULL, чего, я не думаю, хочет OP.

DJ. 25.11.2008 21:25

Извините, remou все равно не сработает - если [конференция] имеет значение null, а другие нет - ваше решение вернет «None» вместо «Speaker - Partstr»

DJ. 25.11.2008 22:04

Вы правы, поэтому я все это переделал, уделив больше внимания :(

Fionnuala 26.11.2008 03:20

Другие вопросы по теме