Недавно встал вопрос о сортировке данных в таблицах 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.
В следующей статье я расскажу как аналогичным образом реализовать фильтрацию.
На 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");
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;
};
}
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
}
В следующей статье я расскажу как аналогичным образом реализовать фильтрацию.
Комментариев нет:
Отправить комментарий