Seite 1 von 2

Datenbankzugriff auf Combofeld im dialog

Verfasst: Mo 21. Mär 2011, 18:15
von wosp
Hallo, vielleicht kann mir hier jemand einen Tipp geben?

Ich habe im writer einen Dialog erstellt mit einer Combobox. Leider habe ich wenig Programmiererfahrung und versuche schon seit Tagen nach einer Lösung im Netz. Wie lautet denn die Zauberformel um eine vorhandene Datenbank und die entsprechende Spalte in der combobox auch darzustellen? (Zugriff etc.) Die Box ist jetzt natürlich leer und das tut weh.
Gibt es da irgendeinen Code-Schnipsel, den man verwenden könnte?

Windows xp

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Di 22. Mär 2011, 12:09
von gogo
Prinzipiell hat ein Dialog keine Datenquelle. Um eine Listbox mit Daten zu füllen, musst Du die vorher auslesen, in eine Variable verpacken (am besten ein Array) und dann die Listbox mit .additems() befüllen.

Code: Alles auswählen

'Dialog als 'oDialog1' definieren (Siehe Link unten)
oListBox = oDialog1.getControl("Name der Listbox") 
oListBox.additems(ArrayVariable(),0)
sieh mal hier nach:
http://www.starbasicfaq.de/Dialoge.html

Direkt auf eine Datenquelle kannst Du nur in einem Formular zugreifen, und das müsste wiederum extern (als Writer-Dokument) gespeichert werden! Nur im Base-Modul kannst Du ein Formular auch in der Base-Datei mitspeichern.

g

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Di 22. Mär 2011, 17:32
von wosp
Hallo gogo, vielen Dank erst einmal, dass du geantwortet hast. Der weg ist mir jetzt klarer : Datenbank öffnen, Tabellenspalte auswählen, auslesen und in den Dialog einfügen.

Datenbank öffnen habe ich gefunden. Ich will nur eine Datenspalte auslesen. Bloß wie geht das? Dieser Vorgang ist doch so häufig, dass er überall stehen müsste. Im Netz finde ich jedoch nur Hiroglyphen.
Gibt es nicht ein Rezept, was man abschreiben kann?
Ich legt mal den bisherigen Code dran, vielleicht könntest du mir noch einen Tip geben. Dannenhöfer ist zwar gut, aber irgendwie auch nur für Cracks geschrieben. Ich hohe dass es nicht zu unverschämt ist, Dich nochmal zu bitten es mal zu kommentieren. es fehlt halt der code zum Auslesen der Datenbank und die Verbindung zum dialog.

Sub Dialog1Show
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
'oDialog1.Model.xxxx ??? Was soll das heißen?

'Dialog als 'oDialog1' definieren (Siehe Link unten)
oListBox = oDialog1.getControl("ListBox1")
' oListBox.additems(ArrayVariable(),0) ' hier wird ein Fehler erzeugt
oDialog1.Execute()

End Sub

Sub Datenbank

Dim myWert as string


DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Feldinhalt")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT * FROM Anamnese")' ist das Bibliography?
Index=resultset.findcolumn("Diagnose")
If Index>resultset.columns.count then MsGBox "nicht vorhanden."
'jetzt fehlt nur noch das Array :-(


myWert=resultset.getString(Index)
MsGBox mywert

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Di 22. Mär 2011, 21:07
von gogo
8-) coole Befehlsauflistung ...


Also: So wie Du's geschrieben hast, gibt es bei Dir eine registrierte Datenbank namens "Feldinhalt".
In dieser DB wiederum eine Tabelle namens "Anamnese"
und in dieser Tabelle eine Spalte (Feld) namens "Diagnose".

Du möchtest also bei dem Dialog der kommt alle möglichen Diagnosen in der Combobox aufgelistet haben, und nach dem Bestätigen eines Buttons im Dialog soll die Diagnose dann im Writer-Dokument eingetragen werden - richtig?

Wenn ja:

Dann sollte die Abfrage lauten:

Code: Alles auswählen

"SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC;"
Das Resultset muss auf SCROLL_INSENSITIVE gestellt sein, sonst kannst Du Dich drin nicht bewegen:

Code: Alles auswählen

Statement.ResultSetType = 1004    '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE
Das Array füllst Du dann folgendermassen:

Code: Alles auswählen

ResultSet.Last
iAnzahl=ResultSet.GetRow

if iAnzahl <= 0 then
   end sub
end if

ResultSet.First
dim strEintraege(iAnzahl)

for i = 1 to iAnzahl
   strEintraege(i-1) = ResultSet.GetString(1)
   ResultSet.next
next i

oComboBox.additems(strEintraege(),1)

Allerdings würdest Du Dir das Ganze ersparen, wenn Du in Deinem Writerdokument einen Formularbschnitt machst, in dem Du dann alles mögliche anstellen kannst, ohne kompliziert Dialoge zu füllen ... vor allem dann wenn die Zeilenzahl des Kombofeldes zu hoch wird!

g

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Mi 23. Mär 2011, 17:06
von wosp
Das finde ich supernett von Dir, dass Du so ausführlich antwortest.

Allerdings ist der Code irgendwie immer noch noch so ganz durch.
er sieht jetzt so aus und erzeugt einige hartnäckige Fehler: könntest Du nochmal ein fachmännisches Auge darauf werfen?

Sub Datenbank

Dim myWert as string


DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Feldinhalt")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT * FROM Anamnese")' ist das Bibliography?
Index=resultset.findcolumn("Diagnose")
If Index>resultset.columns.count then MsGBox "nicht vorhanden."
end if

SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC; 'hier fragt er nach case? !!!!!!!

Statement.ResultSetType = 1004 '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

ResultSet.Last

iAnzahl=ResultSet.GetRow

if ' hier meint er es gäbe kein if !!!!!!!!!

iAnzahl <= 0 then end sub
end if

ResultSet.First
dim strEintraege(iAnzahl)

for i = 1 to iAnzahl
strEintraege(i-1) = ResultSet.GetString(1)
ResultSet.next

myWert=resultset.getString(Index)
'MsGBox mywert
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
'oDialog1.Model.xxxx ??? Was soll das heißen?

'Dialog als 'oDialog1' definieren
oListBox = oDialog1.getControl("ListBox1")
oListBox.additems(ArraymyWert(),0) ' hier wird ein Fehler erzeugt !!!!!!!
oDialog1.Execute()


End Sub

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Do 24. Mär 2011, 10:35
von gogo
Kannst Du bitte Deine Writerdatei, sowie den Dialog und ggf. die Datenbank mit "Dateianhang hochladen" dranhängen? BITTE NUR ANONYME DATEN - und die Datenbank kleinhalten!


Also:

Code: Alles auswählen

ResultSet = Statement.executeQuery("SELECT * FROM Anamnese")' ist das Bibliography?
änderts Du in:

Code: Alles auswählen

ResultSet = Statement.executeQuery("SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC;")
Dann fällt automatisch auch der Fehler beim IF weg.

Weiters:

Code: Alles auswählen

myWert=resultset.getString(Index)
'MsGBox mywert
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
'oDialog1.Model.xxxx ??? Was soll das heißen?

'Dialog als 'oDialog1' definieren 
oListBox = oDialog1.getControl("ListBox1")
oListBox.additems(ArraymyWert(),0) ' hier wird ein Fehler erzeugt !!!!!!!
Andern in:

Code: Alles auswählen

DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )

oListBox = oDialog1.getControl("ListBox1")
oListBox.additems(strEintraege(),0)

g

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Do 24. Mär 2011, 16:56
von wosp
Hmmm - hochladen geht irgendwie nicht...trotzdem sieht der Code schon besser aus.
Ich hänge den Code, wie er jetzt ist einfach nochmal dran, Jetzt findet er keinen Gefallen am End-Sub und schreibt " unerwartetes Symbol : EndSub" :?:

Sub Datenbank


dim strEintraege(iAnzahl)

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Feldinhalt")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC;")
Index=resultset.findcolumn("Diagnose")

Statement.ResultSetType = 1004 '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

ResultSet.Last

iAnzahl=ResultSet.GetRow

'if iAnzahl <= 0 then end sub ' Hab ich stillgelegt, weil er immer noch meckert: "Else/endif ohne if."
'end if

ResultSet.First


for i = 1 to iAnzahl
strEintraege(i-1) = ResultSet.GetString(1)
ResultSet.next

DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
oListBox = oDialog1.getControl("ListBox1")
oListBox.additems(strEintraege(),0)
oDialog1.Execute()
End sub

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Fr 25. Mär 2011, 10:11
von gogo
sry, die If-Teile müssen alle in separaten Zeilen stehen:

Code: Alles auswählen

if iAnzahl <= 0 then
    end sub
end if
g

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Fr 25. Mär 2011, 11:40
von wosp
Jo, wenn das so einfach wäre.
also wenn ich folgendes wieder einschalte
'if iAnzahl <= 0 then
' end sub
' end if
dann kommt die Fehlermeldung else/end if ohne if trotzdem
und wenn ich es ganz ausschalte, dann kommt die nächste Fehlermeldung weiter unten:
for i = 1 to iAnzahl
strEintraege(i-1) = ResultSet.GetString(1)
ResultSet.next

end sub --- unerwartetes Symbol. der Spinnt.
schalt ich auch das aus, meckert er zwar nicht mehr, geht aber auch nicht bis zum ende des Codes weiter. hmmmm..was nun?

Re: Datenbankzugriff auf Combofeld im dialog

Verfasst: Fr 25. Mär 2011, 14:25
von gogo
Diese 'falschen' Fehlermeldungen kommen dann wenn irgendwo Schleifen "offen" sind. Die Fehler treten zwar am Beginn der If-Schleife auf, aber sie beziehen sich auf die offene Schleife irgendwo anders im Code. So eine hast Du produziert als Du:

Code: Alles auswählen

SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC; 'hier fragt er nach case? !!!!!!!
im Code hattest - das ist eigentlich ein SQL-Statement, und Basic kann damit gar nichts anfangen. Zufälligerweise ist aber das erste Wort ("Select") Bestandteil einer Select-Anweisung, die normalerweise etwa so aussieht:

Code: Alles auswählen

select Case VariableXYZ
    case 3
    case 5
    case else
end select
Die Fehlermaldung die Du bekommen hast lautete: "Select ohne Case" oder so ähnlich, weil Basic nach dem Wort "Case" gesucht hat - dass Du gar keine Select-Case-Anweisung wolltest war ein ... Missverständnis ;)

Die Fehlermeldung wegen dem end sub kommt jetzt weil Du das:

Code: Alles auswählen

next i
vergessen hast - damit ist die for-next-Schleife noch offen, wenn das "end sub" kommt.

Die problematische If-Schleife hab' ich übrigens falsch geschrieben, da steht "end sub" und es müsste heissen "end" ("end sub" geht nur in VB)

der ganze Code sollte also so aussehen (wobei ich Dir nicht sagen kann ob die Reihenfolge der Anweisungen den Dialog betreffend so hinhaut, ich verwende immer Formulare...):

Code: Alles auswählen

Sub Datenbank

dim strEintraege(iAnzahl)

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Feldinhalt")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT distinct Diagnose as Diagnose FROM Anamnese order by Diagnose ASC;")
Index=resultset.findcolumn("Diagnose")

Statement.ResultSetType = 1004 '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

ResultSet.Last

iAnzahl=ResultSet.GetRow

if iAnzahl <= 0 then
 end
end if

ResultSet.First

for i = 1 to iAnzahl
strEintraege(i-1) = ResultSet.GetString(1)
ResultSet.next
next

DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
oListBox = oDialog1.getControl("ListBox1")
oListBox.additems(strEintraege(),0) 
oDialog1.Execute()
End sub
g