[gelöst] Base-Tabelle auslesen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

NTClient
****
Beiträge: 106
Registriert: Di, 19.07.2005 16:09

[gelöst] Base-Tabelle auslesen

Beitrag von NTClient »

Hallo Jungs (und Mädels).

Ich habe die Suchen benutzt, hänge aber an einer einfachen Sache fest. Ich möchte die Tabellenwerte einer Base-Tabelle auslesen:

Code: Alles auswählen

Sub TagAuslesen
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource=DBContext.getByName("Bürodatenbank")	    
	ConnectToDB=DataSource.GetConnection ("","")
    SQLStatement=ConnectToDB.createStatement
    MA = inputbox ("Mitarbeiternummer")
    sql= "SELECT ""Mo"", ""Di"", ""Mi"", ""Do"", ""Fr"", ""Sa"", ""So"" FROM ""Woche"" WHERE ""Id"" = '" & MA &"'"
    Result = SQLStatement.executeQuery(sql)
    Wert_heute = Result.getString([b]index[/b])
    MsgBox (Wert_heute)
end Sub
Fehlermeldung:
Es ist eine Exception aufgetreten. Type: com.sun.star.sdbc.SQLException. Message: No data is available.

Was muss für index eingetragen werden, wenn ich den Wert in der Spalte für "Mi" aus Zeile WHERE ""Id"" = '" & MA &" haben möchte?

Gruß Bernd!



Moderation,4: CODE tags gesetzt
Zuletzt geändert von NTClient am Do, 22.09.2011 08:06, insgesamt 1-mal geändert.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Base-Tabelle auslesen

Beitrag von komma4 »

Du musst das RESULT abarbeiten, auch wenn nur ein Treffer zurück geliefert wird

Code: Alles auswählen

While Result.Next()

  ' dritte Spalte
  Wert_heute = Result.getString( 3 )

WEnd

Hilft Dir das?


Edit: wenn Deine ID ein nummerischer Wert ist... dann sollte er auch nicht in Hochkommata stehen

Code: Alles auswählen

WHERE ""Id"" = " & MA
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
NTClient
****
Beiträge: 106
Registriert: Di, 19.07.2005 16:09

Re: Base-Tabelle auslesen

Beitrag von NTClient »

OK- hat funktioniert. Vielen Dank. Nur: verstanden hab ich's nicht. Bekannt ist mir sowas wie:

While a < 100
Print "Alles Sch..., Deine Elli"
a=a+1
Wend

Was genau muss in RESULT abgearbeitet werden? Wie würde hier

Wert_heute = Result.getArray( index )

funktionieren, wenn ich alle Spaltenwerte auslesen möchte?

Gruß Bernd!
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Base-Tabelle auslesen

Beitrag von komma4 »

Die WHILE-Schleife ist zum Abarbeiten aller Ergebnisse der SQL-Abfrage

Jeder RESULT-Satz hat dabei so viele Spalten, wie Du abgefragt hast.
Weisst Du das nicht, so kannst Du mit

Code: Alles auswählen

Result.getColumns().getCount()
die Anzahl der zurück gelieferten Spalten ermitteln.

Willst Du alle Spalten auslesen...

Code: Alles auswählen

lResultCols = Result.getColumns().getCount()
While Result.Next()

For l = 0 To lResultCols - 1
  print "Spalteninhalt " & l+1 & ": " & oResultSet.getString( l + 1 )
Next l

WEnd

Hilft das Deinem Verständnis weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
NTClient
****
Beiträge: 106
Registriert: Di, 19.07.2005 16:09

Re: Base-Tabelle auslesen

Beitrag von NTClient »

Ah, langsam verstehe ich. Vielen Dank. Aber müßte es bei Dir dann nicht heißen

Code: Alles auswählen

print "Spalteninhalt " & l+1 & ": " & Result.getString( l + 1 )
oder was hat

Code: Alles auswählen

oResultSet
darin zu bedeuten?

Verstehe ich das richtig, das das Ganze als Array so ausgelesen würde:

Code: Alles auswählen

Sub TagAuslesen
    DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
    DataSource=DBContext.getByName("Bürodatenbank")      
    ConnectToDB=DataSource.GetConnection ("","")
    SQLStatement=ConnectToDB.createStatement
    MA = inputbox ("Mitarbeiternummer")
    sql= "SELECT ""Mo"", ""Di"", ""Mi"", ""Do"", ""Fr"", ""Sa"", ""So"" FROM ""Woche"" WHERE ""Id"" = " & MA &""
    Result = SQLStatement.executeQuery(sql)
    lResultCols = Result.getColumns().getCount()
    dim MyArray(lResultCols) as string
    While Result.Next()
       For i = 0 To lResultCols - 1
           MyArray (i) = Result.getString( i )
       Next i
   WEnd
end Sub
Sieht doch gut aus, oder? Werde ich morgen mal ausprobieren...

Gruß Bernd!
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Base-Tabelle auslesen

Beitrag von komma4 »

