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

Timestamp aktualisieren bei Änderung eines Records

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Timestamp aktualisieren bei Änderung eines Records

Beitrag von scientific » Fr 26. Apr 2013, 11:38

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

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

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von RobertG » Fr 26. Apr 2013, 15:48

hallo scientific,
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.
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.
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

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von scientific » Mo 29. Apr 2013, 11:21

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!!!)

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)
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

Code: Alles auswählen

oForm = oDrawpage.forms.getByName("Formular")
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

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

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von RobertG » Mo 29. Apr 2013, 12:33

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
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

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von scientific » Mo 29. Apr 2013, 12:55

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:

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]
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:

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

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von scientific » Mo 29. Apr 2013, 13:24

Vielen Dank für deine Hinweise.

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
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

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

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von RobertG » Mo 29. Apr 2013, 16:18

Hallo scientific,
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?
Zuerst einmal die einfache trial- and error-Variante: Das Timestamp-Feld aus dem Formular aus der Tabulatorreihenfolge raus nehmen und auf unsichtbar schalten.
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

devdol
Beiträge: 45
Registriert: Fr 11. Mär 2011, 17:59

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von devdol » Do 12. Jun 2014, 13:43

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
' ...

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

Re: Timestamp aktualisieren bei Änderung eines Records

Beitrag von RobertG » Do 12. Jun 2014, 17:01

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
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 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