Seite 1 von 3

[gelöst]Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: So 16. Jan 2022, 19:12
von malt14
Guten Tag,

für Writer und Calc fand ich im Internet ein Makro, mit welchem man über einen Tastaturbefehl an der jeweiligen Position einen Zeitstempel einfügen kann, Beispiel: 2022-01-16 19:11. Für Base bzw. Firebird konnte ich keines entdecken.
Ein solches über einen Tastaturbefehl ausführbares Makro für die Firebird Feldtypen würde das manuelle Eingeben eines Zeitstempels erübrigen.

Grüße
Malt

Version: 7.2.4.1 (x64) / LibreOffice Community
Build ID: 27d75539669ac387bb498e35313b970b7fe9c4f9
CPU threads: 6; OS: Windows 10.0 Build 19044; UI render: Skia/Raster; VCL: win
Locale: de-DE (de_DE); UI: de-DE
Calc: CL

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: So 16. Jan 2022, 21:07
von RobertG
Hallo Malt,

der übliche Weg ist es, so etwas nicht innerhalb eines Formulars oder Makros zu erledigen sondern mit den Tabellen. Geht in Firebird z.B. mit einem Trigger, aber natürlich nur bei einem Timestamp-Field:

Code: Alles auswählen

CREATE OR ALTER TRIGGER BEFORE_IN_UP_NAME FOR "Tabelle" 
 ACTIVE BEFORE UPDATE POSITION 0
 AS
 BEGIN
 NEW."Aenderungs_Stamp" = CURRENT_TIMESTAMP;
 END;
Den Default-Zeitstempel beim Insert eines neuen Datensatzes kannst Du genau so erstellen wie im Handbuch für die Änderung von Tabellen beschrieben.

Im Makro erzeugst Du so einen Zeitstempel über so etwas wie

Code: Alles auswählen

stTimestamp = Year(Now()) & "-" & Right("0" & Month(Now()),2)  & "-" & Right("0" & Day(Now()),2)  & "_" & Right("0" & Hour(Now()),2)  & ":" & Right("0" & Minute(Now()),2) & ":" & Right("0" & Second(Now()),2)
… nur ist das dann nicht der Zeitstempel des Abspeicherns. Nutze ich als Zeitstempel für Dokumente, die ich automatisch speichere.

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Mo 17. Jan 2022, 19:09
von malt14
Hallo Robert,

Dank für die Informationen.

In manchen Tabellen habe ich eine Kommentarspalte [Typ CLOB]. Dort trage ich zu verschiedenen Zeitpunkten Text ein. Um zu wissen, wann die unterschiedlichen Einträge erfolgten, muss ich einen Zeitstempel tippen. Es wäre bequemer und schneller das mit einem Tastaturbefehl (Makro?) zu erledigen.

Grüße
Malt

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Sa 22. Jan 2022, 13:11
von malt14
Guten Tag,

in einer Tabelle in einem CLOB Feld habe ich das Makro per Extras/Makro/Makro ausführen gestartet, ein Zeitstempel wird in das Feld nicht geschrieben.

Code: Alles auswählen

REM  *****  BASIC  *****
SUB Timestamp
stTimestamp = Year(Now()) & "-" & Right("0" & Month(Now()),2)  & "-" & Right("0" & Day(Now()),2)  & "_" & Right("0" & Hour(Now()),2)  & ":" & Right("0" & Minute(Now()),2) & ":" & Right("0" & Second(Now()),2)
END SUB
Grüße
Malt

Version: 7.2.4.1 (x64) / LibreOffice Community
Build ID: 27d75539669ac387bb498e35313b970b7fe9c4f9
CPU threads: 6; OS: Windows 10.0 Build 19044; UI render: Skia/Raster; VCL: win
Locale: de-DE (de_DE); UI: de-DE
Calc: CL

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Sa 22. Jan 2022, 15:49
von RobertG
Das Codestück erzeugt nur einen Zeitstempel, den Du Dir z.B. per

Code: Alles auswählen

msgbox stTimestamp
anschauen kannst. Das sagt nichts darüber aus, wie der Zeitstempel irgendwo in einen Text eingefügt werden kann.

Soll der Zeitstempel an das Ende eines Textes angefügt werden, der in eine Memo-Feld steht, dann könnte das mit einem Button im selben Formular wie das Memo-Feld so gehen:

Code: Alles auswählen

SUB Zeitstempel(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oMemoFeld = oForm.getByName("Memo")
stMemo	= oMemoFeld.Text
stTimestamp = Year(Now()) & "-" & Right("0" & Month(Now()),2)  & "-" & Right("0" & Day(Now()),2)  & "_" & Right("0" & Hour(Now()),2)  & ":" & Right("0" & Minute(Now()),2) & ":" & Right("0" & Second(Now()),2)
oMemoFeld.Text = stMemo & stTimestamp
END SUB
Gruß

Robert

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: So 30. Jan 2022, 18:27
von malt14
Guten Tag,

Danke für Deine Hilfe und Mühe, Robert.
Beim Ausführen des Makros erhalte ich eine Fehlermeldung. Das liegt wohl an meinen nicht vorhandenen Makro Kenntnissen.

Ich werde künftig versuchen, mich mit dem Zeitstempel zu beschäftigen und hier schreiben, falls ich Erfolg habe.

Grüße
Malt

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Mo 29. Mai 2023, 11:59
von malt14
Guten Tag,

Tabelle1 ,
timestampInText2023-05-29 111727.png
timestampInText2023-05-29 111727.png (59.54 KiB) 5010 mal betrachtet
das Makro Zeitstempel:

Code: Alles auswählen

REM  *****  BASIC  *****

SUB Zeitstempel(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oMemoFeld = oForm.getByName("btext")
stMemo	= oMemoFeld.Text
stTimestamp = Year(Now()) & "-" & Right("0" & Month(Now()),2)  & "-" & Right("0" & Day(Now()),2)  & "_" & Right("0" & Hour(Now()),2)  & ":" & Right("0" & Minute(Now()),2) & ":" & Right("0" & Second(Now()),2)
oMemoFeld.Text = stMemo & stTimestamp
END SUB
startete ich im CLOBfeld "btext" mit dem Button Zeitstempel.

Code: Alles auswählen

Meldung:
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Zeile markiert:

Code: Alles auswählen

SUB Zeitstempel(oEvent AS OBJECT)
Zeitstempel-2023-05-29 113126.png
Zeitstempel-2023-05-29 113126.png (41.13 KiB) 5010 mal betrachtet
Ich versuchte auch das Makro WriteTimestampToClobField, geschrieben von Bing chat:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub WriteTimestampToClobField
    Dim oForm As Object
    Dim oField As Object
    Dim oTable As Object
    Dim oColumn As Object
    Dim oRowSet As Object
    Dim oRow As Object
    Dim sTimestamp As String

    ' Get the form and its controls.
    oForm = ThisComponent.Drawpage.Forms.getByName("btextFormT")
    oField = oForm.getByName("btext")

    ' Get the table and its column.
    oTable = ThisDatabaseDocument.CurrentController.ActiveConnection.getMetaData().getTables(Nothing, Nothing, "Tabelle1", False)
    oColumn = oTable.getColumns().getByName("btext")

    ' Get the row set and its row.
    oRowSet = ThisComponent.DatabaseDocument.DataSource.query("SELECT * FROM Tabelle1")
    oRowSet.last()
    oRow = oRowSet.getRow()

    ' Write the timestamp to the CLOB field.
    sTimestamp = Format(Now(), "ddd-yyyy-mm-dd_hh-nn")
    oRow.updateClob(oColumn.Name, sTimestamp)
End Sub
gestartet im CLOBfeld "btext" mit dem Button Zeitstempel.

Meldung:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Zeile markiert:

Code: Alles auswählen

oTable = ThisDatabaseDocument.CurrentController.ActiveConnection.getMetaData().getTables(Nothing, Nothing, "Tabelle1", False)
WriteTimestampToClobField-2023-05-29 113315.png
WriteTimestampToClobField-2023-05-29 113315.png (82.51 KiB) 5010 mal betrachtet

falls man:

Code: Alles auswählen

ThisDatabaseDocument.
durch:

Code: Alles auswählen

ThisComponent.DatabaseDocument.
ersetzt.
Meldung:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: DatabaseDocument.
Was verursacht die Laufzeitfehler?


Grüße
Malt

Version: 7.5.2.2 (X86_64) /
OS: Windows 10.0 Build 22621

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Mo 29. Mai 2023, 15:58
von RobertG
Hallo Malt,

wo liegen denn die Makros, die Du ausführst? Meist liegt es daran, dass die Makros nicht in der Datenbankdatei sondern in "Meine Makros" abgelegt werden. Und da ist ThisComponent nicht die Datenbankdatei sondern wohl das Eingangsfenster von LibreOffice, von dem aus die verschiedenen Komponenten gestartet werden.

Gruß

Robert

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Mo 29. Mai 2023, 19:17
von malt14
Hallo Robert,

die Makros liegen in der odb Datei.
Makros-2023-05-29 190411.png
Makros-2023-05-29 190411.png (65.54 KiB) 4988 mal betrachtet
Grüße
Malt

Re: Makro Zeitstempel Firebird Text, CLOB, Timestamp

Verfasst: Di 30. Mai 2023, 07:53
von RobertG
Hallo Malt,

vielleicht wäre es angebracht, die Datenbankdatei hier hoch zu laden. In der angezeigten Zeile sind allein schon die Einträge "Nothing", "Nothing" eher ein Hinweis darauf, dass da nichts stehen sollte. Denn so, wie das da in der Zeile steht, sollte "Nothing" eine Variable sein - mit der Basic nichts anfangen kann.

Ich sehe in Deinen Screenshots auch kein Formular, von dem aus Du die Makros startest. Zumindest das zum Zeitstempel sollte doch aus einem Formular heraus gestartet werden. Sonst ist doch das Formularfeld nicht auf zu finden.

Gruß

Robert