• OAF 动态创建组件以及动态绑定属性


    在开发中,我们遇到以下一个需求。

    一个表格左侧有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开发中的绑定值(BoundValues)

    EBS OAF开发DataBoundValues的使用示例-动态显示表列的左右对齐

                
  • 相关阅读:
    Zabbix的SNMPTrap监控配置
    Delphi 7下最小化到系统托盘
    解决来QQ消息后歌曲音量降低问题
    转载——用Mixer API函数调节控制面板的音频设置
    git branch -D 大写的D 删除分支
    gitlab+TortoiseGit中使用SSH
    SQL 高级查询
    正则表达式校验文件路径
    显示所选择文件的路径地址
    Type InvokeMember()用法简介
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/4536978.html
Copyright © 2020-2023  润新知