BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Daten aus dem davor liegendem Datensatz holen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
ogan
Beiträge: 20
Registriert: Mi 15. Jul 2020, 11:31

Daten aus dem davor liegendem Datensatz holen

Beitrag von ogan » Mi 12. Aug 2020, 13:09

Hallo

Ich möchte wenn ich im Formular auf einem bestimmten Datensatz bin gewisse Felder von dem davor liegendem Datensatz holen darstellen und speichern.

Wie ich das mache wenn ich in einen neuen Datensatz bin und auf den letzten Datensatz davor zugreife habe ich herausgefunden. Es geht wie in
https://www.openoffice-forum.de/viewtopic.php?t=7445
oder ich kann es auch mit einem Makro machen zum Beispiel wie folgt: (TestHolenausVortag ist die Name der Tabelle, KassendifferenzVortag ist das Feld dass mit dem Wert vom Vortag gefüllt werden soll. Macro wird beim verlassen des Feldes aufgerufen )

Sub DatenAusVortag

DIM oForm AS OBJECT
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oFeld1 AS OBJECT

DIM oDatasource AS OBJECT
DIM oConnection AS OBJECT

DIM oSQL_Statement AS OBJECT ' das Objekt, das den SQL-Befehl ausführt
DIM stSql AS STRING ' Text des eigentlichen SQL-Befehls
DIM oResult AS OBJECT ' Ergebnis für executeQuery
DIM iResult AS INTEGER
DIM sKdifferenz AS DOUBLE

oDatasource = thisComponent.Parent.CurrentController
IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
oConnection = oDatasource.ActiveConnection()
oSQL_Statement = oConnection.createStatement()
oSQL_Statement.ResultSetType = 1005 ' resultsettype auf SCROLL_SENSITIVE setzen

stSql = "SELECT * From ""TestHolenausVortag"" ORDER BY ""Datum"""
oResult = oSQL_Statement.executeQuery(stSql)

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oFeld1 = oForm.getByName("KassendifferenzVortag")

IF oResult.last THEN ' gehe zum letzten Datensatz, sofern möglich

sKdifferenz = oResult.getDouble(3) ' die Kassendifferenz vom Vortag

inValue = MsgBox("Kassendifferenz: " & CHR(13) & sKdifferenz)
oFeld1.BoundField.UpdateDouble(sKdifferenz)

ELSE
oFeld1.BoundField.UpdateDouble(0.0)
END IF
End Sub

Aber ich will ja wenn ich auf einem beliebigem Datensatz bin Daten aus dem davorliegendem Datensatz holen. Was muss ich da machen ?

Gruss
ogan

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von RobertG » Mi 12. Aug 2020, 17:26

Hallo ogan,

das scheitert vermutlich schon daran, dass für Base nicht klar ist, was denn der davor liegende Datensatz ist. Den weiß es erst genau, wenn Du mit dem Formular diesen Datensatz angesteuert hast. In dem Moment könntest Du die Feldwerte über die Formulareigenschaften kopieren, zurück zu Deinem ursprünglichen Datensatz gehen und dort einfügen. Mit dem Formularsprung (einen Zurück, einen Vor) bekommst Du aber dann Probleme, wenn Du vorher bereits Daten in der aktuellen Zeile hast, die aber noch nicht abgespeichert wurden. Noch mehr Probleme bekommst Du, wenn da Daten geändert wurden, aber bestimmte Pflichtfelder durch die Kopie erst gefüllt werden sollen.

Wenn Du Bei Deinen Daten eine strikte Sortierung noch einem AutoWert-Primärschlüssel einhältst, dann könnte natürlich über SQL auch der vorhergehenden Datensatz rausgesucht werden. Der hat dann einfach in dem entsprechenden Feld den größten Wert, der gerade eben noch kleiner ist als der aktuelle Wert des aktuellen Datensatzes.

Ganze Datensätze kannst Du übrigens bei AutoWert-Feldern als Primärschlüssel kopieren, indem Du in der Tabellenansicht vor dem Datensatz auf den Datensatzzeiger klickst und mit der gedrückten linken Maustaste nach unten ziehst. Dann wird ein neuer Datensatz mit gleichem Inhalt erstellt - bis auf den Primärschlüssel.
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

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von Wanderer » Do 13. Aug 2020, 08:08

Hallo,

F3Ks Lösung ist - wie üblich - elegant, aber je nach Anforderung würde ich vermeiden wollen auf "den vorherigen Datensatz" zuzugreifen.

