Resultset - Was verstehe ich falsch?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

tipap
Beiträge: 6
Registriert: Fr, 05.10.2007 22:05

Resultset - Was verstehe ich falsch?

Beitrag von tipap »

Hallo,

ich glaube, dass ich da ein Verständnisproblem habe was Resultsets angeht. Im Moment stecke ich total fest und weiß ehrlich gesagt nicht, warum mein Makro nicht läuft.

Hier der Code:

Code: Alles auswählen

Sub FilterContacts

Dim oForm as Object
Dim sClient as String
Dim sSQL as String
Dim oStatement as Object
Dim oResultset as Object

oForm = thisComponent.drawpage.forms.getByName("MainForm")
sClient = oForm.getByName("fmtclientID").currentvalue

sSQL = "SELECT ""client ID"" FROM ""tblClients"" WHERE ""client_name"" = '" & sClient & "'"
oStatement = oForm.ActiveConnection.createStatement()
oResultset = oStatement.executeQuery(sSQL)
MsgBox oResultset.getString(1)

End Sub
Im Moment ist der Code noch nicht fertig, aber beim Testen erhalte ich ständig eine Fehlermeldung, sodass ich noch nicht weitergeschrieben habe.

Ich weise das Makro einem Schaltknopf (zum Testen) zu und erhalte dann immer einen BASIC-Laufzeitfehler, Message: no data available. Das heißt wohl nichts anderes, als dass keine Daten vorhanden sind.

Nun habe ich aber überprüft, ob sClient korrekt ausgelesen wird (Ausgabe von sSQL bevor der Rest des Codes durchgeführt wird) und das scheint jetzt OK zu sein, außerdem habe ich auch überprüft, dass die Abfrage auch tatsächlich ein Ergebnis liefert (SQL-Abfrage manuell mit den Werten gestartet; ist auch OK). Ich habe auch überprüft, ob oResultset nicht leer ist (isNull und auch mit isBeforeFirst und isAfterLast); auch das scheint nicht der Fall zu sein.

Ich bin bisher davon ausgegangen, dass man die Ergebnisspalte des Resultsets mit getString() direkt abfragen kann, ganz gleich wo der Zeilen-Cursor steht, also ohne zuerst oResultset.first() o.ä. anzuwenden.
Trotzdem habe ich es mal mit first() (anstatt getString) probiert, und erhalte da die Fehlermeldung "Resultset set to forward only". Keine Ahnung was das jetzt heißt. Wenn ich stattdessen next() verwende, dann erhalte ich als Ausgabe "true", was wohl heißt, dass der Zeilen-Cursor ein Feld weiter gerückt ist. Wenn ich anhand von findColumn() die Spaltennummer meines Ergebnisses auslesen will (in meinem Fall oResultset.findColumn("client ID")), dann erhalte ich als Ergebnis "1".

Alles das spricht doch eher dafür, dass oResultset nicht leer ist und eigentlich mein gewünschtes Ergebnis erhält. Nur komme ich trotzdem nicht an den Wert; ich erhalte immer nur die Fehlermeldung "no data available".

Wie gesagt, vielleicht habe ich da einen fundamentalen Verständnisfehler. Wäre sehr nett, wenn mich jemand aufklären könnte.

Danke.

Sonja
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Resultset - Was verstehe ich falsch?

Beitrag von Toxitom »

Hallo Sonja,

