添加Dataset
步骤1:添加一Common ViewModel,文件名为ContractMaintain。
为ContractMaintain的<<function>>添加如下代码:
// 计算所有记录金额,毛利以及合计
function calcAll() {
datasetContractItems.disableControls();
try {
var record = datasetContractItems.getFirstRecord();
while (record) {
calcItem(record);
record = record.getNextRecord();
}
}
finally {
datasetContractItems.enableControls();
}
}
// 计算单条记录中的金额,毛利..
function calcItem(record) {
var num = record.getValue("num");
var sum = record.getValue("price") * num;
var cost_sum = record.getValue("cost") * num;
record.setValue("sum", sum);
record.setValue("cost_sum", cost_sum);
record.setValue("profit", sum - cost_sum);
record.post();
}
// 处理产品选择,向datasetContractItems中添加产品
function processSelectedProduct(nodes) {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
datasetContractItems.insertRecord();
datasetContractItems.copyRecord(node.getRecord());
datasetContractItems.setValue("item_id", "");
datasetContractItems.postRecord();
}
}
为ContractMaintain的onDatasetsPrepared事件添加如下代码:
datasetContractItems.parameters().setValue("contract_no","${Request.contract_no}");
datasetContractItems.flushData();
calcAll();
步骤2:添加一AutoSqlDataset,选中contract_items表格,选择所有字段,该Dataset属性设置如下:
属性 | 值 |
|---|---|
id | datasetContractItems |
keyFields | item_id |
originTable | contract_items |
retrieveAfterUpdate | true |
为datasetContractItems添加一BaseMatchRule,属性设置如下:
属性 | 值 |
|---|---|
datatype | string |
escapeEnabled | false |
level | 1 |
operator | = |
originField | contract_no |
originTable | CONTRACT_ITEMS |
value | :contract_no |
为datasetContractItems添加一Join,属性设置如下:
属性 | 值 |
|---|---|
keyFields | product_id |
name | product |
originTable | PRODUCT |
sourceKeyFields | product_id |
sourceTable | CONTRACT_ITEMS |
为datasetContractItems添加一DatasetListener,代码如下:
import com.bstek.dorado.data.AbstractDatasetListener;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.data.Record;
import com.bstek.dorado.data.db.DBStatement;
/**
* Contract_datasetContractListener
*/
public class ContractMaintain_datasetContractItemsListener extends
AbstractDatasetListener {
public boolean beforeUpdateData(Dataset dataset) throws Exception {
// 注意: 本例中使用的新建主键值的方法仅用于演示, 在实际应用中并不可取.
DBStatement stMaxId = new DBStatement();
stMaxId.setSql("SELECT MAX(item_id) FROM contract_items");
long maxId = 0L;
try {
maxId = stMaxId.query().getLong(0);
} finally {
stMaxId.close();
}
dataset.moveFirst();
while (!dataset.isLast()) {
if (dataset.getRecordState() == Record.STATE_NEW) {
dataset.setLong("item_id", ++maxId);
}
dataset.moveNext();
}
return true;
}
}
为datasetContractItems添加3个Dummy Field,属性设置如下:
dataType | label | name | readOnly | supportsSum |
|---|---|---|---|---|
float | 毛利 | profit | true | true |
float | 总成本 | cost_sum | true | true |
float | 总金额 | sum | true | true |
为datasetContractItems的afterScroll事件添加如下代码:
buttonDelete.disabled = (datasetContractItems.getCurrent() == null);
为datasetContractItems的afterChange事件添加如下代码:
switch (field.getName()) {
case "num":;
case "price":;
case "cost": {
calcItem(record);
break;
}
}
步骤3:添加一AutoSqlDataset,选择contract表格,选择所有字段,该Dataset属性设置如下:
属性 | 值 |
|---|---|
id | datasetContract |
keyFields | contract_no |
originTable | contract |
retrieveAfterUpdate | true |
为其添加一Join条件,属性设置如下:
属性 | 值 |
|---|---|
joinMode | select_expression |
keyFields | employee_id |
name | employee |
originTable | EMPLOYEE |
sourceKeyFields | owner |
sourceTable | CONTRACT |
为其添加5个BaseMatchRule,属性如下:
dataType | escapeEnabled | operator | originField | table | value |
|---|---|---|---|---|---|
string | true | like | contract_no | contract | :contract_no |
string | true | = | owner | contract | :owner |
string | true | = | customer | contract | :customer |
string | true | >= | sign_date | contract | :sign_date1 |
string | true | <= | sign_date | contract | :sign_date2 |
步骤4:添加一AutoSqlDataset,选择customer表格,选择所有字段,该Dataset的属性设置如下:
属性 | 值 |
|---|---|
id | datasetCustomer |
keyFields | custom_id |
originTable | customer |
添加合同信息部分
步骤1:添加一AutoForm,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetContract |
defaultControlWidth | 200 |
id | formContract |
步骤2:添加一ListDropDown,属性设置如下:
属性 | 值 |
|---|---|
autoDropdown | true |
id | dropdownPalce |
为dropdownPalce添加如下图所示的ListItem:

