Seite 1 von 2

[gelöst] Base-Tabelle auslesen

Verfasst: Di, 20.09.2011 17:59
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

Re: Base-Tabelle auslesen

Verfasst: Di, 20.09.2011 18:54
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

Re: Base-Tabelle auslesen

Verfasst: Mi, 21.09.2011 08:11
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!

Re: Base-Tabelle auslesen

Verfasst: Mi, 21.09.2011 10:13
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?

Re: Base-Tabelle auslesen

Verfasst: Mi, 21.09.2011 19:38
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!

Re: Base-Tabelle auslesen

Verfasst: Do, 22.09.2011 07:02
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

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 09:35
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!

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 10:00
von komma4
Verstehe die Frage nicht ganz, glaube ich

Code: Alles auswählen

sSQL =  "SELECT * FROM ""table"" WHERE ""ID"" = " & suchbegriff

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 10:43
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!

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 11:03
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

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 12:40
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

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 12:58
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

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 13:37
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

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 16:24
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).

Re: [gelöst] Base-Tabelle auslesen

Verfasst: Mo, 26.09.2011 19:01
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 ;)