Makro / Resultsets nicht updatefähig einstellbar

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

StefanOO
*
Beiträge: 13
Registriert: So, 22.04.2007 13:23
Wohnort: Heidelberg / Leipzig

Makro / Resultsets nicht updatefähig einstellbar

Beitrag von StefanOO »

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'
StefanOO
*
Beiträge: 13
Registriert: So, 22.04.2007 13:23
Wohnort: Heidelberg / Leipzig

Update

Beitrag von StefanOO »

Es liegt eindeutig an der Verbindung.

Diese ist immer als Read Only eingestellt.

Aber mir ist bisher unbekannt, wie ich diesen Zustand ändern kann.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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:

Code: Alles auswählen

oStatement.ResultSetCurrency = com.sun.star.sdbc.ResultSetCurrency.UPDATEABLE
oStatement.ResultSetType = com.sun.star.sdbc.ResultSetTyp.SCROLL_SENSITIV
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
Update Personentabelle Set Name = 'Test'
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 probiert ;-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
StefanOO
*
Beiträge: 13
Registriert: So, 22.04.2007 13:23
Wohnort: Heidelberg / Leipzig

Klappt dennoch nicht!

Beitrag von StefanOO »

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?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Jürgen,
Ich vermute einmal, dass du der Autor der zwei Interessanten Bücher über Datenbanken und Makros bist.
Ja, bin ich :-)

Jetzt mal nur ein kurzer Schnellschuss:
Diese hat nur die Tabelle Personendaten und darin als Primärschlüssel „Primär“ und „Name“ (als String).
Hier hätte ich massive Bauchschmerzen :?
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
StefanOO
*
Beiträge: 13
Registriert: So, 22.04.2007 13:23
Wohnort: Heidelberg / Leipzig

Klappt immer noch nicht + update

Beitrag von StefanOO »

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.
peter_schmid
Beiträge: 1
Registriert: Sa, 12.01.2008 14:47

Re: Makro / Resultsets nicht updatefähig einstellbar

Beitrag von peter_schmid »

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.
hoffie
Beiträge: 6
Registriert: Mo, 06.12.2010 15:29

Re: Makro / Resultsets nicht updatefähig einstellbar

Beitrag von hoffie »

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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro / Resultsets nicht updatefähig einstellbar

Beitrag von DPunch »

Aloha
hoffie hat geschrieben:Der Vorschlag von "peter-schmid" funktioniert bei mir leider auch nicht.
Ich verwende ebenfalls Win XP und OOo 3.2, bei mir gibt es keinerlei Probleme bei der Arbeit mit RowSets.

Das Writer-Dokument hast Du wohl leider vergessen hochzuladen, daher fällt es schwer, Hilfestellung zu leisten.
hoffie
Beiträge: 6
Registriert: Mo, 06.12.2010 15:29

Re: Makro / Resultsets nicht updatefähig einstellbar

Beitrag von hoffie »

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
Dateianhänge
Fehlermeldungen mit Code.odt
(74.78 KiB) 60-mal heruntergeladen
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro / Resultsets nicht updatefähig einstellbar

Beitrag von DPunch »

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:

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()
Antworten