Benötigen Sie das heutige Datum als Standardwert in einem Formularfeld in Libre Office

Benötigen Sie das heutige Datum als Standardwert in einem Formularfeld in Libre Office

Neu bei Libre Office Base.

Ich habe herausgefunden, wie man den Standardwert in einer Tabelle auf das aktuelle Datum setzt. Jetzt muss das aktuelle Datum im entsprechenden Feld in einem Formular angezeigt werden.

Ich habe versucht, in „Standardwert“ TODAY()und einzufügen CURRENT_DATE. Aus irgendeinem Grund geben sie mir beide den 18. November 1899.

Hat jemand eine Idee, wie das geht?

Antwort1

Dieses Makro schreibt das heutige Datum in das Datumsfeld myDateField:

Sub writeDate
    Dim today As New com.sun.star.util.Date
    today.Month = Month( Now )
    today.Day = Day( Now )
    today.Year = Year( Now )
    form = ThisComponent.DrawPage.Forms(0)  ' first form
    form.myDateField.BoundField.UpdateDate( today )
End Sub

So weisen Sie die Aktion zu: Formularnavigator > myForm > Formulareigenschaften > Ereignisse > zB Beim Laden

Antwort2

Verwenden Sie den folgenden Makrocode. Hier heißt die Spalte der Tabelle (nicht der Steuerelementname) „MyDate“.

Sub DefaultDateInForm (oEvent As Object)
    oForm = oEvent.Source
    lDateCol = oForm.findColumn("MyDate")
    If oForm.getString(lDateCol) = "" Then
        dateStamp = Format(Now, "YYYY-MM-DD")
        oForm.updateString(lDateCol, dateStamp)
    End If
End Sub

Bearbeiten Sie das Formular und weisen Sie in den Formulareigenschaften das Makro dem Ereignis „Nach Datensatzänderung“ zu.

Formulareigenschaften

Wenn nun das Datum eines Datensatzes leer ist, z. B. wenn ein neuer Datensatz begonnen wird, sollte das Datumsfeld standardmäßig das aktuelle Datum anzeigen.

Es gibt mehrere Diskussionen zu diesem Thema im OpenOffice-Forum:

Antwort3

AusJim Ks Antwort:

Ohne Makro kann das aktuelle Datum als Standardwert für die Tabelle definiert werden. Dieser wird dann beim Speichern eines neuen Datensatzes ohne Datum eingefügt.

  • Menü: Extras -> SQL ...
ALTER TABLE "tbl" ALTER COLUMN "col" DATE DEFAULT CURRENT_DATE

Ersetzen Sie "tbl" und "col" durch die tatsächlichen Namen der Tabelle und Spalte. [Ausführen]

Überprüft und funktioniert einwandfrei:

Bildbeschreibung hier eingeben

Antwort4

Und siehe da, ich hatte mein Problem kurz nach der Bitte um Hilfe gelöst.

Hier ist meine Lösung zum Festlegen eines Standardwerts aus einer Datenbankdatumsspalte in einem ungebundenen Datumssteuerelement. Ich bin sicher, dass es eine bessere Möglichkeit als die Verwendung von gibt oCol.String, und ich würde mich freuen, eine bessere Möglichkeit zu hören.

Sub Form_WhenLoading

' Default control dteDateFrom to SystemParam.DfltRptFrDate
'     and control dteDateTo   to SystemParam.DfltRptToDate

dim oForm as object
dim oControl as object
dim oResultSet as object
dim oContext as object
dim oDB as object
dim oStmt as object
dim sSQL as string
dim oCol as object          ' Column of oResultSet
Dim aDate As New com.sun.star.util.Date

oForm = ThisComponent.DrawPage.Forms.getByIndex(0)
oController = ThisComponent.CurrentController   
oContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDb = oContext.getByName("DatabaseName")
oConn = oDb.getConnection("","")
 
sSQL = "SELECT ""DfltRptFrDate"", ""DfltRptToDate"" from ""SystemParam"" WHERE ""SystemKey"" = '0';"

oStmt = oConn.createStatement()
oResultSet = oStmt.executeQuery(sSQL)

If Not IsNull(oResultSet) Then
    oResultSet.next
End If

' dteDateFrom
oCol = oResultSet.Columns.getByName("DfltRptFrDate")
oControl = oForm.GetByName("dteDateFrom")

' OCol.String is YYYY-MM-DD
aDate.year = left(oCol.String, 4)
aDate.month = mid(oCol.String, 6,2)
aDate.day = right(oCol.String, 2)
If IsEmpty(oControl.Date) Then 
    oControl.Date = aDate
    oControl.text = oCol.String
    oControl.Commit()
End If

' dteDateTo
oCol = oResultSet.Columns.getByName("DfltRptToDate")
oControl = oForm.GetByName("dteDateTo")
aDate.year = left(oCol.String, 4)
aDate.month = mid(oCol.String, 6,2)
aDate.day = right(oCol.String, 2)
If IsEmpty(oControl.Date) Then 
    oControl.Date = aDate
    oControl.text = oCol.String
    oControl.Commit()
End If

End sub

verwandte Informationen