服务器端脚本演示
服务器端脚本
目录
服务器端脚本说明 服务器脚本中函数的使用 服务器脚本中数据集的使用 参数传递 程序调试
服务器端脚本说明
服务器端脚本使用JavaScript语法, 和客户端脚本 一致;服务器端脚本无法操作浏览器的任何控件,只 能对提交的数据集进行操作,数据集中的方法也并 不是所有的方法都可以调用,所有事件/表格/打开 等操作的方法都不能使用。 服务器端脚本的优点:服务器端脚本能使存盘与 SQL执行处于同一事务当中,可用于批量执行多条 SQL语句,如在特定条件循环条件下的添加、修改 、删除操作。通常用于处理复杂逻辑或需要批量 处理的数据交互问题
服务器端脚本说明
服务器脚本运行在应用服务器端,通常在表单保存 form.save()或dataset.save() 调用,将数据提交到 Tomcat服务器后才会执行。 在存储逻辑中,有执行位置的概念(前,中,后,与 AddSubmitTask中的前中后任务一致,不过会在 AddSubmitTask中的任务之前执行),因此,系统预 置了3个固定的函数,只有编写了相应的函数,在 执行到某个位置时才会执行相应。
服务器端脚本函数
服务器脚本使用JavaScript语法,语法和客户端脚本一致;服务器端 脚本无法操作浏览器的任何控件,只能对提交的数据集进行操作, 但并非数据集的所有属性和方法都可以引用,只有少数一部分。属 性如下: Dataset1.FieldCount Dataset1.RecordCount Dataset1.RecNo Dataset1.field(“xxx”).value (这里value的v必须小写) Dataset1.getValueAt(x, y) //Dataset1.getValue(x)//不推荐使用 Dataset1.setValueAt(x, y, v) Dataset1.setValue(x, v) Dataset1.getRowState([int pos]) MoveFirst(), MoveNext(), MovePrev() MoveLast(), SetPos(x)
服务器端脚本函数
其他能调用的方法 DBUtil uniqueValue, update,batchUpdate,select FormUtil.getIdentify(””,””,””) 建议在服务器脚本中,参数不要省略 Utility isSpace,toJSONString,trim DBUtil, FormUtil这两个方法的调用都在数据存储的数据库 事务中。 不能调用SQL集合中的SQL语句。 不能调用本地化资源里的参数
服务器端脚本函数
数据集值对比时需要在值后面加上一个字符串,目的是把对 象转换成字符串;例如:var entid = dataset.field(“entid”).value + “”;
//一次执行多条sql语句 var params = {}; params.aa = ["uf_onload_sql1", {org: id}]; params.bb = ["uf_onload_sql2", {org: id}]; var results = DBUtil.batchUniqueValues(params); if (results.aa == "Y") { }
参数传递
客户端脚本向服务器脚本中传递参数 客户端: dataset1.setProperty("form_action",form.parameters.actio n); 服务器端: dataset1.getProperty("form_action");
参数传递
如果传的是数组 客户端: var pk = []; for (var i = 0; i < database.recordCount; i++) { pk[i] = database.getValueAt(i,0); } ds_save.setProperty("pk", pk); 服务器端: 先进行处理:var pk = eval("(" + ds_save.getProperty("pk") + ")"); 如果不进行处理,默认传过来的是一个字符串 使用: var fieldName = Utility.sqlEncode(pk[j]); Utility.sqlEncode(xxx)主要用来防止恶意的SQL攻击
function before_save() function among_save() function after_save()
服务器端脚本说明
在dataset1中,调用 AddSubmitTask(“sql1”,“before”) , AddSubmitTask(“sql2”, “among”), AddSubmitTask(“sql3”, “after”) 同时服务器端脚本定义了 function among_save() {} function after_save() {} function before_save() {} 那么在表单存盘时,执 行的顺序是: before_save() 添加事务before sql1 among_save() 添加事务among sql2 after_save() 添加事务after sql3
服务器端脚本函数
Form.save(),需要注意几点: 1)主数据集,可以直接使用,存盘时传到服务器端的数据集必须 form绑定的数据集;如果表单类型为Bill,明细数据集写上存储目标 表,同时也可以将明细数据集传到服务器端。(存储目标表) 2)非主数据集,要设置目标存储表,如果不需要在存储目标表里存 数据,可以设置一个绝对不成立的过滤条件(比如1=2),把子 数据集的临时表设为True Dataset.save()(通过循环设置数据集的每行的行状态) Dataset.setRowState(); From.saveDatasets(ds1,ds2,…dsN) (伪存盘,设置主键(shortGUID),存储目标表过滤,开启临时表) FormUtil.executeServerScript(“函数名称”,数据集1,数据集2,...) pf_billdel(数据集) 删除工作流:function delete_bill(){}