🙏 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. 🤗

Datenbankzugriff auf Combofeld im dialog

Alles zur Programmierung im LibreOffice.
wosp
Beiträge: 12
Registriert: Mo 21. Mär 2011, 18:10

Re: Datenbankzugriff auf Combofeld im dialog

Beitrag von wosp » Fr 25. Mär 2011, 18:55

Also wenn der Code demnächst mal hinhauen sollte, dann spendiere ich dir freiwillig einen Sektchen.
Leider tut er es immer noch nicht.
Jetzt kommt bei
ResultSet.Last
die Fehlermeldung: dass Resultset ist set only forward oder so.

Hmm,
Das hab ich des öfteren schon mal im Netz gelesen, aber eine vernünftige Lösung habe ich noch nicht gefunden.
Ich verwende kein Formular, weil ich mir vorstelle, an einer beliebigen Stelle des Berichtes (ist selbst ein formular, nämlich Befundbericht)das Diagnoseauswahlfenster öffnen zu können. Wenn ich eine Auswahlbox ins Formular einbinde stört die hinterher beim Ausdruck, Außerdem will ich mit jeder Diagnose später ein Makro auslösen.)
Und mit zwei Dateien rumhantieren ist auch umständlich.

Gibt es da noch eine Lösung für oben genanntes Problemchen. immerhin sind derweil die Fehlermeldungen von vorher verschwunden und es scheint, dein Code bewegt sich auf der Zielgraden.
:?

wosp
Beiträge: 12
Registriert: Mo 21. Mär 2011, 18:10

Re: Datenbankzugriff auf Combofeld im dialog

Beitrag von wosp » Fr 25. Mär 2011, 19:16

Also es scheint wir nähern uns der zielgeraden.
Ich habe im Code die Zeile mit
--"Statement.ResultSetType = 1004 '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE" --etwas umgestellt, siehe unten. Dann war die Fehlermeldung: resultset was set on forward only verschwunden.
Die dimensionierung von "strEintraege" habe ich nach unten unter for I=1 to iAnzahl gerückt, dann war auch dort eine fehlermeldung verschwunden.
Jetzt hakt es nur noch an der Stelle:
oListBox.additems(strEintraege(),0)
hier entsteht folgende felhermeldung: Objecvariable nicht belegt. Hier nochmals den gesamten Code, wie er zur Zeit steht.

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

ResultSet.Last

iAnzahl=ResultSet.GetRow

if iAnzahl <= 0 then
end
end if

ResultSet.First

for i = 1 to iAnzahl
dim strEintraege(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()

-- Fläschchen sekt für den funktionierenden Code ist versprochen :P

wosp
Beiträge: 12
Registriert: Mo 21. Mär 2011, 18:10

Datenbankzugriff auf Combofeld im dialog

Beitrag von wosp » Fr 25. Mär 2011, 21:24

Heureka es funktioniert! Mit folgendem Code bekommt man Zugriff auf eine Datenbank und stellt sie in einem dialog -Listbox dar:

Zuerst in Dialog1 eine Listobx (listbox1) erzeugen
dann im Makro folgenden Dialog einfügen:

Sub DialogListboxDatenbank


DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
oListBox = oDialog1.getControl("ListBox1")

'dim strEintraege(iAnzahl)

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Name der DB.odb")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
Statement.ResultSetType = 1004 '= com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE
ResultSet = Statement.executeQuery("SELECT distinct Nameder Spalte as NamederSpalte FROM NamedesDatenblattes order by Namederspalte ASC;")
Index=resultset.findcolumn("NamederSpalte")
'Anzahl suchen
ResultSet.Last

iAnzahl=ResultSet.GetRow

MsgBox iAnzahl ' dient nur der Kontrolle, ob überhaupt ein Zugriff erfolgt ist.

if iAnzahl <= 0 then
end
end if

ResultSet.First

dim strEintraege(iAnzahl)
for i = 1 to iAnzahl

strEintraege(i-1) = ResultSet.GetString(1)
if strEintraege (i) <>"" then ' das ist möglicherweise überflüssig
oListBox.additems(strEintraege(),0)

end if ' und das dann auch!
ResultSet.next
next

oDialog1.Execute()

End Sub


Fertig
dauert ein wenig lange, bis die Listbox erscheint und hat noch den kleinen Schönheitsfehler, dass die Daten am Ende wieder von Vorneangezeigt werden, Es ist also noch eine endlosschleife drin...
Wie bekommt man die wohl raus?

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Datenbankzugriff auf Combofeld im dialog

Beitrag von gogo » Sa 26. Mär 2011, 02:30

Code: Alles auswählen

ResultSet = Statement.executeQuery("SELECT distinct Nameder Spalte as NamederSpalte FROM NamedesDatenblattes order by Namederspalte ASC;")
das funktioniert???

Wie heisst denn die Spalte und die Tabelle, in der die Diagnose steht?

Angenommen Deine Tabelle heisst "Tabelle1" und die Spalte in der die Diagnosen stehen heisst "Diagnose", dann sollte die Zeile oben folgendermassen aussehen:

Code: Alles auswählen

ResultSet = Statement.executeQuery("SELECT distinct Diagnose as Diagnose FROM Tabelle1 order by ""Diagnose"" ASC;")
oder

Code: Alles auswählen

ResultSet = Statement.executeQuery("SELECT distinct ""Diagnose"" as Diagnose FROM ""Tabelle1"" order by ""Diagnose"" ASC;")
oder so ähnlich.


Die Überfüllung Deiner Listbox kommt daher, dass Du sie ziemlich oft füllst:

In dieser For-next-Schleife gehst Du Dein ganzes Resultset durch, das Array wird dabei gefüllt, und jedesmal füllst Du das Array in die Listbox! Setz' einfach die Zeile mit dem .additmens zwischen "next" und "oDialog1.Execute()" - dann sollte alles passen

Code: Alles auswählen

for i = 1 to iAnzahl

strEintraege(i-1) = ResultSet.GetString(1)
if strEintraege (i) <>"" then ' das ist möglicherweise überflüssig
oListBox.additems(strEintraege(),0)

end if ' und das dann auch!
ResultSet.next
next

oDialog1.Execute()
Richtig:

Code: Alles auswählen

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

oListBox.additems(strEintraege(),0)
oDialog1.Execute()
g
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

wosp
Beiträge: 12
Registriert: Mo 21. Mär 2011, 18:10

Re: Datenbankzugriff auf Combofeld im dialog

Beitrag von wosp » Sa 26. Mär 2011, 10:43

Also erstmal möchte ich mich jetzt ganz herzlich für Deine wertvolle Hilfe bedanken, ich habe den Code ein wenig nach deinen Anregungen umgestellt und es klappt alles bestens!
Ich denke, dass auch viele andere (Programmieranfänger) von diesem Beispiel profitieren können.

Ich habe tatsächlich die Zeile mit select so eingegeben, wie es da steht und tatsächlich klappt es genau so. Mir fehlen genug Programmierkennisse um darüber erstaunt zu sein. :D

Das nächst Ziel ist es jetzt, den ausgewählten Eintrag in der box in eine Makrofunktion einzubinden.
Markiert wird ja der Eintrag mit der Maus bereits, aber wie gehts weiter?

.... hast Du noch ein paar Tips?

....

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Datenbankzugriff auf Combofeld im dialog

Beitrag von gogo » Mo 28. Mär 2011, 11:24

Die Methode ".Execute()" läuft, so lange Dein Dialog offen ist. D.h. Dein Makro "steht" in dieser Zeile so lange bis der Dialog beendet wird, und wird weiter fortgesetzt wenn der Dialog geschlossen wird. Wenn Du also auf einen Wert des Dialogs zugreifen willst, kannst Du das mit dem schon definierten Objekt "oListBox" machen (mit den Methoden .Model.Text oder .Text):

Code: Alles auswählen

...
oDialog1.Execute()

msgbox oListBox.Text
'msgbox oListBox.Model.Text

end sub
g
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


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