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

Abfrageergbnis innerhalb Base in Tabelle übergeben

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Budbase
Beiträge: 5
Registriert: Sa 7. Mär 2015, 14:53

Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von Budbase » Sa 7. Mär 2015, 15:00

Hallo Forum,

ich habe jetzt lange gesucht und probiert, nun brauche ich hier wohl doch mal eure fachkundige Hilfe. Ich bin frisch bei Linux. Ich möchte mit LibreOffice Base Vers. 4.2 xx eine Konto-Datenbank aufbauen, mit MS Access habe ich es damals geschafft. Die Makrosprache in LO Base schafft mich als mutigen Laien aber wohl doch.

Ich möchte die Werte aus einer Abfrage (Formular dazu funktioniert) in eine Tabelle bei der gleichen Base-Datenbank übergeben, um diese dann für spätere Auswertung oder Statistik zu haben. Es sind vier Konten und deren Bestände, die ich dann nach Bedarf zum Zeitpunkt der Abfrage festhalten möchte in der Tabelle. Daraus dann später einen Bericht erstellen.

Ich schaffe es einfach nicht, dafür ein Makro zu finden oder anzupassen. Ich müsste doch sagen: markiere und kopiere in der Abfrage die Werte der Felder „Konto“ und „Bestand“ und füge diese Werte als neuen Datensatz der Tabelle „Bestände“ an. Es gelingt mir einfach nicht, die passenden Befehle zu finden. Schon gar nicht, überhaupt die Tabelle anzusteuern.

Das funktioniert wunderbar:
Sub Macro2_Oeffnen_Form_Bestand
ThisDatabaseDocument.FormDocuments.getByName("Abfrage2Bestand").open
End Sub


Oder schwirrt mir da was vor, was so in Base nicht zu leisten wäre? Glaub ich aber kaum. Vermutlich ist meine Herangehensweise falsch. Aber ich habe in dem Handbuch gestöbert und gesucht, aber bin nicht schlau drauß geworden. Ist mein Problem vielleicht so einfach, dass jemand hier im Forum mir da recht einfach eine „Makrohilfe“ geben kann. Vermute, das ist leicht zu lösen, aber ich finde es nicht alleine heraus.

Bin gespannt, was ihr meint

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

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von RobertG » Sa 7. Mär 2015, 15:56

Hallo Budbase,

etwas, was direkt darauf zugeschnitten ist, wirst Du im Handbuch nie finden. Das liegt daran, dass die Grundlage einer Datenbank ist, möglichst keine Daten zu duplizieren. und jede Kopie einer Datenzeile auch in eine andere Tabelle ist natürlich so ein Duplikat. Das würde im Handbuch schlicht über Abfragen und Views erledigt.

Trotdem geht das Ganze natürlich.
Ausgangspunkt ist die Abfrage, auf die Du über das Formular zugreifst. In dem Formular befindet sich ein Button, mit dem Du die Kopie anstößt.

Code: Alles auswählen

