Makro / Resultsets nicht updatefähig einstellbar
Moderator: Moderatoren
Makro / Resultsets nicht updatefähig einstellbar
Hallo liebes Forum,
wieder eine Frage an die Makro/ SQL Experten.
Aus einem Dialog heraus soll eine Updatefunktion gestartet werden. Der Dialog selbst zeigt verschiedene Abfragen und Werte aus verschiedenen Tabellen an. Hierfür wird eine Verbindung zur Datenquelle geöffnet. (Eine normale ODB Datei, später soll eventuell auf MYSQL umgestellt werden.)
Was auch immer ich anstelle, ich bekomme keine updatefähigen Resultsets.
Rumprobieren führte schließlich zu folgender Erkenntnis: Ich kann egal wie und wo keine Updatefähigen Resultsets erzeugen.
1) Liegt das an der Art der Verbindung???
Hier etwas Beispielcode:
sub test
dim k,k2 as object
k = getVerbindung
k2= k.createStatement
k2.ResultsetType = 1005
' Das Resultset kann 1003, 1004 einnehmen aber nicht 1005
' Als ResultsetConcurrency kann nur 1007 eingenommen werden
' Tests der Verbindung zeigen, dass diese stets offen war
end sub
function getVerbindung
dim URL as string
dim diesesdocument, databasecontext, quelle as object
diesesdocument = ThisComponent
databasecontext = createUnoService("com.sun.star.sdb.DatabaseContext")
URL =Left(diesesdocument.URL, Len(diesesdocument.URL)-1) &"b"
quelle = databasecontext.getByName(URL)
getVerbindung = quelle.getConnection("","")
end function
(Die Datenbank wird über ein Fremddokument, welches sich testweise im gleichen Verzeichnis befindet, aufgerufen)
2) Es gibt Möglichkeiten über SQL direkt Befehle auszuführen. Wie lautet der Makrokode um z.Bsp. folgenden SQL Befehl auszuführen ?: Update Personentabelle Set Name = 'Test'
wieder eine Frage an die Makro/ SQL Experten.
Aus einem Dialog heraus soll eine Updatefunktion gestartet werden. Der Dialog selbst zeigt verschiedene Abfragen und Werte aus verschiedenen Tabellen an. Hierfür wird eine Verbindung zur Datenquelle geöffnet. (Eine normale ODB Datei, später soll eventuell auf MYSQL umgestellt werden.)
Was auch immer ich anstelle, ich bekomme keine updatefähigen Resultsets.
Rumprobieren führte schließlich zu folgender Erkenntnis: Ich kann egal wie und wo keine Updatefähigen Resultsets erzeugen.
1) Liegt das an der Art der Verbindung???
Hier etwas Beispielcode:
sub test
dim k,k2 as object
k = getVerbindung
k2= k.createStatement
k2.ResultsetType = 1005
' Das Resultset kann 1003, 1004 einnehmen aber nicht 1005
' Als ResultsetConcurrency kann nur 1007 eingenommen werden
' Tests der Verbindung zeigen, dass diese stets offen war
end sub
function getVerbindung
dim URL as string
dim diesesdocument, databasecontext, quelle as object
diesesdocument = ThisComponent
databasecontext = createUnoService("com.sun.star.sdb.DatabaseContext")
URL =Left(diesesdocument.URL, Len(diesesdocument.URL)-1) &"b"
quelle = databasecontext.getByName(URL)
getVerbindung = quelle.getConnection("","")
end function
(Die Datenbank wird über ein Fremddokument, welches sich testweise im gleichen Verzeichnis befindet, aufgerufen)
2) Es gibt Möglichkeiten über SQL direkt Befehle auszuführen. Wie lautet der Makrokode um z.Bsp. folgenden SQL Befehl auszuführen ?: Update Personentabelle Set Name = 'Test'
Hallo Stefan,
welche OOo Version nutzt du? In der 2.0 gab es einige Probleme mit der Typisierung (ResultSetConcurrency). Damit das überhaupt funktioniert, muss natürlich die Dtenbank das auch hergeben (bei HSQLDB also muss ein Primary Key existieren!).
Ansonsten ist der Weg schon richtig - und sollte funktionieren:
Ach ja, ich nutze eher den Langtext als die Nummern. Damit habe ich auch schlechte Erfahrungen gemacht!
So weit, so gut, aber ich glaube, dein Wunsch
Gruss
Thomas
welche OOo Version nutzt du? In der 2.0 gab es einige Probleme mit der Typisierung (ResultSetConcurrency). Damit das überhaupt funktioniert, muss natürlich die Dtenbank das auch hergeben (bei HSQLDB also muss ein Primary Key existieren!).
Ansonsten ist der Weg schon richtig - und sollte funktionieren:
Code: Alles auswählen
oStatement.ResultSetCurrency = com.sun.star.sdbc.ResultSetCurrency.UPDATEABLE
oStatement.ResultSetType = com.sun.star.sdbc.ResultSetTyp.SCROLL_SENSITIV
So weit, so gut, aber ich glaube, dein Wunsch
ist - glaube ich - mit der HSQLDB so sowieso nicht machbar. Du kannst zwar über Base SQL Befehle direkt ausführen (execute(sSQL)), Aber den Namen ändern? Das habe ich nie probiertUpdate Personentabelle Set Name = 'Test'

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Klappt dennoch nicht!
Hallo Thomas,
danke für die Antwort. Ich vermute einmal, dass du der Autor der zwei Interessanten Bücher über Datenbanken und Makros bist.
Ich nutze die Version 2.2, alles läuft auf einem XP System.
Ich hatte das mit dem UPDATEABLE auch schon probiert. Aber geklappt hat es trotzdem nicht.
Testweise erstellte ich eine neue Datenbank: Diese hat nur die Tabelle Personendaten und darin als Primärschlüssel „Primär“ und „Name“ (als String). Es gibt 2 Einträge 0 : Name 1, 1: Name 2
Hier mal eine Liste der Dinge, die ich probierte und die dazugehörige Fehlermeldung.
sub satzaendern1
dim neueverb, set1 as object
neueverb = getVerbindung
msgbox neueverb.isReadonly ' Antwort False
' Falls die Zeile
' neueverb.setReadOnly(False)
' eingefügt wird gibt es die Fehlermeldung: This call is not allowed, when sharing connections
set1 = neueverb.createStatement
set1.ResultsetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
' Wert springt an dieser Stelle von 1003 auf 1004, aber die 1005 wird nicht erreicht.
' FEHLERMELDUNG,Eigenschaft oder Methode nicht gefunden, bei
' set1.ResultsetType = com.sun.star.sdbc.ResultSetType.SCROLL_INTENSITIVE
set1.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATEABLE
'EIGENSCHAFT ODER METHODE NICHT GEFUNDEN
' Wenn 1008 eingegeben wird, bleibt als Wert 1007 erhalten
set1 = set1.executeQuery("Select ""Name"" from ""Personendaten""")
set1.next
msgbox set1.getString(1) ' Name 1
set1.updateString(1, "test")
' Fehlermeldung: Result set is Read only (was auch klar ist, es lässt sich nicht anders einstellen)
neueverb.close
end sub
function getVerbindung
dim URL as string
dim diesesdocument, databasecontext, quelle as object
diesesdocument = ThisComponent
databasecontext = createUnoService("com.sun.star.sdb.DatabaseContext")
quelle = databasecontext.getByName("test")
' Selbst wenn die Datenquelle angemeldet ist, passiert nichts
getVerbindung = quelle.getConnection("","")
end function
Als Java Umgebung habe ich nur noch die 1.6.0_01.
Alle anderen habe ich mal vom Rechner geschmissen.
Vielleicht gibt es ja doch irgendwas, was ich übersehen habe?
Oder sollte ich OO noch einmal neu installieren und dann wieder ausprobieren?
danke für die Antwort. Ich vermute einmal, dass du der Autor der zwei Interessanten Bücher über Datenbanken und Makros bist.
Ich nutze die Version 2.2, alles läuft auf einem XP System.
Ich hatte das mit dem UPDATEABLE auch schon probiert. Aber geklappt hat es trotzdem nicht.
Testweise erstellte ich eine neue Datenbank: Diese hat nur die Tabelle Personendaten und darin als Primärschlüssel „Primär“ und „Name“ (als String). Es gibt 2 Einträge 0 : Name 1, 1: Name 2
Hier mal eine Liste der Dinge, die ich probierte und die dazugehörige Fehlermeldung.
sub satzaendern1
dim neueverb, set1 as object
neueverb = getVerbindung
msgbox neueverb.isReadonly ' Antwort False
' Falls die Zeile
' neueverb.setReadOnly(False)
' eingefügt wird gibt es die Fehlermeldung: This call is not allowed, when sharing connections
set1 = neueverb.createStatement
set1.ResultsetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
' Wert springt an dieser Stelle von 1003 auf 1004, aber die 1005 wird nicht erreicht.
' FEHLERMELDUNG,Eigenschaft oder Methode nicht gefunden, bei
' set1.ResultsetType = com.sun.star.sdbc.ResultSetType.SCROLL_INTENSITIVE
set1.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATEABLE
'EIGENSCHAFT ODER METHODE NICHT GEFUNDEN
' Wenn 1008 eingegeben wird, bleibt als Wert 1007 erhalten
set1 = set1.executeQuery("Select ""Name"" from ""Personendaten""")
set1.next
msgbox set1.getString(1) ' Name 1
set1.updateString(1, "test")
' Fehlermeldung: Result set is Read only (was auch klar ist, es lässt sich nicht anders einstellen)
neueverb.close
end sub
function getVerbindung
dim URL as string
dim diesesdocument, databasecontext, quelle as object
diesesdocument = ThisComponent
databasecontext = createUnoService("com.sun.star.sdb.DatabaseContext")
quelle = databasecontext.getByName("test")
' Selbst wenn die Datenquelle angemeldet ist, passiert nichts
getVerbindung = quelle.getConnection("","")
end function
Als Java Umgebung habe ich nur noch die 1.6.0_01.
Alle anderen habe ich mal vom Rechner geschmissen.
Vielleicht gibt es ja doch irgendwas, was ich übersehen habe?
Oder sollte ich OO noch einmal neu installieren und dann wieder ausprobieren?
Hallo Jürgen,

Jetzt mal nur ein kurzer Schnellschuss:
Ein Umlaut in dem Bezeichner? Ob das gutgeht....
Also, teste das doch mal mit einem "normalen" Bezeichner, zum Beispiel "ID" .
Ansonsten sollte es funktionieren - wenn nicht in der 2.2 wieder ein Bug hinzugekommen ist
Gruss
Thomas
Ja, bin ichIch vermute einmal, dass du der Autor der zwei Interessanten Bücher über Datenbanken und Makros bist.

Jetzt mal nur ein kurzer Schnellschuss:
Hier hätte ich massive BauchschmerzenDiese hat nur die Tabelle Personendaten und darin als Primärschlüssel „Primär“ und „Name“ (als String).

Ein Umlaut in dem Bezeichner? Ob das gutgeht....
Also, teste das doch mal mit einem "normalen" Bezeichner, zum Beispiel "ID" .
Ansonsten sollte es funktionieren - wenn nicht in der 2.2 wieder ein Bug hinzugekommen ist

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Klappt immer noch nicht + update
Hallo Forum,
das "Ä" Problem kommt daher, dass erst die Datenbank da war und ich erst hiernach einen "aufgehübschten" Zugriff via Fremddokument programmierte. (Bzw. noch dabei bin, man muss ja arbeiten und Lust haben)
Ich habe in der neuen Testdatenbank das Feld als Primaer erstellt. Ändert aber leider nichts an der Tatsache. (auch wenn ich die Datenbank anmelde nicht)
Update: Ich habe OO 2.2. noch einmal installiert, keine Änderung.
Ich habe es mit der Portablen Version (2.1.) probiert, ging auch nicht.
Und als letztes habe ich sogar meine Mutter angerufen, ihr den Makrocode per E-Mail geschickt und während eines langen Telefonats noch einmal getestet.
Ergebnis: Selbst auf einem anderen Rechner (mit OO 2.1) und wahlweise JRE 1.6.01_0 (oder so ähnlich) bzw. 1.5.09 (oder so ähnlich) gab es immer die selben Fehlermeldungen.
Falls jemand noch einmal Zeit und Lust hat, kann er ja das Problem einmal nachbilden und mitteilen, ob der Fehler auch bei ihm auftritt.
Ansonsten werde ich in den nächsten Tagen mal die OO Homepage nach Bug- und Fehlermeldungsmöglichkeiten durchsuchen.
Ich werde dann versuchen am Thema zu bleiben und ggf. ein weiteres Update posten.
das "Ä" Problem kommt daher, dass erst die Datenbank da war und ich erst hiernach einen "aufgehübschten" Zugriff via Fremddokument programmierte. (Bzw. noch dabei bin, man muss ja arbeiten und Lust haben)
Ich habe in der neuen Testdatenbank das Feld als Primaer erstellt. Ändert aber leider nichts an der Tatsache. (auch wenn ich die Datenbank anmelde nicht)
Update: Ich habe OO 2.2. noch einmal installiert, keine Änderung.
Ich habe es mit der Portablen Version (2.1.) probiert, ging auch nicht.
Und als letztes habe ich sogar meine Mutter angerufen, ihr den Makrocode per E-Mail geschickt und während eines langen Telefonats noch einmal getestet.
Ergebnis: Selbst auf einem anderen Rechner (mit OO 2.1) und wahlweise JRE 1.6.01_0 (oder so ähnlich) bzw. 1.5.09 (oder so ähnlich) gab es immer die selben Fehlermeldungen.
Falls jemand noch einmal Zeit und Lust hat, kann er ja das Problem einmal nachbilden und mitteilen, ob der Fehler auch bei ihm auftritt.
Ansonsten werde ich in den nächsten Tagen mal die OO Homepage nach Bug- und Fehlermeldungsmöglichkeiten durchsuchen.
Ich werde dann versuchen am Thema zu bleiben und ggf. ein weiteres Update posten.
-
- Beiträge: 1
- Registriert: Sa, 12.01.2008 14:47
Re: Makro / Resultsets nicht updatefähig einstellbar
Mit folgendem sollte es funktionieren
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.setPropertyValue("DataSourceName", "Trial2")
RowSet.setPropertyValue("CommandType", com.sun.star.sdb.CommandType.COMMAND)
RowSet.setPropertyValue("Command", "SELECT * FROM" & sQuote & sFilename & sQuote)
RowSet.execute()
RowSet.first()
RowSet.UpdateBoolean(RowSet.findcolumn("verrechnet"),false)
RowSet.UpdateRow()
Rowset.next()
RowSet.UpdateBoolean(RowSet.findcolumn("verrechnet"), true)
RowSet.UpdateRow()
RowSet.close()
wrde auch schon in anderem Thread beantwortet.
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.setPropertyValue("DataSourceName", "Trial2")
RowSet.setPropertyValue("CommandType", com.sun.star.sdb.CommandType.COMMAND)
RowSet.setPropertyValue("Command", "SELECT * FROM" & sQuote & sFilename & sQuote)
RowSet.execute()
RowSet.first()
RowSet.UpdateBoolean(RowSet.findcolumn("verrechnet"),false)
RowSet.UpdateRow()
Rowset.next()
RowSet.UpdateBoolean(RowSet.findcolumn("verrechnet"), true)
RowSet.UpdateRow()
RowSet.close()
wrde auch schon in anderem Thread beantwortet.
Re: Makro / Resultsets nicht updatefähig einstellbar
Hallo,
würde gerne mit meinem ersten Beitrag dieses Thema wider hervor holen.....
Hab ein ähnliches oder vllt. auch das gleiche Problem wie "StefanOO". Würde gerne meine Datenbank per Makro bearbeiten, heißt Sachen eintragen. Hab beide Lösungsvarianten aus dem Buch von Thomas Krumbein " Makros in Openoffice.org 3" schon ausgiebig getestet und ausprobiert. Der Vorschlag von "peter-schmid" funktioniert bei mir leider auch nicht. Hab mal ein Writer Dokument hochgeladen, indem die Codes mit zugehörigen Fehlermeldungen dargestellt sind. Außerdem hab ich bei meiner Suche in einem englischsprachigen Forum folgenden Link gefunden: http://www.openoffice.org/issues/show_bug.cgi?id=61869 , frag mich ob der Bug bei OO 3.2 immer noch aktuell ist. Kann man das irgendwo sicher nachschauen???
Verwende OO3.2 unter Windows XP
Vielen Dank schon mal!
Gruß Peter
würde gerne mit meinem ersten Beitrag dieses Thema wider hervor holen.....
Hab ein ähnliches oder vllt. auch das gleiche Problem wie "StefanOO". Würde gerne meine Datenbank per Makro bearbeiten, heißt Sachen eintragen. Hab beide Lösungsvarianten aus dem Buch von Thomas Krumbein " Makros in Openoffice.org 3" schon ausgiebig getestet und ausprobiert. Der Vorschlag von "peter-schmid" funktioniert bei mir leider auch nicht. Hab mal ein Writer Dokument hochgeladen, indem die Codes mit zugehörigen Fehlermeldungen dargestellt sind. Außerdem hab ich bei meiner Suche in einem englischsprachigen Forum folgenden Link gefunden: http://www.openoffice.org/issues/show_bug.cgi?id=61869 , frag mich ob der Bug bei OO 3.2 immer noch aktuell ist. Kann man das irgendwo sicher nachschauen???
Verwende OO3.2 unter Windows XP
Vielen Dank schon mal!
Gruß Peter
Re: Makro / Resultsets nicht updatefähig einstellbar
Aloha
Das Writer-Dokument hast Du wohl leider vergessen hochzuladen, daher fällt es schwer, Hilfestellung zu leisten.
Ich verwende ebenfalls Win XP und OOo 3.2, bei mir gibt es keinerlei Probleme bei der Arbeit mit RowSets.hoffie hat geschrieben:Der Vorschlag von "peter-schmid" funktioniert bei mir leider auch nicht.
Das Writer-Dokument hast Du wohl leider vergessen hochzuladen, daher fällt es schwer, Hilfestellung zu leisten.
Re: Makro / Resultsets nicht updatefähig einstellbar
Oh sorry,
hab ich einfach vergessen...
Also zum Zweiten, heir meine verwendeten Codes mit den dazugehörigen Fehlermeldungen.
Nachtrag, hab bei meiner Anfrage an den Autor des Buches die Antwort bekommen, dass die Sache "Result Set nur lesbar" wohl was mit den Datenbanktreibern zu tun hätte. Das sagt mir aber leider aber gar nichts???
Gruß Peter
hab ich einfach vergessen...
Also zum Zweiten, heir meine verwendeten Codes mit den dazugehörigen Fehlermeldungen.
Nachtrag, hab bei meiner Anfrage an den Autor des Buches die Antwort bekommen, dass die Sache "Result Set nur lesbar" wohl was mit den Datenbanktreibern zu tun hätte. Das sagt mir aber leider aber gar nichts???
Gruß Peter
- Dateianhänge
-
- Fehlermeldungen mit Code.odt
- (74.78 KiB) 60-mal heruntergeladen
Re: Makro / Resultsets nicht updatefähig einstellbar
Aloha
Die Variante 2 hat bei mir noch nie funktioniert, ob das an Treibern liegt oder nicht, weiss ich nicht.
Variante 1 funktioniert bei mir, wie gesagt ebenfalls OOo 3.2 und Win XP, einwandfrei.
Die Fehlermeldung lässt sich bei mir auch nur reproduzieren, wenn der Cursor auf "InsertRow" steht, aber ein "oRowSet.updateRow" ausgeführt werden soll.
Probier mal folgenden Code:
Die Variante 2 hat bei mir noch nie funktioniert, ob das an Treibern liegt oder nicht, weiss ich nicht.
Variante 1 funktioniert bei mir, wie gesagt ebenfalls OOo 3.2 und Win XP, einwandfrei.
Die Fehlermeldung lässt sich bei mir auch nur reproduzieren, wenn der Cursor auf "InsertRow" steht, aber ein "oRowSet.updateRow" ausgeführt werden soll.
Probier mal folgenden Code:
Code: Alles auswählen
Dim oRowSet as Object, sSql as String
sSql = "SELECT * FROM ""Tabelle1""" '"SELECT ""Meisterschaft"", ""ID"" FROM ""Tabelle1"""
oRowSet = createUnoService("com.sun.star.sdbc.RowSet")
with oRowSet
.DataSourceName = "Grundauswahl"
.Command = sSql
.execute()
end with
oRowSet.absolute(2)
If oRowSet.isAfterLast Then MsgBox "Unzulässige Cursorposition" : Exit Sub
oRowSet.updateString(2, "Max Moritz")
If oRowSet.isNew Then
oRowSet.insertRow
ElseIf oRowSet.isModified Then
oRowSet.updaterow
End If
oRowSet.close()