Seite 1 von 1
[Gelöst] Makro Firebird Beliebige SQL-Kommandos speichern und bei Bedarf ausführen
Verfasst: So 28. Aug 2022, 19:15
von malt14
Beispiel_InsertUpdateDelete_SQL.odb
Guten Tag,
das Makro zum Ausführen von wiederkehrenden SQL Befehlen ist sehr nützlich und zeitsparend.
In Firebird funktionieren bei mir von den folgenden Befehlen mit dem Makro nur die beiden "update" enthaltenden. Die anderen führen zu BASIC-Laufzeitfehlern. In "SQL ausführen" funktionieren diese Befehle.
Code: Alles auswählen
UPDATE "Personen" SET "Klasse" = "Klasse" +1
ALTER TABLE "test" ALTER "ID" RESTART WITH 2
CREATE OR ALTER TRIGGER BEFORE_IN_UP_NAME FOR "test"ACTIVE BEFORE INSERT OR UPDATE POSITION 0AS BEGIN NEW."cts" = CURRENT_TIMESTAMP;END;
ALTER TABLE "test" ALTER COLUMN "ts" SET DEFAULT CURRENT_TIMESTAMP
execute block as begin update "test" SET "d" = "d" +1; update "test" SET "d2" = "d2" +1; update "test" SET "d3" = "d3" +1; end
Grüße
Malt
Version: 7.3.5.2 (x64) / LibreOffice Community
OS: Windows 10.0 Build 22000
Re: Makro Firebird Beliebige SQL-Kommandos speichern und bei Bedarf ausführen
Verfasst: So 28. Aug 2022, 20:46
von RobertG
Hallo Malt,
ich habe jetzt laufen lassen.
Wenn ich das über Extras → SQL laufen lasse, dann kommt da mit
Code: Alles auswählen
2: at /home/buildslave/source/libo-core/connectivity/source/drivers/firebird/StatementCommonBase.cxx:459
eine undefinierbare Statusmeldung. Das bringt executeUpdate durcheinander. Wie für den Normalnutzer auch wird so etwas als Fehlermeldung angesehen, auch wenn der Code verarbeitet wird.
Außerdem gilt für executeUpdate, dass es gedacht ist für INSERT, UPDATE und DELETE (siehe auch
https://api.libreoffice.org/docs/idl/re ... ement.html)
Versuche alternativ das Makro mit executeQuery ablaufen zu lassen. Dann läuft es durch. Ob die Änderungen aber vollzogen werden habe ich nicht getestet. Und weiter ist es möglich, auch mit einem "execute" das Ganze ablaufen zu lassen.
Da Firebird immer noch nicht richtig mit der GUI zusammenläuft bleibt bei so etwas nur das Testen. Ich habe so ein Problem einmal damit behoben, dass ich vor der Ausführung des executeUpdate einfach bei einer For … NEXT -Schleife zum
Code: Alles auswählen
"ALTER TABLE """+TabellenPK(i)+""" ALTER ""ID"" RESTART WITH 0"
eingebaut habe. Dann lief die Schleife problemlos durch alle Tabellen und ignorierte die Rückmeldung.
Gruß
Robert
Re: Makro Firebird Beliebige SQL-Kommandos speichern und bei Bedarf ausführen
Verfasst: Mo 29. Aug 2022, 06:22
von malt14
Guten Tag Robert,
Dank für die Informationen.
Du hattest Recht. Die Makros enden zwar mit einer Anzeige "BASIC-Laufzeitfehler", sie werden aber ausgeführt. Der Code wird korrekt verarbeitet.
Das Makro funktioniert also auch für SQLs, die "Alter" enhalten.
Grüße
Malt
Re: [Gelöst] Makro Firebird Beliebige SQL-Kommandos speichern und bei Bedarf ausführen
Verfasst: Mo 11. Nov 2024, 07:14
von malt14
Guten Tag,
Robert stellte das nützliche Makro zum SQL-Kommandos speichern und bei Bedarf ausführen bereit:
Code: Alles auswählen
REM ***** BASIC *****
SUB ChangeData(oEvent AS OBJECT)
DIM oConnection AS OBJECT
DIM oForm AS OBJECT
DIM stSql AS STRING
DIM oSql_Statement AS OBJECT
DIM inValue AS INTEGER
oForm = oEvent.Source.Model.Parent
oConnection = oForm.activeConnection()
stSQL = oForm.getString(2)
inValue = MsgBox("Soll der SQL-Code" & CHR(13) & stSQL & CHR(13) & "ausgeführt werden?", 20, "SQL-Code ausführen")
IF inValue = 6 THEN
oSQL_Statement = oConnection.createStatement()
oSQL_Statement.executeUpdate(stSql)
END IF
END SUB
Dank dafür!
Um über die Ausführung informiert zu werden, ergänzte ChatGPT 4o mini das Makro:
Code: Alles auswählen
REM ***** BASIC *****
SUB ChangeData(oEvent AS OBJECT)
DIM oConnection AS OBJECT
DIM oForm AS OBJECT
DIM stSQL AS STRING
DIM oSql_Statement AS OBJECT
DIM inValue AS INTEGER
DIM result AS INTEGER ' Variable zur Speicherung der Rückmeldung der SQL-Ausführung
' Zugriff auf das Formular und die aktive Verbindung
oForm = oEvent.Source.Model.Parent
oConnection = oForm.activeConnection()
' SQL-Text aus dem Formular lesen
stSQL = oForm.getString(2)
' Bestätigung vom Benutzer einholen, ob der SQL-Code ausgeführt werden soll
inValue = MsgBox("Soll der SQL-Code" & CHR(13) & stSQL & CHR(13) & "ausgeführt werden?", 20, "SQL-Code ausführen")
' Wenn der Benutzer 'Ja' auswählt (6 = Ja), SQL ausführen
IF inValue = 6 THEN
oSql_Statement = oConnection.createStatement()
' SQL-Befehl ausführen und die Anzahl der betroffenen Zeilen speichern
result = oSql_Statement.executeUpdate(stSQL)
' Rückmeldung in einer MessageBox anzeigen (z.B. "4 rows deleted")
MsgBox(CStr(result) & " rows affected.", 64, "SQL-Ausführung abgeschlossen")
END IF
END SUB
Grüße
Malt
Version: 24.8.2.1 (X86_64) Firebird
OS: Windows 11 X86_64 (10.0 build 22631)