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

[gelöst] Anfügeabfrage in Base

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
malt14
Beiträge: 125
Registriert: Fr 7. Nov 2014, 06:21

[gelöst] Anfügeabfrage in Base

Beitrag von malt14 » Sa 6. Dez 2014, 12:13

In Base erstellte ich beigefügte Abfrage.

Code: Alles auswählen

SELECT "account balance portfolio cash sum"."last total balance account base currency" AS "cash base", "stock securities last values bond sums"."value base last" AS "bonds base", "account balance portfolio cash sum"."last total balance account base currency" + IFNULL( "stock securities last values bond sums"."value base last", 0 ) AS "total cash + bonds", "portfolio last total value"."portfolio last total value base", "portfolio last total value"."last date portfolio total value", ( "account balance portfolio cash sum"."last total balance account base currency" + IFNULL( "stock securities last values bond sums"."value base last", 0 ) ) / "portfolio last total value"."portfolio last total value base" AS "cash + bonds % of total portfolio", "account balance portfolio cash sum"."last total balance account base currency" / "portfolio last total value"."portfolio last total value base" AS "cash % of total portfolio", "account balance portfolio cash sum"."owner ID" FROM { OJ "account balance portfolio cash sum" LEFT OUTER JOIN "stock securities last values bond sums" ON "account balance portfolio cash sum"."owner ID" = "stock securities last values bond sums"."owner ID" }, "portfolio last total value" WHERE "account balance portfolio cash sum"."owner ID" = "portfolio last total value"."owner ID"
Die Ergebnisse der Abfrage möchte ich regelmäßig in einer Tabelle in der gleichen Datenbank speichern, Titel z.B. "past portfolio values", wobei die Felder der Tabelle wie die acht Spalten der Abfrage benannt werden, zusätzlich ein "ID" Feld.

Mit Extras/SQL konnte ich dies über "Insert into" nicht erreichen; ich erhielt die Fehlermeldung "..table .." nicht erkannt.
Kann man in Base mit Extras/SQL auf Abfragen zugreifen?
Wäre es möglich, die SQL Anfügeabfrage über ein Symbol auszuführen?

Im Base Handbuch und Forum fand ich dazu nichts. Kann mir bitte jemand einen Link oder Hinweis geben.
Falls es nur mit Makro geht, benötigte ich ein Beispiel, um dies entsprechend zu kopieren, da ich Makros noch nicht kenne.

Grüße

Malt
Zuletzt geändert von malt14 am So 7. Dez 2014, 21:10, insgesamt 1-mal geändert.

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Anfügeabfrage in Base

Beitrag von RobertG » Sa 6. Dez 2014, 17:55

Hallo Malt,

ich nehme nicht an, dass Du auf Abfragen innerhalb des SQL-Editors zugreifen kannst.
Wenn Du ein Formular erstellst und darun einen Button unterbringst, dann kannst Du von dort aus das folgende Makro starten:

Code: Alles auswählen

SUB Abfragen
	oDatenquelle = ThisComponent.Parent.CurrentController
	If NOT (oDatenquelle.isConnected()) THEN
		oDatenquelle.connect()
	END IF
	oVerbindung = oDatenquelle.ActiveConnection()
	oDatenDatei = ThisComponent.Parent.CurrentController.DataSource
	oAbfragen = oDatenDatei.getQueryDefinitions()
	oSQL_Anweisung = oVerbindung.createStatement()
	stQuery = oAbfragen.getByName("Query").Command
	stSql = "INSERT INTO ""Table"" (""Name"") "+stQuery
	oSQL_Anweisung.executeUpdate(stSql)
END SUB
Ich habe das jetzt gerade nur von einem Formular aus getestet. "Query" ist der Name der Abfrage. "Table" istder name der Tabelle. Du musst alle Felder der Zieltabelle aufführen, da Du ja noch keinen Primärschlüssel hast. Das Einfügen ohne die Benennnung der Felder ist nur möglich, wenn die Anzahl der Felder, die Reihenfolge der Felder und die Felddefinitionen von Quelle und Ziel genau übereinstimmt.
Achte darauf, dass in Basic die Bezeichnungenb für Tabelle und Feld immer in doppelte Anführungszeichen gesetzt werden müssen.

Willst Du das Ganze außerhalb des Formulars von der Base-Oberfläche aus starten, so nimm einfach alle "Parent"-Bezeichnungen raus. Du kannst Dir dann auch einen entsprechenden Button dafür auf die Symbolleiste der Base-Datei legen. Wie das geht ist in der momentan in Arbeit befindlichen Fassung des Handbuches im Kapitel "Makros" → "Datenbanksicherungen erstellen" beschrieben: http://robert.familiegrosskopf.de/lo_hb_dev/
Natürlich findest Du im Handbuch auch demnächst den Hinweis, wie auf Abfragen mit einem Makro zugegriffen werden kann.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Anfügeabfrage in Base

Beitrag von RobertG » Sa 6. Dez 2014, 22:32

Hallo Malt,

kleine Ergänzung von Rik: Wenn Du aus der Abfrage eine Ansicht machst, dann müsste auch die Möglichkeit gehen, direktes SQL zu nutzen. Schließlich ist die Ansicht der Datenbank bekannt, die Abfrage nicht. Nur musst Du dann jedes Mal die Felder der Aufnahmetabelle in SQL angeben.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

malt14
Beiträge: 125
Registriert: Fr 7. Nov 2014, 06:21

Re: Anfügeabfrage in Base

Beitrag von malt14 » So 7. Dez 2014, 12:10

Hallo Robert,

Vielen Dank für die Hilfe.

Das Anfügen per SQL über einen View/Ansicht funktioniert. Etwas umständlich für mich, da ich zuerst über "Extras" "SQL" aufrufen, und dann den Befehl einfügen muß.

Als Makro versuchte ich dies, um es von der Base Oberfläche zu starten:

Code: Alles auswählen

REM  *****  BASIC  *****


    SUB Abfragen
       oDatenquelle = ThisComponent.CurrentController
       If NOT (oDatenquelle.isConnected()) THEN
          oDatenquelle.connect()
       END IF
       oVerbindung = oDatenquelle.ActiveConnection()
       oDatenDatei = ThisComponent.CurrentController.DataSource
       oAbfragen = oDatenDatei.getQueryDefinitions()
       oSQL_Anweisung = oVerbindung.createStatement()
       stQuery = oAbfragen.getByName("account balance portfolio cash bond sum").Command
       stSql = "INSERT INTO ""history account balance portfolio cash bond sum"" (""cash base"", ""bonds base"", ""total cash + bonds"", ""portfolio last total value base"", ""last date portfolio total value"", ""cash + bonds % of total portfolio"", ""cash % of total portfolio"", ""owner ID"") "+stQuery
       oSQL_Anweisung.executeUpdate(stSql)
    END SUB
""cash base"", ""bonds base"" etc sind die Felder der Zieltabelle und entsprechen den Namen bzw. Alias der Abfrage.

Ich erhalte eine Fehlermeldung "Table not found ..." (siehe screenshot).

Grüße

malt
Dateianhänge
makro anfügeabfrage bookkeeping.PNG
makro anfügeabfrage bookkeeping.PNG (86.71 KiB) 4555 mal betrachtet

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Anfügeabfrage in Base

Beitrag von RobertG » So 7. Dez 2014, 19:48

Hallo malt,

sieh's doch erst einmal so: Das erste Makro und gemeckert wird erst bei der letzten Zeile ...
Aber Spaß beiseite.
- Der Tabellennamen existiert: "history account balance portfolio cash bond sum"?
- Die Abfrage greift auf Tabellen zu, nicht auch noch auf weitere Abfragen?
Wenn das Einfügen über Extras → SQL mit der Ansicht klappt, dann sprich doch einfach die Ansicht mit der entsprechenden Namensbezeichnung an:

Code: Alles auswählen

stSql = "INSERT INTO ""history account balance portfolio cash bond sum"" (""cash base"", ""bonds base"", ""total cash + bonds"", ""portfolio last total value base"", ""last date portfolio total value"", ""cash + bonds % of total portfolio"", ""cash % of total portfolio"", ""owner ID"") SELECT * FROM ""NameAnsicht"" "
Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

malt14
Beiträge: 125
Registriert: Fr 7. Nov 2014, 06:21

Re: [gelöst] Anfügeabfrage in Base

Beitrag von malt14 » So 7. Dez 2014, 21:14

Hallo Robert,

der Tabellenname existiert.

Die Abfrage, deren Ergebnisse an die Tabelle angefügt werden sollen, greift auf mehrere andere Abfragen zu, von den wieder einige auf andere Abfragen zugreifen. Das verursacht das Problem?

Wie von Dir vorgeschlagen, änderte ich das Makro:

Code: Alles auswählen

REM  *****  BASIC  *****

    SUB Abfragen
       oDatenquelle = ThisComponent.CurrentController
       If NOT (oDatenquelle.isConnected()) THEN
          oDatenquelle.connect()
       END IF
       oVerbindung = oDatenquelle.ActiveConnection()
       oDatenDatei = ThisComponent.CurrentController.DataSource
       oAbfragen = oDatenDatei.getQueryDefinitions()
       oSQL_Anweisung = oVerbindung.createStatement()
       stSql = "INSERT INTO ""history account balance portfolio cash bond sum"" (""cash base"", ""bonds base"", ""total cash + bonds"", ""portfolio last total value base"", ""last date portfolio total value"", ""cash + bonds % of total portfolio"", ""cash % of total portfolio"", ""owner ID"") SELECT * FROM ""history balance portfolio"" "+stQuery
       oSQL_Anweisung.executeUpdate(stSql)
    END SUB

Jetzt funktioniert es.
Symbol für das Makro eingerichtet; das Anfügen der Abfrageergebnisse an die Tabelle erfolgt einfach über Anklicken.

Daß es in meinem ersten Makro erst in der letzten Zeile eine Fehlermeldung gab, kann ich mir nicht als Verdienst zuschreiben. Ich kopierte und ergänzte nur, was Du geschaffen und erklärt hattest.

Herzlichen Dank für Deine Hilfe!

Grüße

malt

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: [gelöst] Anfügeabfrage in Base

Beitrag von RobertG » So 7. Dez 2014, 21:39

Hallo malt,

die folgenden Zeilen sind jetzt sinnlos:

Code: Alles auswählen

       oDatenDatei = ThisComponent.CurrentController.DataSource
       oAbfragen = oDatenDatei.getQueryDefinitions()
Damit solltest Du ja den Abfragenamen und die entsprechende Definition ermitteln. Außerdem muss

Code: Alles auswählen

+stQuery
raus. Stört im Moment nicht, aber nur, weil die Variable leer ist.

Jetzt fehlt eigentlich noch die Deklaration der Variablen:

Code: Alles auswählen

DIM oDatenquelle AS OBJECT
DIM oVerbindung AS OBJECT
DIM oSql_Anweisung AS OBJECT
DIM stSql AS STRING
Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

malt14
Beiträge: 125
Registriert: Fr 7. Nov 2014, 06:21

Re: [gelöst] Anfügeabfrage in Base

Beitrag von malt14 » Mo 8. Dez 2014, 10:08

Hallo Robert,

vielen Dank für die Hinweise.

Das geänderte Makro:

Code: Alles auswählen

REM  *****  BASIC  *****

    SUB Abfragen
DIM oDatenquelle AS OBJECT
    DIM oVerbindung AS OBJECT
    DIM oSql_Anweisung AS OBJECT
    DIM stSql AS STRING
       oDatenquelle = ThisComponent.CurrentController
       If NOT (oDatenquelle.isConnected()) THEN
          oDatenquelle.connect()
       END IF
       oVerbindung = oDatenquelle.ActiveConnection()
       oSQL_Anweisung = oVerbindung.createStatement()
       stSql = "INSERT INTO ""history account balance portfolio cash bond sum"" (""cash base"", ""bonds base"", ""total cash + bonds"", ""portfolio last total value base"", ""last date portfolio total value"", ""cash + bonds % of total portfolio"", ""cash % of total portfolio"", ""owner ID"") SELECT * FROM ""history balance portfolio"" "
       oSQL_Anweisung.executeUpdate(stSql)
    END SUB

Grüße

malt


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