一、概述
很多时候,我们需要统计表格的某一列的总和,然而ADF table并没有直接提供这种功能,这需要我们自己写代码来实现。效果如下图:
二、实现
- BC层实现
假设当前表格基于的VO名为SearchRebateVO,里面有入库数量、出库数量、销售金额、现有数量列需要求和,现在只以销售金额(对应VO中的字段为AdjSaleAmount)为例,在VO中新建一个名为(TotalAdjSaleAmount)的字段,为oracle.jbo.domain.Number(与AdjSaleAmount类型一致)。如图所示:
然后生成VO对应的VOImpl和VORowImpl类(SearchRebateVOImpl和SearchRebateVORowImpl),在VOImpl添加一个方法为如下
public Number getTotalAdjSalesAmount() { return getTotal("AdjSaleAmount"); } |
为了便于代码的重用,对如何汇总做了封装,这里继承了ViewObjectImpl里面对getTotal(String attributeName)做了实现
import oracle.jbo.Row; import oracle.jbo.RowSetIterator; import oracle.jbo.domain.Number; import oracle.jbo.server.ViewObjectImpl; /** * @author King Yin * @version 1.0 */ public class CustomViewObjectImpl extends ViewObjectImpl {
/** * 汇总 * @param attributeName 要汇总的属性列名称 * @return */ protected Number getTotal(String attributeName) { Number total = new Number(0); RowSetIterator rsi = createRowSetIterator(null); while (rsi.hasNext()) { Row r = rsi.next(); Number adjSaleAmount = (Number)r.getAttribute(attributeName); if (adjSaleAmount != null) { total = total.add(adjSaleAmount); } } rsi.closeRowSetIterator(); return total; } } |
将VOImpl类由原来继承ViewObjectImpl,改为继承类CustomViewObjectImpl。接下来,在VORowImpl类中做适当的修改
/** * Gets the attribute value for the calculated attribute TotalAdjSaleAmount. * @return the TotalAdjSaleAmount */ public Number getTotalAdjSaleAmount() { return ((SearchRebateVOImpl)getViewObject()).getTotalAdjSalesAmount(); //return (Number) getAttributeInternal(TOTALADJSALEAMOUNT); } |
现在只需要在页面进行些处理就OK了
- UI层实现
在页面定义文件中添加Attribute Binding,如下图步骤
在页面table的column footer中通过EL表达式引用TotalAdjSaleAmount
注:如果需要给outputText组件添加convertNumber,outputText的value中不能出现非数字字符,另外还需写成#{bindings.TotalAdjSaleAmount.inputValue},因为#{bindings.TotalAdjSaleAmount}是非数字类型的对象。
并且给该文本输出框添加partialTriggers和rendered(添加rendered,如果表格没有显示行的时候,将不会显示table footer)
<f:facet name="footer"> <af:outputText value="汇总:#{bindings.TotalAdjSaleAmount}" id="ot1" inlineStyle="text-align:right;" partialTriggers="s4:it3 s5:it8" rendered="#{bindings.SearchRebate1.estimatedRowCount > 0}"/> </f:facet> |