我有一个包含多个视图的Infopath 2007表单,用于在浏览器中使用。我无法在重复表中预先填充字段,从给定值开始,然后使用公式派生的默认值。
在Summary
视图中,我要求项目TotalCost
和当前会计年度的预计支出(CurrentFYSpend
):
+------------------------------+ | Project Summary | +------------------------------+ | Total Cost: $100,000 | -- TotalCost | Current FY Spend: $ 25,000 | -- CurrentFYSpend +------------------------------+在下一个(
Detail
)视图中,我有一个重复表FYSpending
,用户需要在任意数量的会计年度中突破项目的TotalCost
。 FYSpending
表格有一个YearlyCost
字段,用于保存该年度的估算支出。在重复表格下,我有RunningTotal
和Remaining
个字段。 RunningTotal
的默认值为sum(YearlyCost)
; Remaining
的默认值为TotalCost - sum(YearlyCost)
;他们一起向用户显示已经计算了总数的多少,以及他们还需要多少才能进入财政年度行。
当我们第一次进入Detail
视图时,YearlyCost
重复表第一行的FYSpending
字段应填充CurrentFYSpend
值:
+--------------------------------+ | Project Detail | +--------------------------------+ | Total Cost: $100,000 | <- TotalCost | | | Fiscal Year Spending: | | +---------------------------+ | <- FYSpending repeating table | | FY | Yearly Cost | | +---------------------------+ | <- FYSpending repeating table | | 2009 | $ 25,000 | | <- YearlyCost[1], from Summary CurrentFYSpend | +---------------------------+ | | | Add Fiscal Year | | | +-----------------+ | | | | Running Total: $ 25,000 | | Remaining: $ 75,000 | <- TotalCost - sum(YearlyCost) +--------------------------------+
当用户添加新的会计年度行时,我希望将新行的YearlyCost
字段的默认值计算为剩余金额:YearlyCost[n] = TotalCost - sum(YearlyCost)
:
+--------------------------------+ | Project Detail | +--------------------------------+ | Total Cost: $100,000 | | | | Fiscal Year Spending: | | +---------------------------+ | | | FY | Yearly Cost | | | +---------------------------+ | | | 2009 | $ 25,000 | | | | 2010 | $ 50,000 | | -- YearlyCost[2], calc'd by rule on Add Row | +---------------------------+ | | | Add Fiscal Year | | | +-----------------+ | | | | Running Total: $ 75,000 | | Remaining: $ 25,000 | +--------------------------------+
我遇到了麻烦,因为这两个预先填充的行为相互冲突,似乎正在创造竞争条件。我尝试在Summary
的{{1}}字段上设置规则以设置CurrentFYSpend
的{{1}}的值,然后在FYSpending
上设置默认值}字段设置YearlyCost
。当我保存表单时,出现以下错误:
表单代码中发生错误。 对Changed的调用次数 数据中单个更新的事件 超过了最高限额。
(谢谢,InfoPath,有关此类特定错误消息!我需要支付多少才能获取触发事件的对象的名称,或者您尝试更新的对象?)
无论如何,任何人都可以描述一种实现这一目标的技术吗?总之,
YearlyCost
Value: TotalCost - sum(YearlyCost)
YearlyCost
,并将随后添加的行“CurrentFYSpend
默认值填充到YearlyCost
答案 0 :(得分:0)
好的,我从Alec Pojidaev得到了答案,他是InfoPath专家。他说:
你有几个问题我能够精确定位。第一个是您在YearlyCost字段上选中复选框“在重新计算公式的结果时更新此值”。它的一次性操作,所以你不想重新计算它。
第二个问题是公式本身。公式../../../my:TotalCost - sum(.)
的结果与../../../my:TotalCost - .
完全相同
sum()函数在该上下文中没有任何意义。
如果我理解你的意图是正确的,那么正确的公式应该是:
../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
完成这些更改后,表单按预期工作。
公式中的sum(.)
是自动生成的。我通过点击而不是编写XPath表达式来构建公式。当我添加sum()
函数并选择YearlyCost
字段时,公式编辑器将YearlyCost
替换为.
我认为它知道它在做什么,所以我一个人留下它。我看到我需要密切关注正在生成的基础XPath。
答案 1 :(得分:0)
Jimmy Riche在infopathdev.com forums上的另一项技巧:
CurrentFYSpend
有一条规则设置YearlyCost = .
RunningTotal
的默认值为sum(YearlyCost)
,在重新计算公式时会更新。
Remaining
的默认值为TotalCost - RunningTotal
,在重新计算公式时会更新。
最后,重复表中的YearlyCost
字段的默认值为
(Remaining) * (Remaining > 0)
,不更新。 (整洁的伎俩,嗯?)
这很好用,虽然YearlyCost
的公式是,嗯,不明显。但是,我发现很多XPath都是这样的 - 你必须找到一些非显而易见的解决方案,这些解决方案在命令式语言中很简单。无论如何,这是有效的,所以我正在实施它。