🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

firebird objRec.first

Alles zur Programmierung im LibreOffice.
Antworten
dimpflmoser
Beiträge: 16
Registriert: So 2. Feb 2014, 15:19

firebird objRec.first

Beitrag von dimpflmoser » Sa 24. Nov 2018, 18:52

Hallo zusammen,

ich habe die Datentabellen meiner eingebetteten HSQL-Datenbank zu Firebird konvertieren lassen.

Dabei fiel mir in meinen Basic-Modulen auf, dass die Recordsetmethode .first() wohl nicht mehr existiert...:

Code: Alles auswählen

' Kontaktdaten abfragen
strSql = "SELECT NAME1, NAME2, ANREDE, TITEL, ORTSTEIL, STRASSE, PLZ, ORT, " & _
"PLZPOSTFACH, POSTFACH, ANREDEBRF FROM KONTAKTE " & _
"WHERE KONTAKTNR = " & objForm.getByName("txtKontaktNr").Text
objResult = DbConnect.getResultSet(objForm.ActiveConnection, strSql)
' Auf ersten Datensatz positionieren
objResult.first() ' Hier wird eine Fehlermeldung ausgegeben
' Werte aus Resultset übernehmen
strName1 = objResult.getString(1)
strName2 = objResult.getString(2)
Rem ...
Meine Fragen:
Kann jemand helfen?
Gibt es eine Übersicht über die von Firebird unterstützten Basic Datenbank-Eigenschaften und Methoden?

Danke

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: firebird objRec.first

Beitrag von F3K Total » So 25. Nov 2018, 08:54

Moin,
dieser Code funktioniert bei mir, W7 LO 613:

Code: Alles auswählen

Sub Test_First
oController = ThisDatabasedocument.currentController
if not oController.isconnected then oController.connect
oConnection = oController.activeConnection
sQLStatement = oConnection.CreateStatement
strSql = "SELECT NAME1, NAME2, ANREDE, TITEL, ORTSTEIL, STRASSE, PLZ, ORT, " & _
"PLZPOSTFACH, POSTFACH, ANREDEBRF FROM KONTAKTE " & _
"WHERE KONTAKTNR = " & objForm.getByName("txtKontaktNr").Text
objResult = sQLStatement.executequery(strSql)
' Auf ersten Datensatz positionieren
objResult.first() ' Hier wird eine Fehlermeldung ausgegeben
' Werte aus Resultset übernehmen
strName1 = objResult.getString(2)
strName2 = objResult.getString(3)
print strName1
print strName2
Rem ...

end sub
Windows 11: AOO, LO Linux Mint: AOO, LO

dimpflmoser
Beiträge: 16
Registriert: So 2. Feb 2014, 15:19

Re: firebird objRec.first

Beitrag von dimpflmoser » So 2. Dez 2018, 14:43

Vielen Dank für deine Antwort. Sie hat in der Tat sehr geholfen.

Ich habe noch experimentiert und festgestellt, dass das eigentliche Problem früher im Code liegt - hier noch ein Beispiel. Die folgende Funktion ermittelt die Anzahl der Datensätze im Recordset. Anschließend wird der Zeiger wieder auf den ersten Datensatz gestellt:

Code: Alles auswählen

Function getRecordCount(objResult As Object) As Long
	Dim intCount As Long
	
	' Count initialisieren
	intCount = 0
	' ResultSet durchlaufen
	While objResult.Next()
		' Count inkrementieren
		intCount = intCount + 1
	Wend
	' Auf ersten Datensatz positionieren
	objResult.First()
	' RecordCount zurückgeben
	getRecordCount = intCount
End Function
Der Fehler wird erst in der Zeile objResult.First() erzeugt. Kommentiere ich den While-Block bzw. die First()-Zeile aus gibt es keine Probleme. Der Datensatzcursor lässt sich also nicht zurück bewegen. Das ist interessant, da das Recordset wie folgt angelegt wird:

Code: Alles auswählen

Function getResultSet(objDbCon As Object, strSql As String) As Object	
	Dim objStatement As Object
	Dim objResult As Object
	
	' Statement erstellen
	objStatement = objDbCon.createStatement()
	objStatement.ResultSetConcurrency = _
		com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
	objStatement.ResultSetType = _
		com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
	' Abfrage ausfuehren
	objResult = objStatement.executeQuery(strSql)
	' ResultSet zurückgeben
	getResultSet = objResult
End Function
Mit der internen HSQL-Datenbank hingegen läuft der Code problemlos - werden Recordsets by Firebird stets FORWARD_ONLY angelegt?


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten