添加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的综合应用,无新知识点。
Attachments:
worddavea7601d29e0d69b6728e53f9b76447fd.png (image/png)
worddavb62ad4989eb9e017237f2b8c15078cf2.png (image/png)
worddave8c09609e0bf887c4525bdf57f11304a.png (image/png)