[erledigt] Tabelle vollständig einlesen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

[erledigt] Tabelle vollständig einlesen

Beitrag 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
Zuletzt geändert von juetho am So, 23.09.2012 15:54, insgesamt 1-mal geändert.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Tabelle vollständig einlesen

Beitrag von F3K Total »

Hi,
per Makro:

Code: Alles auswählen

...
oForm.last
oForm.first
...
Gruß R
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Tabelle vollständig einlesen

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Tabelle vollständig einlesen

Beitrag von F3K Total »

Hi,
versuch es mal mit dem Ereignis "Beim Laden" von MainForm.

Gruß R
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Tabelle vollständig einlesen

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: [erledigt] Tabelle vollständig einlesen

Beitrag 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
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: [erledigt] Tabelle vollständig einlesen

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten