Das Notes Forum
Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: der busse am 17.11.16 - 15:17:37
-
Moin,
ich habe eine Tabelle im Notes erstellen wollen. Klappt auch soweit, wird aber elendig langsam...
Falls eine Deklaration nicht dabei war, so liegt es daran, daß ich die Sachen aus einer größeren Lib gezogen habe.
' GetThread constants
Const DB_LSI_THREAD_LINE=0'Current line
Const DB_LSI_THREAD_PROC=1'Current procedure name
Const DB_LSI_THREAD_MODULE=2'Current module name
Const DB_LSI_THREAD_VERSION=3'LS version
Const DB_LSI_THREAD_LANGUAGE=4'language setting
Const DB_LSI_THREAD_COUNTRY=5'region setting
Const DB_LSI_THREAD_TICKS=6'Current clock ticks
Const DB_LSI_THREAD_TICKS_PER_SEC=7'Current clock ticks per second
Const DB_LSI_THREAD_PROCESS_ID=8'Current process ID
Const DB_LSI_THREAD_TASK_ID=9'Current task ID
Const DB_LSI_THREAD_CALLPROC=10'Calling procedure name
Const DB_LSI_THREAD_CALLMODULE=11'Calling module name
Function MyTabTest()
On Error GoTo label_Error
Dim array As Variant, a As Integer, Out As String, Ret As Variant, DocName As String
Dim doc As NotesDocument, RTItem As NotesRichTextItem, Header As Variant, l As Integer, UI_Doc As NotesUIDocument
Dim RTNav As NotesRichTextNavigator, rtTable As NotesRichTextTable, Success As Boolean
Dim Start As Long
Start = DB_TimerInit()
Set Doc = DB_ConsoleCreateDoc("Testrun")
Set RTItem = Doc.GetFirstItem("Body")
Header = Split("7|Das|ist|nur|ein|Test|3|2", "|")
Set rtnav = RTItem.CreateNavigator
Call RTItem.AppendTable(1, 7)
Set rtTable= rtNav.GetFirstElement(RTELEM_TYPE_TABLE)
Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
For a=1 To 7
Call rtitem.BeginInsert(rtnav)
Call RTItem.AppendText(header(a))
Call RTItem.EndInsert
Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
Next
ReDim Ret(0 To 8)
Ret(1) = ""
Ret(2) = ""
Ret(3) = ""
Ret(4) = 3
Ret(5) = 2
For a=1 To 600
If rttable.RowCount = 255 Then' Tables can only have 255 rows...
Call RTItem.AppendTable(1, 7)
Set rtTable= rtNav.GetNextElement(RTELEM_TYPE_TABLE)
End If
rttable.AddRow
Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
Call rtitem.BeginInsert(rtnav)
Call RTItem.AppendText("Test")
Call RTItem.EndInsert
Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
Call rtitem.BeginInsert(rtnav)
Call RTItem.AppendText(DB_TimerDiff(Start))
Call RTItem.EndInsert
For l=1 To 5
Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
Call rtitem.BeginInsert(rtnav)
Call RTItem.AppendText(Ret(l))
Call RTItem.EndInsert
Next
Next
Success = Doc.Save(False, False)
Set UI_Doc = DB_UI.EditDocument( True , Doc)
Doc.Remove(True)
Exit Function
label_Error:
MessageBox Error & " [Code: " & Err & " - Line: " & Erl & "] ", DB_MB_OK + DB_MB_IconStop, "Func:" & GetThreadInfo(1)& " Called By: " & GetThreadInfo(10)
End
End Function
Function DB_TimerDiff(p_Init As Long) As String
Dim lTicksStop As Long
Dim lTicksperSec As Long
lTicksStop = GetThreadInfo(DB_LSI_THREAD_TICKS)
lTicksperSec = GetThreadInfo(DB_LSI_THREAD_TICKS_PER_SEC)
DB_TimerDiff=(lTicksStop - p_Init) / lTicksperSec
End Function
Function DB_TimerInit() As Long
DB_TimerInit = GetThreadInfo(DB_LSI_THREAD_TICKS)
End Function
Ich habe also die Tabelle erstellen lassen und die Anzeige der Zeit gemessen.
Die ersten 10 Zeilen zeigen alle 0,15 Sekunden, dann 4 mit 0,31, 4 mit 0.62 und es geht konstant bergab.
Bei Zeile 62 ist eine Sekunde durch, 80 2 Sekunden, 200 erst bei 30 Sekunden. 600 Zeilen dauert 360 Sekunden.
Irgendwas macht also entweder die Suche nach dem nächsten Element sehr langsam...
Ist das so, gibt es besseren Code oder habe ich da einen Bug eingebaut?
-
Hallo,
dieses Verhalten kann ich bestätigen. In meinem Fall war es dann schneller alle 35 Zeilen eine neue Tabelle zu erstellen (sieht auch besser im Ausdruck aus).
Gruß
André
-
Die Tabellenverarbeitung in Notes ist wirklich sehr langsam. I.a. ist es besser viele kleine Tabellen, statt weniger Große, zu haben.
Wenn die vielen Tabellen dann aber "wie eine" wirken sollen, also alle die selben Spaltenbreiten haben sollen, hat man den Nachteil, dass man jede Tabelle einzeln anpassen muss. Ist also Abwägungssache. Bei einer programmatischen Erstellung der Tabellen lässt sich das Breitenproblem ja bestens an zentraler Stelle anpassen.
Zum Glück hat man ja diese Riesentabellen nicht so häufig.
-
Ok.
Ich habe mal einen Test gemacht und die Zahlen sehen bei kleiner Tabellen deutlich besser aus...
Ich habe beim Ändern des RowCount von 255 z.B. auf 5, 10 usw. gesetzt, also
If rttable.RowCount = 5 Then
5 = 1.4 Sekunden
10 = 2.8 Sekunden
20 = 4.5 Sekunden
30 = 7.7 Sekunden
50 = 11 Sekunden
Das ist ein herber Unterschied für die gleiche Anzahl an Zeilen. Ich habe den Eindruck, der geht nicht wie bei GetNextDocument oder so vor und fängt einfach bei jeder gesuchten Zelle wieder vorne an.
Weiß jemand, wie ich die Zeilen zwischen den neuen Tabellen weg bekomme?
_____|
Also das die Zeile hier...
_____
|
Die Entfernen-Taste will nicht helfen, ich kann aber Texte rein schreiben.
Falls nicht, würde ich halt die Überschrift in eine eigene Tabelle auslagern und immer Blöcke a 10 Zeilen machen, das ist dann noch halbwegs sinnvoll von der Aufteilung und schnell.
If a=1 or rttable.RowCount = 10 Then' Tables can only have 255 rows...
Call RTItem.AppendTable(1, 7)
Set rtTable= rtNav.GetNextElement(RTELEM_TYPE_TABLE)
Else
rttable.AddRow
End If
Sonst schon mal danke bis hierhin.
-
Eine Zeile muss ja als Trenner bleiben. Vielleicht wenn es geht über Hide-When verstecken oder die Schrift ganz klein machen, so dass man die Zeile fast nicht sieht (1px).
-
Das Erstellen deiner Tabellen, passiert das durch eine Nutzer-Aktion im Notes-Client?
-
Ich schraube im Moment für mich eine Ausgabe in Tabellenform für einige Auswertungen ala welcher Benutzer hat was (eingestellt).
So als Hilfe für mich. Ich klicke auf eine Schaltfläche und der Client erstellt die Tabellen.
-
Dann kannst du die Tabelle auch in einer HTML-Datei erstellen und diese zum Schluss in ein Richtext importieren. Damit gehen sehr große Tabellen sehr schnell, mit CSS können Formatierungen durchgeführt werden ...
-
Importieren? Aha. Wenn der Workaround klappt... mal sehen. ;)
-
Idee: exportiere die Daten nach Excel. Tabellen dürfen da sehr groß werden und leidlich fix ist es auch.
Schönes WE wünsch' ich,
Th.