2010-12-16 39 views
4

我試圖找出我自己的這個問題,但也許有什麼我誤解ArrayUnique的工作方式。LotusScript 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都是隱式聲明的變體的變量。

我在做什麼錯?我在閱讀the help那裏說:

使用的變量數組

元素,如果他們是同一類型的,只會比較相等。變體數組不能包含類或對象。

包含空值的數組元素將與其他空值匹配。

空的數組元素將與其他空的元素相匹配。

那麼,在本實施例中,變體數組包含變體變量,這些變量的日期/時間的類型。所以,如果我正確地閱讀這篇文章,我沒有做錯任何事情。

編輯:Notes Forums,用戶Thoams肯尼迪嘗試了以下內容:

如果你拼寫出時間分量這樣

dateOne = CDAT(「12/16/2010上午4點20分17秒 「)

dateTwo = CDAT(」 12/16/2010上午4點20分17秒「)

它仍然會將他們視爲不同的人。似乎沒有毫秒級的組件,所以我會說ArrayUnique不知道如何處理DateTime變體。

所以他的結論是ArrayUnique umm,不起作用。

+3

所以等待,在Notes中使用'Dim someArray(1)'聲明一個大小爲2的數組?因此,您可以將基於0的數組*的所有缺點與基於1的數組的所有缺點結合起來? AHAHAHAHAHAHAHAHAHAHAHA – 2010-12-16 19:37:07

+0

@BlueRaja:你爲什麼笑我的痛苦? ;-) – Pandincus 2010-12-16 19:41:40

+1

實際上,這是'Dim someArray(0到1)'的語法糖,省略了下界。你所估計的是數組的上限(假設爲下限),而不是其長度。 – 2010-12-17 02:00:54

回答

2

我做了一些測試,它看起來像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設置爲雙精度,然後再爲它們指定日期值,而且這似乎也可以正常工作。

+0

忘了提及,LS日期有一些很好的信息:http://searchdomino.techtarget.com/tip/0,289483,sid4_gci489484,00.html – 2010-12-17 01:38:28

2

那麼,這個工程:

%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工作...