实体服务规则之Python表达式(2)原创
金蝶云社区-汽修工
汽修工
51人赞赏了该文章 3962次浏览 未经作者许可,禁止转载编辑于2022年08月19日 12:55:23
封面


实体服务规则之设计规范(1) (kingdee.com)


在讲Python表达式之前,先啰嗦一下单据头和单据体实体服务规则应用场景:

一般情况下,要修改值或者属性的字段在哪里,就用哪个单据体。仔细的小伙伴应该知道,单据头的实体服务规则编辑器中看不到单据体的字段,反之单据体的可以看到单头字段,如下图所示:

P1.jpg

P2.jpg

但是,虽然我们在单据头实体服务规则编辑器中看不到单据体字段,但是这个并不妨碍我们使用单据体字段,直接使用单据体字段标识就可以,例如,当我们汇总单据体中某个字段到单据头,如图:


image.png

我们在单据头实体服务规则中添加:

前置条件:FCBIsJoin  = true (是否拼接字段勾选)

执行服务: FTestJoinText  = ','.join(x for x in FTestText) (把合作方单据体中字段拼接赋值给单据头字段)


image.png


我们继续新增一行空行,然后勾选是否拼接,出现报错,这是因为我们这个字段是None,我们需要排除掉空行,空格,空字符串,修改我们的执行服务:

FTestJoinText  = ','.join(x for x in FTestText if x) 

image.png

这个时候大家会发现,拼接的字段,排除掉了空行。


x for x in FTestText if x:这里的if x 指选择x 为true的遍历,这里就要解释一下python中的true和false


同许多程序语言一样,python中真假也是可以用整数0和1来表示,整数0表示假,整数1表示真。其实真和是python每个对象都具体的一种属性,这种属性不是真就是假。在python中一切都是对象,像是数据结构,python视空的数据结构为False假,相反不是空的数据结构则为True真。



"Brook"  True

"" False

[ ] False

{ } False

1 True

0.0 Flase

None False


好了,说到这里我们又插入点其他遍历方式,例如用lambda表达式

可以把我们刚才的执行服务修改成:

FTestJoinText   = ','.join(map(lambda x: x,FTestText))

image.png

如果要去掉空字符,我们还需要用filter进行过滤:

FTestJoinText   = ','.join(filter(lambda x: x<> null and x.strip()<> '',FTestText))

如图:

image.png


突然又想到,如果我们想去掉重复的怎么办?就要用到set函数,如:

FTestJoinText   = ','.join(set(filter(lambda x: x<> null and x.strip()<> '',FTestText)))

image.png


我好想跑偏了,说着就停不下来了,其实大家可以看到,如果我们在单据头中用单据体中的字段,其实是个集合。


好了,同样我们在单据体实体服务规则中实现上面的需求,配置同样的前置条件和执行服务,结果如图:


image.png


大家可以看到把最后一行文本遍历了一下,所以在单据体实体服务规则中,单据体字段是一个值。这就好比你在旁边看山,山是一座山,如果你在山上看山,值能看到你脚下的石头!

小伙伴们一定很急切,想知道单据体中如何实现刚才的需求,大家试想,既然我们没有办法通过单据体字段标志获取所有值,我们可以用单据体标识,如:

 FTestJoinText  = ','.join(x.FTestText  for x in FEntity)

FEntity:单据体标识

image.png

好了,其他的判空,去重,和之前的一样,这里就不赘言了!


未完待续,码字好累,希望大家点赞支持,我将持续更新。。。。。。。


------------------------------

谢谢大家点赞,如果大家比较感兴趣的话,我接着给大家讲:


如果我们的需求是把 单据体中 被拼接字段 大于 3个字符的拼接,那么执行服务应该如何写? 这里就要用到len函数,执行服务如下:

FTestJoinText   = ','.join(x for x in FTestText if len(x)>3)

image.png

但是如果有空行就会报错,所以得去掉空:

FTestJoinText   = ','.join(x for x in FTestText if  x is not None and len(x)>3)

或者FTestJoinText   = ','.join(x for x in FTestText if  x<>null and len(x)>3)


image.png


当时我们又发现空格没有去掉,如图:

image.png


所以我们可以将执行服务修改成:

FTestJoinText   = ','.join(x for x in FTestText if  x<>null and len(x.strip())>3)

接着我们再修改需求:如果我们想把单据体字段中包含字母a的文本拼接起来,应该如何写执行服务呢?这里就要用到函数find,执行方法如:

FTestJoinText   = ','.join(x for x in FTestText if x <> null and x.find('a') >-1)


image.png

这里不能写成这样:

FTestJoinText   = ','.join(x for x in FTestText if x <> null and x.find('a') )

因为 find 查找到了返回0,反之返回-1。


未完待续,睡会哈!!!!!!!!!!

赞 51