xpages: невозможно вычислить столбец представления с помощью getColumnValue()

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

Я не могу понять, почему это не работает, все время возвращая значение по умолчанию:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:viewPanel rows="30" id="viewPanel1" var="varWI">
                <xp:this.facets>
                    <xp:pager partialRefresh="true" layout="Previous Group Next" xp:key="headerPager" id="pager1">
                    </xp:pager>
                </xp:this.facets>

                <xp:this.data>
                    <xp:dominoView var="view1" viewName="WorkItem">
                        <xp:this.categoryFilter><![CDATA[#{javascript:"F832F30FA6C4686E85257F0E0008E964"}]]></xp:this.categoryFilter>
                    </xp:dominoView>
                </xp:this.data>

                <xp:viewColumn columnName="wi_Date" id="viewColumn6" displayAs="link" showCheckbox="true">
                    <xp:this.converter>
                        <xp:convertDateTime type="date"></xp:convertDateTime>
                    </xp:this.converter>
                    <xp:viewColumnHeader value="Creation Date" id="viewColumnHeader6" style="font-weight:bold">
                    </xp:viewColumnHeader>
                </xp:viewColumn>

                <xp:viewColumn id="wi_Intervention1" columnName="wi_Intervention">
                    <xp:viewColumnHeader id="viewColumnHeader9" style="font-weight:bold" value="Intervention">
                    </xp:viewColumnHeader>
                </xp:viewColumn>

                <xp:viewColumn id="wi_Category1" columnName="wi_Category">
                    <xp:viewColumnHeader id="viewColumnHeader10" style="font-weight:bold" value="Category">
                    </xp:viewColumnHeader>
                </xp:viewColumn>

                <xp:viewColumn id="viewColumn1">
                    <xp:this.facets>
                        <xp:viewColumnHeader xp:key="header"
                            id="viewColumnHeader1">
                        </xp:viewColumnHeader>
                    </xp:this.facets>
                    <xp:this.value><![CDATA[#{javascript:var s:string = varWI.getColumnValue('wi_Category');

if(s.equals("CATEGORY_DISCOUNT")) { 
    return "99. Discount" 
} else if(s.equals("CATEGORY_INCOMPATIBILITY")) { 
    return "88. Incompatibility" 
} else {
    return "--. " + s.toLowerCase();
}}]]></xp:this.value>
                </xp:viewColumn>
    </xp:viewPanel>

</xp:view>

Эта часть:

var s:string = varWI.getColumnValue('wi_Category');

if(s.equals("CATEGORY_DISCOUNT")) { 
    return "99. Discount" 
} else if(s.equals("CATEGORY_INCOMPATIBILITY")) { 
    return "88. Incompatibility" 
} else {
    return "--. " + s.toLowerCase();
}

всегда возвращайте значение в нижнем регистре. Значения столбца — это текст, а также поле в форме.

Пример: если значение столбца "CATEGORY_DISCOUNT", в столбце отображается "--. category_discount".

Кажется, он знает значение столбца, так как он помещает его в нижний регистр, но он не увидит его равным значению, которое я проверяю в операторе «если».

Совсем запутался....


person Ben Dubuc    schedule 01.12.2015    source источник
comment
Поскольку похоже, что вы используете представление Notes в качестве источника данных для своей панели просмотра, не рассматривали ли вы возможность выполнять всю свою математику на бэкэнде, используя представление Notes? Если вы сделаете это, это будет быстро, и все, что вам нужно сделать, это обновить элемент управления. Поместите свою логику в формулу столбца, используя язык формул.   -  person Steve Zavocki    schedule 01.12.2015
comment
Протестируйте код с return "--. " + s;, чтобы увидеть, что на самом деле содержит s.   -  person Knut Herrmann    schedule 01.12.2015
comment
Кроме того, попробуйте s.equalsIgnoreCase() вместо s.equals()   -  person Per Henrik Lausten    schedule 01.12.2015
comment
Я согласен с Пером в отношении игнорирования регистра, но, основываясь на предложении Пола, я бы рекомендовал использовать тест на равенство с использованием s.toUpperCase() == CATEGORY_DISCOUNT;   -  person pipalia    schedule 01.12.2015


Ответы (2)


Попробуйте s=="CATEGORY_DISCOUNT". Вы передаете его в строку SSJS, а не в java.lang.String. .equals() может не работать для строк SSJS.

person Paul Stephen Withers    schedule 01.12.2015

Товарищи кодеры, проблема была не в коде, а в сохраненных в документе значениях.

Оказывается, раскрывающийся список, используемый для ввода значений, имеет следующую формулу:

FrenchValue + " | " + Alias

Конечно, в Интернете дополнительное пространство сохраняется вместе с псевдонимом. Поэтому у меня был дополнительный пробел в начале каждого значения, которое я искал...

Я попался на этом раз или два, а теперь мой коллега тоже получил ценный урок!!!

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

Окончательный код столбца был похож на этот:

var s:string = viewEntry.getColumnValue('Intervention');
s = s.trim();
var col = sessionScope.lang=="en" ? 3 : 2;
@DbLookup(@DbName(), "VWL022", s, col);
person Ben Dubuc    schedule 01.12.2015