Dialog-Box mit SQL?

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

Moderator: Moderatoren

uli38
**
Beiträge: 37
Registriert: Do, 13.11.2008 18:24

Dialog-Box mit SQL?

Beitrag von uli38 »

Hallo.
Ich möchte in einer Dialog-Box ein Listenfeld anlegen.
Der Inhalt soll durch eine Abfrage generiert werden.

Leider habe ich bisher so etwas noch nicht im Forum gefunden.
Geht das überhaupt?

Schon jetzt danke.

Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Hallo Uli,
das ist kein Problem.
Ich habe jede Menge Dialoge in meiner Anwendung, wo ich ähnliches tue.
Hier hast Du mal ein kleines Beispiel - leicht gekürzt und nicht schön, aber wirksam.
Wie Du das von mir benutzte Array per SQL laden kannst, wirst Du wohl wissen, oder?
Gruß, eBayer

Sub LogIn
Dim oListbox As Object, aUser()
Dim i As Integer
DialogLibraries.LoadLibrary("Library1")
oDlgLogIn = CreateUnoDialog(DialogLibraries.Library1.DialogLogin)
oDlgLogIn.setTitle("Log in")
oListBox = oDlgLogIn.GetControl("myListBox")
aUser = UserLaden ' hier lade ich per SQL ein Array mit den verfügbaren Usern
for i=0 to ubound(aUser)
oListbox.addItem(aUser(i)) ' Benutzernamen
next i
mControls= oDlgLogIn.tabControllers(0).controls
oDlgLogIn.execute()
oDlgLogIn.dispose()
End Sub
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
uli38
**
Beiträge: 37
Registriert: Do, 13.11.2008 18:24

Re: Dialog-Box mit SQL?

Beitrag von uli38 »

Hallo ebayer.
Vielen Dank für Deine Antwort.
Leider weiß ich nicht wie man das Array per SQL laden kann.
Wie macht man das genau??

Vielen Dank für Diene Antwort.
Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Ich habe mir eine Funktion geschrieben, die ich für beliebige Zwecke einsetzen kann.
Die rufe ich mit dem SQL-Statement als String auf und zurück bekomme ich das Array.
Diese Beispielfunktion entspricht der Funktion UserLaden in meinem ersten Beispiel.
Du solltest Dich allerdings schon etwas mit ooBase beschäftigen, denn NUR mit kopieren von Beispielen wird es nicht klappen.
So mußt Du in der Lage sein, Fehler selbständig zu finden und kleine Anpassungen bezogen auf die Beispielroutinen selbständig durchzuführen.
Gruß eBayer

Function DatenLaden(sSql As String)
Dim s As String
Dim oStatement As Object, oErgSet As Object, oDatenbankKontext As Object, oDatenquelle As Object, oVerbindung As Object
Dim i As Integer, iRows As Integer
Dim aListe()
oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "Kunden" )
oVerbindung = oDatenquelle.getConnection( "" , "")
oStatement = oVerbindung.createStatement()
oErgSet = oStatement.executeQuery(sSQL)
oErgSet.last()
iRows = oErgSet.getrow()
if iRows > 0 then
redim aListe(iRows - 1)
for i = 1 to iRows
oErgSet.absolute(i)
s = oErgSet.getString(1)
aListe(i-1) = s
next
else
redim aListe(0)
aListe(0) = "Keine gefunden"
end if
oErgSet.close()
oStatement.close()
DatenLaden = aListe()
End Function
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
uli38
**
Beiträge: 37
Registriert: Do, 13.11.2008 18:24

Re: Dialog-Box mit SQL?

Beitrag von uli38 »

Hallo ebayer.
Vielen Dank für Deine Antwort.
Ich habe den Code soweit angepasst:

Code: Alles auswählen

