Base Datenbankabfrage in Basic Makro?

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

Moderator: Moderatoren

Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

Hallo, irgendwie schaffe ich es nicht folgende Base Abfrage direkt in mein Makro ein zu speichern.

Das hier ist die Abfrage

Code: Alles auswählen

SELECT "TP".* FROM "TP" AS "TP", "Stadklasse" AS "Stadklasse" WHERE "TP"."Gebiet" = "Stadklasse"."Stadtname" AND "Stadklasse"."Klasse" = :Klasse ORDER BY "TP"."Gebiet" ASC, "TP"."Lokal" ASC
Dabei muss ich auch einen Parameter Abfragen, das löse ich aber über eine ListBox im Dialog. Zu erst muss ich aber die Abfrage irgendwie ins Makro bekommen. Im Moment habe ich eine Version, die auf die Abfragen aus der Basedatei zugreift. Damit funktionieren aber die Parameterabfragen nicht.
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von gogo »

lass mich raten: der Parameter ist ':Klasse' ?

egal welchen Datentyp und Wert der Parameter hat, Du musst ihn für die Abfrage in einen String umwandeln, und diesen dann korrekt in den String Deiner Abfrage einbauen.

Also:
zuerst (wie auch immer) auf den über die Listbox erhaltenen Wert zugreifen,
diesen dann in Deiner Abfrage einbauen, so dass der entstehende String eine korrekte SQL-Abfrage für Deine Datenbank ist ("Stadklasse"."Klasse" = """ & StringWert & """ ) oder ("Stadklasse"."Klasse" = '" & StringWert & "') oder ("Stadklasse"."Klasse" = " & StringWert & ") oder ...

Nun hättest Du den korrekten String.
Mir ist aber nicht klar was Du mit diesem dann machst!

g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Heinz Bär
****
Beiträge: 130
Registriert: Mo, 28.03.2005 11:20
Wohnort: CH-6467 Schattdorf

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von Heinz Bär »

MikeRo

Schau mal unter http://www.ooowiki.de/BaseApi#SQL-Abfra ... 2BAPw-hren nach. Dort wird dies schrittweise erklärt.

Gruss
Heinz
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

gogo hat geschrieben:lass mich raten: der Parameter ist ':Klasse' ?

egal welchen Datentyp und Wert der Parameter hat, Du musst ihn für die Abfrage in einen String umwandeln, und diesen dann korrekt in den String Deiner Abfrage einbauen.

Also:
zuerst (wie auch immer) auf den über die Listbox erhaltenen Wert zugreifen,
diesen dann in Deiner Abfrage einbauen, so dass der entstehende String eine korrekte SQL-Abfrage für Deine Datenbank ist ("Stadklasse"."Klasse" = """ & StringWert & """ ) oder ("Stadklasse"."Klasse" = '" & StringWert & "') oder ("Stadklasse"."Klasse" = " & StringWert & ") oder ...

Nun hättest Du den korrekten String.
Mir ist aber nicht klar was Du mit diesem dann machst!

g
Danke,

ich habe einen Dialog, der per Klick ausgewählte Listen per Standartabfragen (Die alle in der Basedatei sind) in ein Tabellendokument exportiert.
Das klappt auch alles wunderbar.

Jetzt muss ich das Programm um Filter erweitern. Damit nicht alle Datensätze ausgespuckt werden, sondern nur bestimmte.
In Base bekomme ich diese Parameterabfragen ohne weiteres hin. Aber auf die kann ich ja nicht per Makro zugreifen, oder kann ich einfach eine Parameterabfrage in der Basedatei erstellen und dann im Makro einfach den Parameter direkt an die Abfrage übergeben, wenn ich diese Aufrufe?

Ansonsten ist mir nicht klar, in welcher Form ich die Abfrage in das Makro schreiben kann...

Wenn ich

Code: Alles auswählen

TP = "(SELECT "TP".* FROM "TP" AS "TP", "Stadklasse" AS "Stadklasse" WHERE "TP"."Gebiet" = "Stadklasse"."Stadtname" AND "Stadklasse"."Klasse" = " & StringListenWert & " ORDER BY "TP"."Gebiet" ASC, "TP"."Lokal" ASC)"
mache, bekomme ich einen Fehler.

Die Einträge bekomme ich so aus der Listbox (Es sind ja nur die Zulässig die drin sind.)
(Ist erst mal nur ein TestCode)

Code: Alles auswählen

Sub Liste
   oDialog = createUnoDialog(DialogLibraries.Standard.StdDialog)
   oDialog.execute()
   oListBox = oDialog.getControl("ListBox1")
   If oListBox.SelectedItem = "Alle"  Then
   Call Start
   Else 
   'Hier dann die entsprechenden anderen Abfragen, wenn sie von den Standartabfragen abweichen
   msgbox "Bis jetzt nur Alle Möglich", 0, "BETA!"
   'Stadklasse Ende
   End If
End Sub
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von gogo »

Schau mal unter http://www.ooowiki.de/BaseApi#SQL-Abfra ... 2BAPw-hren nach. Dort wird dies schrittweise erklärt.
... beschreibt genau was Du tun musst, Du müsstest aber ganz oben bei http://www.ooowiki.de/BaseApi#StarBasic losstarten falls Du noch keine Verbindung zur Datenbank hast. "Abfrageergebnis = SQL_Anweisung.executeQuery(Sql)" ergibt einen Fehler weil "SQL_Anweisung" in deinem Makro ja noch nicht bekannt ist.

In dem Tutorial steht auch wie Du das "Abfrageergebnis" auswerten kannst.

Übrigens: ich habe selbst noch nicht damit gearbeitet, aber eine Listbox hat auch die Methode .getSelectetItems. Wenn Du die auslesen kannst, dann erübrigt sich die zweite Abfrage! (viewtopic.php?f=18&t=1586)

g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von DPunch »

Aloha
MikeRo hat geschrieben:(...)oder kann ich einfach eine Parameterabfrage in der Basedatei erstellen und dann im Makro einfach den Parameter direkt an die Abfrage übergeben, wenn ich diese Aufrufe?
Nein, das geht nicht.
MikeRo hat geschrieben:(...)mache, bekomme ich einen Fehler.
Aussagen dieser Art sind nicht sonderlich hilfreich.
Ich behaupte, dass OpenOffice nicht einfach ein Popup erscheinen lässt, in dem nichts ausser "Fehler" steht.

Auf den ersten Blick kann ich Dir allerdings sagen, dass

Code: Alles auswählen

TP = "(SELECT "TP".* FROM "TP" AS "TP", "Stadklasse" AS "Stadklasse" WHERE "TP"."Gebiet" = "Stadklasse"."Stadtname" AND "Stadklasse"."Klasse" = " & StringListenWert & " ORDER BY "TP"."Gebiet" ASC, "TP"."Lokal" ASC)"
nicht funktionieren kann, weil Du die Anführungszeichen innerhalb des Strings nicht maskierst - dies tust Du mit zwei aufeinanderfolgenden Anführungszeichen

Code: Alles auswählen

TP = "(SELECT ""TP"".* FROM ""TP"" AS ""TP"", ""Stadklasse"" AS ""Stadklasse"" WHERE ""TP"".""Gebiet"" = ""Stadklasse"".""Stadtname"" AND ""Stadklasse"".""Klasse"" = " & StringListenWert & " ORDER BY ""TP"".""Gebiet"" ASC, ""TP"".""Lokal"" ASC)"
Zudem ist die Art und Weise, wie Du die Variable StringListenWert einbindest potenziell fehlerbehaftet. Wenn es ein numerischer Wert ist, ist alles ok, wenn es allerdings ein String ist, wie der Name vermuten lässt, musst Du dies der Datenbank auch klar machen - dies tust Du mit Hochkommata

Code: Alles auswählen

(...)""Stadklasse"".""Klasse"" = '" & StringListenWert & "' ORDER BY(...)
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