Wenn die Daten nur bei der Erzeugung eines neuen Datensatzes Übernommen werden sollen, würde ich im Formular einen "Clone"-Button einbauen der aus dem aktuellen Datensatz die Daten per Macro übernimmt und in einen neuen Datensatz schreibt. Das funktioniert dann mit beliebigen Datensätzen.

Wenn Du den Kassenstand vom Vortag nur für Berechnungen brauchst, sollte er eher per Unterabfrage/Unterformular aus dem Datum
aktuell ermittelt werden und nicht zweimal gespeichert sein.

Ich habe den Verdacht, dass Du ein Papierformular nachbaust, aber Computer brauchen eigentlich keinen Übertrag.

Mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

ogan
Beiträge: 20
Registriert: Mi 15. Jul 2020, 11:31

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von ogan » Do 13. Aug 2020, 11:35

Hallo Robert
Ich möchte die Werte nicht manuell eintragen sondern möchte dass das automatisch geschieht.

>Wenn Du Bei Deinen Daten eine strikte Sortierung noch einem AutoWert-Primärschlüssel einhältst, dann könnte natürlich >über SQL auch der vorhergehenden Datensatz rausgesucht werden. Der hat dann einfach in dem entsprechenden Feld den >größten Wert, der gerade eben noch kleiner ist als der aktuelle Wert des aktuellen Datensatzes.

ich weiss eben nicht wie ich dafür das SQL schreibe, kannst du mir da ein codebeipiel geben ?

Gruss
Ogan

ogan
Beiträge: 20
Registriert: Mi 15. Jul 2020, 11:31

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von ogan » Do 13. Aug 2020, 11:52

Hallo Jörn

>Wenn die Daten nur bei der Erzeugung eines neuen Datensatzes Übernommen werden sollen, würde ich im Formular einen >"Clone"-Button einbauen der aus dem aktuellen Datensatz die Daten per Macro übernimmt und in einen neuen Datensatz >schreibt. Das funktioniert dann mit beliebigen Datensätzen.
wie mache ich das genau ?

>Wenn Du den Kassenstand vom Vortag nur für Berechnungen brauchst, sollte er eher per Unterabfrage/Unterformular aus >dem Datum aktuell ermittelt werden und nicht zweimal gespeichert sein.
ja ich brauche es schon für Folgeberechnungen und es soll aber auch im Formular dargestellt werden. Wie mache ich das mit Unterabfragen/Unterformularen ? Da kenne ich mich nicht so gut aus. Und wenn ich ein Feld im Formular habe brauche ich doch eine Datenquelle dafür die entweder von einer Abfrage oder Tabelle kommt.

>Ich habe den Verdacht, dass Du ein Papierformular nachbaust, aber Computer brauchen eigentlich keinen Übertrag.
Wir haben eine Excel Vorlage die wir in eine Datenbank abbilden sollen. Eigentlich haben wir ein Datensatz für jeden Tag. Jeden Tag wird eine Abrechnung gemacht. Es werden verschiedene Werte eingegeben und dann müssen gewisse Werte vom Vortag übernommen werden diese fliessen dann in Berechnungen ein dessen Ergebnisse auch gespeichert werden.

Gruss
Ogan

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von RobertG » Do 13. Aug 2020, 16:42

Hallo Ogan,

geht es jetzt wirklich um einen Übertrag? Ich dachte allgemein Um Daten aus einem vorhergehenden Datensatz. Wenn es sich bei dem ganzen um Berechnungen handelt, dann werden die nirgendwo gespeichert. Die werden gemacht, wenn Du aktuell die entsprechenden Werte sehen willst. Das kann im Formular (über eine Abfrage) oder im Ausdruck (über einen Bericht) sein.

Der Code, um den vorhergehenden Datensatz mit SQL aufzurufen, ist so etwas wie

Code: Alles auswählen

SELECT "Tabelle".* FROM "Tabelle" WHERE "ID" = (SELECT MAX("ID") FROM "Tabelle" WHERE "ID" < 37)
... für den Datensatz, der der ID 37 vorausgeht.

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

ogan
Beiträge: 20
Registriert: Mi 15. Jul 2020, 11:31

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von ogan » Fr 14. Aug 2020, 10:03

Hallo Robert
Danke für deine Antwort.

