Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: stitze am 17.03.05 - 13:05:41
-
Moinsen ihr Allwissenden ;)
so ich habe einen Array mit Daten und möchte diese daten nun in ein listenfeld schreiben.
Ich mache das wie folgt:
For i = 0 To UBound( Array ) + 1
String = String + Array(0, i) + ";" + Array(1,i) + Chr(13) + Chr(10)
Next
doc.Listenfeld = String
Jedoch bekomme ich immer nur den Wert der Dimension [0,0] und [0, 1], der Rest wird aber nicht angezeigt, obwohl alle Daten in dem String entahlten sind.
Das ganze geschiet im Queryopen der Maske. Mhh sonst noch was... ich denke das wars an info. Jemand einen plan???
Mfg
stitze
-
Das Semikolon ist kein Trenner für Listenfelder - sie spielen nur bei der Eingabe, ggf. bei der Ausgabe im FrontEnd eine Rolle.
Dim aResult () as string
Redim aResult (0 to Ubound (Array)
For i = 0 To UBound( Array ) + 1
aResult (i) = Array(0, i) & ";" & Array(1,i)
Next
So in etwa ...
Bernhard
-
Hallo Bernhard
das Semikolon soll nicht als trennzeichen dienen, sondern einfach mit im feld stehen, der Cr (Chr(13) und Lnf (Chr(10), dient eigentlich dazu einen neuen Datensatz anzuzeigen, davon bin ich jedenfalls ausgegangen weil das so gepeichert wird, wenn ich die per hand eingebe.
wenn ich es auf deine weise mache steht gar kein datensatz drinne.
-
Wie schreibst Du denn Bernhards Array in das Feld?
Hoffentlich so:
doc.Listenfeld = aResult
-
Noch ein Hinweis: Der String-Concenator ist nicht das "+", sondern "&". Und für die Zeilenschaltung reicht Chr$ (10) (beachte das $).
Ist das doc.Listenfeld ein Multivalue-Field ?
Bernhard
-
mh ich schreibe den array gar nicht direkt in das listenfeld sondern basstel mit erst nen string zusammen? nicht richtig so?
ne ein ein single value feld, besagt doch nur das ich einen wert auswählen darf oder?
wir sind gezwungen durch styleguide den + operator zum konkatieneiern zu benutzen, ich weiss die diskussion hatten wir schonmal ich hab auch hier im betrieb darauf verwiesen aber ... naja.
-
Ach, Du willst die Auswahlliste aufbauen?
Dann in ein Multivalue-Feld (hidden) speichern und per Formel in die Auswahlliste reinnehmen.
-
Dieses Konstrukt
For i = 0 To UBound( Array ) + 1
wird zu einem Laufzeitfehler führen, da Ubound + 1 "out of range" ist.
Bernhard
-
Zu Eins, ja ich möchte eine Auswahlliste aufbauen, aber es soll nur möglich sein 1 wert auszuwählen.
zu zwei, nee führt nicht zu nem out of range ;), wenn ich nicht plus 1 addiere läuft er die schleife einmal zu wenig durch, hat mich auch gewundert, aber es ist so, schwöre :)
-
Wenn Du eine Auswahlliste aufbauen willst, dann brauchst dum dem Feld nicht die Werte übergeben.
Du musst die Werte einem berechneten mehrfachwerte Feld (evtl- berechnet zur Anzeige, Wert = FeldName) zuweisen.
Deswiteren brauchst Du ein zweites Feld vom Typ Dialogliste (Beispiel). In der "Formel für Auswahl" trägst Du das 1. feld ein.
Dirk
-
Ich will das feld aber über ls füllen und nicht über ne formel oder sonst was und ich will auch kein dialogfeld um das feld zu füllen.
-
Ich habe auch nicht bestritten, dass das Feld per LS befüllt wird.
Du hast gesagt, dass es möglich sein soll 1 Wert auszuwählen. Dazu musst Du dem Benutzer eine Auswahlliste zur Verfügung stellen.
Beispiel:
Feld 1 = tmpMyAuswahl = berechnet zur Anzeige, mehrfachwerte
Feld 1 wird über LS befüllt.
Feld 2 = fldAuswahl = bearbeitbar, Listenfeld (oder was du auch immer möchtest), keine Mehrfachwerte zulassen
Formel für Auswahl = tmpMyAuswahl
Dirk
-
Hi Dirk,
jo so sollte das klappen, Danke, ich probier das mal ;)
-
Jo danke Dirk so hat es funktioniert.
Gibt es aber keine Möglichkeiten Werte direkt in ein Listenfeld zu schreiben, ich denke da zum Beispiel an ReplaceItemValue.
Oder kann ich einen Array an ein Listenfeld übergeben oder ne Textliste???
Mit freundlichen Grüßen
stitze
-
@Stitze
Gibt es aber keine Möglichkeiten Werte direkt in ein Listenfeld zu schreiben, ich denke da zum Beispiel an ReplaceItemValue.
Oder kann ich einen Array an ein Listenfeld übergeben oder ne Textliste???
Ich glaube Du verwechselst hier die Begriffe Array/Textliste/Listenfeld bzw. Dir ist der Unterschied nicht klar. Schau Dir das mal in der Designerhilfe und/oder in einem Buch an.
Natürlich kannst Du mit der ReplaceItemValue Methode der NotesDocument-Klasse direkt in ein Item z.B. Werte schreiben. Das hast Du doch oben schon gemacht mit "doc.Listenfeld = StringArray" ??? Du hast Da nur die "Extended Class"-Syntax angewendet, siehe Designerhilfe unter der ReplaceItemValue-Methode.
@Bernhard
For i = 0 To UBound( Array ) + 1
wird zu einem Laufzeitfehler führen, da Ubound + 1 "out of range" ist.
Ich bin mir jetzt nicht sicher was Du hier mit "Out of Range" meinst. UBound gibt doch ein Integer zurück. Ich würde da jetzt erwarten dass die For-Schleife dann eben zum Ubound-Rückgabewert + 1 durchlaufen wird, aber kein "out of Range"...
Eher hätte ich hier die Befürchtung, dass der Veriablenname "Array" intern schon vergeben ist. Bin mir aber nicht sicher, scheinbar ist des das nicht. Sollte man IMHO aber trotzdem vermeiden.
-
Aus allem, was gesagt wurde, befürchtet Bernhard, dass es einen "Subscript out of range" gibt, was durchaus naheliegend ist, falls man mit der Laufvariablen hier auf die Array-Elemente zugreifen will (was ja normalerweise der Sinn einer solchen Schlaife ist)
-
Ich bin mir jetzt nicht sicher was Du hier mit "Out of Range" meinst. UBound gibt doch ein Integer zurück. Ich würde da jetzt erwarten dass die For-Schleife dann eben zum Ubound-Rückgabewert + 1 durchlaufen wird, aber kein "out of Range"...
Ich denke er meint, dass es in dieser Zeile passiert:
aResult (i) = Array(0, i) & ";" & Array(1,i)
weil i beim letzten Durchlauf ja um 1 größer wäre als die Arraybound selber. Das würde ich auch annehmen. Kann sein, dass da vielleicht die Option gesetzt ist, die das Zählen bei Arrays erst bei 1 anfangen lässt (Option Base 1, glaube ich)
-
Ah, OK, danke für die Erklärung, jetzt verstehe auch ich es ;)
-
Thomas, wenn Option Base 1 gesetzt ist, müsste im Gegenzug i=1 statt i=0 genommen werden in der For-Schleife, sonst gibts dasselbe Problem an der anderen Seite des Arrays
-
Danke, Jens, für Deine Erklärung von der "unteren Seite" her und für die weitere Beachtung des Threads.
Für "stitze": Jeglicher Zugriff auf Elemente mit Indizes ausserhalb von Lbound und Ubound des Array führen GARANTIERT zu eine out-of-range error. Garantiert. Da kannst Du schwören, was Du willst. Das einzige, was Du da noch treiben kannst, ist ein Redim innerhalb der Schleife, sonst scheppert es zwangsläufig. Poste einen Code, der das Gegenteil beweist, oder schweige still ;D
Oder kann ich einen Array an ein Listenfeld übergeben oder ne Textliste???
Doch, sicher. Du kannst jedes Array direkt einem Item zuweisen:
Dim aTest (0 to 2) As String
aTest (0) = "A"
aTest (1) = "B"
aTest (2) = "C"
docCurrent.ListField = aTest
Ganz einfach ...
Bernhard