其中"上海"、"北京"等都是设置的ListItem的value,name设置为空即可。
步骤3:添加一CustomDropDown,属性设置如下:
属性 | 值 |
|---|---|
fixed | true |
height | 250 |
id | datasetEmployee |
path | drop-down-employee-tree.jsp |
readFields | employee_id,employee_name |
width | 200 |
writeFields | owner,owner_name |
步骤4:添加一DatasetDropDown,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetCustomer |
fixed | true |
id | dropdownCustomer |
labelField | custom_name |
mapValue | true |
valueField | custom_id |
添加显示合同产品部分
添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetContractItems |
fixedColumn | 2 |
height | 100% |
id | tableContractItems |
showFooter | true |
width | 100% |
选中tableContractItems,点击字段生成按钮。
对其中的字段进行设置,最后结果如下图所示:

添加产品操作部分
步骤1:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonCopyAdd |
value | 复制并添加 |
为buttonCopyAdd的onClick事件添加如下代码:
var recordForCopy = datasetContractItems.getCurrent();
datasetContractItems.insertRecord();
if (recordForCopy != null) {
datasetContractItems.copyRecord(recordForCopy);
}
步骤2:添加一DropDown ViewModel,文件名为ProductTreeSelect。
添加一AutoSqlDataSet,选择Category表,选择Category的所有字段。AutoSqlDataSet的属性设置如下:
属性 | 值 |
|---|---|
id | datasetCategory |
originTable | CATEGORY |
为datasetCategory添加一BaseMatchRule,BaseMatchRule的属性设置如下:
属性 | 值 |
|---|---|
level | 1 |
table | CATEGORY |
operator | = |
originField | PARENT_ID |
value | :PARENT_ID |
为datasetCategory添加一Parameter,name设置为PARENT_ID,value设置为$null。
为datasetCategory的beforeDelete事件添加如下代码:
var category_id = parseInt(record.getValue("category_id"));
if (record.getString("parent_id") == "" &&
(category_id == 1 || category_id == 2 || category_id == 3)) {
return "处于演示数据的安全考虑,本例不允许您删除顶层的分类!";
}
添加一AutoSqlDataset,选择Product表,选择所有字段,属性设置如下:
属性 | 值 |
|---|---|
id | datasetProduct |
originTable | product |
keyFields | product_id |
为AutoSqlDataset添加三个BaseMatchRule,属性设置分别如下:
属性 | 值 |
|---|---|
level | 1 |
dataType | string |
value | :category_id |
escapeEnabled | true |
table | PRODUCT |
originField | category_id |
operator | = |
属性 | 值 |
|---|---|
level | 1 |
dataType | string |
value | :product_id |
escapeEnabled | true |
table | PRODUCT |
originField | product_id |
operator | = |
属性 | 值 |
|---|---|
level | 1 |
dataType | string |
value | :product_name |
escapeEnabled | true |
table | PRODUCT |
originField | product_name |
operator | like |
添加一DataTree,属性设置如下:
属性 | 值 |
|---|---|
id | treeProduct |
height | 100% |
width | 100% |
draggable | true |
为DataTree添加一Recursive Tree Level,属性设置如下:
属性 | 值 |
|---|---|
name | category |
dataset | datasetCategory |
recursiveKeyFields | category_id |
recursiveKeyParameters | parent_id |
labelField | category_name |
detailKeyParameters | parent_id |
masterKeyFields | category_id |
checkable | true |
为product添加一Simple Tree Level,属性设置如下:
属性 | 值 |
|---|---|
name | product |
dataset | datasetProduct |
masterKeyFields | category_id |
detailKeyParameters | category_id |
labelField | product_name |
hasChild | false |
添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonInsert |
value | 添加 |
width | 80 |
为buttonInsert的onclick事件添加如下代码:
var nodes = treeProduct.getAllCheckedNodes(); treeProduct.clearAllCheckedState(); parent.processSelectedProduct(nodes);
添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonInsertAndClose |
value | 添加并关闭 |
为buttonInsertAndClose的onClick事件添加如下代码:
buttonInsert.click(); SubWindow.hideParent();
为该CustomDropDown ViewModel生成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="ProductTreeSelect"> <d:Layout type="border"> <d:Pane position="center"> <d:DataTree id="treeProduct" /> </d:Pane> <d:Pane position="bottom" align="right"> <d:Layout type="Hflow"> <d:Pane> <d:Button id="buttonInsert" /> </d:Pane> <d:Pane> <d:Button id="buttonInsertAndClose" /> </d:Pane> </d:Layout> </d:Pane> </d:Layout> </d:View> </body> </html>
步骤3:回到ContractMaintain中来,添加一RequestCommand,属性设置如下:
属性 | 值 |
|---|---|
id | commandShowProductDialog |
path | product-tree-select.jsp |
为commandShowProductDialog的Frame的节点设置属性如下:
属性 | 值 |
|---|---|
center | true |
target | _subwindow |
步骤4:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
command | commandShowProductDialog |
id | buttonBatchAdd |
value | 批量添加产品 |
步骤5:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
disabled | true |
id | buttonDelete |
value | 删除产品 |
为buttonDelete的onclick事件添加如下代码:
datasetContractItems.deleteRecord();
添加保存返回部分
步骤1:添加一UpdateCommand,id设置为commandSave。在commandSave的DatasetInfos节点下面添加两个DatasetInfo,分别为datasetContract和datasetContractItems。
步骤2:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
command | commandSave |
id | buttonSave |
value | 保存 |
width | 80 |
步骤3:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonSaveAndBack |
value | 保存并返回 |
width | 120 |
为buttonSaveAndBack的onclick事件添加如下代码:
if (commandSave.execute()) {
open("contract-query.jsp", "_self");
}
步骤4:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonBack |
value | 返回 |
width | 80 |
为buttonBack的onclick事件添加如下代码:
open("contract-query.jsp", "_self");
创建Jsp页面
对ContractMaintain生成Jsp页面并进行编辑,最后结果如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head>
<title>
<%
out.print(("add".equals(request.getParameter("op")))?"新增合同":"查看/修改合同");
%>
</title>
</head>
<body>
<d:View config="ContractMaintain">
<d:Layout type="vflow" height="100%">
<d:Pane>
<d:AutoForm id="formContract" />
</d:Pane>
<d:Pane align="right">
<d:Layout type="Hflow">
<d:Pane>
<d:Button id="buttonCopyAdd" />
</d:Pane>
<d:Pane>
<d:Button id="buttonBatchAdd" />
</d:Pane>
<d:Pane>
<d:Button id="buttonDelete" />
</d:Pane>
</d:Layout>
</d:Pane>
<d:Pane height="100%">
<d:DataTable id="tableContractItems" />
</d:Pane>
<d:Pane align="right">
<d:Layout type="Hflow">
<d:Pane>
<d:Button id="buttonSave" />
</d:Pane>
<d:Pane>
<d:Button id="buttonSaveAndBack" />
</d:Pane>
<d:Pane>
<d:Button id="buttonBack" />
</d:Pane>
</d:Layout>
</d:Pane>
</d:Layout>
</d:View>
</body>
</html>
浏览运行效果
启动服务器后,浏览contract-query.jsp页面,效果如下图所示:

在上方的AutoForm中输入查询条件后,点击查询,可以在下面看到结果。当点击下面表格中的合同号的链接,或者双击那条记录的话,可以跳转到如下页面:

在该页面可以进行合同中产品的维护以及进行保存。
知识点
该示例为dorado的综合应用,无新知识点。