13
2024
08
19:13:30

金蝶 云星空 BOS常用表达式整理

【文本类型】

假设有文本字段F_Text,值为“abcd-xyz”

  1. 文本不为空: F_Text <>null and F_Text <>"" and F_Text <>" "

  2. 文本是否包含某值: F_Text.find(“某值”)>=0
    find函数可以获取到“某值”在文本中的位置,返回的是第几位,从0开始,-1表示不存在,示例如下:

    • F_Text是否包含*,F_Text.find("*"),结果为-1

    • F_Text是否包含-,F_Text.find("-"),结果为 4

  3. 切片函数实现对文本的截取: F_Text[n:m],从n+1到第m位

    • 截取第二到四位: F_Text[1:4],结果为"bcd"

    • 截取字段前四位: F_Text[:4],结果为"abcd"

    • 截取字段后三位: F_Text[-3:],结果为"xyz"

    • 取“c”之后的数据:F_Text[F_Text.find(“c”)+1:]

  4. 文本拆分: F_Text.split("-"),可将文本拆分成多个部分

    • F_Text.split("-"),结果为[“abcd”,“xyz”]

    • 取分割后的第一部分:F_Text.split("-")[0],结果为"abcd"

    • 取分割后的第二部分:F_Text.split("-")[1],结果为"xyz"

    • 取分割后的最后一部分:F_Text.split("-")[-1],结果为"xyz"

  5. 去空格: F_Text.strip()。

    • 去掉字符a: F_Text.strip(“a”),结果为"bcd-xyz"

【多语言文本】

假设多语言文本字段的标识为F_TPQJ_MulLangText,绑定实体属性F_TPQJ_MulLangTextSTSX

  1. 获取当前语言的值,直接取标识F_TPQJ_MulLangText

  2. 获取指定语言的值,以英文为例,
    filter(lambda x:x.Key=1033,FBillHead.ActiveObject[‘F_TPQJ_MulLangTextSTSX’])[0].Value
    其他语言,可以将语言代码替换为对应语言的代码,比如中文为2052,其他小语种,可以自行百度查询。
    表达式拆解:

    • FBillHead.ActiveObject[‘F_TPQJ_MulLangTextSTSX’]
      9442ef356d30576b209edbec3b0dddea_01008ce9acf894044171a91fc59925166c8d.png

    • filter(lambda x: x.Key=1033, FBillHead.ActiveObject[‘F_TPQJ_MulLangTextSTSX’])
      733deac4d5a1f115bcd46e9afb9d6624_0100ca457fb7ee80488a8932c340b1a1d94f.png

    • filter(lambda x: x.Key=1033, FBillHead.ActiveObject[‘F_TPQJ_MulLangTextSTSX’])[0]
      8c3b77deb7fc0140abcf80215f2c51b2_010000729b2623814b348272b188a3797d36.png

【日期】

假设日期字段标识为FDate,另有创建日期FCreateDate

  1. 日期不为空:FDate<>null

  2. 日期字段格式化:FDate.ToString(“yyyy-MM-dd HH:mm:ss”),注意大小写(MM为月份,mm为分钟;HH为24小时制,hh为12小时制)
    日期字段存储的是一个日期类型的字符串,并不是我们常见看到的,因此需要格式化。
    本身的日期:
    c65da17e0a15dfbe9ad92b5109d3e31b_010093475cec56a84bfc9594c69c56e8ca10.pngb0731abba96be4c18061e2abcac221fe_01004e60e3d609fc4cf59b00f6309cd400e0.png 格式化之后:
    703a9760c59951b41dd334cf3d55154e_010070b29df400524369acafefac7142266d.png544912d748af9b51841ba7989589a6b7_0100087d08c14fe1491699da3e1a85a20658.png

  3. 取日期的年月:

    • 方案一:FDate.Year、FDate.Month

    • 方案二:FDate.ToString(“yyyy”)、FDate.ToString(“MM”)

  4. 日期比较:

    • 两个日期直接比较:FDate>FCreateDate

    • 日期字段和固定日期比较:FDate.ToString(“yyyy-MM-dd”)>“2023-05-06”

  5. 当前日期:

    • 短日期:@currentshortdate

    • 长日期:@currentlongdate

  6. 日期计算:

    • 加n小时FDate.AddHours(n)

    • 加n天FDate.AddDays(n)

    • 加n个月FDate.AddMonths(n)

    • 加n年FDate.AddYears(n)

    • n可以是负数,对应减n天、减n月、减n年等。

  7. 日期间隔计算:

    • 间隔小时:(FDate -FCreateDate).TotalHours

    • 间隔天:(FDate -FCreateDate).Days

    • 间隔月:(FDate.Year -   FCreateDate.Year) * 12 + (FDate.Month -   FCreateDate.Month)

    • 日期和固定时间做加减:(datetime(“2023-11-13”)-FDate).Days即可,需要把固定日期转换为日期格式(如datetime(“2023-11-13”))

  8. 获取日期是星期几:str(int(FDate.DayOfWeek))

  9. 获取日期当月最后一天:FDate.AddDays(1-float((FDate.ToString(“dd”)))).AddMonths(+1).AddDays(-1).ToString(“yyyy-MM-dd”)。参考:https://vip.kingdee.com/article/23320?productLineId=1

【基础资料】

以物料为例,标识为FMaterialId、其中有属性“基本单位”(也是基础资料)标识为FBaseUnitId,有属性规格型号,标识为FSpecification,物料中有分组,标识为FMaterialGroup
取值参考:

  1. 基础资料不为空:FMaterialId<>null

  2. 基础资料的内码:FMaterialId.Id

  3. 基础资料的编码:FMaterialId.FNumber

  4. 基础资料的名称:FMaterialId.FName

  5. 基础资料的属性:FMaterialId.FSpecification

  6. 基础资料的基础资料的编码:FMaterialId.FBaseUnitId.Number

  7. 基础资料的基础资料的名称:FMaterialId.FBaseUnitId.Name.ToString()

  8. 基础资料的分组内码:FMaterialId.FMaterialGroup.Id

  9. 基础资料的分组编码:FMaterialId.FMaterialGroup.Number

  10. 基础资料的分组名称:FMaterialId.FMaterialGroup.Name.ToString()

给基础资料赋值可参考:

  1. 使用其他基础资料赋值:FMaterialId=F_TPQJ_Base(F_TPQJ_Base是和FMaterialId同样基础资料类型的基础资料字段)

  2. 使用内码赋值:FMaterialId=12345,(12345为基础资料的内码)

  3. 使用编码赋值:GETPKVALUE(目标字段、匹配值),目标字段是被赋值的基础资料字段,匹配值为编码。

    • 使用编码内容赋值:FMaterialId=GETPKVALUE(‘FMaterialId’,‘1.01.001’)

    • 使用其他字段作为编码赋值:FMaterialId=GETPKVALUE(‘FMaterialId’,F_Text)

【辅助资料】

假设辅助资料的标识为F_TPQJ_Assistant,物料中也有辅助资料FMaterialId.F_TPQJ_Assistant

  1. 辅助资料不为空:F_TPQJ_Assistant<>null

  2. 辅助资料的内码:F_TPQJ_Assistant.Id

  3. 辅助资料的编码:F_TPQJ_Assistant.FNumber

  4. 辅助资料的名称:F_TPQJ_Assistant.FDataValue

  5. 基础资料中的辅助资料的内码:FMaterialId.F_TPQJ_Assistant.Id

  6. 基础资料中的辅助资料的编码:FMaterialId.F_TPQJ_Assistant.Number

  7. 基础资料中的辅助资料的名称:FMaterialId.F_TPQJ_Assistant.Name.ToString()

给辅助资料赋值可以参考给基础资料赋值。

【数值】

假设数值字段的标识为FQty,金额类型字段同理,精度字段F_BHR_Integer

  1. 数值不为空:数值没办法判断为空,默认为0,FQty<>0

  2. 格式化:

    • 四舍五入:round(FQty)

    • 四舍五入保留两位小数:round(FQty,2)

    • 格式化成3位小数:"{:.3f}".format(float(FQty))

    • 去尾零:int(FQty) if FQty == int(FQty) else  float(FQty)

    • 按照精度格式化小数:"{:."+str(F_BHR_Integer) + “f}”).format(float(FQty)),参考:https://vip.kingdee.com/article/464801281215929088?productLineId=1

【下拉列表】

