Dorado 5 : 5.17.MasterLink (RF1)

Dorado中的MasterLink主要用于记录集的动态参数赋值,在dorado开发中,我们经常会定义dataset的parameters()属性集合以辅助系统的开发。如下的参数定义:

<Dataset id="dataset1" type="Custom">
<MasterLink />
<Fields>
<Field name="field1">
<Properties />
</Field>
<Field name="field2">
<Properties />
</Field>
</Fields>
<Parameters>
<Parameter name="p1" value="value1" />
<Parameter name="p2" value="value2" />
</Parameters>
<Properties />
</Dataset>

以上我们是通过静态的方式设定参数p1的value为value1,参数p2的value为value2。
这种处理方式只适合与业务逻辑相对简单的应用中。在一些复杂的应用中我们需要动态的设定其中的参数值。MasterLink就属于动态设定参数值的一种处理方式。
MasterLink可以定义将另外一个dataset中的字段值作为当前dataset中指定的参数值。该种应用方式在DBDataset的动态参数赋值中已经有原理上的说明。这儿不再重复。

常用应用举例

明细表


图表 63
上图是一个典型的明细表的例子。当用户在上图的分公司表格中选择不同的分公司时,下方的员工数据会发生自动的变化。该范例你也可以在如下的URL中在线体验:

http:// 61.151.239.187/dorado5/new-feature/new-dataset.jsp

这里特别注意的是: 从表中的员工信息并不是一次性的从服务器上下载下来的, 而是随着主表当前记录的变化而动态的从服务器上下载的.这一点我们也可以通过控制台中的日志得到证明,当我们将分公司表格中的激活行从北京分公司移动到上海分公司时,我们就可以看到如下的系统日志输出:

[dorado] 12:57:56,812 DEBUG SELECT
employee.employee_id,
employee.employee_name,
employee.dept_id,
employee.sex,
employee.married,
employee.birthday,
employee.salary,
employee.degree,
employee.email,
employee.web,
employee.cmnt
FROM
employee
LEFT OUTER JOIN dept dept on (employee.dept_id = dept.dept_id)
WHERE
(dept.branch_id = ?)

明细表在应用系统中会大量的存在,并且根据应用的需求会有不同的变化,例如如下的几个典型应用:

应用界面一:


图表 64
以上应用中产品信息表为合同的明细表,在线体验:

http://61.151.239.187/dorado5/training/ui/contract-query.jsp

在该页面中选者一个合同并双击表格当前行就会进入到上面的合同明细表中。

应用界面二:


图表 65
以上应用中右边的员工表与左边的树之间是明细关系。在应用中我们可以选择树中的不同节点,右边的员工表会发生自动的变化。当我们选择北京软件研发部时,表格中就会显示北京软件研发部的所有员工。当我们选择上海软件研发部的时候,表格中就会自动地显示上海软件研发部的员工列表。
在线体验:

http://61.151.239.187/dorado5/new-feature/new-tree.jsp



图表 66
上图中树节点中第一层节点显示分公司信息,第二层节点显示部门信息,第三层节点显示员工信息。
这种类型的树在dorado中都是通过MasterLink技术实现的。
您可以通过如下的方式在线体验:

http://61.151.239.187/dorado5/new-feature/new-tree.jsp

当然了树在应用中也会有不同的变种,如下图:

图表 67
在上图的树中我们可以看到一个产品分类下的产品节点,该树的特殊之处在于产品分类本身是一个递归表,表结构如下:

CREATE MEMORY TABLE CATEGORY(
CATEGORY_ID VARCHAR(20) NOT NULL PRIMARY KEY,
CATEGORY_NAME VARCHAR(50),
PARENT_ID VARCHAR(20)
)

在上述的表结构中我们可以看到一个字段PARENT_ID,表格中的数据是通过PARENT_ID字段的关联关系确定上下级别关系。而产品与产品分类的关系如下:

CREATE MEMORY TABLE PRODUCT(
PRODUCT_ID VARCHAR(20) NOT NULL PRIMARY KEY,
PRODUCT_NAME VARCHAR(50) DEFAULT NULL,
CATEGORY_ID VARCHAR(20) DEFAULT NULL
)

产品表中存在CATEGORY_ID与产品分类表外键关联。
对于这种类型的树,产品与产品分类的树形结构数据展示在dorado开发当中就可以通过MasterLink实现。
在线体验:

http://61.151.239.187/dorado5/training/ui/product-tree.jsp


非DBDataset如何使用MasterLink?

MasterLink并不是DBDataset专有的,这是一个所有类型的Dataset都支持的处理机制,与DBDataset不同,在其他类型的Dataset中我们无法通过Dorado Studio提供的设计器设计诸如AutoSqlDataset中的MatchRule,或在SqlDataset的SQL中设定变量名。
对于其他类型的dataset一般来说都是通过监听器或与dorado结合的负责数据导入的类中处理参数。
例如listener中的处理代码:

ParameterSet parameters = (ParameterSet) daaset.parameters();
String dept_id = parameters.getString("dept_id");
List employees = null;
if (StringHelper.isNotEmpty(dept_id)) {
employees = employeeManager.getEmployeesByDeptId(dept_id);
}

dataset.fromDO(employees);

上述代码中employeeManager为一个业务bean的实例对象,提供了getEmployeesByDeptId()方法获取对应部门的下属员工。
附加Hibernate范例代码:

String hsql = "";
ParameterSet parameters = (ParameterSet) daaset.parameters();
String dept_id = parameters.getString("dept_id");

if (StringHelper.isNotEmpty(parentId)) {
hsql = "from Employee e where e.dept.id='" + dept_id
+ "' order by e.id";
}

List employees = hibernateTemplate.find(hsql);

dataset.fromDO(employees);