4 Stimmen

Die LotusScript ArrayUnique-Funktion scheint nicht mit Datum/Uhrzeit-Arrays zu funktionieren

Ich habe versucht, dieses Problem selbst zu lösen, aber vielleicht gibt es etwas, das ich über die Funktionsweise von ArrayUnique missverstehe.

Hier ist etwas Beispiellotusskript-Code:

'Lassen Sie uns einige Daten testen
dateOne = CDat("16.12.2010")
dateTwo = CDat("16.12.2010")
testSuccess = (dateOne = dateTwo)

'Bei der Auswertung ist testSuccess = true

'Jetzt erstellen wir ein Array ...
Dim someArray(1) As Variant
someArray(0) = dateOne
someArray(1) = dateTwo
uniqueArray = ArrayUnique(someArray)

'uniqueArray hat dieselben beiden Elemente ... der Duplikat wurde nicht entfernt

In obigem Beispiel sind dateOne, dateTwo, testSuccess und uniqueArray alle implizit deklarierte Variantvariablen.

Was mache ich falsch? Ich habe in der Hilfe gelesen, wo es heißt:

Verwendung

Elemente in einem Variantenarray werden nur dann als gleich betrachtet, wenn sie vom gleichen Typ sind. Das Variantenarray kann keine Klassen oder Objekte enthalten.

Arrayelemente, die den Nullwert enthalten, werden mit anderen Nullwerten übereinstimmen.

Arrayelemente, die leer sind, werden mit anderen leeren Elementen übereinstimmen.

Nun, das Variantenarray in diesem Beispiel enthält Variantvariablen, die vom Typ Datum/Uhrzeit sind. Also, wenn ich das richtig lese, mache ich nichts falsch.

Bearbeiten: Auf den Notes-Foren hat Benutzer Thoams Kennedy Folgendes versucht:

Wenn Sie die Uhrzeit-Komponente so ausschreiben

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

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

werden sie immer noch als unterschiedlich behandelt. Es scheint keine Millisekunden-Komponente zu geben, also würde ich sagen, dass ArrayUnique nicht weiß, wie man mit DateTime-Varianten umgeht.

Also laut seiner Schlussfolgerung funktioniert ArrayUnique ähm, nicht.

3 Stimmen

Also warte mal, in Notes deklarierst du ein Array der Größe 2 mit Dim someArray(1)? Bekommst du also alle Nachteile von 0-basierten Arrays kombiniert mit allen Nachteilen von 1-basierten Arrays? AHAHAHAHAHAHAHAHAHAHAHA

0 Stimmen

@BlueRaja: Warum lachst du über meinen Schmerz? ;-)

1 Stimmen

Eigentlich ist das syntaktischer Zucker für Dim someArray(0 To 1) mit dem weggelassenen unteren Grenze. Was Sie dimensionieren, ist die obere Begrenzung des Arrays (unter der Annahme von Null als untere Grenze), nicht seine Länge.

2voto

Pandincus Punkte 9396

Nun, das funktioniert:

%REM
    Funktion ArrayUniqueStringCompare
    Da ArrayUnique in einigen Fällen nicht zu funktionieren scheint (z. B. bei Datum/Uhrzeit-Werten),
    Konvertieren wir alle Elemente zuerst in Strings und führen dann ArrayUnique aus.
    Nach dem Durchführen von unique können wir wieder in den originalen Typ konvertieren.
    Dies wird abstürzen, wenn sourceArray kein Array ist.
%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
    'Jetzt die eindeutigen Werte erhalten...
    uniqueArray = ArrayUnique(stringArray)
    upperLimitUnique% = UBound(uniqueArray)
    'Schließlich die Werte wieder in ihren ursprünglichen Datentyp konvertieren
    Dim returnArray() As Variant
    ReDim returnArray(upperLimitUnique%)
    For i% = 0 To upperLimitUnique%
        If typeOfElement$ = "DATUM" Then
            returnArray(i%) = CDat(uniqueArray(i%))
        End If
    Next
    ArrayUniqueStringCompare = returnArray
End Function

Aber das kann doch sicher nicht die beste Lösung sein, oder? Es muss doch einen besseren Weg geben, um ArrayUnique zum Laufen zu bringen...

2voto

Ken Pespisa Punkte 21474

Ich habe einige Tests gemacht und es sieht so aus, als ob ArrayUnique einfach den LS-Datentyp 7 (Datum/Uhrzeit) nicht verarbeiten kann. Intern sind die Datentypen als Doubles gespeichert, daher können Sie sie in Doubles konvertieren, um dies zum Laufen zu bringen.

Zum Beispiel:

'Lassen Sie uns jetzt ein Array erstellen ...
Dim someArray(1) As Variant 
someArray(0) = Cdbl(dateOne)
someArray(1) = Cdbl(dateTwo)
uniqueArray = ArrayUnique(someArray)

uniqueArray wird nur ein Element haben.

Alternativ können Sie dateOne und dateTwo als Doubles deklarieren, bevor Sie ihnen die Datumswerte zuweisen, und das scheint auch gut zu funktionieren.

0 Stimmen

Vergessen zu erwähnen, hier gibt es einige gute Informationen zu LS-Daten: searchdomino.techtarget.com/tip/0,289483,sid4_gci489484,00.h‌​tml

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X