Domino 9 und frühere Versionen > Entwicklung

Problem mit Zahl-Feld, Double, Print bzw. For-Schleife

(1/2) > >>

Sascha Seipp:
Moin allerseits!

Ich hab folgendes Problem:
Ich will eine (Hilfs-)Maske benutzen mit den Feldern 'StartSN' und 'Anzahl', beide vom Typ Zahl. Nun soll per LotusScript eine Schleife durchlaufen werden, die <Anzahl> neue Dokumente erstellt, in denen das Feld 'SN' mit der StartSN beginnt und dann entsprechend hochgezählt wird.
Dabei stolpere ich dauernd über einen Type Mismatch.
Das geht soweit, daß ich das Feld StartSN im NotesDocument actbedoc nicht per
  Print actbedoc.StartSN
ausgeben kann (Type Mismatch).

  Print Typename(actbedoc.StartSN)
liefert 'DOUBLE()', was Print doch eigentlich konvertieren bzw. ausgeben können sollte? CInt() hat auch nix gebracht, und
  For newSN = StartSN To StartSN + Anzahl
ging entsprechend völlig schief.

Hab ich nen Denkfehler, oder mach ich irgendwas völlig falsch?  ???
Ich kann dem Frontend ja schlecht beibringen, daß die Zahlenfelder nur Integers enthalten sollen, oder?

Ciao
Sascha

flaite:
LotusScript ist strongly typed.

--- Zitat ---print actbedoc.StartSN

--- Ende Zitat ---
ist ein Array. Du kannst das machen: print actbedoc.StartSN(0). Durch diese "Kurzschreibweise" wird der Inhalt des ersten Elements des Arrays des Feldes automatisch in String konvertiert. print benötigt als Argument String.

Double() heisst: Ein Array von Doubles. Das ist was anderes als ein Double.

Um den Typen des Feldes zu behalten und gleichzeitig den ersten Eintrag des Feldes zu bekommen, geht so was:

--- Code: ---Dim startSN as Double
startSN = actbedoc.getItemValue("StartSN")(0)

--- Ende Code ---
In realen Anwendungen würde ich aber da noch ein bischen Type-checking zwischenschieben. Zumindest hast du schon mal erkannt, dass es sowas wie TypeName überhaupt gibt. Letztlich kannst du dir bezüglich des Datentyps eines Feldes in einem Notesdokument nicht sicher sein.
Um double als Integer zu nutzen, musst du es afaik in integer um-casten.

--- Code: ---Cint (startSN)
--- Ende Code ---

Sascha Seipp:
Hallo Axel!

Arghl! Diese (unvermuteteten) Arrays machen mich noch wahnsinnig!
Aber es is auch nicht weiter verwunderlich - ich wurschtele grade als Quereinsteiger munter drauf los mit einem eher allgemein gehaltenen Buch und der Notes Designer-Hilfe. (Aber immerhin mit Vorkenntnissen aus anderen Programmiersprachen). Weil ich das ganze im Moment eher freiwillig als mit "offiziellem Chef-Auftrag" mache. Wenn mein erster Entwurf für gut befunden wird und da mehr draus wird, hole ich mir auch noch ein bißchen bessere Doku - bis dahin nerve ich nochmal hier und da im Forum, wenn ich auf Anhieb nix Passendes finde... :-)

Jedenfalls danke für die Erleuchtung!

Ich finde es ein wenig doof, daß ich mit der (FrontEnd-)Definition eines Feldes so wenig bestimmen kann, was nachher für ein Datentyp bei rauskommt. Wenn ich im Designer sage, es sollen keine Mehrfachwerte erlaubt werden, sollte doch klar sein, daß das kein Array ist, oder?
Aber das ist wohl der Preis für die Flexibilität...

Was deinen letzten Hinweis betrifft:
Das müßte dann
--- Code: ---Cint(StartSN(0))
--- Ende Code ---
heißen, oder wandelt Cint auch das ganze Array um, sodaß ich dann wieder mit
--- Code: ---int_StartSN = Cint(StartSN)
int_StartSN(0)
--- Ende Code ---
an den Wert komme?
Werd ich gleich mal probieren...

Ciao
Sascha

koehlerbv:
Du musst zwischen Front- und Backend unterscheiden: Erstes bestimmt Anzeige und Eingabe, letzteres sind die "wahren Werte".
Und: Ausser Rich Text sind Items (Backend) IMMER Arrays.

Konvertierungs-Functions wie Cint, Cdat etc. arbeiten immer nur mit skalaren Werten. Dafür kannst Du eine Zahl aus einem Item auch direkt einer Integer-Variable zuweisen.

Weiters: Wenn in einer Maske "Mehrfachwerte erlauben" bestimmt ist, betrifft das wieder nur die Frage "Eingabe" und hat nichts mit dem Backend zu tun. Dort kannst Du deshalb immer noch Arrays einwerfen. Andererseits kannst Du Dir ein Dokument auch mit fünf unterschiedlichen Masken darstellen lassen ...

Bernhard

Sascha Seipp:
Moin Bernhard!

Nur nochmal zur Vergewisserung der Unterschiede, bezogen auf ein Folgeproblem: Wenn ich im FrontEnd für ein Feld einen berechneten Vorgabewert habe, kann ich die Neuberechnung mit
--- Code: ---uidoc.Refresh
--- Ende Code ---
erzwingen.

Da das Backend aber keine Vorgabewert kennt, gibt's da sowas auch nicht, ergo kann ich auch nicht auf die im FE definierten Vorgabewert-Formeln zurückgreifen (ohne ins FE zu wechseln), richtig?

Ciao
Sascha

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln