在开发中,我们遇到以下一个需求。
一个表格左侧有5列是固定存在的,右侧有N列是动态生成的,并且该N列中第一列可输入,第二列是不可编辑的,但是是数字,如果小于0,那么就要显示为红色,重点标识出来。
首先,我们假设你的VO中的SQL查询已经做好了,并且每次能动态确定到需要插入几列。
//获得你要生成的列总数 int n=Integer.valueOf(String.valueOf(am.invokeMethod("getCloumnCount"))) ; OATableBean tableBean = (OATableBean)webBean.findChildRecursive("tableRN"); //创建第1个动态列列单元格 //createWebBean有很多参数,有兴趣的可以翻一翻官方文档 OAMessageTextInputBean cellOneBean= (OAMessageTextInputBean)this.createWebBean(pageContext, OAMessageTextInputBean.MESSAGE_TEXT_INPUT_BEAN, null, "Cell1" ); cellOneBean.setViewUsageName("XxxxVO1");//此列绑定的VO cellOneBean.setViewAttributeName("prodType1");//此列绑定的VO中的字段 cellOneBean.setLabel("第1个动态单元格"); //此列需要显示的题头 //DisableFlag是你在VO中的叫DisableFlag的字段,根据某些条件在VORowImpl中返回true或者false //其用法类似于在页面上设置某个组件的属性 Disable = ${oa.current.DisabledFlag} OADataBoundValueViewObject Disabled = new OADataBoundValueViewObject(cellOneBean,"DiabledFlag"); cellOneBean.setAttributeValue(this.DISABLED_ATTR,Disabled); tableBean.addIndexedChild(cellOneBean); //创建第2个动态列单元格 OAMessageStyledTextBean cellTwoBean = (OAMessageStyledTextBean)this.createWebBean(pageContext, OAMessageStyledTextBean.MESSAGE_STYLED_TEXT_BEAN, null, "Cell2" ); cellTwoBean.setViewUsageName("XxxxVO1");//此列绑定的VO cellTwoBean.setViewAttributeName("prodType2");//此列绑定的VO中的字段 cellTwoBean.setLabel("第2个动态单元格"); //此列需要显示的题头 //同上,CssCode为VO的一个字段 /*其VORowImpl中的写法类似于 public String getCssCode() { //return (String) getAttributeInternal(CSSCODE); // return CSS if( this.getScore() != null && this.getScore().floatValue() < 0 ) { //OAF的CSS样式的设定请参考其他资料 return "TouchScreenRedDataText"; }else { return ""; } } */ OADataBoundValueViewObject cssjob = new OADataBoundValueViewObject(cellTwoBean,"CssCode"); cellTwoBean.setAttributeValue(oracle.cabo.ui.UIConstants.STYLE_CLASS_ATTR, cssjob); tableBean.addIndexedChild(cellTwoBean); for(int i=3; i<n+1; i++ ){ //动态创建WebBean OAMessageStyledTextBean summary = (OAMessageStyledTextBean)this.createWebBean(pageContext, OAMessageStyledTextBean.MESSAGE_STYLED_TEXT_BEAN, null, "Text" + i ); String label = null; label = "Prodtype" + i; //从AccountCostDetailVO中显示对应到的数据项到动态的webBean summary.setViewUsageName("AccountCostDetailVO"); summary.setViewAttributeName(label); summary.setLabel("第"+i+"个动态单元格"); tableBean.addIndexedChild(summary); }
为动态创建的组件添加FireAction事件
// 启用Expense Template的FireAction功能 OAMessageChoiceBean choiceBean = (OAMessageChoiceBean)webBean.findChildRecursive("ExpenseTemplate"); choiceBean.setFireActionForSubmit("change", null, null, true);
OACellFormatBean createApproveCellBean =(OACellFormatBean)this.createWebBean(pageContext , OAWebBeanConstants.CELL_FORMAT_BEAN , null , null); OAButtonBean hierarchBean = (OAButtonBean)createWebBean(pageContext , OAWebBeanConstants.BUTTON_BEAN , null , null); hierarchBean.setID("CuxHierarySumbitBtn"); hierarchBean.setName("CuxHierarySumbitBtn"); String hierarchy = pageContext.getMessage("CUX" , "CUX_APPROVAL_HIERARCHY" , null); hierarchBean.setLabel(hierarchy); hierarchBean.setText(hierarchy); hierarchBean.setFireActionForSubmit("CuxHieraryEvent" , null , null , true); createApproveCellBean.addIndexedChild(hierarchBean); OARowLayoutBean btnRowBean =(OARowLayoutBean)webBean.findChildRecursive("ButtonBarRow"); btnRowBean.addIndexedChild(createApproveCellBean);
为table中的bean组件添加事件,并在事件处理中可以获取当前行的参数
import java.util.HashTable;
Hashtable params = new Hashtable(); params.put("param_AucHeaderId" , new OADataBoundValueViewObject(attrBidValueBean , "AuctionHeaderId")); params.put("param_BidNumber" , new OADataBoundValueViewObject(attrBidValueBean , "BidNumber")); params.put("param_LineNumber" , new OADataBoundValueViewObject(attrBidValueBean , "LineNumber")); params.put("param_SequenceNumber" , new OADataBoundValueViewObject(attrBidValueBean , "SequenceNumber")); attrBidValueBean.setFireActionForSubmit("AttrBidValueNumEvent" , null , params , false , false);
或者创建事件后,在PFR中使用获取事件行的方式去获得当前行的列值
//注:动态创建的不能以EVENT_SOURCE_ROW_REFERENCE方法来获取当前行。
String rowRef = pageContext.getParameter(EVENT_SOURCE_ROW_REFERENCE); Row currentRow = am.findRowByRef(rowRef); currentrow5.getAttribute("Sscore");
现在TABLE里面的每行都有一个poplist,用的相同的VO,但是要求每行的下拉框中的值根据当前行的某些值来获取。
OATableBean table = (OATableBean)webBean.findChildRecursive("TableRN");; OAMessageChoiceBean statsfiedBean = (OAMessageChoiceBean)webBean.findChildRecursive("InstallmentName"); if (statsfiedBean != null) { statsfiedBean.setPickListCacheEnabled(false); statsfiedBean.setListVOBoundContainerColumn(0, table, "ProjectName" /* ProjectName 是TableRN中的组件ID,而不是TableRN对应的VO中的attribute*/
); }
//OAF JAVA DOC标准示例 OATableBean table = ...
OAMessageChoiceBean empPoplist = (OAMessageChoiceBean)table.findChildRecursive("EmpName");
empPoplist.setListVOBoundContainerColumn(0, /* bind index */ table,"Deptno" /* Deptno是table中的组件ID,而不是table对应的VO中的attribute*/ );
参考资料:
EBS OAF开发DataBoundValues的使用示例-动态显示表列的左右对齐