[Oracle ADF] > Фильтрация в таблице по SelectOneChoice


UPD: VC должна быть создана декларативно а не создавться где-то произвольно в коде. Иначе потом некоторым программистам может быть сложно понять, почему VO выполняется именно так. В коде нужно получать это VC и уже в него подставлять данные.


Вариант 1 (Так делал я)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<af:table

    ***

    <af:column ***
               filterable="true">

               ***

<f:facet name="filter">
    <af:selectOneChoice id="soc5"  simple="true"
                        label="#{commonBundle['common.priority']}" autoSubmit="true"
                        valueChangeListener="#{pageFlowScope.MyBean.onPriorityFilter}">
            <af:selectItem label="#{commonBundle['common.notSelectedLevel']}" value="-1" id="si3"/>
            <af:selectItem label="#{commonBundle['common.high']}" value="1" id="si4"/>
            <af:selectItem label="#{commonBundle['common.middle']}" value="2" id="si5"/>
            <af:selectItem label="#{commonBundle['common.low']}" value="3" id="si6"/>
    </af:selectOneChoice>
</f:facet>   

</af:column>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void onPriorityFilter(ValueChangeEvent valueChangeEvent) {

    String selectedPriority = valueChangeEvent.getNewValue().toString();

    ViewObject vo = VOUtils.getViewObjectByName(CONSTANTS_VO.MY_VO_NAME);

    // Если вариант -1 (из константы)
    if (selectedPriority.equals(CONSTANTS_VARIABLES.PRIORITY_NOT_SELECTED)){
        VOUtils.clearViewCriteriaByName(vo, CONSTANTS_VC.MY_SUPER_VC_FOR_THIS_CASE);
    } else {

        ViewCriteria vc = vo.createViewCriteria();
        vc.setName(CONSTANTS_VC.MY_SUPER_VC_FOR_THIS_CASE);

        ViewCriteriaRow vcr1 = vc.createViewCriteriaRow();
        vcr1.setAttribute("Priority","= " + selectedPriority);
        vc.add(vcr1);

        vo.applyViewCriteria(vc, true);
    }
    vo.executeQuery();
}


Вариант 2 (Так делал коллега)

Итак.

Есть колонка

<af:column filterable="true"


Нужно, чтобы в заголовке пользователь мог выбрать один из вариантов фильтра в SelectOneChoice.

Я такие вещи раньше всегда делал с помощью VC, но тут нашел код не такой как обычно делаю я:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
***
<f:facet name="filter">
    <af:panelGroupLayout id="pgl13">
        <af:selectOneChoice
                            label="#{bindings.MyValuesDescView1.label}"
                            shortDesc="#{bindings.MyValuesDescView1.hints.tooltip}"
                            id="soc5"
                            rendered="#{bindings.ValueDesc.inputValue != null}"
                            autoSubmit="true"                                                                            
                            value="#{pageFlowScope.MyBean.valueDescFilter}">
            <f:selectItem value="A" id="si11" itemLabel="A"
                          itemValue="A"/>
            <f:selectItem value="B" id="si10" itemLabel="B"
                          itemValue="B"/>
            <f:selectItem value="C" id="si5" itemLabel="C"
                          itemValue="C"/>
        </af:selectOneChoice>
        <af:inputText  id="it5"
                      rendered="#{bindings.ValueDesc.inputValue == null and bindings.Value.inputValue != null}"
                      value="#{vs.filterCriteria.Value}"/>
    </af:panelGroupLayout>
</f:facet>
</af:column>



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// А этот, если я правильно понял, нужен, чтобы установить нужное значение в заголовке таблицы. Т.е. нужное значение для SOC

public String getValueDescFilter(){
    RichTable tbl = (RichTable)JSFUtils.resolveExpression("#{pageFlowScope.MyBean.myTable}");
    FilterableQueryDescriptor filterQD = (FilterableQueryDescriptor)tbl.getFilterModel();
    ConjunctionCriterion cc = filterQD.getFilterConjunctionCriterion();
    List<Criterion> lc = cc.getCriterionList();
    for (Criterion c : lc){
        if (c instanceof AttributeCriterion){
            AttributeCriterion ac = (AttributeCriterion) c;
            if ((ac.getAttribute().getName().equalsIgnoreCase("ValueDesc"))){
                System.out.println("GET FILTER VALUE " + ac.getValue());
                if(ac.getValue().equals(1))  return "A";
                if(ac.getValue().equals(2))  return "B";
                if(ac.getValue().equals(3))  return "C";
            }
        }
    }
    return null;
}


// При выборе элемента SOC вызывается этот метод
public void setValueDescFilter(String filterValue){

    RichTable tbl = (RichTable)JSFUtils.resolveExpression("#{pageFlowScope.MyBean.myTable}");
    FilterableQueryDescriptor filterQD = (FilterableQueryDescriptor)tbl.getFilterModel();
    ConjunctionCriterion cc = filterQD.getFilterConjunctionCriterion();
    List<Criterion> lc = cc.getCriterionList();
    for (Criterion c : lc){
        if (c instanceof AttributeCriterion){
            AttributeCriterion ac = (AttributeCriterion) c;
            if ((ac.getAttribute().getName().equalsIgnoreCase("ValueDesc"))){
                System.out.println("SET FILTER VALUE " + filterValue);
                ac.setValue(filterValue);
            }
        }
    }
}