开箱即用并不容易。Infopath 具有将日期添加到日期的功能。运行仅在您的选择器字段等于值“天”时触发的规则。让规则设置目标日期的值
规则1:
addDays(StartDate, IncrementValue)
那很容易。
通过提取年份来增加年份也很容易。在内部,日期以 YYYY-MM-DD 格式存储,因此您可以使用 substring-before() 提取年份,使用破折号作为分隔符。增加该数字,然后使用 concat() 函数将该新年份值与开始日期的其余部分组合,即使用破折号的 substring-after()。创建一个仅在选择器字段具有值“年”时触发的规则,并将目标日期设置为
规则 2
concat(substring-before(StartDate, "-") + IncrementValue, "-", substring-after(StartDate, "-"))
真正复杂的地方是月份。使用提取月份的相同原理,将其递增并将其拼接回日期并不困难。月份需要有一个前导零,但对于有效的日期条目。这可以通过在月份加上 100 然后只抓取最后两位数来实现。只要新日期不跨越到明年,这种方法就会奏效。
规则 3
concat(substring-before(StartDate, "-"), "-", substring-after(substring-before(substring-after(StartDate, "-"), "-") + 100 + IncrementValue, "1"), "-", substring-after(substring-after(StartDate, "-"), "-"))
如果新日期在下一年,则此公式将导致错误。因此,您需要创建存储月份值的辅助字段,如果计算的月份大于 12,则增加年份并相应地调整月份值。
使用以下规则设置月份帮助字段:
substring-before(substring-after(StartDate, "-"), "-") + IncrementValue
然后使用此规则设置目标日期,如果月份助手大于 12,则会触发该规则:
concat(substring-before(StartDate, "-") + 1, "-", substring-after(MonthHelper - 12 + 100, "1"), "-", substring-after(substring-after(StartDate, "-"), "-"))
如果月份助手小于 13,则运行上面的规则 3
真正困难的问题是月份有不同的长度。如果使用此技术将一个月添加到 2013-01-31,则结果将是无效的日期字符串 2013-02-31。此外,闰年也需要考虑在内。
根据您想要实现的目标,您可能希望每个月增加 30 天,改用 addDays() 函数。
如果您需要精确的月增量技术,您将需要另一组辅助单元来评估月/日组合并进行调整,或者您需要更优雅地执行日期增量的代码,但这不是我想要的可以帮忙。
Qdabra Software 的 qRules 等第三方工具可为 InfoPath 表单提供附加功能。qRules 包括日期函数,无需您编写代码即可完成您想做的事情。