Hi,
ich habe hier zur Zeit einen sehr eifrigen Praktikanten. Er ist wirklich engagiert, und hat einige Programmier-Vorkenntnisse in VB und PHP.
Da er gut ist, darf er nun selbständig ein paar unserer produktiven Notes-Datenbanken verbessern.
Ausgangssituation:
DB mit Haupt- und Antwort - Doks. Hauptdoks haben eine ID. Zahlenfeld, Mehrfachwerte. D.h. es können dort 1-x IDs eingetragen werden.
Darunter hängen Antwort-Docs, die u.a. die ID vom Hauptdokument übernehmen. Auch Zahlenfeld, Mehrfachwerte, Computed when composed.
Nun soll per Button einem bestehenden Antwort-Dokument ein anderes Hauptdokument zugeordnet werden können . Dafür nimmt er den Code aus Best Practices (http://www.atnotes.de/index.php?topic=13984.0).
Damit die Auswahl über Picklist sauber klappt, wird das ID-Feld über
@Implode(@Text(cID); ",") umgewandelt, weil es eben mehrere Zahlen enthalten kann.
In LotusScript hat man dann letztendlich z.B. folgendes in einem String:
strQuelle = "10526,10527,10530"
strQuelle = "10532"
strQuelle = "10535,10537"
Ziel:
Jetzt geht es darum, dieses String wieder in ein Feld (Zahl, Mehrfachwerte) zurückzuschreiben.
Er hing da, daher hab ich ihm schnell was geschrieben:
Dim vIDArray As Variant
Dim intUboundID As Integer
Dim intLoop As Integer
vIDArray = Split(strQuelle, ",")
intUboundID = Ubound(vIDArray)
Dim lngResultArray() As Long
For intLoop = 0 To intUboundID
Redim Preserve lngResultArray(intLoop) '// Although redim is no good in loops due to performance, we use it here since we do not expect many elements
lngResultArray(intLoop) = Clng(vIDArray(intLoop))
Next intLoop
Was passiert da: per "Split" Funktion in String-Array. Dann String-Array abarbeiten und die Elemente in ein Long Array schreiben.
Ehrgeizig und frech wie mein Praktikant ist, meint er nun, dass das eher ein Würgaround ist. Er hat auch Recht.
Mir fällt aber nichts gescheites dazu ein. Ihm natürlich auch nicht.
Habt Ihr bessere Vorschläge, ein solches String wieder in ein Zahlenfeld mit Mehrfachwerten zu bringen?
Kurzzusammenfassung:
Ein String, das Integer mit Mehrfachwerte enthalten kann (getrennt durch Komma) soll per LS (Backend) in ein Item geschrieben werden, das vom Typ Zahl ist mit Mehrfachwerten.
Meine Methode funktioniert, aber eigentlich wäre was eleganteres netter.
Wie wäre es mit dem guten Evaluate ? Gegeben sei ein Feld namens cID, das einen skalaren Wert (String) enthält, der als Zahlenliste interpretierbar wäre:
@TextToNumber (@Explode (cID; ","))
So wird daraus sehr maschinennah wieder eine Integerliste.
Oder willst Du eine Lösung pur in LS ? Das geht dann auch noch eleganter, aber nicht so "nativ" wie via Evaluate.
Bernhard
Also wollt Ihr eine LS-Übung abhalten ? Keine Performancesteigerung (quasi via API) ?
Dann würde ich den Code folgendermassen kürzen:
Dim vIDArray As Variant
Dim lngResultArray() As Long
Dim intLoop As Integer
vIDArray = Split(strQuelle, ",")
Redim lngResultArray (Ubound (vIDArray))
For intLoop = 0 To Ubound (vIDArray)
lngResultArray(intLoop) = Clng(vIDArray(intLoop))
Next intLoop
Ein direkterer und vor allem schnellerer Weg, ein Array of Strings in ein Array of Longs umzuwandeln als via Evaluate umzuwandeln, ist mir nicht bekannt. Im wesentlichen kann ich nur das "Preserve" aus Deinem Code streichen.
Servus,
Bernhard :)
EDIT: Doppelte Deklaration von vIDArray gelöscht ...
Du kannst vielleicht höchsten versuchen dir eigene split Funktion zu schreiben, die einen Array aus Integers erzeugt (oder Long).
Besonders sinnvoll find ich das nicht.
Wenn du Performance willst nimmst du Bernhards Vorschlag mit Evaluate (find ich am besten).
Ich versteh auch deine grundsätzliche Ablehnung gegen dieses stabil funktionierende Feature nicht.
Das einzige Argument gegen evaluate, das mir einfällt, ist, dass es vom Abstraktionsniveau vielleicht nicht so gut zu dem RestSkript passt.
Aber du kannst es ja in eine Skriptlibrary packen (z.B. ArrayBuilders). Dann hast du eine wirklich kurze Funktion mit evaluate. Diese kann jederzeit isoliert getestet werden und im Skript stört es auch nicht weiter. Der Aufruf könnte so aussehen.
longArray = buildLongArray(feldWert, ",")
Genau das ist Kappselung.
Wenn nicht dann nimmst du die Lösung mit dem temporären String-Array.
Btw. ist es meines Wissens auch nicht mit Java möglich schnell mal eben den Datentyp eines Arrays zu ändern.