DPunch hat geschrieben:Aloha
MikeRo hat geschrieben:(...)oder kann ich einfach eine Parameterabfrage in der Basedatei erstellen und dann im Makro einfach den Parameter direkt an die Abfrage übergeben, wenn ich diese Aufrufe?
Nein, das geht nicht.
MikeRo hat geschrieben:(...)mache, bekomme ich einen Fehler.
Aussagen dieser Art sind nicht sonderlich hilfreich.
Ich behaupte, dass OpenOffice nicht einfach ein Popup erscheinen lässt, in dem nichts ausser "Fehler" steht.

Auf den ersten Blick kann ich Dir allerdings sagen, dass

Code: Alles auswählen

TP = "(SELECT "TP".* FROM "TP" AS "TP", "Stadklasse" AS "Stadklasse" WHERE "TP"."Gebiet" = "Stadklasse"."Stadtname" AND "Stadklasse"."Klasse" = " & StringListenWert & " ORDER BY "TP"."Gebiet" ASC, "TP"."Lokal" ASC)"
nicht funktionieren kann, weil Du die Anführungszeichen innerhalb des Strings nicht maskierst - dies tust Du mit zwei aufeinanderfolgenden Anführungszeichen

Code: Alles auswählen

TP = "(SELECT ""TP"".* FROM ""TP"" AS ""TP"", ""Stadklasse"" AS ""Stadklasse"" WHERE ""TP"".""Gebiet"" = ""Stadklasse"".""Stadtname"" AND ""Stadklasse"".""Klasse"" = " & StringListenWert & " ORDER BY ""TP"".""Gebiet"" ASC, ""TP"".""Lokal"" ASC)"
Zudem ist die Art und Weise, wie Du die Variable StringListenWert einbindest potenziell fehlerbehaftet. Wenn es ein numerischer Wert ist, ist alles ok, wenn es allerdings ein String ist, wie der Name vermuten lässt, musst Du dies der Datenbank auch klar machen - dies tust Du mit Hochkommata

Code: Alles auswählen

(...)""Stadklasse"".""Klasse"" = '" & StringListenWert & "' ORDER BY(...)
Vielen Lieben Dank! Ich werde es ausprobieren!
Und in Zukunft werde ich bei der Fehlerbeschreibung genauer sein ;-)

Lg
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

Jetzt habe ich noch ein neues Problem.

Wenn ich die Abfrage ausführe, kommt die Fehlermeldung

"Relation TP does not exists"

Ich denke das Problem ist, das ich über die Abfrage auf Abfragen in der Base Datei zugreife und nicht auf Tabellen, kann man das irgendwie einbauen das er die Abfragen als "Tabellen" Nimmt? Oder muss ich die gesamte Abfrage neu erstellen
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von DPunch »

Aloha
MikeRo hat geschrieben:ch denke das Problem ist, das ich über die Abfrage auf Abfragen in der Base Datei zugreife und nicht auf Tabellen
Das sollte eigentlich kein Problem sein.
MikeRo hat geschrieben:kann man das irgendwie einbauen das er die Abfragen als "Tabellen" Nimmt?
Ich weiss ehrlich gesagt nicht, was Du damit meinst.

Mit der Fehlermeldung kann ich im Moment auch nichts anfangen.
Vielleicht solltest Du nochmal den kompletten Code posten.
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

DPunch hat geschrieben:Aloha
MikeRo hat geschrieben:ch denke das Problem ist, das ich über die Abfrage auf Abfragen in der Base Datei zugreife und nicht auf Tabellen
Das sollte eigentlich kein Problem sein.
MikeRo hat geschrieben:kann man das irgendwie einbauen das er die Abfragen als "Tabellen" Nimmt?
Ich weiss ehrlich gesagt nicht, was Du damit meinst.

Mit der Fehlermeldung kann ich im Moment auch nichts anfangen.
Vielleicht solltest Du nochmal den kompletten Code posten.
Ich habe es bereits gelöst :) Ich habe die Abfragen komplett in das Makro eingearbeitet und somit, wird nun alles vom Makro abgearbeitet. Das ist inzwischen auch sehr sehr mächtig geworden.
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

