OKB-000047 | Langsamer Aufbau der Listenansicht

Betrifft: ab orgAnice CRM 2008 in Verbindung mit MS SQL-Server

Problem: 

Der Aufbau der Listenansicht in orgAnice Data ist sehr langsam. Das Verhalten betrifft nur bestimmte Tabellenlayouts.

Ursache: 

Beim Einsatz der SQL-Servers wird die gesamte Liste durch zwei SQL-Abfragen aufgebaut. Dabei spielt es keine Rolle, ob sich die Ausdrücke für alle Listenspalten nach SQL übersetzen lassen: Wenn nicht, werden einfach die Feldinhalte für alle anzuzeigenden Datensätze übertragen und die Spaltenausdrücke clientseitig ausgewertet.

Die Abfragen fallen unterschiedlich komplex aus, je nach Anzahl und Aufbau der Listenspalten. Wenn die Listenspalten orgBasic-Ausdrücke enthalten, die sich auf verknüpfte Tabellen beziehen, kann das den Aufbau der Liste stark bremsen, da zusätzlich zur Listentabelle auch verknüpfte Tabellen mitgeführt werden müssen. Besonders aufwändig ist der Zugriff auf untergeordnete Tabellen (Beispiel: Zugriff auf Tabelle „Ansprechpartner“ in der Adressen-Liste) oder auf indirekt verknüpfte Tabellen (Beispiel: Zugriff auf Tabelle „Adresse“ in der Aktivitäten-Liste).

Der Zugriff auf die Fremdtabelle muss nicht offensichtlich sein, es genügt, wenn der Zugriff in einer indirekt aufgerufenen CustomFunction erfolgt. Selbst wenn der Codezweig, der auf die Fremdtabelle zugreift, beim Listenaufbau nie angesprochen wird, wird die Fremdtabelle trotzdem mitgeladen. (Beispiel: Wenn der orgBasic-Ausdruck

Iif(True, Adressen->Name, Ansprechpartner->Name)

in der Adressen-Liste verwendet wird, wird die Ansprechpartner-Tabelle mit geladen,  obwohl der rechte Iif-Zweig nie ausgewertet wird.)

Lösung:

Prüfen Sie zunächst, welche Spalte(n) für die schlechte Performance verantwortlich ist/sind. Löschen Sie dazu in einer Kopie der .odb-Datei im betreffenden Tabellenlayout schrittweise alle Listenspalten und prüfen Sie nach jedem Löschen, ob sich das Abfrageverhalten verbessert hat.

Stellen Sie sicher, dass das untersuchte Tabellenlayout aktiv ist. Erzeugen Sie in einem temporären VBA-Modul folgende Prozedur. Ersetzen Sie dabei i durch den Index der Listenspalte, deren Aufbau lange dauert:

Private Sub EnumUsedFields()

Dim pPrq As ParserRequest

Set pPrq = ActiveTableLayout.ListColumns(i).ParserRequest

Dim aUsedFields() As Field

aUsedFields = pPrq.UsedFields

Dim l1 As Long

Dim pField As Field

For l1 = LBound(aUsedFields) To UBound(aUsedFields)

Set pField = aUsedFields(l1)

Debug.Print pField.Parent.Parent.Name & "->" & pField.Name

Next

End Sub

Führen Sie die Prozedur durch Betätigung der Taste F5 im VBA-Editor aus. Im Direktfenster erfolgt die Ausgabe der Felder (mit Tabellennamen), die von dem betreffenden orgBasic-Ausdruck verwendet werden. Wenn die Liste Felder aus mehreren unterschiedlichen Tabellen enthält, muss der orgBasic-Ausdruck vereinfacht werden, um die Performance des Listenaufbaus zu verbessern.

Für das Umschreiben des orgBasic-Ausdrucks kann an dieser Stelle nur der allgemeine Hinweis gegeben werden, nur auf die Felder zuzugreifen, die für die Anzeige der Listenspalte wirklich notwendig sind. Vermeiden Sie für Listenspalten die Verwendung von angepassten Funktionen, die je nach übergebenem Parameter auf verschiedene Tabellen zugreifen.