Как предварительно заполнить суммированное поле в повторной таблице Infopath
Вопрос
У меня есть форма 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
S. CurrentFYSpend
поле, чтобы установить значение FYSpending
S. YearlyCost
, затем установите значение по умолчанию в YearlyCost
поле для установки Value: TotalCost - sum(YearlyCost)
. Анкет Когда я сохраняю форму, я получаю следующую ошибку:
Произошла ошибка в коде формы. Количество вызовов в измененное событие для одного обновления в данных превысило максимальный предел.
(Спасибо, Infopath, за такое конкретное сообщение об ошибке! Сколько мне нужно заплатить, чтобы получить имя объекта, который запустил событие, или что вы пытались обновить?)
В любом случае, может ли кто -нибудь описать технику для этого? В итоге,
- Заполнить первый ряд
YearlyCost
Из предыдущего взглядаCurrentFYSpend
- Разрешить переоценить первый ряд
YearlyCost
, и заполняют впоследствии рядыYearlyCost
Значение по умолчаниюTotalCost - sum(YearlyCost)
Решение 2
И еще одна техника от Джимми Рише на Форумы Infopathdev.com:
CurrentFYSpend
имеет правило, которое устанавливает YearlyCost = .
RunningTotal
имеет значение по умолчанию sum(YearlyCost)
, обновляется, когда формула повторно.Remaining
имеет значение по умолчанию TotalCost - RunningTotal
, обновляется, когда формула повторно.
Наконец YearlyCost
поле в повторной таблице имеет значение по умолчанию
(Remaining) * (Remaining > 0)
, нет обновляется, когда формула переоборудована. (аккуратный трюк, а?)
Это работает хорошо, хотя формула для YearlyCost
это неочевидное. Но я обнаружил, что много XPath такого-вы должны найти неочевидные решения для вещей, которые были бы мертвыми на императивном языке. В любом случае, это работает, поэтому я его реализую.
Другие советы
Хорошо, я получил ответ от Алек Поджидаев, кто настоящий эксперт Infopath. Он говорит:
У вас есть пара проблем, которые я смог точно определить. Во -первых, вы проверили флажок «Обновить это значение, когда результат формулы пересматривается» в поле Egylycost. Это один раз, так что вы не хотите ее пересчитывать.
Вторая проблема - сама формула. Результат вашей формулы ../../../my:TotalCost - sum(.)
абсолютно такой же, как ../../../my:TotalCost - .
Функция sum () не имеет смысла в этом контексте.
Если я понимаю, что ваше намерение исправить правильную формулу должна быть:../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
После того, как я внес эти изменения, форма работала по желанию.
А sum(.)
В формуле был автоматически сгенерирован. Я построил формулу через точку и щелкну, а не пишу выражение XPath. Когда я добавил sum()
функционировать и выбрать YearlyCost
Поле, редактор формулы заменил YearlyCost
с .
Я понял, что это знал, что он делает, поэтому я оставил это в покое. Я вижу, что мне нужно обратить пристальное внимание на то, что генерируется основной XPath.