Autor Thema: Array zu groß für Feld  (Gelesen 3177 mal)

Offline SD

  • Aktives Mitglied
  • ***
  • Beiträge: 164
Array zu groß für Feld
« am: 06.10.17 - 20:05:28 »
Hallo!

Ich stocke gerade an einem Problem und bin fast bei einer Lösung, aber leider nicht ganz.

Ich habe ein Array, das ziemlich groß werden kann. Am Ende packe ich dieses Array in ein NotesItem. Bekanntermaßen geht das aber nur bis 64KB.

Ich könnte prinzipiell damit leben kurz vor 64KB aufzuhören den Array zu befüllen, allerdings scheitere ich daran festzustellen, wann es soweit ist.

Eigentlich macht LenB() fast genau das, was ich brauche, aber das scheint nicht mit Arrays zu funktionieren, nur mit Strings und in Strings umwandelbaren Dingen. Die Designer-Hilfe behauptet es ginge auch mit einer "Variant expression that includes a variable name". Was ich habe ist ein Variant, den ich auf die benötigte Größe ReDim'e und dann befülle. Aber LenB() gibt mir einen Type mismatch. "meinItem.Values = meinVariantArray" gibt mir "Notes error: Adding entry will cause text list to exceed 64K. Entry not added.".

Gibt es irgendeine Chance beim Befüllen des Array zu prüfen, ob damit die 64K überschritten werden (und das weitere Befüllen dann gegebenenfalls zu unterlassen)? Sowas wie LenB() für Arrays? Wenn alle Stricke reißen, könnte ich den Array wahrscheinlich jedes mal Imploden, aber ich hatte gehofft das geht irgendwie geschickter.

Gruß
Stefan

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Array zu groß für Feld
« Antwort #1 am: 09.10.17 - 08:23:41 »
Müssen die Daten des Feldes irgendwo in einer Ansicht angezeigt werden?

Ansonsten würde ich entweder ein Richtextfeld verwenden, oder NotesItem.IsSummary = False setzen. Dann gehen wesentlich mehr Daten in das Feld.

Wenn das für Dich nicht praktikabel ist, dann errechne Dir doch die Länge Deines Arrays einfach immer selbst.

Jedesmal, bevor Du einen Array- Wert addierst addierst Du dessen Länge auf:

Code
Dim lngLen as Long
lngLen = lngLen + Len( strToAddToArray )
if lngLen < 60000 then
   array(i) = strToAddToArray
Else
   '- neues Dokument? Neues Item? was auch immer....
   lngLen = 0
End If
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Array zu groß für Feld
« Antwort #2 am: 09.10.17 - 14:16:03 »
Es geht, ganz grundsätzlich, auch länger als 64KB wenn man das Array in einen String konvertiert und den dann in einem Richtext Feld speichert. Man verliert dann zwar ein paar Funktionen, vor allem in Ansichten, aber die Daten abspeichern kann man. Und man bringt das auch wieder in einen Script String und vom String aus auch in eine Liste oder ein Variant.

Entgegen der landläufigen Meinung kann einen String Variable in Lotus Script nämlich deutlich mehr as 32/64 KB an Zeichen aufnehmen.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Array zu groß für Feld
« Antwort #3 am: 09.10.17 - 15:04:02 »
Und man bringt das auch wieder in einen Script String und vom String aus auch in eine Liste oder ein Variant.
Damit habe ich schlechte Erfahrung gemacht bzw. werden ab einer bestimmten Größe automatisch Zeilenumbrüche erzeugt.
Richtext zur Anzeige ist OK, wenn man die Daten aber wieder auslesen möchte, dann sollte man das mit mehreren Items und dem Setzten des Summary-Flags tun.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Pyewacket

  • Senior Mitglied
  • ****
  • Beiträge: 310
  • Geschlecht: Männlich
Re: Array zu groß für Feld
« Antwort #4 am: 09.10.17 - 15:12:04 »
Ich stand auch mal vor so einem Problem.
Ich hab das Array 64k-weise in ein Hilfsarray umkopiert und dann dieses
in jeweils einem Item gespechert dessen Name eine fortlaufende Nummerierung hatte.
Also z.B. Array Element 0-200 war dann in item_1 gespeichert, die
Elemente 201-250 waren dann in item_2 usw.
In Item_0 war die Gesamtzahl Arrayelemente gespeichert.
ATOS.org - Feel the music!

Offline SD

  • Aktives Mitglied
  • ***
  • Beiträge: 164
Re: Array zu groß für Feld
« Antwort #5 am: 09.10.17 - 16:28:23 »
Mehrere Notes-Items wäre wohl auch der Workaround, den ich nehmen würde, wenn ich unbedingt einen bräuchte.

RichText-Abenteuer wollte ich an der Stelle eigentlich vermeiden.

Konkret benutze ich das NotesItem in einem temporären Dokument, dem ich eine Maske zuweise und es dann in den Body einer Mail rendere. Das ist ein ganz prima Weg, um aufwendiger formatierte Mails nach einheitlichem Design zu gestalten. Die variablen Teile füllt man einfach als Felder, rendert das ganze Ding und ab geht die Mail.

Ich nutze hier die Möglichkeit Mehrfachwerte in einem Feld in neuen Zeilen darzustellen. So kann ich schön eine Tabelle mit mehreren Spalten befüllen und das sieht in der Mail dann ordentlich aus. Wenn da mehr Daten in dem Feld landen, als es verträgt, hat der User mutmaßlich eigentlich eh schon etwas sinnloses gemacht. Die Daten sind eigentlich zum lesen bestimmt und niemand liest tausende Zeilen. Aber wie User halt so sind, tun sie manchmal auch Dinge, die sie nicht tun sollten. Und dann sollte nicht das Script auf die Bretter gehen, da sonst dieses Feld komplett leer bleibt in der Mail.

Darum nutze ich jetzt die Idee die Größe des Arrays laufend aufzuaddieren. Wenn die 64KB zu Nahe kommen, ersetze ich das Ende durch eine Meldung, die dem User freundlich aber bestimmt erklärt, was er falsch gemacht hat, und schreibe keine weiteren Daten in den Array. Das ist für meine Zwecke ausreichend. Ansonsten würde ich wahrscheinlich großzügig weitere Felder untereinander setzen und diese dann in 64KB-Häppchen befüllen. Am Ende wird ja eh alles in den Mail-Body gerendert.

Vielen Dank für Eure Tipps!

Gruß
Stefan

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz