Dorado 5 : 4.5.主从绑定2 (T22)

概述

主从绑定的概念在Dorado中是这么定义的,存在两个Dataset,有一个为主Dataset,有一个为从Dataset。当主Dataset进行变化的时候,从Dataset会根据主Dataset的变化来变化。
本示例用来展示Dataset中主从绑定,这一章节介绍如何进行主从表的同时更新。本示例链接如下:

 

准备工作

新建一工程MasterDetail,并且配置好数据库,具体步骤参考3.1.2节。

开发步骤

添加Dataset

步骤1:新建一Common ViewModel,文件名为MasterDetail。
步骤2:添加一AutoSqlDataset,选择TEST_MASTER,选择所有字段,AutoSqlDataset属性设置如下:

属性

id

datasetMaster

originTable

TEST_MASTER

keyFields

ID

步骤3:添加一AutoSqlDataset,选择TEST_DETAIL表格,选择所有字段,AutoSqlDataset的属性设置如下:

属性

id

datasetDetail

originTable

TEST_DETAIL

keyFields

ID

步骤4:为datasetDetail设置MasterLink如下:

属性

masterDataset

datasetMaster

masterKeyFields

ID

detailKeyFields

FK_ID

detailKeyParameters

FK_ID

 

添加DataTable

步骤1:添加一DataTable,属性设置如下:

属性

id

tableMaster

dataset

datasetMaster

width

100%

showHScrollBar

false

步骤2:选中tableMaster,点击自动生成字段按钮。
步骤3:添加一DataTable,属性设置如下:

属性

id

tableDetail

dataset

datasetDetail

showHScrollBar

false

width

100%

步骤4:选中tableDept,点击自动生成字段按钮。
步骤5:添加一DataPolit,属性设置如下:

属性

id

datapilotMaster

dataset

datasetMaster

步骤6:添加一DataPolit,属性设置如下:

属性

id

datapilotDetail

dataset

datasetDetail

 

添加Command和Button

步骤1:添加一UpdateCommand,id设置为commandSaveMasterAndDetail。为UpdateCommand添加2个DatasetInfo,Dataset分别设置为datasetMaster和datasetDetail。
步骤2:添加一Button,属性设置如下:

属性

id

buttonSave

value

主从表同时更新

command

commandSaveMasterAndDetail

 

添加ViewModel实现

步骤1:添加一ViewModel实现,选择弹出对话框中的doUpdata方法,如图所示:

步骤2:实现doUpate方法,最后生成的MasterDetailViewModel的代码如下:

import java.util.Date;
import com.bstek.dorado.common.*;
import com.bstek.dorado.data.*;
import com.bstek.dorado.view.*;
import com.bstek.dorado.view.data.*;
import com.bstek.dorado.view.control.*;
import com.bstek.dorado.data.db.DBStatement;
import com.bstek.dorado.utils.variant.VariantSet;
/**
 * MasterDetailViewModel
 */
public class MasterDetailViewModel extends DefaultViewModel {
    protected void doUpdateData(ParameterSet parameters,
            ParameterSet outParameters) throws Exception {
        ViewDataset datasetMaster = getDataset("datasetMaster");
        ViewDataset datasetDetail = getDataset("datasetDetail");
        // 注意: 本例中使用的新建主键值的方法仅用于演示, 在实际应用中并不可取.
        VariantSet varSet;
        DBStatement st = new DBStatement();
        try {
            st.setSql("SELECT MAX(id) FROM TEST_MASTER");
            varSet = st.query();
            long masterId = varSet.getLong(0);
            st.setSql("SELECT MAX(id) FROM TEST_DETAIL");
            varSet = st.query();
            long detailId = varSet.getLong(0);
            datasetMaster.moveFirst();
            while (!datasetMaster.isLast()) {
                if (datasetMaster.getRecordState() == Record.STATE_NEW) {
                    datasetMaster.setLong("id", ++masterId);
                }
                datasetMaster.setDouble("field2", Math.random() * 10000);
                datasetMaster.setDate("field3",
                        new Date(System.currentTimeMillis()));
                datasetDetail.moveFirst();
                while (!datasetDetail.isLast()) {
                    if (datasetDetail.getRecordState() == Record.STATE_NEW) {
                        datasetDetail.setLong("id", ++detailId);
                    }
                    datasetDetail.setDouble("field2", Math.random() * 10000);
                    datasetDetail.moveNext();
                }
                datasetMaster.moveNext();
            }
            super.doUpdateData(parameters, outParameters);
        } finally {
            st.close();
        }
    }
}

 

创建Jsp页面

生成Jsp页面以后再编辑一下布局,最后结果如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title>主从绑定2</title> 
 </head> 
 <body> 
 <d:View config="MasterDetail"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:Layout type="vflow"> 
 <d:Pane> 
 <d:Layout type="Hflow" width="100%" padding="0"> 
 <d:Pane> 
 <d:DataPilot id="datapilotMaster" /> 
 </d:Pane> 
 <d:Pane align="right"> 
 <d:Button id="buttonSave" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane> 
 <d:DataTable id="tableMaster" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane position="center"> 
 <d:Layout type="vflow"> 
 <d:Pane> 
 <d:DataPilot id="datapilotDetail" /> 
 </d:Pane> 
 <d:Pane> 
 <d:DataTable id="tableDetail" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

 

查看运行效果

启动服务器后,浏览效果如下:

在上图中,为上面的表格添加一条记录,为下面的表格添加多条记录,然后点击"主从表同时更新",就可以把主从表中的数据同时更新。

知识点

本例通过MasterLink和ViewModel实现来实现主从表的同时更新。关于MasterLink可以参考《Dorado 5用户指南 v1.1》的5.3.4.3节。关于ViewModel实现可以参考《Dorado 5用户指南 v1.1》的第六章。