🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ 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. 🤗

[solved] Base, BASIC-Laufzeitfehler: No data is available

Alles zur Programmierung im LibreOffice.
Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

[solved] Base, BASIC-Laufzeitfehler: No data is available

Beitrag von tweety » Mo 30. Mär 2015, 19:28

Hi all,

ich finde den Fehler einfach nicht!
Folgendes Progrämmlein habe ich für LibreOffice Base zusammengetippt und scheinbar unterwegs irgendwo einen Fehler eingebaut, denn es kommt als Fehlermeldung:

BASIC-Laufzeitfehler. (4.3.5.2)
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: No data is available.

Am Ende des Makros gebe ich zum Test zwei Message Boxes aus, kopiere ich von dort den String aus dem ersten (strSQL) in eine Abfrage oder in das SQL-Fenster von Base, erscheint das richtige Ergebnis.

Zu Ostern vielleicht schonmal eine Vorübung zum Suchen :roll:

Hier das Makro noch dazu.

Code: Alles auswählen

Sub getSchoolLeader ()
	Dim oForm as Object
	Dim oDataSource as Object
	Dim oQueryStatement as Object
	Dim oQueryResult as Object
	
	Dim strSchoolID as String
	Dim strSQL as String
	
	oDataSource = ThisComponent.Parent.CurrentController
	If NOT (oDataSource.isConnected()) THEN
	   oDataSource.connect()
	END IF
	
	oForm = ThisComponent.DrawPage.Forms.GetByName("frm_Mitglieder")
	oQueryStatement =  oDataSource.ActiveConnection.createStatement()

	strSchoolID = oForm.GetByName("Schul-ID").currentValue
	strSQL = "SELECT ""tbl_Ausbilder"".""Titel"", ""tbl_Ausbilder"".""Vorname"", ""tbl_Ausbilder"".""Name"" "_
			+ "FROM ""tbl_Schulen"", ""tbl_Ausbilder"" "_
			+ "WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = '" + strSchoolID + "'"
	oQueryResult = oQueryStatement.ExecuteQuery(strSQL)
	msgbox strSQL	
	msgbox oQueryResult.GetString(1)
End Sub
Wäre nett, wenn ihr mal drüberschauen könntet.

Greez2all
Tweety
Zuletzt geändert von tweety am Do 2. Apr 2015, 20:04, insgesamt 1-mal geändert.
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von mikele » Mo 30. Mär 2015, 23:40

Hallo,

ich bin mir nicht sicher, aber fehlt am Ende

Code: Alles auswählen

strSQL = "SELECT ""tbl_Ausbilder"".""Titel"", ""tbl_Ausbilder"".""Vorname"", ""tbl_Ausbilder"".""Name"" "_
         + "FROM ""tbl_Schulen"", ""tbl_Ausbilder"" "_
         + "WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = '" + strSchoolID + "'"
nicht noch ein Ausführungszeichen, um den "WHERE - Zweig abzuschließen?
Gruß,
mikele

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Di 31. Mär 2015, 00:35

Hi Mikele,

soweit ich weiß (und probiert habe) ist es egal ob man

Code: Alles auswählen

... + "WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = '" + strSchoolID + "'"
oder

Code: Alles auswählen

+ "WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = " + strSchoolID
schreibt.
Der Ausgabestring sieht dann so aus

Code: Alles auswählen

... WHERE "tbl_Schulen"."Schulleiter" = "tbl_Ausbilder"."ID" AND "tbl_Schulen"."ID" = '1'
bzw.
... WHERE "tbl_Schulen"."Schulleiter" = "tbl_Ausbilder"."ID" AND "tbl_Schulen"."ID" = 1
Mit den einfachen Hochkommata habe ich aus einem Beispiel genauso übernommen, und über den SQL Dialog per Direkteingabe kommt bei beiden Varianten das selbe richtige Ergebnis heraus.
Der Fehler tritt im Code auch erst bei der zweiten msgbox auf, da wurde die Abfrage ja (vielleicht) schon durchgeführt.