a) ja, "mein" oResultset ist "Dein" Result - Code war kopiert und nicht durchgängig angepasst
b) die Zähler sind bei Dir nicht korrekt: während Array Null-basiert ist, werden die Spalten ab 1 gezählt
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
NTClient
****
Beiträge: 106
Registriert: Di, 19.07.2005 16:09

Re: [gelöst] Base-Tabelle auslesen

Beitrag von NTClient »

Tschuldigung, aber ich muß noch mal stören:

Wie gelingt es mir, die n-te Zeile einer Tabelle auszulesen.

Code: Alles auswählen

	for i = 1 to Anzahl_Zeilen
		sql= "SELECT ""ID"" FROM ""table"" where " ...???... Zeile = i  ...???...
	next i
Gibt es da einen SQL-Befehl?

Hintergrund: Ich will prüfen, ob ein Wert in der Spalte "ID" der Tabelle "table" vorhanden ist.

Gruß Bernd!
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [gelöst] Base-Tabelle auslesen

Beitrag von komma4 »

Verstehe die Frage nicht ganz, glaube ich

Code: Alles auswählen

sSQL =  "SELECT * FROM ""table"" WHERE ""ID"" = " & suchbegriff
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
NTClient
****
Beiträge: 106
Registriert: Di, 19.07.2005 16:09

Re: [gelöst] Base-Tabelle auslesen

Beitrag von NTClient »

Nee ich suche

SELECT "Wert aus Spalte "n" aus Tabelle "table" und dort aus Zeile i"

Ich will Zeile für Zeile prüfen, ob in Spalte "n" z. B. der Wert "xyz" steht.

Gruß Bernd!
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: [gelöst] Base-Tabelle auslesen

Beitrag von Philipp_19 »

Moin,

versuchs mal mit "rownum = "

Code: Alles auswählen

select * from [tabelle] where rownum = 1
hab mir grade nochmal genau das Problem durchgelesen:

Code: Alles auswählen

select * from table where ID like 'xyz'
so filterst du alle einträge, die xyz in der ID stehen haben.
Wenn du nun wissen willst, ob die Zeile vorhanden ist:

Code: Alles auswählen

select count(*) from table where ID like 'xyz'
Grüße
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [gelöst] Base-Tabelle auslesen

Beitrag von komma4 »

Philipp_19 hat geschrieben:

Code: Alles auswählen

select * from table where ID like 'xyz'
Ungetestet!
Sonst hättest Du gesehen, dass es so nicht funktioniert.

In den meisten SQL-Dialekte erwarten bei LIKE eine Wildcard, hier (bei HSQLDB) bspw.

Code: Alles auswählen

...WHERE name LIKE 'name%'
Liefert alle Zeilen, deren Inhalt in der Spalte name mit name beginnt
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [gelöst] Base-Tabelle auslesen

Beitrag von komma4 »

NTClient hat geschrieben:Hintergrund: Ich will prüfen, ob ein Wert in der Spalte "ID" der Tabelle "table" vorhanden ist.
Mit der Abfrage

Code: Alles auswählen

sSQL = "SELECT count(*) FROM ""Tabelle""  WHERE ""id"" = 1 "
und der Auswertung

Code: Alles auswählen

While Result.Next()
If Result.Columns().getByIndex(0).getInt() > 0 Then
   Msgbox "id bereits vorhanden"
End If

WEnd
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: [gelöst] Base-Tabelle auslesen

Beitrag von Philipp_19 »

komma4 hat geschrieben:
Philipp_19 hat geschrieben:

Code: Alles auswählen

select * from table where ID like 'xyz'
Ungetestet!
Sonst hättest Du gesehen, dass es so nicht funktioniert.

In den meisten SQL-Dialekte erwarten bei LIKE eine Wildcard, hier (bei HSQLDB) bspw.
sehr wohl getestet, nur dann beim tippen das/die zeichen vergessen.
der select hat bei mir so auch ohne wildcard funktioniert, deswegen nicht 100% drauf geachtet...sorry
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: [gelöst] Base-Tabelle auslesen

Beitrag von DPunch »

Aloha
komma4 hat geschrieben:In den meisten SQL-Dialekte erwarten bei LIKE eine Wildcard, hier (bei HSQLDB) bspw.
Dem muss ich mal kurz widersprechen, ich kenne keinen SQL-Dialekt, der da eine Wildcard verlangt.
Wenn man ohne Wildcards suchen will, sollte man prinzipiell zwar eher ein "=" statt "LIKE" verwenden, aber entweder wandelt der Query Optimizer des DBMS zweiteres sowieso in ersteres um, oder man muss damit leben, dass man unter Umständen eben case insensitive sucht (sprich Suche mit "SCHMITT" liefert auch "schmitt" als Treffer).
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [gelöst] Base-Tabelle auslesen

Beitrag von komma4 »

DPunch hat geschrieben:Dem muss ich mal kurz widersprechen, ich kenne keinen SQL-Dialekt, der da eine Wildcard verlangt.
Akzeptiert.

War unklar ausgedrückt...

wenn ich LIKE verwende, dann suche ich mit wildcards, da ich -wenn ich diese nicht benötige, mit = suchen würde ;)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten