Функция LotusScript ArrayUnique, похоже, не работает с массивами даты / времени - PullRequest
4 голосов
/ 16 декабря 2010

Я пытался разобраться в этой проблеме самостоятельно, но, возможно, есть кое-что, что я неправильно понимаю о том, как ArrayUnique работает.

Вот пример LotusScript кода:

'Let's test some dates
dateOne = CDat("12/16/2010")
dateTwo = CDat("12/16/2010")
testSuccess = (dateOne = dateTwo)

'On evaluation, testSuccess = true

'Now let's make an array ...
Dim someArray(1) As Variant
someArray(0) = dateOne
someArray(1) = dateTwo
uniqueArray = ArrayUnique(someArray)

'uniqueArray has the same two elements ... the duplicate hasn't been removed

В приведенном выше примере dateOne, dateTwo, testSuccess и uniqueArray - все неявно объявленные переменные варианта.

Что я делаю неправильно?Я прочитал в справку , где говорится:

Использование

Элементы в массиве вариантов будут сравниваться равными, только если онитого же типа.Вариантный массив не может содержать классы или объекты.

Элементы массива, содержащие нулевое значение, будут совпадать с другими нулевыми значениями.

Пустые элементы массива будут совпадать с другими пустыми элементами.

Ну, вариантный массив в этом примере содержит вариантные переменные типа даты / времени.Так что, если я правильно читаю, я не делаю ничего плохого.

Редактировать: На форумах Notes , пользователь Thoams Kennedy попытался сделать следующее:

Если вы укажете компонент времени, как это

dateOne = CDat ("16.12.2010 04:20:17 AM")

dateTwo = CDat ("16.12.2010 04:20:17 AM")

все равно будет обрабатывать их как отдельные элементы.Компонент, похоже, не содержит миллисекунды, поэтому я бы сказал, что ArrayUnique не знает, как обращаться с вариантами DateTime.

Поэтому он пришел к выводу, что ArrayUnique, ммм, не работает.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Я провел некоторое тестирование, и похоже, что ArrayUnique просто не может обрабатывать данные типа LS 7 (Дата / Время). Внутренне типы данных хранятся в виде двойных чисел, поэтому вы можете преобразовать их в двойные и обратно, чтобы заставить это работать.

Например:

'Now let's make an array ... 
Dim someArray(1) As Variant 
someArray(0) = Cdbl(dateOne)
someArray(1) = Cdbl(dateTwo)
uniqueArray = ArrayUnique(someArray)

uniqueArray будет иметь только один элемент.

В качестве альтернативы вы можете Dim dateOne и dateTwo как Doubles до того, как назначить им значения даты, и это, кажется, тоже работает хорошо.

2 голосов
/ 16 декабря 2010

Ну, это работает:

%REM
    Function ArrayUniqueStringCompare
    Since ArrayUnique doesn't seem to work in some cases (such as with date/time values),
    Let's convert all of the elements to string and then perform arrayunique.
    After performing unique, we can convert back to original type
    This will crash if sourceArray is not an array.
%END REM
Function ArrayUniqueStringCompare(sourceArray As Variant) As Variant
    typeOfElement$ = TypeName(sourceArray(0))
    upperLimitSource% = UBound(sourceArray)
    Dim stringArray() As String
    ReDim stringArray(upperLimitSource%)
    For i% = 0 To upperLimitSource%
        stringArray(i%) = CStr(sourceArray(i%))
    Next
    'Now get the unique values...
    uniqueArray = ArrayUnique(stringArray)
    upperLimitUnique% = UBound(uniqueArray)
    'Finally, convert the values back to their original data type
    Dim returnArray() As Variant
    ReDim returnArray(upperLimitUnique%)
    For i% = 0 To upperLimitUnique%
        If typeOfElement$ = "DATE" Then
            returnArray(i%) = CDat(uniqueArray(i%))
        End If
    Next
    ArrayUniqueStringCompare = returnArray
End Function

Но, конечно, это не может быть лучшим решением, верно?Должен быть лучший способ заставить работать ArrayUnique ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...