🙏 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!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Timestamp aktualisieren bei Änderung eines Records
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Timestamp aktualisieren bei Änderung eines Records
Hi!
Ich habe den Befehl gefunden
ALTER TABLE "Table1" ALTER COLUMN "TimeStamp" SET DEFAULT CURRENT_TIMESTAMP;
um bei Änderungen eines Records den Timestamp neu setzen zu lassen. Dieser Befehl wird über Extras/SQL einmalig ausgeführt.
Nur bleibt bei mir der Timestamp immer gleich...
Ich ruf meine Records über ein Formular auf und ändere dort bei Bedarf die Inhalte. Beim Speichern sollte der Timestamp eben aktualisiert werden...
Hab ich was vergessen?
[edit]
Ich hab jetzt bei der Abfrage ein
... now() AS "Timestamp"...
eingebaut. Mir wird im Formular korrekt der aktuelle Timestamp angezeigt, aber gespeichert wird der wieder nicht... :-/
lg scientific
Ich habe den Befehl gefunden
ALTER TABLE "Table1" ALTER COLUMN "TimeStamp" SET DEFAULT CURRENT_TIMESTAMP;
um bei Änderungen eines Records den Timestamp neu setzen zu lassen. Dieser Befehl wird über Extras/SQL einmalig ausgeführt.
Nur bleibt bei mir der Timestamp immer gleich...
Ich ruf meine Records über ein Formular auf und ändere dort bei Bedarf die Inhalte. Beim Speichern sollte der Timestamp eben aktualisiert werden...
Hab ich was vergessen?
[edit]
Ich hab jetzt bei der Abfrage ein
... now() AS "Timestamp"...
eingebaut. Mir wird im Formular korrekt der aktuelle Timestamp angezeigt, aber gespeichert wird der wieder nicht... :-/
lg scientific
Re: Timestamp aktualisieren bei Änderung eines Records
hallo scientific,
Willst Du die Abspeicherungszeit bei einer Änderung in dem Feld mit speichern, so musst Du diese Änderung per Makro vornehmen. Per Makro, weil es sich ja um ein Ereignis handelt, dass gleichzeitig genau zu diesem Zeitpunkt eintreten soll.
Ich habe da einmal ein Beispiel angehängt. Der Zeitstempel wird bei Drücken des Buttons im Formular per Makro neu gesetzt. Wenn Du die Eingabe im Formular wählst, dann kannst Du Dir den Default-Zeitstempel gegebenenfalls sparen. Du könntest jetzt das Makro mit dem Abspeichern des Datensatzes verbinden: Formulareigenschaften → Ereignisse → vor der Datensatzaktion.
Gruß
Robert
Der Einsatzzweck ist falsch. Es handelt sich um den Defaultwert, der eingesetzt wird, wenn das Feld leer geblieben ist. Mit dem Default-Timestamp kannst Du nicht die momentane Zeit der Änderung eines Datensatzes aufzeichnen, sondern nur die Erstellungszeit.scientific hat geschrieben: ALTER TABLE "Table1" ALTER COLUMN "TimeStamp" SET DEFAULT CURRENT_TIMESTAMP;
um bei Änderungen eines Records den Timestamp neu setzen zu lassen. Dieser Befehl wird über Extras/SQL einmalig ausgeführt.
Willst Du die Abspeicherungszeit bei einer Änderung in dem Feld mit speichern, so musst Du diese Änderung per Makro vornehmen. Per Makro, weil es sich ja um ein Ereignis handelt, dass gleichzeitig genau zu diesem Zeitpunkt eintreten soll.
Ich habe da einmal ein Beispiel angehängt. Der Zeitstempel wird bei Drücken des Buttons im Formular per Makro neu gesetzt. Wenn Du die Eingabe im Formular wählst, dann kannst Du Dir den Default-Zeitstempel gegebenenfalls sparen. Du könntest jetzt das Makro mit dem Abspeichern des Datensatzes verbinden: Formulareigenschaften → Ereignisse → vor der Datensatzaktion.
Gruß
Robert
- Dateianhänge
-
- Beispiel_Defaultzeit.odb.zip
- Zeitstempel neu setzen mit Makro
- (10.94 KiB) 458-mal heruntergeladen
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Timestamp aktualisieren bei Änderung eines Records
Hi, vielen Dank für dein Beispiel.
Leider bin ich grad dabei, mich in Base einzuarbeiten...
Ich habe hier kein Tabellenkontrollfeld sondern ein Datumsfeld und ein Zeitfeld.
Wie spreche ich diese beiden Felder an? Mit dem Tabellenkontrollfeld und dem Index, das ist mir irgendwie klar... auch der Hinweis, dass andere Felder direkt angesprochen werden müssen...
Hab das in Unkenntnis einmal so abgewandelt und ausprobiert, aber das ändert den Timestamp nicht...:
(Ausschnitt, hab dein Beispiel abgewandelt!!!)
Sorry für meine Anfängerfragen, ich bin noch ganz neu in Libreoffice und seinen Makros. VBA programmiere ich schon lange, aber das Basic in Libreoffice ist mir noch ganz neu... :-/
Konkret hänge ich gerade dabei, was mit
gemeint sein könnte. Ich finde in deinem Formular nirgends ein Element, das "Formular" heißt, geschweige denn das Formular selber heißt so... Was ist das für ein Element?
lg scientific
Leider bin ich grad dabei, mich in Base einzuarbeiten...
Ich habe hier kein Tabellenkontrollfeld sondern ein Datumsfeld und ein Zeitfeld.
Wie spreche ich diese beiden Felder an? Mit dem Tabellenkontrollfeld und dem Index, das ist mir irgendwie klar... auch der Hinweis, dass andere Felder direkt angesprochen werden müssen...
Hab das in Unkenntnis einmal so abgewandelt und ausprobiert, aber das ändert den Timestamp nicht...:
(Ausschnitt, hab dein Beispiel abgewandelt!!!)
Code: Alles auswählen
DIM unoDate AS NEW com.sun.star.util.Dat
DIM unoTime AS NEW com.sun.star.util.Time
Dim daJetzt AS DATE
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Formular")
oDatum=oForm.getByName("Datumsfeld 1") 'Beispiel Tabellenkontrollfeld - daher nachher getByIndex. Sonst direkt das Datumsfeld oder Zeitfeld ansteuern.
oZeit=oForm.getByName("Zeitfeld 1") 'Beispiel Tabellenkontrollfeld - daher nachher getByIndex. Sonst direkt das Datumsfeld oder Zeitfeld ansteuern.
daJetzt = Now()
WITH unoDate
.Day = Day(daJetzt)
.Month = Month(daJetzt)
.Year = Year(daJetzt)
END WITH
daJetzt = Now()
WITH unoTime
.HundredthSeconds = 0
.Seconds = Second(daJetzt)
.Minutes = Minute(daJetzt)
.Hours = Hour(daJetzt)
END WITH
' oFeld.getByIndex(2).BoundField.updateTimeStamp(unoDateTime)
oDatum.BoundField.updateTimeStamp(unoDate)
oZeit.BoundField.updateTimeStamp(unoTime)
Konkret hänge ich gerade dabei, was mit
Code: Alles auswählen
oForm = oDrawpage.forms.getByName("Formular")
lg scientific
Re: Timestamp aktualisieren bei Änderung eines Records
Hallo scientific,
zuerst öffne einmal Dein Formular zum Bearbeiten. Suche den Formularnaviagtor auf. Dort siehst Du die Struktur Deines Formulars. Bei meinem Beispiel heißt das Formular "Formular". Bei Leuten, die das direkt durch den Assistenten erstellt haben, heißt das "MainForm". In diesem Formular liegen Felder, bei Dir also auch "Datumsfeld 1".
Du erreichst also dieses Datumsfeld über den Weg des Formulares. Und den Namen Deines Formulares musst Du nutzen.
Wenn Du ein Timestamp-Feld in Deiner Tabelle hast, dann wird beim Formular dafür ein Datums und ein Zeitfeld benötigt. Beide sind aber mit dem gleichen Feld verbunden. Du musst also nur oDatum.BoundField.updateTimeStamp(unoDateTime) ausführen. Das ändert den Wert für das Tabellenfeld und schlägt sich dann in beiden Feldern des Formulars nieder.
Hast Du hingegen in Deiner Tabelle ein Zeitfeld und ein Datumsfeld separat, dann musst Du auch entsprechend separat das jeweilige Feld mit einem Update versehen:
oDatum.BoundField.updateDate(unoDate)
oZeit.BoundField.updateTime(unoTime)
Gruß
Robert
zuerst öffne einmal Dein Formular zum Bearbeiten. Suche den Formularnaviagtor auf. Dort siehst Du die Struktur Deines Formulars. Bei meinem Beispiel heißt das Formular "Formular". Bei Leuten, die das direkt durch den Assistenten erstellt haben, heißt das "MainForm". In diesem Formular liegen Felder, bei Dir also auch "Datumsfeld 1".
Du erreichst also dieses Datumsfeld über den Weg des Formulares. Und den Namen Deines Formulares musst Du nutzen.
Wenn Du ein Timestamp-Feld in Deiner Tabelle hast, dann wird beim Formular dafür ein Datums und ein Zeitfeld benötigt. Beide sind aber mit dem gleichen Feld verbunden. Du musst also nur oDatum.BoundField.updateTimeStamp(unoDateTime) ausführen. Das ändert den Wert für das Tabellenfeld und schlägt sich dann in beiden Feldern des Formulars nieder.
Hast Du hingegen in Deiner Tabelle ein Zeitfeld und ein Datumsfeld separat, dann musst Du auch entsprechend separat das jeweilige Feld mit einem Update versehen:
oDatum.BoundField.updateDate(unoDate)
oZeit.BoundField.updateTime(unoTime)
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Timestamp aktualisieren bei Änderung eines Records
Das hab ich mittlerweile rausgefunden.
Und ich hab jetzt die Zeilen entsprechend angepasst ("MainForm" ist der Name des Formulars).
Jetzt liefert die Zeile einen Absturz von Libreoffice mit folgender Fehlermeldung:
Das in der Fehlermeldung erwähnte Log ist im Anhang.
Die Version von Libreoffice ist:
LibreOffice 3.5.4.2
Build-ID: 350m1(Build:2)
Die Java-Version ist im Logfile ersichtlich.
:-/
Konkret schaut das Macro jetzt so aus:
Und ich hab jetzt die Zeilen entsprechend angepasst ("MainForm" ist der Name des Formulars).
Jetzt liefert die Zeile einen Absturz von Libreoffice mit folgender Fehlermeldung:
Code: Alles auswählen
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f723b7ab70a, pid=11512, tid=140127807248128
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libuno_cppu.so.3+0x1d70a] uno_type_any_construct+0x3a
#
# An error report file with more information is saved as:
# /home/jakob/hs_err_pid11512.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
[error occurred during error reporting , id 0xb]
Die Version von Libreoffice ist:
LibreOffice 3.5.4.2
Build-ID: 350m1(Build:2)
Die Java-Version ist im Logfile ersichtlich.
:-/
Konkret schaut das Macro jetzt so aus:
Code: Alles auswählen
SUB Zeitstempel_neu
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
' DIM oFeld AS OBJECT
DIM oDatum AS OBJECT
DIM oZeit AS OBJECT
' DIM unoDateTime AS NEW com.sun.star.util.DateTime
DIM unoDate AS NEW com.sun.star.util.Date
DIM unoTime AS NEW com.sun.star.util.Time
Dim daJetztD AS DATE
Dim daJetztT AS DATE
daJetztD = Now()
WITH unoDate
.Day = Day(daJetztD)
.Month = Month(daJetztD)
.Year = Year(daJetztD)
END WITH
daJetztT = Now()
WITH unoTime
.HundredthSeconds = 0
.Seconds = Second(daJetztT)
.Minutes = Minute(daJetztT)
.Hours = Hour(daJetztT)
END WITH
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oDatum=oForm.getByName("Datumsfeld 1")
oZeit=oForm.getByName("Zeitfeld 1")
oDatum.BoundField.updateDate(unoDate)
oZeit.BoundField.updateTime(unoTime)
END SUB
- Dateianhänge
-
- hs_err_pid11512.log.gz
- (18.45 KiB) 344-mal heruntergeladen
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Timestamp aktualisieren bei Änderung eines Records
Vielen Dank für deine Hinweise.
SO funktioniert es jetzt.
Zeit UND Datum werden geupdated.
Ich hab ein Timestamp-Feld in der Tabelle und ein Datums- sowie ein Zeitkontrollfeld im Formular.
Gibt es auch noch eine Möglichkeit, den Timestamp zu updaten, wenn im Formular KEINE Felder für Datum und Uhrzeit vorhanden sind?
lg scientific
SO funktioniert es jetzt.
Code: Alles auswählen
SUB Zeitstempel_neu
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oFeld AS OBJECT
DIM unoDateTime AS NEW com.sun.star.util.DateTime
Dim daJetzt AS DATE
daJetzt = Now()
WITH unoDateTime
.HundredthSeconds = 0
.Seconds = Second(daJetzt)
.Minutes = Minute(daJetzt)
.Hours = Hour(daJetzt)
.Day = Day(daJetzt)
.Month = Month(daJetzt)
.Year = Year(daJetzt)
END WITH
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oDatum=oForm.getByName("Timestamp_Datum")
oDatum.BoundField.updateTimeStamp(unoDateTime)
END SUB
Ich hab ein Timestamp-Feld in der Tabelle und ein Datums- sowie ein Zeitkontrollfeld im Formular.
Gibt es auch noch eine Möglichkeit, den Timestamp zu updaten, wenn im Formular KEINE Felder für Datum und Uhrzeit vorhanden sind?
lg scientific
Re: Timestamp aktualisieren bei Änderung eines Records
Hallo scientific,
Dann könntest Du noch den aktuellen Datensatz aus dem Formular bestimmen, die Datenquelle natürlich auch und das entsprechenden Feld ansteuern. Das geht dann direkt über SQL.
Sicher gibt es nach makrofindige Leute, die auch noch andere Wege beschreiten.
Gruß
Robert
Zuerst einmal die einfache trial- and error-Variante: Das Timestamp-Feld aus dem Formular aus der Tabulatorreihenfolge raus nehmen und auf unsichtbar schalten.scientific hat geschrieben: Gibt es auch noch eine Möglichkeit, den Timestamp zu updaten, wenn im Formular KEINE Felder für Datum und Uhrzeit vorhanden sind?
Dann könntest Du noch den aktuellen Datensatz aus dem Formular bestimmen, die Datenquelle natürlich auch und das entsprechenden Feld ansteuern. Das geht dann direkt über SQL.
Sicher gibt es nach makrofindige Leute, die auch noch andere Wege beschreiten.
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: Timestamp aktualisieren bei Änderung eines Records
Vielen Dank auch für die Anregung! Grundsätzlich wären ja auch Trigger in der Datenbank eine Lösung, aber wenn man selber Kontrolle darüber möchte, welcher Änderung man einen Timestamp zuerkennen möchte und welcher nicht, ist ein Button doch besser.
Mittlerweile (LibreOffice 4.2.4) ist der Struct unoDateTime wohl etwas anders definiert, jetzt funktioniert jedenfalls:
' ...
With unoDateTime
.NanoSeconds = 0
.Seconds = Second(datJetzt)
.Minutes = Minute(datJetzt)
.Hours = Hour(datJetzt)
.Day = Day(datJetzt)
.Month = Month(datJetzt)
.Year = Year(datJetzt)
.IsUTC=false
End With
' ...
Mittlerweile (LibreOffice 4.2.4) ist der Struct unoDateTime wohl etwas anders definiert, jetzt funktioniert jedenfalls:
' ...
With unoDateTime
.NanoSeconds = 0
.Seconds = Second(datJetzt)
.Minutes = Minute(datJetzt)
.Hours = Hour(datJetzt)
.Day = Day(datJetzt)
.Month = Month(datJetzt)
.Year = Year(datJetzt)
.IsUTC=false
End With
' ...
Re: Timestamp aktualisieren bei Änderung eines Records
Hallo devdol,
Du hast Recht, irgendwann muss da eine Änderung in dem Struct vollzogen worden sein. Bereits bei der 4.1 läuft die Anweisung nicht, wenn Du irgendetwas bei HundrethSeconds etwas einzugeben versuchst. Ich habe gerade so eine Datenbank gehabt, bei der ich zuerst vergeblich versucht habe, Minuten:Sekunden,Hundertstelsekunden einzugeben. Über SQL bekam ich das in einem Timestamp-Feld hin, nicht aber vom Formular aus, ohne dass ich in dem formatierten Feld gleichzeitig auch das gesamte Datum mit anzeigte - das mich ja gar nicht interessierte. Mit den NanoSeconds kam ich dann zum Erfolg. Die müssen aber schon länger drin sein, denn in der API steht lediglich ab 4.1 isUTC neu drin: http://api.libreoffice.org/docs/idl/ref ... eTime.html
Gruß
Robert
Du hast Recht, irgendwann muss da eine Änderung in dem Struct vollzogen worden sein. Bereits bei der 4.1 läuft die Anweisung nicht, wenn Du irgendetwas bei HundrethSeconds etwas einzugeben versuchst. Ich habe gerade so eine Datenbank gehabt, bei der ich zuerst vergeblich versucht habe, Minuten:Sekunden,Hundertstelsekunden einzugeben. Über SQL bekam ich das in einem Timestamp-Feld hin, nicht aber vom Formular aus, ohne dass ich in dem formatierten Feld gleichzeitig auch das gesamte Datum mit anzeigte - das mich ja gar nicht interessierte. Mit den NanoSeconds kam ich dann zum Erfolg. Die müssen aber schon länger drin sein, denn in der API steht lediglich ab 4.1 isUTC neu drin: http://api.libreoffice.org/docs/idl/ref ... eTime.html
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
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 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.