2013-01-09 2 views
1

필터링 할 수있는 열이있는 풍부한 데이터 테이블이 있습니다. rich : dataTable이 filterBy 열의 합계를 가져 오는 중

<!-- Data table with filters --> 
<h:form> 
<rich:dataTable value="#{sessionScope.paymentsBean.payments}" var="payment" 
    id="table"> 
    <rich:column filterBy="#{sessionScope.payment.invoice}" filterEvent="onkeyup"> 
     <f:facet name="header">Invoice</f:facet> 
     <h:outputText value="#{sessionScope.payment.invoice}" /> 
    </rich:column> 
    <rich:column filterBy="#{sessionScope.payment.description}" filterEvent="onkeyup"> 
     <f:facet name="header">Description</f:facet> 
     <h:outputText value="#{sessionScope.payment.description}" /> 
    </rich:column> 
    <rich:column filterBy="#{sessionScope.payment.amount}" filterEvent="onkeyup"> 
     <f:facet name="header">Amount</f:facet> 
     <h:outputText value="#{sessionScope.payment.amount}" /> 
    </rich:column> 
</rich:dataTable> 
</h:form> 

<!-- Total --> 
<h:outputText id="total" value="#{sessionScope.paymentsBean.total}" > 
    <f:convertNumber maxFractionDigits="2" type="currency" currencySymbol="$"/> 
</h:outputText> 

은 전체를 위해, 나는 총을 얻을 수 sessionScope.paymentsBean.payments 모든 금액을 합산 할 수 있습니다. 다음 예에서 $ 355.00입니다. 총은 $ 150 인 그러나해야하지만 getTotal()가 filterBy 데이터에 대해 알고하지 않습니다

Invoice  Description  Amount 
2   Visa   $50.00 
3   Visa   $100.00 

Total: $355.00 

: 나는 "비자"를 기준으로 필터링하는 경우처럼

Invoice  Description  Amount 
1   Cash   $5.00 
2   Visa   $50.00 
3   Visa   $100.00 
4   MasterCard  $200.00 

Total: $355.00 

그러나, 테이블 및 총 보일 것이다. rich : datatable의 filterBy 기준에 따라 합계를 동적으로 계산할 수 있습니까?

+0

사용중인 RichFaces 및 JSF 버전을 지정할 수 있습니까? –

+0

물론, 저는 JSF 1.2와 Richfaces 3.3.3 Final을 사용하고 있습니다. 더 큰 프로젝트의 일부이기 때문에이 라이브러리를 업그레이드 할 수는 없지만 JSF 2 또는 Richfaces 4가 지원하는지 여부는 알 수 있습니다. –

+0

JSF 2 PrimeFaces를 사용하면 Datatable이 기본 목록과 필터링 된 목록의 두 목록에 바인드되므로 백엔드 빈에서 항상 사용할 수있는 필터링 된 목록을 가질 수 있으므로 확실히 할 수 있습니다. PF 1.2와 3.3으로 나는 비슷한 것을했을 것이라고 생각합니다. –

답변

0

필터링 된 데이터를 복구하는 방법이 있습니다. 테이블을 뒷받침 빈 속성에 바인딩해야하고 rich:extendedDataTable이 필요합니다.

<rich:extendedDataTable value="#{sessionScope.paymentsBean.payments}" var="payment" id="table" binding="sessionScope.paymentsBean.table">

바인더 제본 속성은 HTMLExtendedDataTable 유형이 될 것입니다. 그런 다음 사용자가 호출 할 필터에 무언가를 입력 할 때 Ajax 호출을 만들어야합니다. 로, <a4j:support /> 구성 요소를 확인하고 키를 누를 때 사용 :

<a4j:support event="onkeyup" reRender="countBox" action="#{sessionScope.paymentsBean.actionCalculateTotalValue}"/>

이 filterings can be tricky에 아약스 메소드를 호출하는 것을 기억하십시오. 테이블의 빌트인 필터를 피하고 h:inputText에 기반한 사용자 정의 필터를 만들고 여기에 아약스 호출을 구현하는 것이 좋습니다. 이 link을 살펴볼 수 있습니다.

일단 메소드가 호출되면 필터링 된 행을 가져와 총 금액을 계산하고 호출이 완료되면 JSF가 상자를 업데이트하는 변수에 넣으면됩니다. 필터링 된 행을 가져 오는 방법은 무엇입니까? 당신은 다음과 같습니다 :

public List<E> filteredList() { 
    List<E> list = new java.util.ArrayList<E>(); 

    int i = 0; 
    boolean loop = true; 

    while (loop) { 
     table.setRowKey(new Integer(i)); 
     if (table.isRowAvailable()) { 
      list.add((E) table.getRowData()); 
      i += 1; 
     } else { 
      loop = false; 
     } 
    } 

    table.setRowKey(null); 
    return list; 
} 

기본적으로 테이블에 사용 가능한 행이 없을 때까지 루프를 만듭니다. 행운을 빕니다.