Python脚本表达式原创
金蝶云社区-eris
eris
18人赞赏了该文章 4,687次浏览 未经作者许可,禁止转载编辑于2024年06月27日 18:06:26
summary-icon摘要由AI智能服务提供

本文本涉及多种数据处理和逻辑判断的规则表达式,涵盖日期字段赋值、文本字符判断、数据过滤、字段映射、单据转换与合并、日期计算、字符串处理、反写规则等多个方面。简要概述如下: 文本提供了日期字段根据不同条件赋值的表达式;文本及字段值存在性的判断方法;数据过滤和字段映射表达式,包括去除空值、截取字符串、条件赋值等;单据转换与合并的方法,包括去重、去空格、连接字段等;日期计算和字符串处理函数;以及反写规则的条件表达式,包括单据头与单据体的比较逻辑。整体内容展示了多种数据处理和逻辑判断的实现方式。

 1. 日期字段改变给另外一个日期字段赋值,比如日期为当月1-5号的取5号,5-15号的取15号,15-25号取25号,25号以后取下月5号,取5号,表达式为:

FDate1= FDate.AddDays((5 if FDate.Day < 6 else ( 15 if FDate.Day< 16 else (25 if 

FDate.Day< 26 else ( (FDate.AddDays(1 - FDate.Day).AddMonths(1).AddDays(-

1).Day)+5))))-FDate.Day)

2. 判断文本中是否存在每个字符?

首先需要把字段值转换为字符串类型,然后使用python字符串内置函数find进行判断,具体表达式为:

str(字段key).find("/")>=0

如果包含中文会报'ascii' codec can't decode byte 0 in position 0: ordinal not in range错误

可以直接使用:

字段.find('/') > -1 if 字段 != nul else false


3、判断所有分录是否有某个字段是否等于特定值?

len(filter(lambda x: ( x.FMaterialId.FSpecification == '某某规格型号' ), "物料所在的单据体key"))>0

4、去除为空的赋值?

FTaxprice =( 0 if FMATERIALID.F_PAEZ_Text == null else FMATERIALID.F_PAEZ_Text)

FTaxprice = (0 if FMaterialId.F_PAEZ_Text.replace(' ','')=="" else FMaterialId.F_PAEZ_Text)

5、截取字符串

len(filter(lambda x:(str(x.F_PAEZ_Material.FNumber)[0:3]='000'),FEntity))>0

6、单据体字段给单据头字段赋值

 取单据体第一个不为空的字段数据给单据头字段赋值

单据头字段可以=filter(lambda x:x.单据体字段key<>"", 单据体key)[0].单据体字段key

7、单据转换表单服务策略运行逻辑

1)根据被赋值字段所在的实体确定循环数据包,如果所在的实体是单据体,则循环单据体

8、反写规则表达式需要使用基础资料,如果加了属性,则无法解析出此基础资料,需要使用基础资料等于基础资料处理?

1)F_PAEZ_Material.Id <> 422657 And F_PAEZ_Qty  > 6  And  F_PAEZ_Material ==  F_PAEZ_Material

9、转换规则字段映射自定义表达式无效?

这些情况都无效,1 if   FSalerId <> 0 else 0,1 if   str(FSalerId) <>'0' else 0,1 if   FSalerId <>null else 0

原因:FSalerId 是基础资料字段,虽然取到的数据包中的FSalerId 对应的数据是长整形,但还是按基础资料字段来处理,FSalerId被包含在表达式中得到使用一个基础资料处理实例类,所以不会为null也不会为0等。

解决方案: 对销售员加编码引用,然后使用 1 if  FSalerId.FNumber <>null else 0 或者直接把销售员的信息带到下游,在服务策略中对复选框处理。

10. 辅助属性维度的值合并

F_PAEZ_Remark1 = str('' if F_PAEZ_Flex.FF100001 == null else F_PAEZ_Flex.FF100001.FNumber)+str('' if F_PAEZ_Flex.FF100002== null else F_PAEZ_Flex.FF100002.FNumber)

11、单据是否下推而来?

IsDraw    IsDraw()    IsDraw()=1   这样的写法都可以,  但还需要加个关联主实体的字段或者勾选一个关联主实体的字段

12、字段映射,自定义公式: F_BOS_Date日期减3天,大于当前日期则取,否则取当前日期;F_BOS_Date为空时取当前日期;@currentlongdate当前长日期、@currentshortdate当前短日期

(F_BOS_Date.AddDays(-3)  if F_BOS_Date.AddDays(-3) >  @currentlongdate else @currentlongdate) if F_BOS_Date<> null else  @currentlongdate

13、表达式中可调用的函数

@currentlongdate、@currentshortdate、@maxdate、@mindate、@userid、@currentorgid

14、单据转换合并下推,用逗号连接,去重脚本?

1)单据合并
def AfterConvert(e):
objExs = e.Result.FindByEntityKey("FBillHead")
for objEx in objExs:
oldStr = str(objEx.DataEntity["F_PAEZ_Text"])
splitStr = oldStr.Split(",")
lst = []
for ele in splitStr:
if not ele in lst:
lst.append(ele)
else:
continue
objEx.DataEntity["F_PAEZ_Text"] = ','.join(lst)
2)适应所以合并
也可以通过字段映射自定义公式赋值,假设来源字段key为fdemo
",".join(set(",".join(Sources.fdemo).split(","))) 其中Sources是单据转换的专业务关键字,代表字段来源数据包集合


15、合并连接单据体FEntity所有行中的FMemo1字段

','.join(x.FMemo1 for x in FEntity if x.FMemo1 != null and len(x.FMemo1.strip())>0 )

16、过滤掉FBillNO字段的所有数值

''.join(x for x in FBillNO if x.isdigit()== False)

或者

''.join(filter(lambda x: x.isdigit()==False, FBillNo))

或者

''.join(x for x in FBillNO if x.isalpha()== true)

17、判断FBillNo是否存在某个字符

如果FBillNo包含中文,则不能使用str()函数,否则会报编码错误

FBillNo.find('a') > -1  if FBillNo != null  else false

18、判断两个日期相隔天数

  (日期1 - 日期2).Days < 30

19、牛逼最全合并连接单据体中的字段

包括去null ,去空格,去重复, 按单据体显示顺序合并。

','.join(reversed(list(set((x.FMemo1 for x in FEntity if x.FMemo1 != null and len(x.FMemo1.strip())>0)))))

image.png

20、反写规则条件表达式

一、下游单据关联实体是单据体,则可以直接使用单据头字段和单据体字段比较 

单据体字段 < 单据头字段 

二、下游单据关联实体是单据头:

1、大于所有单据体字段数据 

len(filter(lambda x:x.单据体字段 < 单据头字段,FEntity))==len(FEntity) 

2、大于所有单据体任何行字段数据

len(filter(lambda x:x.单据体字段 < 单据头字段,FEntity))>0



图标赞 18
18人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!