Libre Office のフォーム フィールドのデフォルト値として今日の日付が必要です

Libre Office のフォーム フィールドのデフォルト値として今日の日付が必要です

Libre Office Base の新機能。

テーブルのデフォルト値を現在の日付に設定する方法を見つけました。次に、フォームの対応するフィールドに現在の日付を表示する必要があります。

TODAY()「デフォルト値」とに挿入してみましたCURRENT_DATE。 どちらも何らかの理由で 1899 年 11 月 18 日を返します。

これを実行する方法について何かアイデアはありますか?

答え1

このマクロは、今日の日付を日付フィールドに書き込みます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

アクションを割り当てるには: フォームナビゲータ > myForm > フォームプロパティ > イベント > 例: 読み込み時

答え2

次のマクロ コードを使用します。ここでは、テーブルの列 (コントロール名ではありません) は「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

フォームを編集し、フォームのプロパティで、マクロを「レコード変更後」イベントに割り当てます。

フォームのプロパティ

これで、新しいレコードが開始されたときなど、レコードの日付が空の場合は、日付フィールドはデフォルトで現在の日付に設定されるようになります。

このトピックについては、OpenOffice フォーラムでいくつかの議論が行われています。

答え3

からジム・Kの回答:

マクロを使わずに、現在の日付をテーブルのデフォルト値として定義できます。日付が欠落している新しいレコードを保存すると、日付が挿入されます。

  • メニュー:ツール -> SQL...
ALTER TABLE "tbl" ALTER COLUMN "col" DATE DEFAULT CURRENT_DATE

「tbl」と「col」を実際のテーブル名と列名に置き換えます。[実行]

チェック済みで完璧に動作します:

ここに画像の説明を入力してください

答え4

ご存知のとおり、私は助けを求めてからすぐに問題を解決しました。

これは、データベースの日付列の既定値を非バインド日付コントロールに設定するための私のソリューションです。 を使用するよりも良い方法があるはずです。oCol.Stringより良い方法があれば教えてください。

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

関連情報