0

現在、ユーザーがフィールドに特定の日付を入力する InfoPath のフォームに取り組んでいます。

次に、その年の残り日数を計算する数式が必要です。私も一日一日を大切にしたいと思っています。毎日の費用が 2 ドルで、入力された日付が 12 月 29 日であるとします。次に、関数が「価格:4 $」を返すようにします

4

1 に答える 1

1

XPath 2.0 には非常に多くの日付/時刻関数があります。

2012 年の最後の日から現在の日までの日数を取得するには、次を使用できます。

days-from-duration(date("2012-12-31") - current-date() )

ユーザーが入力した日付がある場合は、それ$user-dateを置き換えcurrent-date()$user-date、その年の最後の 12 月の日付オブジェクトを作成する必要があります。これは次のように行うことができます。

days-from-duration(date(concat(year-from-date($user-date), "-12-31")) - $user-date )

(またはが文字列のdate($user-date)場合は を使用)$user-date

最終的な価格文字列を取得するには、次を使用します。

concat("price: ", 2  *  days-from-duration(date(concat(year-from-date($user-date), "-12-31")) - $user-date ), "$")

XPath 1.0:

日付関数がなければ、これらすべてのばかげた計算を手動で行う必要があります。

各月から年末までの日数をマッピングするマップが必要です。その後、行うことができますMap[$month] - $day。(または、月から年初までの日をマッピングするマップを使用し、それを 365 から減算します。そのマップは既に転がっているので)

現在、XPath 1.0 にはマップがありませんが、文字列を使用してマップをシミュレートできます。

 365 - substring-before(substring-after( "1:00, 2:31, 3:59, 4:90, 5:120, 6:151, 7:181, 8:212, 9:243, 10:273, 11:304, 12:334, 13:365", concat($month, ":")), ",") - $day

これは、うるう年以外のすべての年で機能します。

うるう年の場合は、366 を使用し、2 月以降の各月に 1 を加算します。

 366 - substring-before(substring-after( "1:00, 2:31, 3:60, 4:91, 5:121, 6:152, 7:182, 8:213, 9:244, 10:274, 11:305, 12:335, 13:366", concat($month, ":")), ",") - $day

うるう年を検出するには、モジュロ計算を行うことができます。すべてのうるう年のマップを使用する方がおそらく簡単です。

concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ",")) * 1

その年が範囲内のうるう年である場合、これは 1 を返します。

次に、すべてをまとめます。

 ( 365 - substring-before(substring-after( "1:00, 2:31, 3:59, 4:90, 5:120, 6:151, 7:181, 8:212, 9:243, 10:273, 11:304, 12:334, 13:365", concat($month, ":")), ",") - $day)  * ( 1 - concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ",")) * 1)     +     (366 - substring-before(substring-after( "1:00, 2:31, 3:60, 4:91, 5:121, 6:152, 7:182, 8:213, 9:244, 10:274, 11:305, 12:335, 13:366", concat($month, ":")), ",") - $day) * concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ","))
于 2012-10-01T10:10:29.783 に答える