Relation fest auf vorhergehenden Datensatz in base

Hallo!
Ich habe (unter anderen;)) folgendes Problem:
Ich habe eine kleine Datenbank erstellt, die ich als Fahrtenbuch nutzen will.
Soweit funktioniert alles nach meinen Wünschen. Nur zu einer Sache bin ich anscheinend zu doof.
In der Datenbank sollen alle Fahrten kontinuierlich erfasst werden. Zu jeder Fahrt gehört ein neuer Datensatz.
In ihm gibt es unter anderem die Felder “Start” und “Ankunft”.
Da alle Fahrten erfasst werden sollen, muss der Wert (Kilometerstand) in “Start” identisch sein mit dem Wert
in “Ankunft” des vorherigen Datensatzes. Also habe ich das Feld “Start” durch eine Relation mit “Ankunft” verbunden was soweit auch funktioniert. Allerdings gelingt es mir nicht, die Relation so anzulegen, dass immer automatisch und fest der Wert aus dem letzten vorhergehenden Datensatz eingelesen wird. WIE GEHT DAS?

Eine Relation sagt, salopp ausgedrückt, nur, dass Datensätze mit dem gleichen Wert in diesem Feld “zusammengehören”, deswegen hört man auch ab und an den Begriff “Übereinstimmungsfeld”.
Es gibt in Base aber die Möglichkeit von Variablen auf Tabellenebene, dort würde ich eher eine Lösungsmöglichkeit vermuten.
Also eine Variable KM-Stand anlegen, die beim Speichern eines Datensatzes befüllen und als Standardwert für das Datenfeld verwenden.
Ist irgendwo im Handbuch bei Feldfunktionenen beschrieben, glaube ich.

Moin! Nach meinem Kenntnisstand geht es nicht automatisch. Denn dann müsste ja immer klar sein, auf welchen Datensatz sich die Relation bezieht. Was tun? Ich denke, du hast wohl scon den richtigen Weg gewählt, indem du Relationen angelegt hast. Leider musst du aber immer händisch den letzten Datensatz aufrufen.
Ich werde aber noch mal einen anderen Weg testen: mit dem Anlegen einer Variablen könnte das zu machen sein - da war @neugierig einige Sekunden schneller als ich…

Danke, Ihr Lieben!
Die Idee mit der Variablen hatte ich auch, hab sie aber nicht richtig verfolgt. Der Gedanke, dass die Variable schon vor dem Speichern als “Start” eingelesen wird ist bestechend und auch einfach als Rechenbefehl anzulegen. (als Beispiel: + KMstand) Das wäre wohl auch der elegantere Weg.
Aber dann.
Beim Anlegen der Variablen ist ihr ein Wert zuzuordnen. Mit einer festen Zahl als Wert ist das kein Problem und dann erscheint dieser Wert auch sofort automatisch bei Anlegen eines neuen Datensatzes im Feld “Start”. Aber wie sag ich, dass der Wert der Variablen gleich dem letzten Wert in “Ankunft” sein soll? (Z.B. der Versuch als Wert einzugeben: LET KMstand = Ankunft, schreibt mir dann den Text LET KMstand = Ankunft in das Feld “Start”.) Hätte ich nur mal Informatik studiert.
Anscheinend hat sich das Problem lediglich verlagert.
Ach! In einer Tabellenkalkulation wär das ganz einfach, aber wenn einen erstmal der Ehrgeiz gepackt hat …

Nächtliche Grüße von der Küste! Hajo

1 „Gefällt mir“

Hallo!.
Fahrtenbuch, lückenlos war auch mal meine Intension. Bekomme es aber auch nicht hin. Ich denke wir lassen uns von “Tabellenkalkulation” verwirren, da haben Felder ein-eindeutige Bezeichnungen auf die man rückwärts referenzieren kann.
Ein KMstand ist in Papyrus ja dann mehrfach vorhanden, und das System weiß nicht welches es nehmen soll. Wir Menschen wissen es, da wir eine sortierte Ansicht haben, in der wir voraussetzen das der “vorherige” Datensatz z. B. der des jüngsten Datums ist. Aber wie sagen wir es unserem Papyrus?
Ob Herr Ramps mitliest?
Kann man das mit dem jüngsten Datum codieren/programmieren?

Ich könnte die Funktion auch sehr gut nicht nur für das Fahrtenbuch, sondern auch für die Tankbelege gebrauchen.
Wäre also mal cool da eine Lösung zu haben.

Moin falcotec,
es ist für mich nicht klar, auf was du deine Frage beziehst. Selbstverständlich haben Felder in der BASE-Datenbank eindeutige Bezeichnungen, sonst ginge das ja auch nicht.
Wenn du etwas wie eine Tabellenkalkulation suchst, dann gibt es das in PA natürlich auch. Die musst du in einem normalen Dokument anlegen (siehe 'Einfügen → Tabelle). Dann kannst du jeder Zelle einen individuellen Namen zuweisen.

Was meinst du damit? Mit sysdate() bekommst du immer das aktuelle Datum.

1 „Gefällt mir“

Auch hierfür würde ich dir eine Tabelle in einem PA-Dokument empfehlen.

1 „Gefällt mir“

Was der OP von Hajo doch meint ist, er möchte aus dem letzten Eintrag in seine DB aus einem Bestimmten Feld etwas in den neuen Datensatz einlesen. Mach einfach mal ein Fahrtenbuch als App auf dem Handy auf, dann siehst du, dass der KM Stand schon eingetragen ist, da er aus dem “letzten” Datensatz geholt wurde. Aber was ist der letzte Datensatz in der Datenbank für das Feld mit dem Namen “KMstand”?
Und wenn jedes Feld ein-eindeutig ist, wie ist dann in einer Ansicht der Fahrtenbuch-Einträge das 12. Feld mit dem KM Stand von vor drei Wochen?
Ich denke das ist eine versteckte Funktion/Nummerierung, so wie in PB jeder Datensatz eindeutig einen Bezeichner hat, den wir aber nicht sehen können, zumindest ich wüsste nicht wie.

Will ich aber nicht, will eine Datenbank mit Reports!

Schiebe mal ganz links die Spalte auf, die sich dort versteckt, da sind die Nummern der Datensätze zu sehen.

1 „Gefällt mir“

Nach meinen derzeitigen Überlegungen ist das in BASE so nicht programmierbar. - Ich überlege aber noch mal.

Ein Fahrtenbuch ist eher eine Tabelle im Sinne einer Tabellenkalkulation als eine Datenbank-Tabelle. Eben wegen der Bezüge zu “vorhergehenden” Einträgen, die man in einer Datenbanktabelle nur über Hilfskonstruktionen erreicht (z.B. automatische laufende Nummerierung der Datensätze beim Anlegen).

In einer Kalkulationstabelle dagegen verweist man einfach auf den Wert in der Zeile darüber und gut.

Sprich, in Papyrus würde ich dazu einfach ’ne Tabelle anlegen.

1 „Gefällt mir“

Tja, @AndreasE, das habe ich ihm auch schon vorgeschlagen, da das auf der Hand liegt.
Aber …

1 „Gefällt mir“

… zudem kann man ja die Papyrustabelle als CSV exportieren, dann in Papyrus-Base importieren und damit die gewünschten Reports erstellen …

1 „Gefällt mir“

Oh je! Erst einmal vielen Dank an alle, die sich um die Lösung des Problems Gedanken gemacht haben oder sogar noch nachdenken.
Natürlich, und das ist mir lange klar (siehe meinen Post vom 28.03.2020), dass es in einer Tabellenkalkulation ganz einfach wäre. Noch einfacher wäre es, sich ein Fahrtenbuch als APP zu holen oder ein vorgedrucktes Heftchen im gut sortierten Papier-Fachhandel zu kaufen.
Aber in einer selbst erstellten Datenbank könnte jeder Datensatz umfangreiche Felder enthalten, die dann ja mit diesem Datensatz verknüpft wären. Also z.B. Grund der Fahrt, Ergebnis einer Besprechung und Teilnehmer. Und all das könnte mit passenden Reports wiedergegeben werden.
Deshalb in einer Datenbank und nicht in einer Tabelle.

Ich könnte mir folgendes vorstellen:
Einen Report anlegen, der automatisch beim Anklicken die Variable letzterKMStand mit dem KMStand der Ankunft befüllt. Wenn man dann den Datensatz durch das Klicken auf das Reporticon auslöst und das auf automatisch Ausführen gestellt hat, wird der Report ausgeführt (-> Einstellung: nur Rechnung ausführen … Datenblatt automatisch schließen). Wenn dann das Feld KMStart mit der Variable letzterKMStand vorbelegt ist, sollte es eigentlich so funktionieren, wie gedacht.
Ich habe das einmal in einer Beispieldatenbank getestet:

FahrtenbuchBeispiel.zip (2.25 KB)

1 „Gefällt mir“

Jede saubere Datenbank-Programmierung setzt eine ebenso saubere Indizierung jeden Datensatzes voraus! Das ist Grundlagen Datenbank-Programmierung.

Es ist also nur eine Frage der Kenntnis was zu tun ist. Natürlich geht das mit einer Tabelle genauso wie mit einer Datenbank.
Nur mit der Datenbank erfordert es deutlich mehr Kenntnisse vom Anwender. Und genau die kann ich keineswegs von einem Autor erwarten. Da sind schon einige Fachkenntnisse erforderlich.

Ps ich habe u. A. Datenbanken & SQL unterrichtet

Gute Idee. Hast du das gemacht, ich meine: Könntest du die Reportvorlage auch beilegen?

– Nachtrag: Okay, ich hab’s auch. Funktioniert.

Fahrtenbuch_Reportvorl_Var_210829wa.pap (2.35 KB)

Ich auch. 15 Jahre lang.