本文讨论了在使用Python进行单据头和单据体实体服务规则设计时的一些操作技巧和示例。文中详细阐述了如何在单据头服务规则中通过单据体字段进行拼接操作,并处理了空值、空格、空字符串和重复值等问题。此外,还介绍了使用Python内置函数如`len`和`find`来满足特定条件的拼接需求,如筛选长度大于3的字符串或包含特定字母的文本。最后,文章还提出了在单据体服务规则中类似操作的实现方式,并鼓励读者点赞支持。
在讲Python表达式之前,先啰嗦一下单据头和单据体实体服务规则应用场景:
一般情况下,要修改值或者属性的字段在哪里,就用哪个单据体。仔细的小伙伴应该知道,单据头的实体服务规则编辑器中看不到单据体的字段,反之单据体的可以看到单头字段,如下图所示:
但是,虽然我们在单据头实体服务规则编辑器中看不到单据体字段,但是这个并不妨碍我们使用单据体字段,直接使用单据体字段标识就可以,例如,当我们汇总单据体中某个字段到单据头,如图:
我们在单据头实体服务规则中添加:
前置条件:FCBIsJoin = true (是否拼接字段勾选)
执行服务: FTestJoinText = ','.join(x for x in FTestText) (把合作方单据体中字段拼接赋值给单据头字段)
我们继续新增一行空行,然后勾选是否拼接,出现报错,这是因为我们这个字段是None,我们需要排除掉空行,空格,空字符串,修改我们的执行服务:
FTestJoinText = ','.join(x for x in FTestText if x)
这个时候大家会发现,拼接的字段,排除掉了空行。
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))
如果要去掉空字符,我们还需要用filter进行过滤:
FTestJoinText = ','.join(filter(lambda x: x<> null and x.strip()<> '',FTestText))
如图:
突然又想到,如果我们想去掉重复的怎么办?就要用到set函数,如:
FTestJoinText = ','.join(set(filter(lambda x: x<> null and x.strip()<> '',FTestText)))
我好想跑偏了,说着就停不下来了,其实大家可以看到,如果我们在单据头中用单据体中的字段,其实是个集合。
好了,同样我们在单据体实体服务规则中实现上面的需求,配置同样的前置条件和执行服务,结果如图:
大家可以看到把最后一行文本遍历了一下,所以在单据体实体服务规则中,单据体字段是一个值。这就好比你在旁边看山,山是一座山,如果你在山上看山,值能看到你脚下的石头!
小伙伴们一定很急切,想知道单据体中如何实现刚才的需求,大家试想,既然我们没有办法通过单据体字段标志获取所有值,我们可以用单据体标识,如:
FTestJoinText = ','.join(x.FTestText for x in FEntity)
FEntity:单据体标识
好了,其他的判空,去重,和之前的一样,这里就不赘言了!
未完待续,码字好累,希望大家点赞支持,我将持续更新。。。。。。。
------------------------------
谢谢大家点赞,如果大家比较感兴趣的话,我接着给大家讲:
如果我们的需求是把 单据体中 被拼接字段 大于 3个字符的拼接,那么执行服务应该如何写? 这里就要用到len函数,执行服务如下:
FTestJoinText = ','.join(x for x in FTestText if len(x)>3)
但是如果有空行就会报错,所以得去掉空:
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)
当时我们又发现空格没有去掉,如图:
所以我们可以将执行服务修改成:
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)
这里不能写成这样:
FTestJoinText = ','.join(x for x in FTestText if x <> null and x.find('a') )
因为 find 查找到了返回0,反之返回-1。
未完待续,睡会哈!!!!!!!!!!
推荐阅读