🙏 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.
F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

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

Beitrag von F3K Total » Do 2. Apr 2015, 21:04

Hi,
Ich empfehle Dir die Verwendung eines Introspection-Tools wie MRI oder Xray
Damit kannst Du alle OOo-Dokumente hinsichtlich ihres Aufbaues durchleuchten.
Wenn du z.B nach

Code: Alles auswählen

oQueryResult = oQueryStatement.ExecuteQuery(strSQL)
den Befehl

Code: Alles auswählen

xray oQueryResult
ausführst, kannst du unter den Methoden des ResultSets die Eigenschaft isBeforeFirst finden, deren Wert gerade TRUE zeigt. Dies bedeutet, dass sich der Datensatzzeiger vor dem ersten Datensatz befindet.
Ohne Xray/Mri kannst du diesen Wert mit

Code: Alles auswählen

msgbox oQueryResult.isBeforeFirst
abfragen.
Mit

Code: Alles auswählen

oQueryResult.next
springst du dann auf den nächsten, also in deinem Fall ersten und einzigen Datensatz.
Solltest Du eine Abfrage über mehrere Datensätze durchgeführt haben, kannst Du z.B. mit einer Schleife alle Zeilen durchlaufen:

Code: Alles auswählen

While oQueryResult.next
     msgbox oQueryResult.GetString(1)
wend
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

Koto
Beiträge: 19
Registriert: Do 30. Aug 2012, 17:05

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

Beitrag von Koto » Fr 3. Apr 2015, 09:33

Ich habe mal versucht alle Schritte in MySql zu vollziehen. Weil ich deine CREATE-Statements nicht kenne, habe ich die Tabellen der DB nach eigenem Geschmack etwas geändert:
ID nehme ich, um den Datensatz eindeutig zu machen, also wird es ein BIGINT der sich selber hochzählt und als Schlüssel verwendet wird. Falls eine Schule in Hamburg so heißt wie eine in München, kann ich die
beiden in anderen Queries immer noch unterscheiden. Zudem muß ich eine Datenbankverbindung mit Passwort herstellen. Aber es kommt ja auf die SELECT-Geschichte an.

In MySQL sind das diese Befehle:

Code: Alles auswählen

CREATE TABLE `Ausbilder` (ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `Position` VARCHAR(255)`, `Vorname` VARCHAR(255), `Name` VARCHAR(255), `Titel` VARCHAR(255), PRIMARY KEY (ID));
CREATE TABLE `Schulen` (ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `Schulleiter` VARCHAR(255),  PRIMARY KEY (ID));

INSERT INTO Schulen (Name, Schulleiter) VALUES ("Schule 1", "Boss");
...

INSERT INTO Ausbilder (Position, Vorname, Name, Titel) VALUES ("Schulleiter", "Bernd", "Boss", "Deutsch");
INSERT INTO Schulen (Name, Schulleiter) VALUES ("Schule 1", "Boss");
...

SELECT Titel, Vorname, Ausbilder.Name FROM Schulen, Ausbilder WHERE Schulleiter = Ausbilder.Name AND Schulen.Name = "Schule 1";
In dieser Abfrage sind also soviele Feldnamen unter MySQL gar nicht nötig. Aber auch in der Query von starbasic ist ein String ein String. Man braucht also nicht jedes Feld und jeden Punkt usw. verpacken.

Code: Alles auswählen

Sub getSchoolLeader ()
   Dim oForm as Object
   Dim oDataSource as Object
   Dim oQueryStatement as Object
   Dim oQueryResult as Object
   
   DIM DBContext AS OBJECT
   DIM DBSource AS OBJECT
   DIM DBName AS STRING
   DIM DBInterAction  AS OBJECT
   DIM DBConnection AS OBJECT
   
   Dim strSchoolID as String
   Dim strSQL as String
   
   DBContext = createUnoService ("com.sun.star.sdb.DatabaseContext")
   DBSource = DBContext.createInstance()
   DBName = "school"
   
   DBSource.IsPasswordRequired = TRUE
   
   DBSource.URL = "sdbc:mysql:mysqlc:localhost:3306/" & DBName
   DBInterAction = CreateUnoService ("com.sun.star.sdb.InteractionHandler")
   DBConnection = DBSource.ConnectWithCompletion (DBInterAction)
   
   oQueryStatement = DBConnection.createStatement()
   
   
   
   '' 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 = "Schule 1"
   strSQL = "SELECT Titel, Vorname, Ausbilder.Name " &_
   			"FROM Schulen, Ausbilder " &_
   			"WHERE Schulleiter = Ausbilder.Name AND Schulen.Name = '" & strSchoolID & "';"
   
   '' Query ausführen
   oQueryResult = oQueryStatement.ExecuteQuery(strSQL)

  '' auf ersten Datensatz setzen
   oQueryResult.first ()
   
   
   msgbox strSQL   

	'' Irgendeinen String (1 beginnt) ausgeben
   msgbox oQueryResult.GetString(3)
End Sub

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

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

Beitrag von tweety » Fr 3. Apr 2015, 13:08

Hi Koto,

danke für die Infos...
Von MS Access kenne ich das auch ohne "verpacken". Sämtliche Tutorials und Anleitungen von OOo oder LO beschreiben aber alle die Verwendung der Anführungszeichen.
Ich werde nachher mal ein wenig damit experimentieren, denn leserlich ist es mit den ganzen Dingern definitiv nicht mehr!

Daß ich bei Verwendung einer Tabelle auf den Präfix "tbl_irgendwas." verzichten kann, war mir schon klar, ich war mir nur unsicher ob die Where-Klausel irgendwie dazwischen funkt, daher habe ich es erstmal zur Fehlervermeidung drin gelassen. Umso besser, daß das auch rausfliegen kann.

Interessant, daß Du MySQL - typisch mit einem Semikolon abschließt.

Zu meinem Aufbau:
1. Tabelle: Mitglieder mit einer ID für die Schule
2. Tabelle: Schulen mit Beschreibung und Ort und ID für einen Schulleiter/Ausbilder
3. Tabelle: Ausbilder

Alle drei Tabellen haben (natürlich) einen indizierten Autowert. Ein Ausbilder kann mehrere Schulen haben. Für den Benutzer gibt es ein Hauptformular, in dem er die Mitglieder bearbeitet. In diesem wird die Schule (DropDown Menü) definiert, in der ein Mitglied ist und zu Lernzwecken habe ich für ein einfaches Textfeld den zugehörigen Namen des Schulleiters herausgefischt. Ob das so sinnvoll ist oder nicht, sei mal dahingestellt mir ging es ums Datenfischen :)

Aber vielen Dank an alle, für die zahlreichen Ideen und Korrekturen, darauf kann ich prima aufbauen!

Ein ganz tolles Osterwochenende an euch.
bis denne
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