Formular in Base soll nach Aktualisierung wieder die gleichen Datensätze anzeigen

Hallo liebe Forumsmitglieder,

ich habe eine Frage zu einer Formularaktualisierung in einer LibreOffice-Base-Datei.
In meinem Formular “Kontenliste_mit_Kontendetails” gibt es die beiden Tabellen-Steuerelemente “Liste_der_Konten” und “Liste_der_Kontobuchungen”.
Wird in der “Liste_der_Konten” ein Konto ausgewählt, werden in der “Liste_der_Kontobuchungen” direkt alle zugehörigen Buchungen angezeigt.

Auf dem Formular gibt es eine Schaltfläche, mit der ein LibreOffice-Basic-Makro gestartet wird. Das Makro nimmt Buchungen vor.
Nach Beendigung der Buchung, soll das Formular aktualisiert werden. Anschließend soll der zuletzt angezeigte Datensatz wieder angezeigt werden.

In der Dokumentation zu LibreOffice habe ich folgenden Basic-Code zur Aktualisierung eines Formulars gefunden:

Private Sub Aktualisieren
	'Beispiel aus Base_Gesamtband_einseitig_V44.pdf, Seite 382:

		DIM oDoc AS OBJECT			'Für momentan aktives Dokument.
		DIM oDrawpage AS OBJECT		'Behälter für alle Formulare
		DIM oForm AS OBJECT			'Nimmt das Formular auf.
		
		oDoc = thisComponent
		oDrawpage = oDoc.drawpage
		oForm = oDrawpage.forms.getByName("Kontenliste_mit_Kontendetails")
		
		oForm.reload()

End Sub

Leider habe ich bis jetzt keine Befehle gefunden, mit denen die angezeigten Datensätze der beiden Tabellen-Steuerelemente ermittelt werden können. Nach der Aktualisierung sollen dann die gleichen Datensätze wie vor der Aktualisierung angezeigt werden.
In dem Tabellen-Steuerelement “Liste_der_Kontobuchungen” kann alternativ auch der letzte Datensatz angezeigt werden.

Ich würde mich freuen, wenn mir hierzu jemand einen Tipp geben könnte.
Vielen Dank!

Viele Grüße
Frank

Hallo Frank,

ich würde in der folgenden Richtung suchen:

DIM loNr AS LONG

loNr = oForm.getRow()

oForm.reload()

oForm.absolute(loNr)

Dafür nimmst Du einfach oForm.reload() aus Deinem Code raus. Probiert habe ich das jetzt nicht.

Gruß

Robert

Hallo Robert,

du hast mich mit deinem Hinweis auf die richtige Fährte gebracht! Vielen Dank!
Nach ein wenig Trickserei bin ich auf die folgende Lösung gekommen:

Private Sub Aktualisieren
'Beispiel aus Buch Base_Gesamtband_einseitig_V44.pdf, Seite 382.
'Auf Seite 378 stehen Befehle zum Navigieren in einem Formular.
	DIM oDoc AS OBJECT			'Für momentan aktives Dokument.
    DIM oDrawpage AS OBJECT		'Behälter für alle Formulare
    DIM oForm AS OBJECT			'Nimmt das Formular auf.
    DIM oTab AS OBJECT			'Nimmt das Tabellen-Steuerelement im Formular auf.
    DIM loNrForm AS LONG		'Speichert den aktuellen Datensatz im Formular.
    DIM loNrTab AS LONG			'Speichert den aktuellen Datensatz im Tabellen-Steuerelement
    DIM loA AS LONG				'Für Zeitschleife
    DIM loB AS LONG				'Für Zeitschleife
    
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Kontenliste_mit_Kontendetails")
oTab = oForm.getByName("Buchungsdetails")

'Aktuell markierte Datensätze speichern:
loNrForm = oForm.getRow()
loNrTab = oTab.getRow()

'Formular aktualisieren:
oForm.reload()

'Im Formular den alten Datensatz auswählen:
oForm.absolute(loNrForm)

'Zeitschleife!
'Das Formular muss zunächst im Tabellen-Steuerelement
'die passenden Daten zum Datensatz im Formular aufrufen.
'Ohne Zeitschleife stürzt LibreOffice ab, da es keinen Datensatz findet.
For loA = 1 To 1000
	For loB = 1 To 1000
	Next loB
Next loA

'Wenn der Cursor in der Zeile für einen neuen Datensatz steht,
'dann ist der Wert für die gespeichert Zeile 0.
If loNrTab = 0 Then
	'In dem Fall soll zum letzten Datensatz gesprungen werden:
	oTab.last
Else
	'Hier wird der alte ausgewählte Datensatz angesprungen:
	oTab.absolute(loNrTab)
End If
End Sub

Weißt du zufälligerweise noch eine elegante Lösung für die Zeitschleife?

Viele Grüße
Frank

Zeitschleife? Vielleicht hilft Dir der einfache Befehl wait

wait(100) '100 Millisekunden eine Pause einlegen

Hallo Robert, ich komme leider erst jetzt dazu, dir zu antworten.
Ja, mit dem WAIT-Befehl klappt es hervorragend. Damit ist es schon viel eleganter. :wink:
Vielen Dank!