stimmt - dir fehlt das Verstndnis zum "resultset".
Also, das ist ein ganz bestimmtes Objekt, das später ähnlich wie eine Tabelle die Datensätze aufnimmt. Dieses Objekt erzeugst du zuerst, wobei du dabei diverse Eigenschaften mit übergeben kannst bzw. musst - je nachdem, was du für ein Objekt haben willst.
Lässt du das alles weg, so werden die Standardvorgaben genutzt - und das bedeutet, das Resultset ist nur sequenziell nach vorne lesbar. Du kanst also nicht wahlfrei springen und auch nicht zurückgehen. Eine Änderung der Daten ist ebenfalls nicht möglich.
So, zum nächsten Punkt. Das "Resultset"- Objekt besitzt einen Zeilenzeiger - der steht beim Erzeugen vor dem ersten Datensatz! Um überhaupt etwas auslesen zu können, musst du den mindestens um eine Stufe weiterbewegen - sonst kann der keine Daten auslesen.
Also, da ich nicht genau weiss, was du endgültig erreichen willst:
Schau dir erst einmal den Service com.sun.star.sdbc.ResultSet an, und dort insbesondere die Eigenschaften "ResultSetConcurrency" und "ResultSetType" (die erste solltest du auf 1008 - UPDATEABLE stellen, die zweiten auf 1005 - SCROLL_SENSITIVE).
Dann - nach Erzeugen des Resultsets - mache mindestens einen Schritt( oResultset.next() ) bevor du mit getString(1) den Wert der ersten Splate des ersten Datensatzes ausliest :-)

Und wenn du gar nichts ändern willst und auch nicht wahlfrei lesen möchtest, so sollte schon die Zeile

Code: Alles auswählen

oResultset.next() 
vor deiner Msgbox ausreichen :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
tipap
Beiträge: 6
Registriert: Fr, 05.10.2007 22:05

Re: Resultset - Was verstehe ich falsch?

Beitrag von tipap »

Hallo Thomas,

Danke für die Erklärung, ich glaube es jetzt verstanden zu haben, werde aber in den nächsten Tagen noch etwas weiter daran arbeiten, dann werden wir sehen. :)

Eine andere Frage am Rande: Ich würde mir gerne zum Thema Makros und OOoBase Literatur zulegen, und habe mir da natürlich die aus dem Galileo-Verlag angesehen. Da ich früher schon mal mit Access gearbeitet habe, sind mir so die grundlegenden Funktionen (wie erstelle ich Tabellen, Abfragen, Formulare, usw.) schon klar. Für manches habe ich auch hier im Forum oder sonstwo im Netz schon gute Lösungen gefunden.

Mich würde aber das Thema Makroprogrammierung in OOo und da speziell in Base besonders interessieren. Welches Buch eignet sich da besser: Datenbanken mit OOo 2 oder Macros in OOo 2?

Danke,

Sonja
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Resultset - Was verstehe ich falsch?

Beitrag von Toxitom »

Hallo Sonja,
...Datenbanken mit OOo 2 oder Macros in OOo 2?...
Hmm, das ist schwierig. Wenn du ein entsprechendes Budget hast, nimm beide. Der Grund: Das Basic Buch liefert die Grundlagen der API, von Dialogen und Formularen. Die brauchst du als Basis - behandelt aber Base eher "stiefmütterlich".
Das Base-Buch gibt ausführliche Hinweise zum Einsatz und zur Benutzung von Base - und hat eigene Kapitel zur Programmierung. Setzt aber Grundlagen der API etc. voraus. Also: Nur Base reicht dann nicht, da fehlen die Grundbegriffe der API.
Wenn ich entscheiden müsste..... ich glecube, ich würde das Makro-BUch nehmen.

Im Übrigen solltest du noch ein wenig warten. Beide Bücher sind neu geschrieben - das Basicbuch kommt wohl Ende des Monats in den Handel, das Basebuch Ende November. Beide Bücher wurden erweitert und aktualisert (auf die 2.3 Version). Es lohnt sich zu warten ;-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
tipap
Beiträge: 6
Registriert: Fr, 05.10.2007 22:05

Re: Resultset - Was verstehe ich falsch?

Beitrag von tipap »

Toxitom hat geschrieben: Im Übrigen solltest du noch ein wenig warten. Beide Bücher sind neu geschrieben - das Basicbuch kommt wohl Ende des Monats in den Handel, das Basebuch Ende November. Beide Bücher wurden erweitert und aktualisert (auf die 2.3 Version). Es lohnt sich zu warten ;-)
Hallo Thomas,

Danke für den Hinweis.

Ich werde dann wohl erstmal das Makro-Buch kaufen, sobald es erhältlich ist, und mich damit beschäftigen. Wenn ich noch mehr Infos brauche kann ich dann im November noch das Base-Buch zusätzlich erwerben. ;)

Gruß,

Sonja
Antworten