小技巧 - 判断条件中,如何比较字段值
K/3 Cloud,很多地方允许设置条件,根据条件解析结果,决定功能是否处理,如实体服务规则执行条件、操作校验条件、反写规则执行条件、工作流连线跳转条件等。
条件中,允许使用单据上的字段,与常量值进行比较。但不同的字段类型,允许比较的常量值会有很大不同,本帖尝试对此介绍一二。
例1:普通文本字段,与之比较的字符串,需要使用单引号括起
F_JD_Text1 = '文本内容'
搜索字段中是否包含某段文本
F_JD_Text1.find('文本内容') >= 0
更多文本处理,请参阅:
https://vip.kingdee.com/article/161317
学习笔记 - Python字符串操作
例2:多语言文本字段
多语言文本字段,在内存中,并不是简单的字符串,而是一个复杂对象LocalValue类型,其中包含了各种语言下的字段内容。
可以使用如下语句把多语言对象,转换为简单文本字符串:
1. str(F_JD_MulLangText) = '文本内容';
2. str(F_JD_MulLangText).find('文本内容') >= 0;
例3:数值字段,直接与数值比较
F_JD_Decimal1 = 1
例4: 复选框字段,必须与true, false比较,不能与0,1比较
F_JD_CheckBox1 = true and F_JD_CheckBox2 = false
例5:下拉列表字段
下拉列表字段,存储的是枚举项,显示的是枚举名称,公式中,需要与枚举项进行比较
如F_JD_Combo1绑定的枚举类型为价格类型,有两个枚举项('1' : 到岸价; '2' : 出厂价)
F_JD_Combo1 = '1'
例6:日期字段,字段值为日期型,不能与字符串常量进行比较。
可以采用公用函数,把日期转换为字符串进行比较:
F_JD_Date1.ToString('yyyy-MM-dd') = '2016-07-07'
实际上,日期字段通常不会与常量值比较,常见的是与一些系统变量进行比较。
如判断日期是否大于今天,'今天'需要用系统变量替代
F_JD_Date1 > @currentshortdate
附:其他可用的系统变量(大小写必须一致)
@currentshortdate : 今天,短日期,不包含时间
@currentlongdate : 此时,长日期,包含时间
@maxdate : 系统最大时间
@mindate : 系统最小时间
@userid : 当前登录用户内码
@currentorgid : 当前登录组织内码
@null : null 值
@getstkclosedate : 未知
另外,系统支持对日期字段值进行计算:
计算日期差: (F_JD_Date1 - F_JD_Date2).Days
增加天数:F_JD_Date1.AddDays(-1)
增加月份:F_JD_Date1.AddMonths(-1)
增加年份:F_JD_Date1.AddYears(-1)
取每个月最后一天(复杂):
FENDDate = FSTARDate.AddDays(1-float((FSTARDate.ToString("dd")))).AddMonths(+1).AddDays(-1)
此公式解读:
FENDDate = {2016-07-07}.AddDays(1-float(({2016-07-07}.ToString("dd")))).AddMonths(+1).AddDays(-1)
FENDDate = {2016-07-07}.AddDays(1-float('07')).AddMonths(+1).AddDays(-1)
FENDDate = {2016-07-07}.AddDays(1-7).AddMonths(+1).AddDays(-1)
FENDDate = {2016-07-01}.AddMonths(+1).AddDays(-1)
FENDDate = {2016-08-01}.AddDays(-1)
FENDDate = {2016-07-31}
更多关于日期计算的,请参阅:
https://vip.kingdee.com/article/285117969850556324
分享:实体服务规则实现日期计算功能
例7:基础资料字段
基础资料字段,F_JD_Base1返回的是一个复杂对象 BaseFieldDynamicRow,包含了很多的属性,不能与一个简单常量进行比较。
如 F_JD_Base1 = '资料名称',达不到预期效果。
需要明确的指定属性与常量值进行比较:
F_JD_Base1.Id = 100001
F_JD_Base1.FNumber = 'GW0001'
F_JD_Base1.FName = '采购员'
特别说明:
1. 公式中需要用到的基础资料属性,必须在字段的引用属性中添加;
2. 如果指定的属性FProperty,也是一个基础资料,F_JD_Base1.FPropery 返回的是DynamicObject对象,需要使用['PropName'],进一步确定具体的属性值
F_JD_Base1.FProperty['Id'] = 100001
F_JD_Base1.FProperty['Number'] = 'GW0001'
F_JD_Base1.FProperty['Name'].ToString() = '采购员'
例8:单据体字段
单据体中的字段,公式取到的是一个集合,不能直接跟常量进行比较。
需要lambda表达式,对单据体行,进行循环,逐行取基础资料字段值进行比较:
len(filter(lambda x : (x.F_JD_Base.FProperty['Name'].ToString() = '采购员'), FEntity)) > 0
说明:
FEntity是单据体标识,公式中取到的是 BOSDynamicRow 集合
x 代表单据体当前行,类型为BOSDynamicRow,允许直接使用"."取字段值
F_JD_Base.FProperty['Name'] 返回的是多语言文本对象,需要使用ToString()函数,转换成纯文本
例9:基础资料单据体属性值
如需对基础资料字段,单据体中属性进行比较,也需要使用lambda进行循环:
len(filter(lambda x: ( x['Post']['Name'].ToString() = '璧山分公司总经理' ), FStaffId.PostEntity)) > 0
说明:
FStaffId.PostEntity中,PostEntity 是基础资料单据体的Orm实体名
FStaffId.PostEntity 返回值,是DynamicObject集合,需要通过x['PropName']的方式,取各属性值
常见问题:
工作流连线,设置了非常复杂的条件,导致系统当掉
1. 任务处理界面打不开
2. 任务提交后,把工作流引擎卡死,其他所有流程都停止,不能正常处理。
引起上述问题的连线条件,对往来单位名称,使用 Or 拼接了非常多的单位,类似于
往来单位.名称 = '单位1' or 往来单位.名称 = '单位2' or 往来单位.名称 = '单位3'
建议通过 in 语句进行简化:
往来单位.名称 in ['单位1', '单位2', '单位3']
单据转换规则,如何对单据体多个字段进行运算,然后求和
背景说明
假设,单据头字段为FTotal
单据体字段有F1, F2, F3,需要对单据体行进行 (F1 + F2) / F3,然后把此结果求和,设置到单据头FTotal字段中
配置公式
FTotal = sum(map(lambda x : (x.F1 + x.F2 ) / x.F3, FEntity))
公式说明
1. lambda x: (x.F1 + x.F2) / x.F3
这相当于定义一个函数,传入x,返回(x.F1 + x.F2) / x.F3
2. map(fun, FEntity)
相当于对FEntity集合,进行循环,逐行经过fun函数的处理,返回结果构成一个新集合
3. sum(arrays)
对新产生的集合,进行合计
等效于
FTotal = sum((x.F1 + x.F2) / x.F3 for x in FEntity)
小技巧 - 判断条件中,如何比较字段值
本文2024-09-23 03:37:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-159988.html