Autor Thema: Tabellen mit LotusScript und @Formeln  (Gelesen 3582 mal)

Offline jr

  • Senior Mitglied
  • ****
  • Beiträge: 260
  • Geschlecht: Männlich
  • Bitte keine eierlegenden Wollmilchsäue...
    • Homepage
Tabellen mit LotusScript und @Formeln
« am: 14.03.05 - 14:17:52 »
Hallo zusammen.

Ich hatte in einem Projekt die Aufgabe, eine Tabelle aus 11 Spalten dynamisch zu machen. Es werden mehr Zeilen beutzt als angezeigt werden können. Die Anzeige ist auf 15 Zeilen beschränkt, womit man auf 11 x 15 = 165 Felder kommt.

Mit zwei Buttons soll man die Tabelle nach oben oder unter scrollen können. Ich habe die ganze Funktionalität in eine Klasse gepackt und dann Funktionen geschrieben, mit denen ich einzelne Spalten verschieben konnte:


i = doc.nFirstRow(0)
For ix = i To i + ROWS - 1
   Call doc.ReplaceItemValue(fieldName & (ix - i + 1), array(ix))
Next


In nFirstRow wird der aktuelle Startindex und die alle vorhandenen Werte werden im Array "array" gespeichert. ROWS ist eine Konstante und gibt mir die Anzahl der Zeilen an. Das Ganze wird für jede Spalte (also insgesamt 11 x ausgeführt).

Ergebnis: Um die Tabelle um eine Zeile nach oben zu schieben braucht Notes knapp 5 Sek.  :'(

Das konnte ich meinem Kunden unmöglich zumuten, also ging ich einmal hin und habe die reine Verschiebung mit @Formel-Sprache versucht.


fields := "feld1" : "feld2" : ...;
@For(i := 1; i <= 11; i := i + 1;
   feld := fields;
   @For(j := 1; j < 15; j := j + 1;
      @SetField(feld + "_" + @Text(j); @GetField(feld + @Text(nFirstRow + j))))
   )


Und siehe da, die komplette Verschiebung geht quasi auf Knopfdruck, praktisch keine zeitliche Verzögerung.

Das ist zwar gut, hilft aber nicht wirklich weiter, weil die Klasse noch einige zusätzliche Funktionalitäten bieten muss, die ich mit @Formeln nicht abdecken kann. Außerdem hat der Kunde noch R5 und da kann ich den Code so noch nicht einsetzen.

Die Lösung fand ich dann, in dem ich die Evaluate-Funktion in Lotus Script sinnvoll einsetze.

Die einfachste Lösung war es, einfach alle Feldzuweisungen einer Spalte in einer @Formel zusammenzufassen:


i = doc.nFirstRow(0)
For ix = i To i + ROWS - 1
   frml = frml + |FIELD | + fieldName & (ix - i + 1) & | := | & array(ix) & |;|
Next
ret = Evaluate(frml + |""|, doc)


Und siehe da, die Zeit konnte unter 1 Sekunde gedrückt werden.

Im Prinzip hat sich nichts geändert, nur dass die Ausgabe auf dem Bildschirm jetzt anstatt von der LotusScript-Engine jetzt durch die @Formel-Engine ausgeführt wird. Diese scheint wohl wesentlich effektiver zu sein und der zusätzliche Aufwand ist im Prinzip vernachlässigbar.

Fazit:
Anstatt
Call doc.ReplaceItemValue(fieldName & (ix - i + 1), array(ix))
jetzt
frml = frml + |FIELD | + fieldName & (ix - i + 1) & | := | & array(ix) & |;|
und ich bin um den Faktor 5 schneller.

Wenn mann die @For-Schleife einsetzt, wird es wahrscheinlich noch einmal schneller werden.

So, ich hoffe, Ihr könnt ewas damit anfangen.

Viele Grüße,

Joachim
Wer in den Fußstapfen eines anderen geht, hinterlässt keine Spuren und kommt nie als Erster an.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz