2015-11-13 4 views
0

У меня есть 100 документов с многозначным полем. Поле имеет 5 возможных значений (Альберт, Бен, Крис, Дон, Эд), скажем так. Поле должно содержать значение 1, но может содержать до 5.Xpages: получить количество значений в многозначном поле в поле зрения

Мне нужно вычислить количество документации, содержащую каждое значение, так

Albert 56 
Ben 22 
Chris 79 

т.д.

Это казалось легко. Я построил представление, которое содержит документы, первый столбец - это поле, и я выбрал отображение нескольких документов для нескольких каналов.

В SSJS цикл через мой главный список значений в поле, а для каждого из них - getDocumentByKey.

myArray = applicationScope.application;  
var dc:NotesDocumentCollection; 

for (index = 0; index < myArray.length; ++index) { 
     dc = view1.getAllDocumentsByKey(myArray[index]); 
    Print(dc.getCount()) 
} 

Это первое правильное значение, но после него ничего не происходит. Если я просто жестко кодирую определенное значение, он работает. Но когда я вызываю getAllDocumentsByKey второй раз, он не возвращает правильное значение.

Я думаю, что это нормально работает в LS, но в SSJS я должен очистить или переработать или что-нибудь о чем-то отдохнуть, но я не знаю, что.

+0

Возможно, попробуйте либо dc = null, либо dc.recycle() в конце цикла for –

+0

Кроме того, что-то не выглядит правильно относительно первой строки. Вам не хватает var, и вы не даете ему тип. Вы уверены, что на самом деле получаете массив? Перед циклом добавьте печать (myArray.length) и убедитесь, что у вас есть правильная длина. Я подозреваю, что у вас будет «1», что объясняет, почему вы видите только первое значение. –

+0

Выполнение ответа из моих комментариев –

ответ

0

Bryan,

Две вещи, чтобы попробовать в следующем порядке:

  1. Ваша первая линия myArray = applicationScope.application; не выглядит правильно. Я подозреваю, что вы на самом деле не получаете массив здесь. Я думаю, вы просто получаете первое значение от вашего приложенияScope. Добавьте заявление печати на следующую строку: print(myArray.length); Если он всегда равен единице, это ваша проблема. Вы не используете var, и вы должны установить переменную в некоторый java-тип, используя двоеточие.
  2. Прежде, чем закончить цикл for, попробуйте установить свою коллекцию в нуль. dc = null; Таким образом, вы точно знаете, что получаете новую коллекцию на следующей итерации.
0

Являются ли какие-либо из ваших значений значений многозначного значения двусмысленными? getAllDocumentsByKey(Vector) выполняет частичные совпадения. Если вы этого не захотели, я бы порекомендовал всегда, используя второй параметр и установив его на true, то же самое всегда для getAllEntriesByKey().

Альтернативой, которая, безусловно, будет работать лучше, было бы добавление общего столбца в представление. Это показатель производительности при индексировании вида, но затем вы можете использовать ViewNavigator с getColumnValues() и getNextSibling(). getCount() чрезвычайно плохо работает в LS и почти наверняка будет так же плохо работать в SSJS/Java. См. Это сообщение в блоге от нескольких лет назад http://www.intec.co.uk/why-you-shouldnt-count-on-a-notesviewnavigator/

0

Если я понимаю это право: вы хотите подсчитать все значения, которые возможны над количеством документов, чтобы иметь 5 значений с соответствующими 5 значениями, правильно? Вы можете прокручивать все документы, перебирать все значения и добавлять записи в HashMap со значением как ключ и значением int как значение (которое должно быть увеличено каждый раз). После этого у вас есть карта с 5 значениями, содержащими суммы каждого ключа.

0

Вы не получите правильного ответа getAllDocumentsByKey(). Когда документ отображается в одной категории, он будет отсутствовать в коллекции следующей категории.Так оно и работает.

Использовать вместо ViewNavigator. Постройте его по категориям и просто countViewEntries.

Смежные вопросы