Seite 1 von 1

[erledigt] Tabelle vollständig einlesen

Verfasst: Sa, 22.09.2012 11:41
von juetho
In einem Hilfsformular werden die Daten einer MySQL-Tabelle (ca. 200 Datensätze) zur Auswahl angeboten. Wenn das Formular aufgerufen wird, werden zunächst etwa 50 Datensätze angezeigt; erst während man im Tabellenkontrollfeld nach unten blättert, kommen nach und nach (relativ langsam) die weiteren Datensätze. Beim "normalen" Arbeitsablauf ist dieses Verhalten zwar nützlich, aber wenn eine Auswahl angeboten wird, möchte man von Anfang an eine vollständige Übersicht erhalten (zumal 200 Zeilen nicht übermäßig viel sind).

Gibt es irgendwo eine Einstellung, mit der ich das vollständige Einlesen erzwingen kann, bevor die Daten im Kontrollfeld angezeigt werden? Danke! Jürgen

Re: Tabelle vollständig einlesen

Verfasst: Sa, 22.09.2012 21:56
von F3K Total
Hi,
per Makro:

Code: Alles auswählen

...
oForm.last
oForm.first
...
Gruß R

Re: Tabelle vollständig einlesen

Verfasst: So, 23.09.2012 11:55
von juetho
Schöner Trick, genügt aber noch nicht; es liefert bei last() die Fehlermeldung mit der maximalen Ungenauigkeit:
SQLException
Message:Fehler in der Funktionsfolge
Ich habe mehrere Varianten versucht: zunächst innerhalb des Makros, das das Hilfsformular aufruft:

Code: Alles auswählen

    lkzForms = thisDatabaseDocument.FormDocuments.getByName("fibu.selectLkz").open
    lkzForm = lkzForms.drawpage.forms.MainForm
    ' lkzForm.reload        ' zunächst ohne, dann in einem weiteren Versuch mit reload
    lkzForm.last
    lkzForm.first
Danach über das Ereignis "Ansicht wurde erzeugt" direkt im Hilfsformular:

Code: Alles auswählen

Sub SelectLkzShowAll
oForm = thisComponent.drawpage.forms.MainForm
oForm.last
oForm.first
End Sub
Schließlich habe ich diese Routine dem Ereignis "Dokument aktivieren" zugewiesen. (Dieses Ereignis passt eigentlich überhaupt nicht, denn es wird auch nach der Fehlermeldung erneut ausgelöst.) Dabei wurde das Makro einmal ausgeführt (natürlich mit der nötigen Pause), bei jedem späteren Aufruf folgt derselbe Fehler.

Ich habe den Verdacht, dass der Aufruf der Methode last() "zu schnell" kommt und der Befehl zum Laden der Daten innerhalb des Formulars noch nicht abgeschlossen ist. Ich vermute sehr stark, dass dein Trick trotzdem funktioniert, aber dass ich ihn in einen anderen Zusammenhang einbinden muss. Hast du auch dafür einen Tipp? Gruß Jürgen

Re: Tabelle vollständig einlesen

Verfasst: So, 23.09.2012 13:47
von F3K Total
Hi,
versuch es mal mit dem Ereignis "Beim Laden" von MainForm.

Gruß R

Re: Tabelle vollständig einlesen

Verfasst: So, 23.09.2012 15:54
von juetho
Danke, das passt noch am ehesten. Es blieb nur das Problem aus meiner anderen Frage "Ladezeit eines Formulars beobachten/melden". Mit der MessageBox konnte ich hier nicht arbeiten; die passte nicht in die Reihenfolge der Befehle. Stattdessen habe ich den Auswahl-Button provisorisch mit "Bitte warten" beschriftet und ihn erst nach first() auf Enabled = true gesetzt. Das bringt zwar nach wie vor etwas Wartezeit, ist aber alles in allem in Ordnung. Gruß Jürgen

Re: [erledigt] Tabelle vollständig einlesen

Verfasst: So, 23.09.2012 19:15
von F3K Total
Hi,
vielleicht hiflt Dir auch

Code: Alles auswählen

oForm.FetchSize
In der API steht dazu:
FetchSize: retrieves the number of result set rows that is the default fetch size for result sets generated from this Statement object.
If this Statement object has not set a fetch size, the return value is implementation-specific.

Gruß R

Re: [erledigt] Tabelle vollständig einlesen

Verfasst: Mo, 24.09.2012 11:01
von juetho
In der Tat, das ist noch eine Verbesserung: Es verzichtet auf das Hin- und Herspringen der aktuellen Zeile bzw. unlockControllers() und scheint auch etwas schneller zu gehen. Abschließend gehört jetzt zum Ereignis "Beim Laden" des Hauptformulars folgende Routine:

Code: Alles auswählen

Sub SelectLkzShowAll
if not thiscomponent.currentcontroller.isFormDesignMode then
  rem alle 240 Datensätze bereitstellen
  oForm = thisComponent.drawpage.forms.MainForm
  oForm.fetchSize = 240
  rem nach dem Laden den OK-Button freigeben
  btn = oForm.getByName("btnOK")
  btn.Label = "Land übernehmen"
  btn.Enabled = true
end if
End Sub
Danke nochmals für deine hilfreiche Mitwirkung! Jürgen