Function DatenLaden(sSql As String)
Dim s As String
Dim oStatement As Object, oErgSet As Object, oDatenbankKontext As Object, oDatenquelle As Object, oVerbindung As Object
Dim i As Integer, iRows As Integer
Dim aListe()
oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "Verwaltung" )
oVerbindung = oDatenquelle.getConnection( "" , "")
oStatement = oVerbindung.createStatement()
sSQL = "SELECT DISTINCT ""Ablesedatum"" FROM ""Elektro-Zählerstände"""
oErgSet = oStatement.executeQuery(sSQL)
oErgSet.last()
iRows = oErgSet.getrow()
if iRows > 0 then
redim aListe(iRows - 1)
for i = 1 to iRows
oErgSet.absolute(i)
s = oErgSet.getString(1)
aListe(i-1) = s
next
else
redim aListe(0)
aListe(0) = "Keine gefunden"
end if
oErgSet.close()
oStatement.close()
DatenLaden = aListe()
End Function
Aber bei der SQL-Anweisung erhalte ich einen Basic-Laufzeitfehler: Argument ist nicht optonal. :(
Was mache ich falsch??

Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Hallo Uli,
leider bin ich kein grosser SQL-Spezialist (auch kein kleiner).
Meines Wissens verhindert DISTINCT die Anzeige doppelter Datensätze, muß aber im richtigen Format in das SQL-Statement eingebaut werden. Um mich heranzutasten würde ich zunächst mal DISTINCT weglassen.... Ich weiß ja nicht genau was Du mit der Abfrage erreichen willst und ob DISTINCT in Deinem Fall überhaupt notwendig ist.
Um etwas über SQL zu erfahren schau mal hier nach..... mir hat das ganz gut geholfen: http://sql.1keydata.com/de/
und hier solltest Du auch mal schauen: http://hsqldb.org/web/hsqlDocsFrame.html
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
uli38
**
Beiträge: 37
Registriert: Do, 13.11.2008 18:24

Re: Dialog-Box mit SQL?

Beitrag von uli38 »

Hallo ebayer.
Vielen Dank für Deine Antwort.
Das Ablesedatum kommt in der Tabelle öfter vor. DAher brauche ich das Distinct.
Auch wenn ich es weg lasse, erhalte ich die gleiche Fehlermeldung. Das kann scheinbar nicht die Ursache sein.
Habe ich vielleicht zuvor etwas vergessen bei der Definition?

Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Ich sehe gerade, daß Du die Funktion ohne Übergabeparameter aufrufst.
So, wie Du es programmiert hast, brauchst Du den ja wohl auch nicht.
Nimm einfach aus dem Funktionskopf den Parameter heraus:
Function DatenLaden(sSql As String) ändern in: Function DatenLaden()
Dann solltest Du aber sSQL mit Dim definieren bevor Du es ansprichst.
Schätze, das löst Dein Problem.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
uli38
**
Beiträge: 37
Registriert: Do, 13.11.2008 18:24

Re: Dialog-Box mit SQL?

Beitrag von uli38 »

Hallo ebayer.
Nicht ganz - es hängt jetzt an der Zeile

Code: Alles auswählen

oErgSet.last()
Fehlermeldung: Es ist eine Exception aufgetreten:ResultSet was set to forward only.
Keine Ahnung, was das wieder bedeutet:-(
Überspringe ich die Zeile, gibt es keinen Wert, der angezeigt wird.
Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Füge nach der Zeile mit "CreateStatement....." die folgende Zeile ein:
oStatement.ResultSetType = 1004
Damit bestimmst Du daß das ResultSet vorwärts und rückwärts-Beweguung erlaubt.
Nun sollte es aber funktionieren.
Aber wie Du nun wohl allmählich erkennst, wirst Du nicht darum herumkommen, Dich schnellstmöglich intensiver mit ooBase, SQL und mit der Makroprogrammierung auseinanderzusetzen.
Viel Erfolg und Gruß
eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
ulihueck
**
Beiträge: 23
Registriert: Mi, 12.11.2008 19:17

Re: Dialog-Box mit SQL?

Beitrag von ulihueck »

Okay.
ich habe nun einen Dialog, der in einer Sub aufgerufen wird.

Code: Alles auswählen

Sub Liste
Dim oListbox As Object, aListe()
Dim i As Integer
DialogLibraries.LoadLibrary("Standard")
oDlgLogIn = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDlgLogIn.setTitle("Log in")
oListBox = oDlgLogIn.GetControl("aListe")
aListe = DatenLaden ' hier lade ich per SQL ein Array mit den verfügbaren Kunden??????
for i=0 to ubound(aListe)
oListbox.addItem(aListe(i)) ' Kunden
next i
mControls= oDlgLogIn.tabControllers(0).controls
oDlgLogIn.execute()
oDlgLogIn.dispose()
End Sub


Function DatenLaden()
Dim s As String
Dim oStatement As Object, oErgSet, ResultSet As Object, oDatenbankKontext As Object, oDatenquelle As Object, oVerbindung As Object
Dim i As Integer, iRows As Integer
Dim aListe()
oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "ABH" )
oVerbindung = oDatenquelle.getConnection( "" , "")
oStatement = oVerbindung.createStatement()
oStatement.ResultSetType = 1004
sSQL = "SELECT ""Kunden-ID"", Vorname, Name FROM Kunden"
oErgSet = oStatement.executeQuery(sSQL)
While oErgSet.next
s = oErgSet.getString(1) &", " & oErgSet.getString(2)& " " & oErgSet.getString(3)
'msgbox s
WEND
oErgSet.close()
oStatement.close()
DatenLaden = aListe()
End Function
Aber leider bleibt die Listbox im Dialog leer.
Was mache ich denn da noch falsch??

Grüße
Uli
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Dialog-Box mit SQL?

Beitrag von eBayer »

Hallo Uli,
wie schon vor langer Zeit geschrieben...... Du MUSST Dich systematisch mit ooBasic, Makros etc. beschäftigen.
Auf Dauer wirst Du hier niemand finden, der für Dich programmiert!
Aber schau Dir mal diese Zeilen aus Deinem Makro an:

While oErgSet.next
s = oErgSet.getString(1) &", " & oErgSet.getString(2)& " " & oErgSet.getString(3)
'msgbox s
WEND

Fällt Dir was auf?
Du arbeitest das ErgSet ab..... Das ist so ja schon richtig, aber wo füllst Du das Array "aListe"?
In Deinem Fall bleibt es natürlich leer!
Also, wenn Du in "s" schon den Wert der Zeile hast, mußt Du "s" doch noch in das Array schieben!
Das solltest Du Dir aber nun wirklich selbst erarbeiten - in der Hilfe findest Du ausreichend Unterstützung dafür!
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Antworten