2013年6月19日星期三

ADF_234:Groovy在ADF BC中的常见用法之二

开发运行环境:JDeveloper 11.1.2.4

1. 访问其它EO中的Attribute
以Departments和Employees为例,二者是一对多的关系。
现在想在Employees中的AnnualSalary中引用Departments中的locationId。
首先,要看一下Departments和Employees之间的Assocation关系定义。
可以看到,在Employees中暴露了Departments Accessor。


那么AnnualSalary的Expression可以这样写:adf.object.getDefaultSalaryForGrade(Departments.LocationId)。

方法getDefaultSalaryForGrade(Integer locId)是定义在EmployeeImpl中的自定义方法:   
public static BigDecimal getDefaultSalaryForGrade(Integer locId) {
    System.out.println(" ################### " + locId);
    return new BigDecimal(20000);
}

2. 内置的属性:adf.currentDate 和 adf.currentDateTime
比如,你可以为Hiredate定义一个验证规则:
return (newValue < adf.currentDate)

3. 集合功能
<Accessor>.sum(Groovyexpression)
<Accessor>.count(Groovyexpression)
<Accessor>.avg(Groovyexpression)
<Accessor>.min(Groovyexpression)
<Accessor>.max(Groovyexpression)

(1)对于Departments的SalarySum,你可以使用Employees.sum("Salary")来统计该部门员工的工资和。
其中,Employees是Departments中的Accessor,Salary是Employees中的Attribute。
你甚至可以这样写:Employees.sum("Salary + 1000"),为每个员工涨1000元。
因为参数"Salary + 1000"将被首先解析,即获取每一个Employees EO上的Salary,然后加1000。
同样,你也可以在参数中再调用一个方法,比如:Employees.sum("Salary + adf.object.getBenefitsValue(JobId)")。
注意,方法getBenefitsValue是定义在EmployeesImpl中的。

(2)对于Employees的Salary,你可以增加一个验证规则:return newValue > Departments.Employees.min("Salary"),即要求用户的工资必须大于这个部门工资最低的员工工资。
这里,Departments是Employees EO中reference的对象,而Departments.Employees是Deparments EO中reference的对象。
注意,使用这个验证规则时,如果一个部门的员工很多,比如上千名员工,会有性能问题。

4. 更复杂一些的Groovy验证规则
(1)(JobId != "SALESMAN" ? newValue > 100 : newValue > 0)
(2)Employees.sum("CommissionPct != null ? CommissionPct : 0")
(3)Employees.count("CommissionPct != null && CommissionPct > 300 ? CommissionPct : null")

5. 使用adf.error抛出异常或警告
if (newValue > 1000){
if (newValue > 5000){
adf.error.raise("SALARY_TOO_HIGH_ERROR")
return false
}
adf.error.warn("SALARY_LIMIT_WARNING")
return true
}else{
       return true
}

Project 下载:ADF_Groovy(2).7z

没有评论: