Makro-Programmierung in LibreOffice-Base

Ich habe als Umsteiger von Windows zu Linux auch eine Datenbank von Microsoft Access in LibreOffice Base übernehmen müssen/wollen. In der Access-Anwendungen waren verschiedene VBA-Programmierungen enthalten, die ich in der letzten Woche mit viel Recherche und Ausprobieren in Makros übernommen habe. Nun ist alles fertig bis auf eine Kleinigkeit, die ich nicht lösen kann:
Test-Datenbank.odb (15.8 KB)

  • Beim Öffnen der Datenbank startet ein Formular, mit dem ich verschieden Tools aufrufen kann (alle die funktionieren habe ich in der Test-Datenbank entfernt)
  • Rufe ich über das Formular die Routine „Belege einreichen“ auf, kommt folgende Fehlermeldung:
    Fehlermeldung
  • Führe ich das Makro „Belege_einreichen“ direkt in der Makroverwaltung aus, läuft alles fehlerfrei durch.

BIN RATLOS

Ich möchte Dir raten, das Handbuch einmal zu Hilfe zu nehmen (Handbücher - nach Base suchen). Gehe einfach einmal hin und teste, was denn ThisComponent.Location (msgbox ThisComponent.Location) heraus gibt. Nach der Fehlermeldung zu urteilen bist Du da nicht bei dem angemeldeten Datenbanknamen.

Danke für die schnelle Antwort.
Deine Vermutung stimmt:
wenn ich das Makro aus dem Formular aufrufe, ist die MsgBox leer.
Lasse ich das Makro aber direkt im Makroverwalter laufen, werden Speicherort und Datei in MsgBox richtig angezeigt.
Das verstehe ich nicht und kann in Deinem Handbuch auch keine Lösung finden - weil ich nicht weiß wonach ich suchen muss.
Kannst Du mir vielleicht einen Tipp geben?

Wenn Du aus dem Formular heraus eine Datenbankverbindung suchst:

SUB MeinMakro(oEvent AS OBJECT)
     oForm =  oEvent.Source.Model.Parent
     oConnection = oForm.activeConnection()
     oSQL_Statement = oConnection.createStatement()
     stSql = "SELECT * FROM ""Rechnungen"" WHERE ""AntragNr"" IS NULL"
     oResult = oSQL_Statement.executeQuery(stSql)
     WHILE oResult.Next
     …
     WEND
END SUB

Damit erhältst Du von dem auslösenden Button die Verbindung zur Datenbank. Weitere Verbindungsmöglichkeiten stehen im aktuelle Handbuch ab S. 486.

Die Schreibweise, die Du da nutzt, habe ich nie ausprobiert. Alles, was Du da der Variablen “Rechnung” zuweist, kannst Du stattdessen raus lassen.

Eine vergleichbare Programmierung hatte ich zunächst vorgesehen, aber beim Bearbeiten des Datensatzes (Einfügen der Antragsnummer) bekam ich die Fehlermeldung: “The result is read-only”. Gleiches passiert auch bei Deinem Makro.
Darum habe ich im Netz gesucht und als Lösung “meine” Schreibweise vorgesehen. Jetzt fehlt offenbar nur noch die Verbindung zur Datenbank.
Gruß
HP

Wenn Du Daten in das Ergebnis eintragen willst:

oSQL_Statement.ResultSetConcurrency = 1008

Ansonsten

Rechnungen.DataSource = thisComponent.Parent.CurrentController

Oder Du musst den Namen direkt mit in das Makro schreiben:

Rechnungen.DataSourceName = "Test-Datenbank"

Danke für Deine Anregungen, ich werde sie ausprobieren.
Gruß
HP

Nachtrag:
Nachdem bei mir alle Vorschläge nicht zum Ziel führten, habe ich aufgrund Deiner Anregung nach
ResultSetConcurrency gegoogelt und bin auf einen Tipp von 2009 gestoßen:
https://de.openoffice.info/viewtopic.php?p=103748&sid=c7807e14da87bb2c71ec4a5b1ca2d39f#p103748
Das analog meiner Vorgaben in die Programmierung übernommen und alles klappt prima.
Für andere Neulinge meine neue Programmierung:
Sub Belege_einreichen 'Datensätze als abgeschickt markieren
'Datenbank vorbereiten
oDatasource = thisDatabaseDocument.CurrentController
IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
oConnection = oDatasource.ActiveConnection()
oSQL_Statement = oConnection.createStatement()
'letzte Nummer aus Tabelle Rechnungen ermitteln
Kriterien = “SELECT MAX( ““AntragNr”” ) AS ““letzte_AntragNr”” FROM ““Rechnungen”””
Rechnungen = oSQL_Statement.executeQuery(Kriterien)
Rechnungen.next
letzter_Antrag = Rechnungen.getDouble(1)
‘eingereichte Rechnungen mit nächster Nummer füllen
Antrag= letzter_Antrag+1
sSQL = “UPDATE ““Rechnungen”” SET ““AntragNr”” = '” + Antrag + "’ WHERE ““AntragNr”” IS NULL"
oSQL_Statement.executeUpdate(sSQL)
End Sub

Nochmals meinen Dank
Bis demnächst
HP