Ich habe aber eine andere Frage. (oder soll ich lieber ein eigenes Thema erstellen)

Ich habe dieses Makro Programmiert. und es wird über ein Dialog gestartet. Und sobald der Startknopf gedrückt wird. passieren alle schritte sichtbar. (Aufrufen Der Vorlage, Export der Daten, Formatieren der Daten, Teilergebnisse ausführen, Ergebnisse anpassen und Formeln einsetzen) Man kann aber jeden dieser Schritte sehen. kann das alles nicht im Hintergrund ablaufen und ich mache im Dialog selbst einfach einen Fortschrittsbalken und wenn das Dokument fertig ist, wird es erst angezeigt, was auch gut wäre, wäre wenn bei Fehlern nicht in den Quelltext gesprungen wird...
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von DPunch »

Aloha
MikeRo hat geschrieben:Man kann aber jeden dieser Schritte sehen.
Versuch mal, per

Code: Alles auswählen

oDoc.lockControllers
die Controller zu blockieren, bevor Du irgendwelche Operationen in dem Dokument vornimmst.
Ans Ende des Codes muss dann noch ein

Code: Alles auswählen

oDoc.unlockControllers
Das bewirkt zwar nicht, dass das Dokument unsichtbar bzw. im Hintergrund bearbeitet wird, aber zumindest wirst Du die einzelnen Schritte nicht mehr sehen (und es sollte nebenbei auch noch einen deutlichen Geschwindigkeitszuwachs geben).
Die andere Möglichkeit wäre, das Dokument tatsächlich versteckt zu öffnen und zu bearbeiten, dazu siehe FAQ: Wie kann man ein Dokument versteckt öffnen?.
MikeRo hat geschrieben:was auch gut wäre, wäre wenn bei Fehlern nicht in den Quelltext gesprungen wird...
Normalerweise solltest Du alle möglichen Fehler direkt per entsprechenden logischen Abfragen in Deinem Quellcode abfangen - ansonsten auch hier: FAQ: Wie kann man Fehler abfangen?
Benutzeravatar
MikeRo
****
Beiträge: 153
Registriert: Mi, 20.01.2010 10:16

Re: Base Datenbankabfrage in Basic Makro?

Beitrag von MikeRo »

DPunch hat geschrieben:Aloha
MikeRo hat geschrieben:Man kann aber jeden dieser Schritte sehen.
Versuch mal, per

Code: Alles auswählen

oDoc.lockControllers
die Controller zu blockieren, bevor Du irgendwelche Operationen in dem Dokument vornimmst.
Ans Ende des Codes muss dann noch ein

Code: Alles auswählen

oDoc.unlockControllers
Das bewirkt zwar nicht, dass das Dokument unsichtbar bzw. im Hintergrund bearbeitet wird, aber zumindest wirst Du die einzelnen Schritte nicht mehr sehen (und es sollte nebenbei auch noch einen deutlichen Geschwindigkeitszuwachs geben).
Die andere Möglichkeit wäre, das Dokument tatsächlich versteckt zu öffnen und zu bearbeiten, dazu siehe FAQ: Wie kann man ein Dokument versteckt öffnen?.
MikeRo hat geschrieben:was auch gut wäre, wäre wenn bei Fehlern nicht in den Quelltext gesprungen wird...
Normalerweise solltest Du alle möglichen Fehler direkt per entsprechenden logischen Abfragen in Deinem Quellcode abfangen - ansonsten auch hier: FAQ: Wie kann man Fehler abfangen?

Vielen Dank für deine Hilfe!

oDoc.lockControllers
Hat mir eine erhebliche Geschwindigkeit Steigerung gebracht.
Ich kann zwar jetzt das Dokument versteckt öffnen und bearbeiten. Allerdings muss es ja am ende wieder sichtbar werden^^
Und das mit den Fehlern klappt auch gut, die meisten habe ich ja schon abgefangen.
OpenOffice 3.3 & postgresql-sdbc-driver 0.7.6b
Windows XP Professional SP3 x86
Antworten