>Wenn es sich bei dem ganzen um Berechnungen handelt, dann werden die nirgendwo
>gespeichert. Die werden gemacht, wenn Du aktuell die entsprechenden Werte sehen willst.
>Das kann im Formular (über eine Abfrage) oder im Ausdruck (über einen Bericht) sein.
Was ist wenn ich die Berechnungen per Makro mache ? Oder sonst wie kann ich in einem Formular die Felder zur Eingabe in der Datenbank und die berechnete Felder über eine Abfrage kombinieren ? Das Formular hat ja nur eine Datenquelle entweder Tabelle oder Abfrage. Geht das nur wenn ich anstelle eine Tabelle eine editierbare Abfrage verwende und alles damit mache ?

Danke für die SQL Query jetzt ist es klarer. Ich habe aber dann nicht eine fixe ID wie 37 sondern die ID vom aktuellen Datensatz. Wie kann ich programmatisch die ID vom aktuellen Datensatz ermitteln so dass ich es im SQL eingeben kann ?

Gruss
Ogan

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von RobertG » Fr 14. Aug 2020, 17:48

Hallo Ogan,

mit einer Abfrage kannst Du immer nur dann etwas Berechnetes anzeigen, wenn Der Datensatz bereits abgespeichert ist. Während der Eingabe eines neuen Datensatzes geht das nicht. Die beste Übersicht für so eine Abfrage auch direkt nach der Eingabe bietet das Tabellenkontrollfeld. Da siehst Du dann, was gerade eben eingegeben wurde.

Du kannst auch bei der gleichen Formularoberfläche mehrere Datenquellen in eigenständigen Formularen unterbringen. Dann erscheint z.B. die Berechnung aus der Abfrage in einem Teil der Formularoberfläche und die Daten, die Du aktuelle bearbeitest, in einem anderen Teil. Speicherst Du die aktuellen Daten, so musst Du nur die Daten bei der Abfrage aktualisieren.

Wie Berechnungen per Makro im aktuellen Datensatz erfolgen habe ich im Handbuch beschrieben - aktuelles Handbuch S. 474. Da ist eine entsprechende Beispieldatenbank auch dabei.

Die ID vom aktuellen Datensatz kann per Makro auf die folgende Art ermittelt werden:

Code: Alles auswählen

stID = oForm.getString(oForm.findColumn("ID"))
Das geht von einem Feld in der Datenquelle aus, das den Namen "ID" hat. Ich mache das hier über getString. Der allgemeine Befehl geht immer. Dann kann ich auch stID als String vorher definieren. Das ist für mich manchmal günstiger, da sonst bei einer leeren ID und einer Definition z.B. als Integer der Wert der Variable nicht leer sondern 0 ist.
Du kannst aber auch die ganze Abfrage so laufen lassen, dass Du alles innerhalb einer Abfrage sehen kannst:

Code: Alles auswählen

SELECT "a".*, 
(SELECT "Feld" FROM "Tabelle" WHERE "ID" = (SELECT MAX("ID") FROM "Tabelle" WHERE "ID" < "a"."ID")) 
AS "Feld_vorher" FROM "Tabelle" AS "a"
Alle Datensätze der Tabelle "Tabelle" werden angezeigt. Mit der korrelierenden Unterabfrage wird außerdem in dem aktuellen Datensatz das angezeigt, was in dem Feld "Feld" im 'vorhergehenden' Datensatz gespeichert wurde.


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

ogan
Beiträge: 20
Registriert: Mi 15. Jul 2020, 11:31

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von ogan » Mo 17. Aug 2020, 11:18

Hallo Robert

Vielen Dank, die Codebeispiele helfen mir sehr.

Die ersten 2 Abschnitte deiner Antwort verstehe ich nicht so gut. Ich will ja Daten eingeben und im gleichen Datensatz auch andere einige Felder berechnen. Habe dazu ein kleines Beispiel gemacht dass nicht so richtig funktioniert. Ich würde das gerne hier anhängen. Aber wenn ich die odb Datei rüberziehe sagt er ungültige Dateierweiterung. Wenn ich es über Dateianhänge unten versuche zeigt er mir die Datei nicht zur Auswahl an. Wie kann ich hier eine odb Datei anhängen ? Ich habe schon Beiträge gesehen mit einem odb Anhang, es sollte also gehen.

Gruss
Ogan

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Daten aus dem davor liegendem Datensatz holen

Beitrag von RobertG » Mo 17. Aug 2020, 16:17

Hallo Ogan,

das *.odb-Format wird hier als fremdes Format betrachtet und nicht übernommen. Du kannst die Datei einfdach noch einmal mit *.zip packen. Und wenn Du kein Packprogramm hast, dann auch nur die Endung mit entsprechendem Hinweis auf *.zip verändern. Das funktioniert hier.

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

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten