DataWindow列表达式扩展服务
- 支持给普通列绑定表达式(取代在ItemChanged里做计算的传统做法)
- 支持宏变量和宏函数调用
- 支持控制列表达式的计算触发条件(由哪些列变更后触发,并且可以约束是否为手动输入,还可以控制递归)
- 一个列可以绑定多个表达式(指定由什么列修改了数据则触发对应的表达式计算)
- 支持引用其他DW的表达式参与混合计算 (跨DW表达式计算)
- 支持输出表达式计算的调用栈
- 支持运行时修改表达式
定义普通类型变量:
of_AddVar('变量名',{内置数据类型的值})
定义表达式变量:
of_AddVarExp('变量名','{任意DW支持的表达式,同时也支持引用其他变量}')
引用外部变量:
dw_src.ColumnExp.of_AddVar('外部变量名',123)
of_AddForeignVar('外部变量名',dw_src) //'外部变量名'定义在dw_src下,此处只引用其结果
of_AddVarExp('本地变量名','$$外部变量名') //需要使用动态展开
静态展开是在表达式设置的时候将对应变量的值进行替换,后续变量的值改变不会影响对应表达式的值的改变
语法: $变量名
//定义变量:"本月读数",值为DW表达式:"5"
dw_1.ColumnExp.of_AddVarExp("本月读数","5")
//定义变量:"上月读数",值为数值:0
dw_1.ColumnExp.of_AddVar("上月读数",0)
//此处静态展开本月读数和上月读数, 计算结果固定为5
dw_1.ColumnExp.of_AddvarExp("num1","$上月读数 + $本月读数")
//此处修改变量的值不会影响到num1的计算结果,始终为5
dw_1.ColumnExp.of_SetVar("上月读数", 1)
//重新计算第1行所有列的表达式
dw_1.ColumnExp.of_Calc(1)
动态展开是在表达式设置的时候以变量的形式进行计算,后续变量的值改变时会影响对应表达式的值的改变
语法: $$变量名
//定义变量:"本月读数",值为DW表达式
dw_1.ColumnExp.of_AddVarExp("本月读数","5")
//定义变量:"上月读数",值为数值0
dw_1.ColumnExp.of_AddVar("上月读数",0)
//此处静态展开上月读数和静态展开本月读书, 计算结果固定为5
dw_1.ColumnExp.of_AddvarExp("num1","$$上月读数 + $本月读数")
//此处修改变量的值会影响到num1的计算结果,结果将改变为6
dw_1.ColumnExp.of_SetVar("上月读数", 1)
//重新计算第1行所有列的表达式
dw_1.ColumnExp.of_Calc(1)
根据字符串所指定的变量名动态获取对应的值
语法: $$('变量名字符串')
dw_1.ColumnExp.of_AddVarExp("本月读数","5")
dw_1.ColumnExp.of_AddVar("上月读数",0)
dw_1.ColumnExp.of_AddVar("下月读数",10)
//此处静态展开上月读数和静态展开本月读书, 计算结果固定为5
dw_1.ColumnExp.of_AddvarExp("num1","$$上月读数 + $本月读数")
dw_1.ColumnExp.of_AddvarExp("num2","$$下月读数 + $本月读数")
//此处修改变量的值会影响到num1的计算结果,结果将改变为6
dw_1.ColumnExp.of_SetVar("上月读数", 1)
//n2 n3 为栏位
//当n2 > n3 时n1的对应num1表达式,否则为num2表达式
dw_1.ColumnExp.of_SetExp("n1","$$(if(n2 > n3 ,'num1','num2'))")
dw_1.ColumnExp.of_Calc(1)
n2
>n3
,n1
绑定num1
n2
<=n3
,n1
绑定num2
可以将函数定义在数据窗口的OnColumnExpInvokeMethod
中,然后在表达式中进行调用
语法: $函数名({参数列表})
- 设置表达式
dw_1.ColumnExp.of_SetVar("精度", 1)
//调用函数
dw_1.ColumnExp.of_SetExp("n1", "$FormatPrice(n2, $精度)")
- 实现
OnColumnExpInvokeMethod
事件
//表达式服务请求执行函数
choose case name
case "FormatPrice" //格式化金额
return Round(Double(args[1]),Long(args[2]))
end choose
可将函数名作为一个参数进行调用
语法: $$Invoke('函数名', {参数列表})
- 设置表达式
dw_1.ColumnExp.of_SetVar("精度", 1)
dw_1.ColumnExp.of_SetVar("单价格式化", "FormatPrice")
//调用
dw_1.ColumnExp.of_SetExp("n1", "$$Invoke($单价格式化, n2, $精度)")
- 实现
OnColumnExpInvokeMethod
事件
//表达式服务请求执行函数
choose case name
case "FormatPrice" //格式化金额
return Round(Double(args[1]),Long(args[2]))
end choose
dw_1.ColumnExp.of_AddVar("aa", 5) //定义一个变量
dw_1.ColumnExp.of_AddVarExp("bb", "$$aa + 5") //定义一个表达式变量
dw_1.ColumnExp.of_SetVar("aa", 6) //修改变量
dw_1.ColumnExp.of_SetVarExp("bb", "$a + 5") //修改变量表达式
dw_1.ColumnExp.of_SetExp("n1", "$$bb + $aa") //将表达式绑定列
dw_1.ColumnExp.of_SetExp("n2", "n1 + n3") //普通DW表达式绑定列
dw_1.ColumnExp.of_SetRelativeColumn("n2", {"n1"}) //n1的值变化的时候触发表达式计算
dw_1.ColumnExp.of_SetRelativeInputColumn("n2", {"n1"}) //只有当用户输入n1的时候触发表达式计算
更多奇妙用法请自行探索