SUB Kopie(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
ID = oForm.getLong(1)
sName = oForm.getString(2)
dValue = oForm.getDouble(3)
...
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "INSERT INTO ""Tabelle""(""ID"",""Name"",""Wert"") VALUES ('"+ID+"','"+sName+"','"+dValue+"')"
oSQL_Anweisung.executeUpdate(stSql)
END SUB
Die Variablen musst Du deklarieren. Das Einlesen über den Index (1, 2, 3, ...) geschieht in der Reihenfolge, wie die Felder in der Datenquelle des Formulars vorliegen. Beim Druck auf den Button wird der aktuelle Datensatz eingefügt.

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

Budbase
Beiträge: 5
Registriert: Sa 7. Mär 2015, 14:53

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von Budbase » Sa 7. Mär 2015, 16:48

Hallo Robert,

danke für die rasche Antwort. Wie ich schrieb, Laie! :oops:
Will es natürlich ausprobieren, aber bekomme schon bei
oForm = oEvent.Source.Model.Parent
die Meldung : "Basic-Laufzeitfehler, Argument ist nicht optional"
Hängt das mit Feldformatierungen zusammen? Hab die Stelle noch nicht geknackt.

Beste Grüße
Budbase

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

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von RobertG » Sa 7. Mär 2015, 17:20

Hallo Budbase,

das Makro muss an einen Button in dem Formular gekoppelt sein, aus dem heraus Du die Daten kopieren willst:
Eigenschaften: Schaltfläche → Ereignisse → Aktion ausführen
Wie führst Du das Makro aus?

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

Budbase
Beiträge: 5
Registriert: Sa 7. Mär 2015, 14:53

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von Budbase » Sa 7. Mär 2015, 17:33

Hi Robert,
ja, das dachte ich mir schon als erstes und habe in dem Formular eine Schaltfläche eingebaut und die Aktion wollte ich bei "Maustaste losgelassen" starten lassen. Habe vorher dein Makro in den Makroeditor kopiert und dann die Aktion zugewiesen. Die Meldung bekomme ich, wenn ich im Editor (wenn man das so nennt) die Einzelschritte (F8) prüfe. Ich hoffe, es ist egal, wo die Makros gespeichert werden. Bei "Makros verwalten" sind die Makros jetzt alle unter dem Namen der Datenbank abgelegt.

Gruß Budbase

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

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von RobertG » Sa 7. Mär 2015, 18:04

Hallo Budbase,

Makros, die aus einem Formular gestartet werden sollen, kannst Du nur selten im Makroeditor schrittweise ablaufen lassen. Ich setzte häufig zur Kontrolle eine Messagebox ein, die mir den Inhalt bestimmter Elemente aufzeigt:
msgbox ID
würde Dir z.B. den Inhalt des Feldes anzeigen, aus dem Du die ID auslesen willst. Nützlich, wenn Du nicht genau weißt, ob die Felder nun korrelt sind.
Wenn Du

Code: Alles auswählen

stSql = "INSERT INTO ""Tabelle""(""ID"",""Name"",""Wert"") VALUES ('"+ID+"','"+sName+"','"+dValue+"')"
msgbox stSql
'oSQL_Anweisung.executeUpdate(stSql)
statt des normalen Endes in das Makro eingibst, dann passiert erst einmal bei der Ausführung über den Button nichts mit Deiner Datenbank. Die Ausführungsanweisung ist als Kommentar ausgewiesen. Stattdessen wird Dir der SQL-Befehl in der Messagebox angezeigt.

Die Makros solltest Du grundsätzlich innerhalb der Datenbank speichern, nicht unter "Meine Makros". Nur dann sind sie auch noch verfügbar, wenn Du die Datenbank z.B. auf einem anderen Rechner öffnest.

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: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von RobertG » So 8. Mär 2015, 11:20

Hallo Budbase,

noch ein Hinweis, den ich jetzt doch in dem nächsten Handbuch unter gebracht habe:
Wenn Du Werte aus einem Formular ausliest und nur in SQL weiter verarbeiten willst (also keine Rechnungen oder so etwas durchführen), dann ist es günstiger, gar nicht erst nach Variablentypen zu differenzieren.

Code: Alles auswählen

stWert1 = oForm.getString(1)
lässt sich immer in einem weiteren SQL-Befehl verarbeiten. Auch Datumswerte werden so direkt im SQL-tauglichen Format ausgelesen und können in Abfragen oder Eingaben genutzt werden.

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

Budbase
Beiträge: 5
Registriert: Sa 7. Mär 2015, 14:53

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von Budbase » So 8. Mär 2015, 17:16

Hallo Robert,
nun habe ich endlich durch deine Hilfe einen Teilerfolg an der Stelle. Hab noch etwas probiert und gefummelt und die erste Zeile der Abfrage landet in der Tabelle. Du ahnst mein Problem? ;) In der Abfrage werden mir vier Konten und deren Bestände angezeigt. Die möchte ich dann auch alle in die "Bestandstabelle" übernehmen. Wie bringe ich das Mako dazu, das gleich noch dreimal nur einen Datensatz weiter jeweils zu machen. Irgendwie mit "oResult.next" vielleicht. Bevor ich die halbe Nacht versuche, gibt es hier bestimmt ne richtige Lösung :)
Beste Grüße Budbase

Zur Info, das läuft jetzt bei mir störungsfrei:
SUB Kopie(oEvent AS OBJECT)
DIM oForm AS OBJECT
oForm = oEvent.Source.Model.Parent
oForm.IsModified = TRUE
Konto =oForm.getString(1)
Bestand = oForm.getString(4)
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "INSERT INTO ""WertetabelleBestand""(""Konto"",""Bestand"") VALUES ('"+Konto+"','"+Bestand+"')"
oSQL_Anweisung.executeUpdate(stSql)
END SUB

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

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von RobertG » So 8. Mär 2015, 18:02

Hallo Budbase,

das auslösende Ereignis ist ja mit dem aktuellen Datensatz des Formulars verbunden. Ich würde jetzt einfach einmal

Code: Alles auswählen

oForm.next
probieren.
Allerdings steht in Deinbem Code oForm.IsModified = TRUE (warum auch immer ...). Den Ansatz verstehe ich nicht.
Wenn ich jetzt eine Schleife einbauen würde, dann würde statt oForm.IsModified folgendes stehen:

Code: Alles auswählen

FOR i = 1 TO 4
Konto =oForm.getString(1)
Bestand = oForm.getString(4)
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "INSERT INTO ""WertetabelleBestand""(""Konto"",""Bestand"") VALUES ('"+Konto+"','"+Bestand+"')"
oSQL_Anweisung.executeUpdate(stSql)
oForm.next
NEXT i
Habe ich jetzt, wie geschrieben, nicht nachgetestet ...

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

Budbase
Beiträge: 5
Registriert: Sa 7. Mär 2015, 14:53

Re: Abfrageergbnis innerhalb Base in Tabelle übergeben

Beitrag von Budbase » So 8. Mär 2015, 21:25

Hallo Robert,
danke für deine Hilfe, es klappt.
Die unnötige Zeile hatte ich beim ausprobieren einkopiert, hab sie wieder gelöscht.
Nun bastel ich an den nächsten Schritten. Bis zum nächsten mal :D
Nochmal vielen Dank
Gruß
Budbase


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