2011-01-25 9 views
7

Używam priorytetów i ich datatable. Kilka kolumn to daty lub waluty. Jeśli spróbuję je odfiltrować, występują niezręczne zachowania. Kiedy zaczynam pisać filtr działa aż do pierwszego separatora (na przykład kropka dla daty, więc filtruje tylko dla 11. następny znak niech tabela nie wyświetla żadnego wpisu).jsf zawiera podstawowe problemy z filtrowaniem danych

Czy jest możliwe zastosowanie dateconvertera?

Oto mój kod teraz:

<p:column filterBy="#{cou.startDate}" 
    headerText="#{text['date']}" 
    filterMatchMode="contains" 
    sortBy="#{cou.startDate}" > 
     <h:outputText value="#{cou.startDate}" > 
      <f:convertDateTime pattern="dd.MM.yyyy" /> 
     </h:outputText> 
</p:column> 

Odpowiedz

2

O ile mi wiadomo, nie można korzystać z konwertera do wartości filtra. Możesz jednak poradzić sobie z tym w swojej logice bean/service/dao.

Można zakodować kod logiczny i użyć funkcji SimpleDateFormat do przeanalizowania wartości, jeśli kolumna filtra pasuje do określonej nazwy, np. StartDate lub endDate. Bardziej ogólnym podejściem byłoby użycie refleksji, aby uzyskać klasę związaną z kolumną i użycie SimpleDateFormat, jeśli jest to Date, DecimalFormat, jeśli jest to liczba i tak dalej.

Naturalnie jeśli propagujesz to zapytanie do bazy danych, nie będziesz mógł użyć operatora podobnego. Jeśli używasz numeru, musisz porównać go dla równości (to samo dotyczy dat). Jeśli szukasz rzeczy, które są w pamięci, będziesz musiał nieco zmienić swoją logikę. Ale nie powinno być tak źle. Jeśli mógłbyś opublikować część swojego kodu bean/kodu serwisowego, prawdopodobnie mógłbym być trochę bardziej pomocny;)

2

Brak jeszcze gotowego mechanizmu filtrowania daty, ale istnieje możliwość filtrowania według daty za pomocą niestandardowego filtru. Trzeba będzie zdefiniować aspekt nagłówka na kolumnie i wykorzystanie ajax wzywa do „ręcznego” filtrowania, ale to działa:

<f:facet name="header">DateRange 
    <div> 
    <p:calendar id="from" value="#{bean.from}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    <p:calendar id="to" value="#{bean.to}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    </div> 
</f:facet> 
3

Zamiast bezpośrednio za pomocą cou.startDate od modelu, można zamiast tego zrobić następujące:

Utwórz nową właściwość przejściową w klasie modelu.

@Transient 
private String dateForFilter; 
public String getDateForFilter() { 
return dateForFilter; 
} 
public void setDateForFilter(String dateForFilter) { 
this.dateForFilter = dateForFilter; 
} 

Utwórz poniższą logikę przed zwróceniem modelu danych.

public List<Item> getDataModel() { 
    List<Item> lstItem = serviceClass.loadItem(userid); 
    for (Item item : lstItem) { 
     DateFormat dateFormat = null; 
     Date date = item.getDate; 
     dateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm"); 
     item.setDateForFilter(dateFormat.format(date)); 
    } 

    return lstItem; 
} 

Zaktualizuj swój XHTML, aby użyć właściwości dateForFilter.

<p:column filterBy="#{item.dateForFilter}"> 
    <f:facet name="header"> 
    Transaction Date 
    </f:facet> 
    <h:outputText value="#{item.dateForFilter}" /> 
</p:column> 

Uwaga: Możesz użyć tego tylko, jeśli nie używasz daty do aktualizacji zawartości klasy modelu.

HTH.

Powiązane problemy