假设下拉列表的标识为F_TPQJ_Combo

  1. 下拉列表不为空:F_TPQJ_Combo <> null and F_TPQJ_Combo <> “” and F_TPQJ_Combo <> " "

  2. 下拉列表的比较和赋值需要使用枚举项值,无法通过枚举项名称简单操作(需二开)。

【维度关联字段】辅助属性、核算维度、仓位

  1. 函数及说明
    获取弹性域维度属性函数GETFLEXDETAILVALUE (参数1,“参数2”,参数3)。
    参数1:维度关联字段的标识
    参数2:子维度属性的标识
    参数3:获取值的类型,1或者2(基础资料、辅助资料,传1是编码、传2是名称;其他类型,传1即可)

  2. 案例
    有辅助属性字段标识为F_Jac_Flex,子维度属性FF100005,取它的名称:GETFLEXDETAILVALUE ( F_Jac_Flex ,“FF100005”,2)

  3. 适用范围和详情
    函数适用于获取辅助属性、核算维度、仓位的值,具体可参考:https://vip.kingdee.com/article/240402217378067712?productLineId=1&isKnowledge=2

【lambda表达式】

lambda表达式是遍历函数,主要应用于获取单据体多行数据、多选基础资料、多选辅助资料等多个数据的合并处理的场景。
案例:
当物料为“1.01.002”时,校验备注字段唯一性。
len(set(map(lambda x:x.FEntryNote,filter(lambda x:x.FMaterialId.FNumber==“1.01.002”,FPOOrderEntry))))=1
详解:
①遍历FPOOrderEntry
filter(①),过滤FPOOrderEntry中物料编码是1.01.002的分录行
③lambda x:x.FEntryNote,②。遍历过滤之后的分录行,取FEntryNote字段
map(③),将③中取到的字段映射成一个集合
set(④),将④中取到的集合中的数据去重
len(⑤),计算去重后数据的数量
3606c31dc3aa71c16c36c4b13fe99fe7_01001b78c6b0647d460f86752c3ac809ca5a.png 上述函数中,len函数用来计算个数,set函数用来去重;还有一些其他lambda函数格式参考:

  1. max函数,取最大值:在单据体FEntity的全部分录行中,取日期FDate的最大值。
    max(map(lambda x:x.FDate,FEntity))

  2. min函数,取最小值:在单据体FEntity中,取单据体物料 = 单据头的物料F_TPQJ_Base的最小单价FPrice
    min(map(lambda x:x.FPrice,filter(lambda x:x.FMaterialId.FNumber== F_TPQJ_Base.FNumber,FEntity)))
    标橘色的内容是单据头的字段,单据头的字段不是集合里的字段,因此前边不需要写x.

  3. sum函数,求和:在单据体FEntity中,将物料分组编码左包含A的物料数量FQty的数量的合计汇总到单据头
    sum(map(lambda x:x.FQty,filter(lambda x:x.FMaterialId.FMaterialGroup.Number.find(“A”)==0,FEntity)))

  4. join:在单据体Fentity中,将所有行的物料名称、对应的采购数量FQty、采购单位FUnitId拼接到一起
    “+”.join(map(lambda x:x.FMaterialId.FName+"("+str(x.FQty)+x.FUnitId.FName+")",FEntity))
    join函数拼接的必须是文本类型的内容,因此对于数量类型,需要强制转换为str。

注:套打聚合动态字段会经常用到lambda函数,格式和单据里的是一样的,只不过遍历的实体,不再用单据体标识来表示,而是无关实体标识,全部使用ActiveObject来实现。

【补充】

  1. 什么时候用单引号、什么时候用双引号、什么时候不用引号。
    通常情况下,单引号和双引号都是一样的。
    内码如果是int、long类型不需要写引号,字符串类型的需要写引号.
    fc648f9582dc34622bd1415582c093cc_01001fc68a0a4b0445a294b9d9a1e9f739c3.pnge81e077b26923ab51853124fa4ab06d1_01001da99ba4c6c6448baf1cd7ef43f42602.png

  2. 巧用表达式测试功能,可以了解到数据的真实数据包,实现根据数据包取到需要的所有数据,参考:表达式测试的妙用


作者:猪猪zhuzhu侠

来源:金蝶云社区

原文链接:https://vip.kingdee.com/article/511898282776545792?productLineId=1&isKnowledge=2&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/7547.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: