2011-11-15 7 views
2

Легко вычислить сумму, среднее или максимальное количество полей, используя встроенные функции xpath.Рассчитать произведение поля через повторяющиеся элементы в InfoPath

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

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

<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 (и работа с любым количеством строк).

Любые идеи?

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

ответ

1

Используя conditional hack described here, я, наконец, собрал решение.

Внутри 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

Вы не можете со встроенными функциями в InfoPath.

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

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

+0

не списывать НЕТ -код: подумайте о добавлении в строку элемента значения sibling value, который будет накапливать (запускать) продукт с помощью 'my: value * ../ previous-sibling :: my: row [1]/my: value', в результате общий продукт в последнем ряду ... Мне просто нужно выяснить трюк, чтобы преодолеть порог «16 вычислений» IP. –

+0

Сделайте снимок. У вас есть еще несколько краевых дел, которые нужно позаботиться (для первого узла нет предыдущего, удаление узла в середине может испортить вычисление и т. Д.), Но должно работать, если вы найдете/обработаете все их. – ktharsis

+0

Многие развертывания sharepoint не позволяют ни изолированных решений, ни одобренных администратором форм, в этом случае вы не можете развернуть форму с кодом. –