Dorado 5 : 4.2.数据提交(T22)

概述

该章节讲述了一个典型的数据提交页面,可以利用复选框来同时更新或删除记录。同时展示了UpdateCommand的submitScope的灵活性。
本章节讲述如何开发Dorado Sample Center中的数据提交,目前在示例中心->分类示例->数据处理目录下面。示例链接如下:

 

准备工作

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

开发步骤

添加Dataset

步骤1:新建一Common ViewModel,文件名为update。
步骤2:添加一AutoSqlDataset,选中表Employee,选中的字段如下图所示:

AutoSqlDataset属性如下:

属性

id

datasetEmployee

originTable

EMPLOYEE

keyFields

employee_id

注意:此处的keyFields必须,否则无法对Employee的表进行保存。

 

步骤3:选中datasetEmployee的Fields节点,给datasetEmployee添加一个DummyField,即虚拟字段,添加DummyField的按钮位置如下:

设置DummyField的属性如下:

属性

name

select

dataType

boolean

步骤4:新建一AutoSqlDataset,选中表Log,选中全部字段。AutoSqlDataset的id设置为datasetLog。

添加DataTable

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

属性

id

tableEmployee

dataset

datasetEmployee

width

100%

showHScrollBar

false

height

100%

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

属性

id

tableLog

dataset

datasetLog

width

100%

showHScrollBar

false

步骤4:点击tableLog生成字段按钮。

添加ViewModel Implementation

步骤1:选中根节点View,点击Open Implementation的按钮,如下图所示:

步骤2:会提示当前View没有Implementation,选择yes,则出现如下对话框,在这里直接点击OK即可。

步骤3:编写updateViewModel代码,代码如下:

import java.util.Date;
import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.common.MessageHelper;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.data.ParameterSet;
import com.bstek.dorado.data.Record;
import com.bstek.dorado.data.RecordIterator;
import com.bstek.dorado.data.db.DBStatement;
import com.bstek.dorado.utils.variant.DataType;
import com.bstek.dorado.view.DefaultViewModel;
/**
 * updateViewModel
 */
public class updateViewModel extends DefaultViewModel {
    public void deleteSelection(ParameterSet parameters,
            ParameterSet outParameters) throws Exception {
        int count = 0;
        Dataset datasetEmployee = getDataset("datasetEmployee");
        RecordIterator iter = datasetEmployee.recordIterator();
        while (iter.hasNext()) {
            Record record = iter.nextRecord();
            datasetEmployee.deleteRecord(record);
            count++;
        }
        MessageHelper.addMessage(DoradoContext.getContext(), "共有" + count
                + "条记录被删除!");
        super.doUpdateData(parameters, outParameters);
    }
    public void raiseSalary(ParameterSet parameters, ParameterSet outParameters)
            throws Exception {
        Dataset datasetEmployee = getDataset("datasetEmployee");
        if (datasetEmployee.getCurrent() != null) {
            float salary = datasetEmployee.getFloat("salary") + 500;
            datasetEmployee.setFloat("salary", salary);
            MessageHelper.addMessage(DoradoContext.getContext(), "["
                    + datasetEmployee.getString("employee_name") + "]已加薪至"
                    + salary + "!");
        }
        super.doUpdateData(parameters, outParameters);
    }
    public void saveAndLog(ParameterSet parameters, ParameterSet outParameters)
            throws Exception {
        int count = 0;
        DBStatement statement = new DBStatement();
        statement.setSql(DBStatement.INSERT, "LOG");
        try {
            Dataset datasetEmployee = getDataset("datasetEmployee");
            RecordIterator ri = datasetEmployee.recordIterator();
            ri.setVisibility(Dataset.FILTER_CHANGED); // 确保遍历到每一条有变化的记录
            while (ri.hasNext()) {
                Record record = ri.nextRecord();
                String operation;
                switch (record.getState()) {
                case Record.STATE_NEW:
                    operation = "[Insert] ";
                    break;
                case Record.STATE_MODIFIED:
                    operation = "[Modify] ";
                    break;
                case Record.STATE_DELETED:
                    operation = "[Delete] ";
                    break;
                default:
                    operation = "[Unknown]";
                }
                statement.parameters().setDataType("MSG_TIME",
                        DataType.DATETIME);
                statement.parameters().setDate("MSG_TIME", new Date());
                statement.parameters().setString("MSG",
                        operation + " " + record.getString("employee_name"));
                statement.execute();
                count++;
            }
        } finally {
            statement.close();
        }
        super.doUpdateData(parameters, outParameters);
        if (count > 0) {
            MessageHelper.addMessage(DoradoContext.getContext(), "已添加了\""
                    + count + "\"条日志记录!");
        }
    }
}

添加Command和Button

步骤1:添加一UpdateCommand,属性如下:

属性

id

commandSave

async

true

步骤2:选中commandSave下的DatasetInfos,点击添加DatasetInfo按钮,位置如下:

添加DatasetInfo以后,设置Dataset属性为datasetEmployee。
步骤3: 添加一Button,属性如下:

属性

id

buttonSave

value

保存

command

commandSave

步骤4:添加一UpdateCommand,属性如下:

属性

id

commandDelete

method

deleteSelection

步骤5:为commandDelete添加DatasetInfo,设置其属性如下:

属性

dataset

datasetEmployee

submitScope

selected

步骤6:添加一Button,属性如下:

属性

id

buttonDelete

value

删除选中记录

command

commandDelete

步骤7:添加一UpdateCommand,属性如下:

属性

id

commandRaiseSalary

method

raiseSalary

步骤8:为commandRaiseSalary添加一DatasetInfo,属性如下:

属性

dataset

datasetEmployee

submitScope

current

步骤9:添加一Button,属性如下:

属性

id

buttonRaiseSalary

value

为当前员工加薪

command

commandRaiseSalary

步骤10:添加一UpdateCommand,属性如下:

属性

id

commandSaveAndLog

method

saveAndLog

步骤11:给commandSaveAndLog的onSuccess事件添加如下代码:

datasetLog.flushData();

步骤11:给commandSaveAndLog添加两个DatasetInfo,其dataset分别设置为datasetEmployee和datasetLog。
步骤12:添加一Button,属性如下:

属性

id

buttonSaveLog

value

保存并记录日志

command

commandSaveAndLog

创建Jsp页面

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

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title>更新</title> 
 </head> 
 <body> 
 <d:View config="update"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:Button id="buttonSave" /> 
 <d:Button id="buttonDelete" /> 
 <d:Button id="buttonRaiseSalary" /> 
 <d:Button id="buttonSaveLog" /> 
 </d:Pane> 
 <d:Pane position="center"> 
 <d:SplitPanel id="sp1" orientation="vertical" position="70%" width="100%" height="100%" showButtons="true"> 
 <d:DataTable id="tableEmployee" /> 
 <d:Splitter /> 
 <d:DataTable id="tableLog" /> 
 </d:SplitPanel> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

查看运行效果

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

知识点

关于Dataset的DummyField,可以参考《Dorado 5用户指南v1.1》的5.1.3.2节。关于ViewModel实现,可以参考《Dorado 5用户书册v1.1》的第5章。关于CommandUpdate,可以参考《Dorado 5组件详解 v1.1》的C部分第二章。