Seite 1 von 2
Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Mi 3. Jul 2019, 08:56
von jh56
Hallo,
ich habe eine eingebette HSQL-DB konvertiert nach MySQL und will sie weiter als Libredatenbank bearbeiten.
Inzwischen funktioniert fast alles:
- Bearbeitung über Formulare
- Lesen von Daten miitels Makros
Was nicht läuft ist ein Datenbankupdate aus einem Makro heraus.
Ich benutze hierzu mehrere Routinen zum Aufbau der Verbindung, holen der Altdaten und dann zum Update.
Es kommt keine Fehlermeldung. Beim Neuaufruf des Hauptformulares sind die Daten allerdings nicht verändert.
hier der Code und der generierte SQL-String:
Code: Alles auswählen
Sub verarbeite_Monat(oForm as Object)
DIM SQL_Anweisung AS OBJECT
DIM Abfrageergebnis AS OBJECT
DIM sql_str as string
DIM erg as Boolean
DIM monatalt as Integer
verbinde_DB
read_Defaults
'lese Datensatz aud Defaults und aktualisiere Monat
monatalt = monat
' Auslesen des neuen Monatzwertes und Dialog schließen
monat = Odialog1.getControl("MonatNeu").Value
Odialog1.endexecute()
'Update Defaults-Monat
sql_str = "Update " +CHR(34)+ "Defaults" +CHR(34) + " set " +CHR(34)+ "Selmon" +CHR(34) + " = '" + monat
sql_str = sql_str + "' " + " where " +CHR(34)+ "ID" +CHR(34) + " = '" + ID +"';"
SQL_Anweisung = Verbindung.createStatement()
SQL_Anweisung.executeQuery(Sql_str)
end sub
Hier die Ergebnisse der Debug- überwachung
- Sql_str = "Update "Defaults" set "Selmon" = '6' where "ID" = '1';"
- Verbindung: Typ com.sun.star.drivers.OCConnectionWrapper
- SQL_Anweisung Typ com.sun.star.OStatement
Kann mir jemand helfen?
Mit HSQLDB läuft das ganze. Ich benutze den selben Formalismus zum Lesen aus der DB, wo es auch klappt, so dass ich keine Ideen mehr habe.
Gruß und Danke für eine hilfreiche Antwort
Jürgen
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Mi 3. Jul 2019, 17:32
von RobertG
Hallo Jürgen,
ich vermute, dass das an der Maskierung liegt. Ich kopiere Dir einmal den Abschnitt aus dem Handbuch:
MySQL-Code in Makros
Wird die interne Datenbank angesprochen, so werden die Tabellen und Felder mit doppelten
Anführungszeichen gegenüber dem SQL-Code abgesetzt:
Da in Makros der SQL-Befehl Text darstellt, müssen die doppelten Anführungszeichen zusätzlich
maskiert werden:
MySQL-Abfragen hingegen werden anders maskiert:
Durch diese andere Form der Maskierung wird daraus im Makro-Code:
Gruß
Robert
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Mi 3. Jul 2019, 20:06
von jh56
Hallo Robert,
ich verstehe Dich nicht ganz:
Deine Maskierung ist der select, mein Problem liegt beim Update. das bekomme ich jetzt nicht zusammen. Dies ist aber auch Sql_str dokumentiert:
"Update "Defaults" set "Selmon" = '6' where "ID" = '1';"
ich schrieb:
Was nicht läuft ist ein Datenbankupdate aus einem Makro heraus.
Ich benutze hierzu mehrere Routinen zum Aufbau der Verbindung, holen der Altdaten und dann zum Update.
Es kommt keine Fehlermeldung. Beim Neuaufruf des Hauptformulares sind die Daten allerdings nicht verändert.
Hier noch ein paar Informationen zum Umfeld:
Betriebssystem: Linux Mint
Libre Version 6.1 und 6.2
Java Schnittstelle 8.0.15
Mysql Server 5.7
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Mi 3. Jul 2019, 23:33
von gogo

versuch's mal mit
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Do 4. Jul 2019, 10:39
von jh56
Hallo gogo,
Danke für für Deine Idee, sie läuft aber auch nicht in der MySQL-anbindung mit dem Javatreiber.
interessanter Weise läuft dieser Code aber genau wie mein vorgestellter Code in der HSQLDB.
Ich beginne zu vermuten, dass eventuell ein Bug im Libre Base vorliegt, da bei einem Versuch diesen Wert über eine Formularmaske zu ändern dies einwandfrei funktioniert.
Die Alternative. wir haben alle noch nicht den richtigen Punkt in der Doku gefunden, allerdings sollte meiner Ansicht der Code datenbankunabhängig arbeiten.
Ich freue mich also weiter um jeden Post, der hilfreiche Ideen bringt.
Danke und Gruß
Jürgen
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Do 4. Jul 2019, 16:44
von RobertG
Hallo Jürgen,
was macht denn Dein Code, wenn Du den entsprechenden Teil (aus der Messagebox) kopierst und über Extras > SQL laufen lässt?
Gruß
Robert
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Do 4. Jul 2019, 20:24
von jh56
im SQL-Fenster funktioniert der Code:" update Defaults set Selmon = 1 where ID = 1 " , also ohne Anführungszeichen und Hochkomma. Das läuft aber nicht im Makro
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Do 4. Jul 2019, 21:07
von RobertG
Hallo Jürgen,
ich habe hier nicht genau Deine Konfiguration, konnte aber das Update ganz ohne jegliche Maskierung durchführen:
Code: Alles auswählen
SUB UpDate
oDatasource = thisDatabaseDocument.CurrentController
IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
oConnection = oDatasource.ActiveConnection()
oSQL_Command = oConnection.createStatement()
oSql_Command.executeUpdate("UPDATE personen SET Nachname = 'Hein' WHERE ID = 2;")
END SUB
Die Maskierung um Text wird wohl weiterhin nötig sein. Bei mir handelt es sich allerdings um eine MariaDB und den entsprechenden JDBC-Treiber für die MariaDB Version 2.4.1. Das ganze läuft unter OpenSUSE 15 64bit rpm Linux.
Gruß
Robert
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Fr 5. Jul 2019, 09:21
von jh56
Hallo Robert,
wenn ich genau wie Du den SQL-Befehl als String einfüge, läuft bei mir gar nichts. ich bekomme die Fehlermeldung siehe Bildschirmfoto

- Bildschirmfoto vom 2019-07-05 08-07-10.png (221.19 KiB) 3235 mal betrachtet
Ich muss also mit einer Variablen für den SQL-Befehl arbeiten, wie sie ja auch bei den DB_Selectionen
bestens funktioniert.
Hier ein Bildschirmfoto mit Breakpoint vor der Ausführung des Updatebefehls.

- Bildschirmfoto vom 2019-07-05 07-59-16.png (237.29 KiB) 3235 mal betrachtet
Hier läuft der
Makro zwar ohne Fehlermeldung durch, es kommt aber zu
keinem DatenbankUpdate.
Ich nahm als nächstes die Hochkomma bei der Wertzuweisung vom Feld Selmon heraus. Das Ergebnis ist wie gehabt:

- Bildschirmfoto vom 2019-07-05 08-29-09.png (223.52 KiB) 3235 mal betrachtet
Bei der Enfernung der Anführungsstriche um den Tabellennamen gab es wieder einen Laufzeitfehler.
Der
Tabellenname muss definitiv
in Anführungszeichen gesetzt werden, weil es
sonst zu einem
Laufzeitfehler kommt.:

- Bildschirmfoto vom 2019-07-05 08-37-17.png (230.8 KiB) 3235 mal betrachtet
Ich probierte also weiter: Entfernung der Hochkomma um den Feldnamen des zu verändernden Feldes. Das brachte eine Fehlermeldung, dass dass Feld nicht erkannt wurde: Text:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Column not found: SELMON in statement [Update "Defaults" set Selmon].
Was mich verwundert ist, dass ein Code,der mit einem Interface (HSQLDB) funktioniert, mit dem nächsten Interface nicht funktioniert.
Da ich jahrelang als Programmierer tätig war, denke ich, dass es hier ein Problem des Interfaces ist, welches ich mit Änderung des BASIC-Codes nicht lösen kann.
Die Methode executeUpdate, die ich ja nicht debuggen kann geht ja wahlweise entsprechend der DB an unterschiedliche Interfaces. Hier müsste ein Entwickler von Libre Base mal in das Eingemachte schauen.
Ich kenne die aber nicht.
Wenn die Tabelle Defaults über ein Formular geändert wird funktioniert eine Änderung der Anwendungsstandartwerte!, (Eingrenzung des Problems).
Hier noch die Tabellenstruktur der Tabelle Defaults:
Feldname Typ
ID Int Schlüssel
Selmon Dec(2)
Seljahr Dec(4)
Lastjahr Dec(4)
Berichtszeit Dec(2)
eventuell gibt es ja doch noch eine Lösung
Gruß Jürgen
Re: Probleme mit DB-Update aus Makro nach Konvertierung in eine MySQL-DB
Verfasst: Fr 5. Jul 2019, 16:53
von RobertG
Hallo Jürgen,
ich gehe davon aus, dass das Problem in Deiner JDBC-Verbindung steckt. Ich kann das Verhalten hier auch mit MySQL-Connector 5.1.40 nicht nachvollziehen. Da funktioniert das Makro ebenso einwandfrei, auch mit einem Tabellennamen mit einem Großbuchstaben am Anfang.
Sobald ich mit einem doppelten Anführungszeichen maskiere kommt eine Errormeldung. Sobald ich mit ` maskiere, wie von mir beschrieben, erfolgt das Update genauso wie ohne jegliche Maskierung.
Ich kann noch einmal nachschauen, ob ich einen Deinem Connector nahe kommenden Connector zum Testen finde.
Gruß
Robert