2013年6月28日星期五

ADF_237:实现Table数据自动填充功能之一:修改

开发运行环境:JDeveloper 11.1.2.4 + Oracle Database XE 11gR2

前一个实验使用的是Form,实际情况中,还可能会使用Table。
考虑以下场景:用户修改一行记录时,修改其中某个字段后,希望能够带出其它字段值,即自动填充。

1. 为了不影响其它VO,新建一个VO:EmployeesDetailsView。
注意,为了演示自动填充的功能,这里手工添加了一个Transient Attribute:JobTitle。
也就是说,这个JobTitle并不是从Jobs EO中关联过来的。
我是为了演示输入JobId,自动把JobTitle带出来。

2. 修改JobsView,增加一个View Criteria:GetJobTitleByJobIdViewCriteria,用于根据JobId获取JobTitle。

3. 修改JobsViewImpl.java,增加一个方法:,用于根据JobId获取JobTitle,并将其暴露到Client。

    public void getJobTitleByJobId(String jobId) {
        this.setApplyViewCriteriaNames(null);
        ViewCriteria criteria = this.getViewCriteria("GetJobTitleByJobIdViewCriteria");
        this.setRangeSize(10);
        this.applyViewCriteria(criteria);
        this.setbv_job_id(jobId);
        this.executeQuery();

    }

4. 修改页面,在JobId上增加ValueChangeListener
完成后的页面代码如下:
<af:inputText value="#{row.bindings.JobId.inputValue}"
              label="#{bindings.EmployeesDetailsView1.hints.JobId.label}"
              required="#{bindings.EmployeesDetailsView1.hints.JobId.mandatory}"
              columns="#{bindings.EmployeesDetailsView1.hints.JobId.displayWidth}"
              maximumLength="#{bindings.EmployeesDetailsView1.hints.JobId.precision}"
              shortDesc="#{bindings.EmployeesDetailsView1.hints.JobId.tooltip}"
              autoSubmit="true" id="it6"
              valueChangeListener="#{viewScope.myBackingBean.onJobIdValueChange}">
    <af:autoSuggestBehavior maxSuggestedItems="10"
                            suggestItems="#{viewScope.myBackingBean.onJobIdSuggest}"/>
    <f:validator binding="#{row.bindings.JobId.validator}"/>
</af:inputText>

对应的Managed Bean中的方法代码如下:

    public void onJobIdValueChange(ValueChangeEvent valueChangeEvent) {
        String newValue = (String)valueChangeEvent.getNewValue();
        System.out.println("################################# 1 " + newValue);
        OperationBinding binding = ADFUtils.findOperation("getJobTitleByJobId");
        binding.getParamsMap().put("jobId", newValue);
        binding.execute();

        DCIteratorBinding it = ADFUtils.findIterator("JobsView1Iterator");
        Row[] allRowsInRange = it.getAllRowsInRange();
        if (allRowsInRange.length > 0) {
            Row row = allRowsInRange[0];
            String jobTitle = (String)row.getAttribute("JobTitle");
            System.out.println("################################# 2 " + jobTitle);
            ADFUtils.setBoundAttributeValue("JobTitle", jobTitle);
        }
    }

这里有一个问题要注意:就是何时会触发InputText上的ValueChange事件。
答案是:当输入内容和以前的内容不一样时,并且焦点离开当前InputText时。
所以,自动提示功能发生在前,用户选择和以前不同的某个选项后,才会发生ValueChange事件。
因此,不要担心ValueChange事件会调用多次,其实只有一次。

5. 修改页面的Bindings,这一点和前一个实验一样。
不同的地方是,还要多增加一个Attribute Binding:JobTitle和一个methodAction Binding:getJobTitleByJobId。

6. 运行
修改某行记录,选择某个JobId: 

选定后,JobTitle会自动带出来:


Project 下载:ADF_AutoComplete(2).7z

没有评论: