Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: stitze am 17.03.05 - 13:05:41

Titel: Listenfeld
Beitrag 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
Titel: Re: Listenfeld
Beitrag von: koehlerbv am 17.03.05 - 13:09:44
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
Titel: Re: Listenfeld
Beitrag von: stitze am 17.03.05 - 13:16:39
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.
Titel: Re: Listenfeld
Beitrag von: Semeaphoros am 17.03.05 - 13:19:59
Wie schreibst Du denn Bernhards Array in das Feld?

Hoffentlich so:

doc.Listenfeld = aResult
Titel: Re: Listenfeld
Beitrag von: koehlerbv am 17.03.05 - 13:23:19
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
Titel: Re: Listenfeld
Beitrag von: stitze am 17.03.05 - 13:31:39
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.

Titel: Re: Listenfeld
Beitrag von: Semeaphoros am 17.03.05 - 13:34:21
Ach, Du willst die Auswahlliste aufbauen?

Dann in ein Multivalue-Feld (hidden) speichern und per Formel in die Auswahlliste reinnehmen.
Titel: Re: Listenfeld
Beitrag von: koehlerbv am 17.03.05 - 13:39:19
Dieses Konstrukt

For i = 0 To UBound( Array ) + 1

wird zu einem Laufzeitfehler führen, da Ubound + 1 "out of range" ist.

Bernhard
Titel: Re: Listenfeld
Beitrag von: stitze am 17.03.05 - 13:55:49
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 :)
Titel: Re: Listenfeld
Beitrag von: dirk_2909 am 17.03.05 - 14:04:07
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
Titel: Re: Listenfeld
Beitrag von: stitze am 17.03.05 - 14:05:46
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.
Titel: Re: Listenfeld
Beitrag von: dirk_2909 am 17.03.05 - 14:10:06
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
Titel: Re: Listenfeld
Beitrag von: stitze am 22.03.05 - 09:24:54
Hi Dirk,

jo so sollte das klappen, Danke, ich probier das mal ;)
Titel: Re: Listenfeld
Beitrag von: stitze am 23.03.05 - 14:40:12
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
Titel: Re: Listenfeld
Beitrag von: TMC am 23.03.05 - 20:22:54
@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.
Titel: Re: Listenfeld
Beitrag von: Semeaphoros am 23.03.05 - 20:44:10
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)
Titel: Re: Listenfeld
Beitrag von: animate am 23.03.05 - 20:45:50
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)
Titel: Re: Listenfeld
Beitrag von: TMC am 23.03.05 - 20:52:22
Ah, OK, danke für die Erklärung, jetzt verstehe auch ich es  ;)
Titel: Re: Listenfeld
Beitrag von: Semeaphoros am 23.03.05 - 21:31:56
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
Titel: Re: Listenfeld
Beitrag von: koehlerbv am 25.03.05 - 01:13:10
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

Zitat
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