Seite 1 von 2
Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: Sa 12. Apr 2014, 18:27
von Originalgangsta
Hi zusammen,
ich möchte gerne in einem Formular das Folgende tun:
- aus einem Listenfeld übernehme ich mir den aktuell ausgewählten Wert (einen Text) - das klappt.
- mit diesem Wert führe ich ein SQL aus und versuche die ID des Wertes zu ermitteln - das klappt im Makro nicht, führe ich nur das SQL über Extras - SQL aus funktioniert es. Das Ergebnis der SQL-Ausführung im Makro scheint fehlerfrei, es erscheint aber nur eine leere Message-Box (lasse ich mir zu Testzwecken ausgeben), also ohne die erwartete ID. Versuche ich den einzelnen Wert des Ergebnisses des SQL mit getString(1) auszulesen bekomme ich den Fehler "No data is available".
Ausgeführt wird die Query mit executeQuery, nicht mit execute. Darüber bin ich zuerst gestolpert...
Wie geht ich also richtig mit dem Ergebnis des SQL um?
Danke für Eure Hilfe!
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: Sa 12. Apr 2014, 19:17
von pmoegenb
Beispiele findest Du
hier.
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: Sa 12. Apr 2014, 20:03
von RobertG
Hallo Originalgangsta,
Originalgangsta hat geschrieben:
Wie geht ich also richtig mit dem Ergebnis des SQL um?
Vielleicht hilft dieser Ausschnitt eines Makros:
Code: Alles auswählen
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "SELECT ""ID"" FROM ""Tabelle"""
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
WHILE oAbfrageergebnis.next
inFeldWert = oAbfrageergebnis.getInt(1)
WEND ' nächster Datensatz
Du liest alle Werte nacheinander aus. Kommen mehrere Werte, so wird in dem obigen Fall nur der letzte Wert zum Schluss noch in der Variablen "inFeldWert" gespeichert sein. Du kannst natürlich innerhalb der Schleife jeweils auf das Abfrageergebnis zugreifen oder auch die gesamten Ergebnisse in einem Array speichern.
Mit getString(1) - wie in Deinem Beitrag geschrieben - kannst Du nurd den Inhalt von Textfeldern korrekt auslesen. Sollte Deine ID also tatsächlich ein Textfeld sein, so müsste das natürlich stattdessen dort stehen.
Gruß
Robert
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: So 13. Apr 2014, 20:38
von Originalgangsta
Hi Robert,
das war auf jeden Fall der richtige Tip! Auch das Durchlaufen der Schleife für den Fall, daß es eine Ergebnisliste zurückgibt, habe ich hinbekommen, das mit dem Speichern in ein Array und die Übergabe desselben an eine Listbox jedoch noch nicht. Freue mich wenn Du auch hierzu einen Tip für mich hast!
Besten Dank und einen schönen Sonntagabend!
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: So 13. Apr 2014, 21:48
von RobertG
Hallo Originalgangsta,
Du möchtest den Inhalt einer Abfrage in einem Array speichern?
ist so etwas wie
Code: Alles auswählen
WHILE oAbfrageergebnis.next
ReDim Preserve ar(inZaehler,0 to 1)
ar(inZaehler,0) = oAbfrageergebnis.getString(1)
ar(inZaehler,1) = oAbfrageergebnis.getString(2)
....
Damit hast Du die Ergebnisse der Abfrage in einem zweidimensionalen Array. Wenn Du nur ein Element abfragst, dann reicht natürlich ein eindimensionales Array.
Das mit der Listbox habe ich so nicht verstanden. Die befüllst Du doch vermutlich über eine Abfrage. Wenn sich da Inhalt verändert hat, dann reicht ein oListbox.refresh.
Gruß
Robert
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: Mo 21. Apr 2014, 22:24
von Originalgangsta
Hi Robert,
o.k., den Tip habe ich umsetzen können, aber es bringt mir wieder zu weiteren Fragen:
1. Wenn ich das array gefüllt habe, kann ich es mir als Ganzes in einer Messagebox ausgeben lassen (zu QS-Zwecken)? Innerhalb der Schleife den jeweils verarbeiteten Eintrag ja, aber das Gesamtergebnis?
2. Nun zur Listbox. Das Ergebnis des SQL, daß ich in dem array speichere, soll eigentlich der Input für die nächste Listbox in dem Formular sein. Weiteres Lesen bringt mich zu der Annahme, daß ich die Verarbeitung im array sein lassen kann und statt dessen das Ergebnis des SQl direkt als source für die Listbox nutzen kann. Das bekomme ich leider nicht hin. Mein Ansatz wie folgt:
oForm = thiscomponent.drawpage.forms.getByName("mfrm")
oListfeld2 = oForm.getByName("lst_mfrm_organisation")
oListfeld2.ListSourceType = Query
sSQL2 = "SELECT ..."
oListfeld2.ListSource = sSQL2
oListfeld2.refresh
Als Meldung bekomme ich in der vorletzten Zeile "Objektvariable nicht belegt".
Warum?
In der Listbox soll man dann einen Eintrag auswählen, der in der zweiten (ganz rechten) Spalte die am Ende zu speichernde ID enthält - das wird dann die nächste Herausforderung...
Und ist das der "richtige" Weg zu meinem Ziel?
Danke!
Beste Grüße,
OG
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: Mo 21. Apr 2014, 23:21
von F3K Total
Hi,
die Listsource ist ein Array, also daher:
Code: Alles auswählen
dim sSQL2(0) as string
oForm = thiscomponent.drawpage.forms.getByName("mfrm")
oListfeld2 = oForm.getByName("lst_mfrm_organisation")
oListfeld2.ListSourceType = Query
sSQL2(0) = "SELECT ..."
oListfeld2.ListSource = sSQL2
oListfeld2.refresh
HTH R
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: So 27. Apr 2014, 16:07
von Originalgangsta
Hallo,
der Hinweis bringt insofern die Lösung als daß ich die SQL-Abfrage nach Ausführung des Makros in der Quelle des Listenfeldes (Eigenschaften) sehe. Die Daten werden jedoch nicht angezeigt, wenn ich also das Listenfeld im Formular aufklappe ist es leer. Die Einstellungen des Listenfeldes bzgl. seiner Art steht auf "Werteliste", habe aber auch mit anderen Einstellungen getestet. Wodran kann der Fehler liegen?
Der Vollständigkeit halber hier nochmal der aktuelle Inhalt des Makros:
Code: Alles auswählen
dim sSQL2(0) as string
oForm = thiscomponent.drawpage.forms.getByName("mfrm")
oListfeld2 = oForm.getByName("lst_mfrm_organisation")
oListfeld2.ListSourceType = Query
sSQL2(0) = "SELECT ... "
oListfeld2.ListSource = sSQL2
oListfeld2.refresh
Danke!
OG
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: So 27. Apr 2014, 17:54
von RobertG
Hallo OG,
1. Es handelt sich um "SQL", nicht um eine "Werteliste". Art des Listenfeldinhaltes ist also "SQL". Der ListSorceType ist meines Wissens eine Integer-Variable. Da müsste '3' stehen für SQL. Wenn das aber schon voreingestellt ist kannst Du diese Bestimmung gut raus lassen.
2. In dem Select-Befehl muss zuerst der anzuzeigende Inhalt und als 2. Feld der Fremdschlüssel stehen, der in die Tabelle eingegeben werden soll - vorausgesetzt das gebundene Feld ist '1'.
Wie lautet denn Dein SQL-Befehl?
Gruß
Robert
Re: Ergebnis einer Query in Makro weiterverarbeiten
Verfasst: So 27. Apr 2014, 19:43
von Originalgangsta
Hi Robert,
zu 1.: Umgestellt (Sourcetype = 3, Listenart = SQL), funktioniert.
zu 2.: das Select liefert die Felder wie von Dir beschrieben, speichert die ID aber nicht in die zugrunde liegende Tabelle. Das SQL (aus dem Makro kopiert) lautet:
Code: Alles auswählen
"SELECT ""tbl_land"".""Land"" || ', ' || ""tbl_organisation"".""Organisation"" AS ""Organisation"", ""tbl_organisation"".""ID_organisation"" FROM ""tbl_region"", ""tbl_land"", ""tbl_gebiet"", ""mtbl_hersteller"", ""tbl_organisation"" WHERE ""tbl_region"".""ID_land"" = ""tbl_land"".""ID_land"" and ""tbl_land"".""ID_land"" = '" & SQL_LandID & "' AND ""tbl_gebiet"".""ID_region"" = ""tbl_region"".""ID_region"" AND ""mtbl_hersteller"".""ID_gebiet"" = ""tbl_gebiet"".""ID_gebiet"" AND ""mtbl_hersteller"".""ID_organisation"" = ""tbl_organisation"".""ID_organisation"" ORDER BY ""tbl_land"".""Land"" ASC"
Danke!
Gruß,
OG