2016-08-05 4 views
1

У меня есть категориальный вид, первый столбец категоризирован и восходит. Последний столбец вычисляет общее количество. Представьте себе имя вида называется view1 и выглядит следующим образом:xpages: как получить общее количество категоризированного столбца

1st column(categorized) | 2nd column | 3rd column (total) 
Australia    |    | 2 
         | Alex  | 1 
         | Bill  | 1 
Brazil     |    | 3 
         | Alan  | 1 
         | Alice  | 1 
         | Tom   | 1 
Chile     |    | 1 
         | John  | 1 
Denmark     |    | 2 
         | Susan  | 1 
         | Tim   | 1 
         |    | 8 

Я хотел бы получить в общей сложности каждого категоризированного столбца, например, общее для Австралии 2, общая для Бразилии 3. Я просматриваю в Интернете и пишу код, но результат не увенчался успехом.

Это моя первая попытка: я намерен использовать @DbLookup для цикла и @Count.

var value = sessionScope.Value; 
var lookupValue = (@DbLookup(@DbName(),"view1",value,1)); 

for(var a = 0; a < lookupValue.length; a++) 
{ 
    //try to display the lookupValue and the relevant total 
    writer.write("<tr><td>"+lookupValue[a]+"<td> "+ @Count(lookupValue[a]) + "</td></tr>"); 
} 

Когда я запускаю код, я получаю следующий результат:

Australia 1 
Australia 1 
Brazil 1 
Brazil 1 
Brazil 1 
Chile  1 
Denmark 1 
Denmark 1 

После первой попытки, я начинаю вторую попытку: (обратите внимание, что большая часть кода в этой части я получаю из интернета, и я просто изменить немного, чтобы удовлетворить мой случай)

var myView:NotesView = database.getView('view1'); 
var vec:NotesViewEntryCollection = myView.getAllEntries(); 
var viewEnt:NotesViewEntry = vec.getFirstEntry(); 

writer.write("<table>"); 
while (viewEnt != null) 
{ 
    // try to retrieve the total in the 3rd column 
    writer.write("<tr><td> "+ 'viewEnt.getColumnValues()[2]' +"</td></tr>"); 

    var tmp = vec.getNextEntry(viewEnt); 
    viewEnt.recycle(); 
    viewEnt = tmp; 
} 
writer.write("</table>"); 
writer.endDocument();    

Я бегу код и результат пуст. Я не получаю никакого общего столбца с категорией.

Я просматриваю код из попытки 1 и стараюсь 2, я не понимаю, почему я не могу получить общее количество.

Я ищу в Интернете снова, и я нашел аналогичную должность: Getting a summary count in a view export?

Я пытаюсь применить решение в приложении: (обратите внимание, что большая часть кода в этой части я получаю от этой должности, и я просто добавьте имя вида в функции)

function getCategoryData(viewName, dataColumn, getChildren) { 
var v = database.getView(view1); // change viewName to view1 
var nav = v.createViewNav(); 
var ve = nav.getFirst(); 
var isFirst = true; 
var result = "["; 
    while (ve) { 
if (!ve.isTotal()) { 
    var curData = ve.getColumnValues(); 
    if (!isFirst) { 
     result += ","; 
    } 
    result += "{label : \""; 
    result += curData[0]; 
    result += "\", value : "; 
    result += curData[dataColumn]; 
    /* for 2 level categories we fetch additional data */ 
    if (getChildren) { 
     var childve = nav.getChild(); 
     var firstChild = true; 
     result += ", children : ["; 
     while (childve) { 
      var childData = childve.getColumnValues(); 
      if (!firstChild) { 
       result += ","; 
      } 
      result += "{label : \""; 
      result += childData[1]; 
      result += "\", value : "; 
      result += childData[dataColumn]; 
      result += "}";   
      firstChild = false; 
      childve = nav.getNextSibling(childve); 
     } 
     result += "]" 
    } 
    result += "}";   
    isFirst = false; 
}  
ve = nav.getNextSibling(ve); 
} 
result += "]"; 
return result; 
} 

Я бегу код и я получаю результат:

[{label : "Australia", value : undefined},{label : "Brazil", value : undefined},{label : "Chile", value : undefined},{label : "Denmark", value : undefined}] 

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

Фактически, то, что я хотел бы сделать, это получить общее количество каждого столбца с разбивкой по категориям1. Поэтому представьте, что результат будет выглядеть так:

Australia 2 
Brazil 3 
Chile  1 
Denmark 2 

На самом деле, я думаю, что первая попытка очень близка к результату. Я чувствую, что что-то пропустил в коде (возможно, я думаю, в части цикла for).

Как я могу получить общее количество столбцов с каждой категорией?

Благодарный за ваш совет по этому вопросу, пожалуйста. Большое спасибо.

ответ

1

Вы на правильном пути со своей третьей попыткой. Вы определенно хотите использовать NotesViewNavigator.

Вот рабочий пример, основанный на ваших требованиях:

/* 
* @param viewName  Name of the view to navigate 
* @param labelColumn Number of the column in the view containing the label 
*      Note: column count start at 0 
* @param dataColumn Number of the column in the view containing 
*      totals. Note: column count starts at 0 
* @return    String representing a javascript array of objects containing label and value 
*/ 
function getCategoryData(viewName, labelColumn, dataColumn) { 
    var v:NotesView = database.getView(viewName); 
    var nav:NotesViewNavigator = v.createViewNav(); 

    var ve:NotesViewEntry = nav.getFirst(); // first category 
    var isFirst = true; 
    var result = "["; 

    while (ve) { 

     var curData = ve.getColumnValues(); 

     if (curData[labelColumn] != "") { // skip the total at the bottom of the totals column 
      if (!isFirst) { 
       result += ","; 
      } 

      result += "{label : \""; 
      result += curData[labelColumn]; 
      result += "\", value : "; 
      result += curData[dataColumn]; 
      result += "}"; 
     } 

     isFirst = false;  
     var tmpentry:NotesViewEntry = nav.getNextCategory(); 
     ve.recycle(); 
     ve = tmpentry; 
    } 

    result += "]"; 

    nav.recycle(); 
    v.recycle(); 

    return result; 
} 

Основываясь на описании вашего зрения и предполагая, что имя вашего зрения «страна» Вы могли бы назвать эту функцию следующим образом:

getCategoryData("countries", 0, 2);

Примечание: Я не тестировал эту функцию с несколькими столбцами с категоризацией.

+1

Он работает для нескольких категоризированных столбцов, если вы используете 'var tmpentry: NotesViewEntry = nav.getNextSibling (ve);'. Поскольку он начинается с категории верхнего уровня, 'getNextSibling' будет возвращать только категории верхнего уровня. –

+0

Хороший вопрос! Я не думаю, что. – jpishko

+0

Спасибо за ваш ответ и комментарии. Я могу получить общее количество каждого столбца с категорией, используя код 'getCategoryData (« страны », 0, 2);'. Результат выглядит так: [{label: «Австралия», значение: 2}, {label: «Brazil», value: 3}, {label: «Chile», value: 1}, {label: «Denmark», value: 2}] ' – beginner

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