Рассчитать произведение поля между повторяющимися элементами в InfoPath - PullRequest
2 голосов
/ 15 ноября 2011

С помощью встроенных функций xpath легко вычислить сумму, среднее или максимальное значение по множеству полей.

Но можно ли рассчитать произведение?

Предполагая, что у меня есть повторяющиеся элементы, такие как

<my:table>
    <my:row>
        <my:value>10</my:value>
    </my:row>
    <my:row>
        <my:value>20</my:value>
    </my:row>
    <my:row>
        <my:value>30</my:value>
    <my:row>
</my:table>

(количество my:row с может отличаться).

мне нужно иметь формулу, умножающую все my:value s: 10 * 20 * 30 (и работающую с любым количеством строк).

Есть идеи?

Пожалуйста, не предлагайте решения для кода, мне нужно это для ограниченной формы.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Используя условный хак, описанный здесь , я наконец собрал решение.

Внутри my:row, создайте поле работающего продукта my:valueCumul, заполненное формулой для ссылки на предыдущую строкуи используя условный хак для переопределения NaN для первой строки:

../my:value * 
concat(
(count(../preceding-sibling::my:row[1]) = 0) * 1,
substring(../preceding-sibling::my:row[1]/my:valueCumul, 1, (count(../preceding-sibling::my:row[1]) = 1) * string-length(../preceding-sibling::my:row[1]/my:valueCumul))
)

За пределами таблицы вы можете легко обратиться к my:valueCumul в последней строке, чтобы получить общий продукт:

../my:row[count(../my:row)]/my:valueCumul

Приятные особенности этого решения:

  • Работает в форме браузера в любой среде sharepoint
  • Не зависит от порога "16 вычислений"
  • Формула надежна для удаления строк и сдвигов
0 голосов
/ 16 ноября 2011

Вы не можете использовать встроенные функции в InfoPath.

Однако не списывайте решение кода так быстро. Если вы обращаетесь только к элементам данных в самой форме (ничего ВНЕШНЕГО), вы можете оставить форму с ограниченной защитой, и код будет работать без проблем - пользователь не знает разницы.

Довольно просто прикрепить к нужному событию, захватить узлы, и перебирать их во время умножения. Вам даже не нужно использовать управляемый код - используйте один из вариантов сценария. Оставьте комментарий (или обновите исходное сообщение), если у вас возникнут проблемы, и мы поможем их устранить.

...