Как предварительно заполнить суммированное поле в повторной таблице Infopath

StackOverflow https://stackoverflow.com/questions/1590703

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть форма 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   |
+--------------------------------+

У меня проблемы, потому что эти два предварительных действиях противоречат друг другу и, похоже, создают состояние гонки. Я попытался установить правило на SummaryS. CurrentFYSpend поле, чтобы установить значение FYSpendingS. YearlyCost, затем установите значение по умолчанию в YearlyCost поле для установки Value: TotalCost - sum(YearlyCost). Анкет Когда я сохраняю форму, я получаю следующую ошибку:

Произошла ошибка в коде формы. Количество вызовов в измененное событие для одного обновления в данных превысило максимальный предел.

(Спасибо, Infopath, за такое конкретное сообщение об ошибке! Сколько мне нужно заплатить, чтобы получить имя объекта, который запустил событие, или что вы пытались обновить?)

В любом случае, может ли кто -нибудь описать технику для этого? В итоге,

  1. Заполнить первый ряд YearlyCost Из предыдущего взгляда CurrentFYSpend
  2. Разрешить переоценить первый ряд 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top