Danke trotzdem :)
Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Di 31. Mär 2015, 11:50

Hi Mikki,

danke für den Hinweis.
Folgende Fehlermeldung kommt dann bei der Zeile

Code: Alles auswählen

oQueryResult = oQueryStatement.ExecuteQuery(strSQL)
Type: com.sun.star.sdbc.SQLException
Message: Column not found: 6 in statement [SELECT "tbl_Ausbilder"."Titel", "tbl_Ausbilder"."Vorname", "tbl_Ausbilder"."Name" FROM "tbl_Schulen", "tbl_Ausbilder" WHERE "tbl_Schulen"."Schulleiter" = "tbl_Ausbilder"."ID" AND "tbl_Schulen"."ID" = "6"

Geändet habe ich es von einfachen auf doppelte Anführungszeichen:

Code: Alles auswählen

...+ "WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = """ + strSchoolID + """"
Die selbe Fehlermeldung bekomme ich dann auch, wenn ich die SQL Anweisung direkt verwende. Oder habe ich mich jetzt bei den Anführungszeichen wieder vertan?
Ich hätte es damit erklärt, daß in doppelten Anführungszeichen alle Spalten einer Tabelle/Abfrage aufgeführt werden müssen. Da es sich bei strSchoolID aber um den Vergleichswert handelt, nachdem "gefilter" wird, müssen entweder einfache oder gar keine Anführungszeichen verwendet werden. Vielleicht...

Noch eine Idee?
greez2all
Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Di 31. Mär 2015, 12:21

Hallo Mikki,

"tbl_Schulen"."ID" ist ein numerischer Wert.
strSchoolID = oForm.GetByName("Schul-ID").currentValue ist ebenfalls ein numerischer Wert aus einem Kombinationsfeld, dessen Inhalt aus einer Abfrage kommt.

Ich hatte strSchulID auch schon als iSchulID und entsprechend also Integer deklariert, mit dem selben Ergebnis, daß keine Daten vorhanden sind. Ich war auch der Meinung, daß es egal ist, da strSQL ein String ist und der numerische Wert entsprechend konvertiert wird, oder?

greez2all
Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Di 31. Mär 2015, 14:59

Hallo Mikki,

ja Danke für die Hilfe. Ich denke auch, daß die Syntax des SQL-Statements soweit korrekt ist, aber irgendwo ist vielleicht noch ein anderes Fehlerchen.
Vielleicht hat ja jemand noch eine Idee :)

Bis denne
Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von mikele » Do 2. Apr 2015, 17:38

Hallo,

soweit ich es nachlesen konnte, wäre das SQL-Kommando in deinem Fall:

Code: Alles auswählen

SELECT tbl_Ausbilder.Titel, tbl_Ausbilder.Vorname, tbl_Ausbilder.Name FROM tbl_Schulen, tbl_Ausbilder WHERE tbl_Schulen.Schulleiter = tbl_Ausbilder.ID AND tbl_Schulen.ID = strSchoolID
Das Ganze als String

Code: Alles auswählen

"SELECT tbl_Ausbilder.Titel, tbl_Ausbilder.Vorname, tbl_Ausbilder.Name FROM tbl_Schulen, tbl_Ausbilder WHERE tbl_Schulen.Schulleiter = tbl_Ausbilder.ID AND tbl_Schulen.ID = strSchoolID"
würde eigentlich reichen, aber die Eigennamen müssen in doppelte Hochkommas gesetzt werden und diese müsse in dem String maskiert werden (Thomas Krummbein: Makros in OpenOffice.org 3). Daher denke ich, es müsste so aussehen:

Code: Alles auswählen

"SELECT ""tbl_Ausbilder"".""Titel"", ""tbl_Ausbilder"".""Vorname"", ""tbl_Ausbilder"".""Name"" FROM ""tbl_Schulen"", ""tbl_Ausbilder"" WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = strSchoolID"
Bei letzten Ausdruck handelt es sich ja nicht um eienn Eigennamen (der Datenbank) sondern um eine Variable. Ich bin aber nicht sicher, ob die Variable als solche in dieser Abfrage korrekt behandelt wird.
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von mikele » Do 2. Apr 2015, 18:17

Hallo,

Korrektur/ zu meinem letzten Beitrag. Damit der Variablenwert von strSchoolID richtig in den SQL-Komandostring eingebaut wird müsste es so gehen:

Code: Alles auswählen

"SELECT ""tbl_Ausbilder"".""Titel"", ""tbl_Ausbilder"".""Vorname"", ""tbl_Ausbilder"".""Name"" FROM ""tbl_Schulen"", ""tbl_Ausbilder"" WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" ='" & strSchoolID & "' "
So wie ich es jetzt sehe unterscheiden sich unsere LÖsungen nur im + und & :o
Vielleicht liegt der Fehler ja ganz woanders. Ich vermute jetzt mal, dass oQueryResult korrekt bestimmt wird und der Fehler im Auslesen liegt.
Was passiert, wenn du vor

Code: Alles auswählen

msgbox oQueryResult.GetString(1)
die Zeile

Code: Alles auswählen

oQueryResult.next
einfügst?
Gruß,
mikele

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Do 2. Apr 2015, 18:24

Hallo Mikele,

dank für Deinen weiteren Denkanstoß :)

Wie Du aber schon selbst sagtest ist deine zweite Code-Zeile nicht korrekt, weil dann tbl_Schulen.ID gleich dem String/Text "strSchoolID" abgefragt wird, und nicht der Inhalt dieser Variablen (0,1,2,3,4,...).

Die Meldung bleibt auch gleich, wenn ich anstelle der Variablen einen Zahl vorgebe. Also zum Beispiel:

Code: Alles auswählen

"SELECT ""tbl_Ausbilder"".""Titel"", ""tbl_Ausbilder"".""Vorname"", ""tbl_Ausbilder"".""Name"" FROM ""tbl_Schulen"", ""tbl_Ausbilder"" WHERE ""tbl_Schulen"".""Schulleiter"" = ""tbl_Ausbilder"".""ID"" AND ""tbl_Schulen"".""ID"" = 1"
Von daher denke ich eher, daß irgendwo die Verbindung zur Datenbank hängt, aber die SQL Syntax korrekt ist. Also irgendwo hier:

Code: Alles auswählen

   oDataSource = ThisComponent.Parent.CurrentController
   If NOT (oDataSource.isConnected()) THEN
      oDataSource.connect()
   END IF
   
   oForm = ThisComponent.DrawPage.Forms.GetByName("frm_Mitglieder")
   oQueryStatement =  oDataSource.ActiveConnection.createStatement()
Ich wüßte aber nicht wie ich das prüfen sollte. Für mich auch nicht verständlich, weil doch eigentlich die Abfrage losgelöst vom Formular ist und mit oDataSource doch eigentlich auf die Datenbank zugegriffen werden sollte, die das "Formular enthält".

greez2all
Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2

Benutzeravatar
tweety
Beiträge: 8
Registriert: Mo 30. Mär 2015, 19:15

Re: Base, BASIC-Laufzeitfehler. Message: No data is availabl

Beitrag von tweety » Do 2. Apr 2015, 19:58

Hallo Mikele,

:D ;) :( :o :lol: :oops: :x :cry: :roll: :?: :?: :?: :?: :?:

Code: Alles auswählen

oQueryResult.next
hat es gebracht.. und warum??? Wäre nett, wenn Du mir das noch erklären könntest. Ich war nämlich überzeugt davon, daß nur ein einziger Datensatz zurückgeliefert wird. .next würde dann also auf ein nicht vorhandenes Element verweisen und mit einem Fehler abbrechen. Nie im Leben wäre ich darauf gekommen, das zu verwenden.

Ich hoffe Du hast dafür eine vernünftige Erklärung!!!
Vielen Dank und viele Grüße

Tweety
Nichts vereinfacht ein Problem so sehr, wie mangelnde Sachkenntnis!
Linux, LibreOffice 4.3.5.2


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