Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: TMC am 07.10.05 - 22:20:24

Titel: Not Urgent: Text in Integer Array
Beitrag von: TMC am 07.10.05 - 22:20:24
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:
Code
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:
Code
	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.
Titel: Re: Not Urgent: Text in Integer Array
Beitrag von: koehlerbv am 07.10.05 - 22:40:29
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:

Code
@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
Titel: Re: Not Urgent: Text in Integer Array
Beitrag von: TMC am 07.10.05 - 22:46:40
Danke schonmal, Bernhard.

Eigentlich will ich bzw. wollen wir eine reine LS Lösung.
Titel: Re: Not Urgent: Text in Integer Array
Beitrag von: koehlerbv am 07.10.05 - 23:23:50
Also wollt Ihr eine LS-Übung abhalten ? Keine Performancesteigerung (quasi via API) ?

Dann würde ich den Code folgendermassen kürzen:

Code
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 ...
Titel: Re: Not Urgent: Text in Integer Array
Beitrag von: flaite am 07.10.05 - 23:53:54
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.
Code
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.
Titel: Re: Not Urgent: Text in Integer Array
Beitrag von: TMC am 08.10.05 - 15:45:39
danke für Eure Antworten.