среда, 1 мая 2013 г.

Простая сортировка данных в Таблице для Web Dynpro Java 7.3 / simple sorting in a Table for Web Dynpro Java 7.3

Недавно встал вопрос о сортировке данных в таблицах Web Dynpro ( IWDTable ). Интерфейс есть, а реализации - нет.
На SCN'е,  да и на просторах интернета много статей, наглым образом позаимствованных у SAP, но выдаваемых уже от своего имени, все в основном для версии 7.0. Их отличительная черта - это тонны кода, предоставляемого SAP.

Но как оказалось,реализовать сортировку  - намного проще :)

1. Создаю компонент Web Dynpro и контекст в Component Controller'е.



2. Заполняю его данными, для этого в Node Data, предусматриваю Supply Function


  public void supplyData(IPrivateComp1.IDataNode node, IPrivateComp1.IContextElement parentElement)
  {
    //@@begin supplyData(IWDNode,IWDNodeElement)
 wdContext.createAndAddDataElement();
 wdContext.currentDataElement().setFirst("Один");
 wdContext.currentDataElement().setSecond(2);
 wdContext.currentDataElement().setThird(true);
 wdContext.currentDataElement().setFourth(new Date(158687222l));
 
 wdContext.createAndAddDataElement();
 wdContext.nodeData().moveLast();
 wdContext.currentDataElement().setFirst("Два");
 wdContext.currentDataElement().setSecond(1);
 wdContext.currentDataElement().setThird(false);
    //@@end
  }

3. Во View делаю Context Mapping с Component Controller



4. Во View Создаю таблицу на основе данных контекста и создаю обработчик (Sort) для события onSort 



5. В методе-обработчике события необходимо получить параметры события, такие как  поле и направление сортировки, узнать о них можно здесь http://help.sap.com/saphelp_nw73/helpdata/en/0e/23b3c8b0a238439f664f73a04e6332/content.htm?frameset=/en/95/f75f42403cc253e10000000a1550b0/frameset.htm
Чтоб они корректно передавались необходимо добавить параметры в Actions и Event Handlers



 Далее в методе wdDoModifyView пишу следующие строки кода:


if (firstTime){
   IWDTable table = (IWDTable)view.getElement("Table");
   table.mappingOfOnSort().addSourceMapping("direction","direction");
   table.mappingOfOnSort().addSourceMapping("col","col");
 }

Альтернатива вышеописанным действиям:

wdEvent.getString("col");

6. Разрабатываю класс, который непосредственно будет заниматься сортировкой. Это обычный JavaBean, реализующий интерфейс Comparator. Сразу замечу, что класс не претендует на универсальность и полноту, он носит лишь обучающий характер:


public class TableSorter<T extends IWDNodeElement> implements Comparator<T> {
private T t;
private String attribute;
private boolean direction;

public TableSorter(String attr,String direction) {
this.attribute = attr;
this.direction = direction.equalsIgnoreCase("UP")?true:false;
}
public int compare(T o1, T o2) {
Object value1 = ((NodeElement)(direction?o1:o2)).getAttributeValue(attribute);
Object value2 = ((NodeElement)(direction?o2:o1)).getAttributeValue(attribute);

if (value1 instanceof String){
String thisVal = value1!=null?(String)value1:"";
String anotherVal = value2!=null?(String)value2:"";
return thisVal.compareTo(anotherVal);
}

if (value1 instanceof Long){
long thisVal =value1!=null?(Long)value1:0;
long anotherVal =value2!=null?(Long)value2:0;

return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
if (value1 instanceof Boolean){
Boolean thisVal =value1!=null?(Boolean)value1:false;
Boolean anotherVal =value2!=null?(Boolean)value2:false;

return thisVal.compareTo(anotherVal);
}
if (value1 instanceof Date){
Date thisVal =value1!=null?(Date)value1:new Date(0);
Date anotherVal =value2!=null?(Date)value2:new Date(0);

return thisVal.compareTo(anotherVal);
}

return 0;
};
}

7. Последний штрих :


  public void onActionSort(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent, java.lang.String col, java.lang.String direction )
  {
    //@@begin onActionSort(ServerEvent)
      wdContext.nodeData().sortElements(new TableSorter<NodeElement>(col,direction));
    //@@end
  }



В результате, я получил рабочий код, который в разы меньше SAP'овского, работает для платформы 7.3.

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



Комментариев нет:

Отправить комментарий