惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
用友U9C系统函数使用手册
老码识途-YonBIP · 2026-06-21 · via 博客园_首页

一、概述

函数在系统中的核心应用场景:预警、权限、分录模板、薪资模板、列表等。
通用调用方式:点击 fx 按钮
函数使用频率标注说明:根据一线支持问题提出频度,分为“极高”、“高”、“中”、“低”、“极低”。

比如:

在权限中,点击 fx 按钮 会弹出如下图所示各种函数,其他地方点击 fx 按钮弹出画面都是一样。

f

二、提示词

置顶提示词,按照这样的范式,参考知识库中的《用友U9C系统函数使用手册》 对后续的代码进行注释,markdown代码块使用```python
# 判断当前操作不是“审核”或者当前用户不是销售订单创建人。
## GetCurrentActionName()  获取当前执行的动作名称,例如:保存、提交、审核、弃审等。
## !=  不等于比较运算符。
## GetCurrentUserName()   获取当前登录用户名称。
## SO  销售订单对象(Sales Order)。
## SO.CreatedBy  销售订单创建人用户名。
GetCurrentActionName()!='审核' or (GetCurrentUserName()!=SO.CreatedBy)

三、函数分类详解‌

示例代码并非通用编程语言(如Java、C#、Python),而是‌用友U9C系统内部定义的函数表达式‌。

函数分为数值函数、字符串函数、日期函数、转换函数、判断函数、公共扩展函数、SQL函数,除了以上这些函数外,还包含使用率极高但是没有表现为函数的几个关键字New/Old、like、in的使用。


1、New/Old关键字

New:取保存后值

功能:取保存后的值

使用频率:极高

适用范围:增删改函数,事件消息

不适用范围:列表计算列、读取权限

举例:销售订单行上价税合计必须大于100

通常写法:SOLine.TotalMoneyFC>100 这个若放在新增视图下,是可以的,

但是放到修改视图下,就变成了满足这个条件下,可以修改,可以修改成不满足这个条件的情况,并显示保存成功

而加了New后 NewSOLine.TotalMoneyFC>100 不论新增还是修改都实现了该控制。因此下面所有牵扯到增删改权限的举例中都用到了New关键字,就不再一一解释了。


Old:取保存前值

功能:取保存前的值

使用频率:中

适用范围:增删改函数,事件消息

不适用范围:列表计算列、读取权限

举例:这个常用于通知管理的条件表达式

采购订单审核后发消息给某人

正确写法:

NewPurchaseOrder.Status.Value==FunEnum('采购订单状态','已审核',2) and OldPurchaseOrder.Status.Value==FunEnum('采购订单状态','审核中',1)

错误写法:

PurchaseOrder.Status.Value==FunEnum('采购订单状态','已审核',2)

错误写法的效果:不只是审核时候发消息,审核后,有修改或者有回写仍旧发消息,而一旦结合New,Old,就会圈定审核那一时刻才发消息,之后即使再有修改也不会发消息了。

in:在…….之中

功能:列出符合的取值集合

使用频率:高

适用范围:读取权限、预警定义

不适用范围:列表计算列、增删改权限、通知管理

举例:只能查看部门为001,002的销售订单

SaleDepartment.Code in ('001','002')

like:包含

功能:包含。。。。。。

使用频率:高

适用范围:读取权限、预警定义

不适用范围:列表计算列、增删改权限、通知管理

举例:只能查看部门编码包含01的销售订单

SaleDepartment.Code like ‘%01%’

销售订单部门编码以01开头的

SaleDepartment.Code like ‘01%’

销售订单部门编码以01结尾的

SaleDepartment.Code like ‘%01’

2、数值函数

取绝对值(value):Abs(value)

功能:取某数值字段的绝对值

使用频率:极低

适用范围:增删改函数、通知管理

不适用范围:列表计算列、读取权限、预警定义

举例:Abs(9) 结果为9

Abs(9)

Abs(-9) 结果为9

Abs(-9) 

取最小整数(a): Ceiling(a)

功能:对某数值字段向上取整

使用频率:极低

适用范围:增删改函数、通知管理

不适用范围:列表计算列、读取权限、预警定义

举例:Ceiling (22.22) 结果为23

Ceiling (22.22)

取最大整数(a): Floor (a)

功能:对某数值字段向下取整

使用频率:极低

适用范围:增删改函数、通知管理

不适用范围:列表计算列、读取权限、预警定义

举例:Floor (22.22) 结果为22

Floor (22.22) 

四舍五入(value,digits): Round(value,digits)

功能:对某数值字段四舍五入

参数Value:进行四舍五入的字段

参数digits:保留的位数

使用频率:极低

适用范围:增删改函数、通知管理

不适用范围:列表计算列、读取权限、预警定义

举例:Round(1.55,1) 结果为1.6(保留一位小数并进行四舍五入)

Round(1.55,1)

Round(1.54,1) 结果为1.5(保留一位小数并进行四舍五入)

Round(1.54,1) 

求余数(d1,d2): Mod(d1,d2):

功能:求余函数,d1除以d2得到的余数

参数d1:被除数

参数d2:除数

使用频率:极低

适用范围:增删改函数

不适用范围:列表计算列、读取权限

举例:Mod(3,2) 结果为1

Mod(3,2)

求幂函数: Power(x,y)

功能:求x的y次幂

使用频率:极低

适用范围:增删改函数

不适用范围:列表计算列、读取权限

举例:Power(3,2) 结果为9

Power(3,2) 

指数函数: Exp(d1):

功能:exp()函数表示以自然常数e为底的指数函数,exp(x)表示的是e的x次方,x可以是一个函数

使用频率:极低

适用范围:增删改函数

不适用范围:列表计算列、读取权限

举例:2exp3就是2乘以e的3次方

2exp3

3、字串处理函数

字串长度:Len(str)

功能:取得字串长度

使用频率:高

适用范围:增删改函数、通知管理、预警定义

不适用范围:列表计算列、读取权限

举例:料品主分类编码必须为9位:

Len(NewItemMaster.MainItemCategory.Code)==9

取右子串:Right(str, length)

功能:取字符串右子串

参数str:被取右子串的字段

参数length:右边截取的位数

使用频率:低

适用范围:增删改函数、通知管理、预警定义

不适用范围:列表计算列、读取权限

举例:料品主分类编码右边三位为【001】

Right (ItemMaster.MainItemCategory.Code,3)==’001’

取左子串:Left(str,length)

功能:取字符串左子串

参数str:被取左子串的字段

参数length:左边截取的位数

使用频率:高

适用范围:增删改函数、通知管理、预警定义

不适用范围:列表计算列、读取权限

举例:料品主分类编码左边三位为【001】

Left (ItemMaster.MainItemCategory.Code,3)==’001’

去掉字符串前后的空格(str):Trim(str)

功能:去掉字符串前后的空格

参数str:要去掉空格的字段

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列、通知管理

不适用范围:预警定义

去掉字符串左侧的空格(str):LTrim(str)

功能:去掉字符串左侧的空格

参数str:要去掉左侧空格的字段

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列、通知管理

不适用范围:预警定义

去掉字符串右侧的空格(str):RTrim(str)

功能:去掉字符串右侧的空格

参数str:要去掉右侧空格的字段

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列、通知管理

不适用范围:预警定义

字符串变成小写(str):Lcase(str)

功能:将大写字母转换成小写字母,若String本身为小写字母或非字母函数,函数的返回值不变;

参数str:被转换的字段

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列。

不适用范围:

举例:销售订单号都变成小写

原始单号SO225-0124Ab

Lcase(DocNo) 后显示为SO225-0124ab

字符串变成大写(str):Ucase (str)

功能:将大写字母转换成小写字母,若String本身为小写字母或非字母函数,函数的返回值不变;

参数str:被转换的字段

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列。

不适用范围:

举例:销售订单号都变成小写

原始单号SO225-0124Ab

Ucase(DocNo) 后显示为SO225-0124AB

取子串:Substr(str,startIndex,length)

功能:从字串的某个位置开始取固定长度的子串

参数str:被取子串的字段

参数startIndex:取子串的开始位置

使用频率:极少

适用范围:增删改权限,读取权限,列表计算列。

不适用范围:

举例:从销售订单号第二个位置起取三位

原始单号SO225-0124Ab

Substr(DocNo,2,3) 结果为 O2

字符串替换:Replace(str,oldStr,newStr)

功能:将字串中某个子串替换成新的子串

参数str:进行子串替换的字段

参数oldStr:被替换旧子串(注意这里的子串即使是数字也要英文单引号括起来 )

参数newStr:替换后新子串(注意这里的子串即使是数字也要英文单引号括起来 )

使用频率:极少

适用范围:增删改权限、通知管理

不适用范围:读取权限,列表计算列、预警定义

举例:销售订单号中‘2’换成‘3’ 或者‘24‘换成’a’

原始单号SO225-0124Ab

Replace (DocNo,’2’,’3’) 结果为 SO335-0124Ab

Replace (DocNo,’24’,’a’) 结果为 SO335-01aAb

空串检查函数(str):Empty(str)

功能:检查是否为空串

参数str:进行检查的字段

使用频率:高

适用范围:增删改权限。

不适用范围:读取权限,列表计算列,分录模板

举例:销售订单头上某数字类型扩展字段必须非空才能保存。

Empty(NewSO.DescFlexField.PrivateDescSeg13)==false

字符串是否包含(str,substr):Contains(str,substr)

功能:是否包含某子串

参数str:进行检查的字段

参数substr:包含的子串

使用频率:高

适用范围:增删改权限。

不适用范围:读取权限,列表计算列

举例:销售订单单号必须包含01才能保存


字符串是否开始于(str,substr):StartsWith(str,substr)

功能:是否开始于某子串

参数str:进行检查的字段

参数substr:开始的子串

使用频率:中

适用范围:增删改权限。

不适用范围:读取权限,列表计算列

举例:销售订单单号必须左包含so才能保存


字符串是否结束于(str,substr):EndsWith(str,substr)

功能:是否结束于某子串

参数str:进行检查的字段

参数substr:结束的子串

使用频率:中

适用范围:增删改权限。

不适用范围:读取权限,列表计算列

举例:销售订单单号必须以so结尾才能保存

当前联系对象ID(proj):GetProjMember(proj)

功能:判断当前登录用户是否存在指定项目主档的项目成员中(用户联系对象和项目成员业务员联系对象比对)

参数proj: 项目主档的ID

适用频率:低

适用范围:增删改权限。

不适用范围:读取权限,列表计算列

举例: 无

4、日期函数

年(date):Year(date)

功能:取出日期或者时间中的年份

参数date:日期或者时间字段

使用频率:中

适用范围:增删改权限,分录模板

不适用范围:读取权限,列表计算列 、预警定义

举例:销售订单业务日期的年份必须是2023年

# 判断销售订单的业务日期是否属于 2023 年。
Year(NewSO.BusinessDate)==2023

月(date):Month(date)

功能:取出日期或者时间中的月份

参数date:日期或者时间字段

使用频率:中

适用范围:增删改权限,分录模板

不适用范围:读取权限,列表计算列 、预警定义

用法同年(date)

日(date):Day(date)

功能:取出日期或者时间中的月份

参数date:日期或者时间字段

使用频率:中

适用范围:增删改权限,分录模板

不适用范围:读取权限、列表计算列 、预警定义

用法同年(date)

当前系统日期:Today()

功能:获取当前系统日期(不是登陆画面中的操作日期)

使用频率:高

适用范围:预警定义、增删改权限,分录模板、读取权限,列表计算列

不适用:

用法:通常是和下面的函数【增加时间间隔(addType,addDiff,now))】一起适用

增加时间间隔(addType,addDiff,now):dateadd(addType,addDiff,now)

功能:增加时间间隔

参数addType:分为day,hour,minute

addDiff:时间间隔,若第一个参数为day,这里录入数字几就就代表增加几天,可以录入负数,代表向前倒推几天,hour/minute类似。

使用频率:高

适用范围:预警定义、增删改权限,列表计算列

不适用:读取权限

举例:根据采购订单行到期日提前三天预警

# 到期日(MaturityDate)小于等于今天之后第 3 天(提前3天)。
MaturityDate <= dateadd(day, 3, Today())

空日期检查(obj):IsNullDate(obj)

功能:日期判断函数,如果为空或最新日期,返回true

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用

取组织当前时间:BizToday()

功能:取组织当前时间(类似于Today()函数)

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用

时区转换:ToBizDate(convertdatetime,SourceZone,TargetZone)

功能:不同时区转换函数

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用,请补充

系统时区转换:SysToBizDate(convertdatetime,TargetZone)

功能:当前日期转换成固定时区

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用,请补充

相隔年(now,then):YearsBetweenFunc(CreatedOn,BusinessDate)

功能:两个时间字段相隔年份

BusinessDate年份减去CreatedOn的年份(只看年份)

使用频率:低

适用范围:增删改权限,读取权限、通知管理、分录模板

不适用:列表计算列、预警定义

举例:若适用在数据权限,必须是两个日期或时间类型字段比较YearsBetweenFunc(StrToDate('2022-05-01'),StrToDate('2023-02-01'))结果为1

相隔月(now,then):MonthsBetweenFunc(now,then)

功能:两个时间字段相隔月份

BusinessDate月份减去CreatedOn的月份(同时看年和月)

使用频率:低

适用范围:增删改权限,读取权限、通知管理、分录模板

不适用:列表计算列、预警定义

举例:若适用在数据权限,必须是两个日期或时间类型字段比较,

# 计算 2021-05-20 到 2022-01-01 之间相差多少个月。
## StrToDate('2021-05-20'):把字符串转换成日期
## StrToDate('2022-01-01'):把字符串转换成日期
## MonthsBetweenFunc(...):计算两个日期之间的月数差
MonthsBetweenFunc(StrToDate('2021-05-20'),StrToDate('2022-01-01'))

结果为8

相隔日(now,then):DaysBetweenFunc (now,then)

功能:两个时间字段相隔日

BusinessDate日减去CreatedOn的日(同时看年月日)

使用频率:低

适用范围:增删改权限,读取权限、通知管理、分录模板

不适用:列表计算列、预警定义

举例:若适用在数据权限,必须是两个日期或时间类型字段比较

DaysBetweenFunc(StrToDate ('2021-05-20', StrToDate ('2022-01-01'))

# 计算 2021-05-20 到 2022-01-01 之间相差多少天。
## trToDate('2021-05-20') → 将字符串转换为日期
## StrToDate('2022-01-01') → 将字符串转换为日期
## DaysBetweenFunc(...) → 计算两个日期之间的天数差
DaysBetweenFunc(
    StrToDate('2021-05-20'),
    StrToDate('2022-01-01')
)

结果为226

5、转换函数

字串转数字(str):StrToFloat(str)

功能:字串转成数字,这种常用于无档案数字类型的扩展字段,扩展字段都是以字串形式存储的,因此进行运算时需要进行该转换

参数str::要进行该转换的字段

使用频率:极高

适用范围:增删改权限,读取权限、列表计算列,分录模板,预警定义

不适用范围:

举例:销售订单两个扩展字段的和要大于5

对于增删改权限,进行运算的数字类型扩展字段,直接相加,虽然不会报错,但是不是按照数字来相加,而是按照两个字符串连接的方式组成新的字符串而已,因此必须进行转换,读取权限/分录模板不转换会报错。因此凡是数字类型扩展字段进行运算的都要先进行下转换。

# 将销售订单(NewSO)自定义字段13和自定义字段14转换为数字后相加,判断结果是否大于 5。
# 当自定义字段13与自定义字段14的数值之和大于 5 时,条件成立。
## StrToFloat(NewSO.DescFlexField.PrivateDescSeg13)  # 将自定义字段13的值从字符串转换为数字。
## StrToFloat(NewSO.DescFlexField.PrivateDescSeg14)  # 将自定义字段14的值从字符串转换为数字。
## +   # 两个数字求和。
## > 5   # 判断和是否大于 5。
StrToFloat(NewSO.DescFlexField.PrivateDescSeg13)+StrToFloat(NewSO.DescFlexField.PrivateDescSeg14)>5

数字转字串(str):FloatToStr(f)

功能:数字转字串

参数str::要进行该转换的字段

使用频率:低

这个很少适用,不再举例。

将字符串转换为日期(str):StrToDate(str)

功能:字串转成日期,这种常用于无档案日期类型的扩展字段,扩展字段都是以字串形式存储的,因此按照日期进行处理时,需要先进行转换。

参数str::要进行该转换的字段

使用频率:中

适用范围:增删改权限,读取权限、列表计算列,分录模板,预警定义

不适用范围:

举例:日期扩展字段的年份必须是2022年

若不进行转换,Year(NewSO.DescFlexField.PrivateDescSeg12)==2022,会如下图报错

正确书写方式为:

# 判断自定义字段12记录的日期是否属于 2022 年。
Year(StrToDate(NewSO.DescFlexField.PrivateDescSeg12))==2022

将日期转换为字串(date):DateToStr(date)

功能:日期转换为字串,一般用于和其他字符字段连接到一起来显示组合内容。

参数date::要进行该转换的字段

使用频率:中

适用范围:增删改权限,读取权限、列表计算列,分录模板,预警定义

不适用范围:

举例:销售订单列表计算列显示单号+业务日期

若直接书写为:DocNo+ BusinessDate 会报错

正确形式:

# 将单据编号(DocNo)与业务日期(BusinessDate)转换后的字符串进行拼接。
## DocNo 单据编号
## DateToStr(date) 将日期转换为字串(date)
## BusinessDate 业务日期
DocNo+DateToStr(BusinessDate)

字符转换双精度浮点:StrToDouble(str)

功能:字符转成双精度浮点数,这种常用于无档案数字类型的扩展字段,扩展字段都是以字串形式存储的,因此进行运算时需要进行该转换

(双精度与单精度浮点数唯一的区别是单精度(float)在计算机中存储占用4字节,32位,有效位数为7位(6位小数+小数点)。双精度(double)在计算机中存储占用8字节,64位,有效位数为16位(15位小数+小数点)。)

参数str::要进行该转换的字段

使用频率:中

适用范围:增删改权限, 分录模板

不适用范围:读取权限、列表计算列,,预警定义

双精度浮点转换为字符(f):DoubleToStr(f)

功能:双精度浮点数转成字符

参数str::要进行该转换的字段

使用频率:中

适用范围:增删改权限, 分录模板

不适用范围:读取权限、列表计算列,预警定义

字符转换为十进制数(str):StrToDecimal(str)

功能:字符串类型转换为十进制类型

参数str::要进行该转换的字段

使用频率:中

适用范围:增删改权限, 分录模板

不适用范围:读取权限、列表计算列,预警定义

十进制数转换为字符(f):DecimalToStr(f)

功能:十进制类型转换为字符串类型

参数str::要进行该转换的字段

使用频率:中

适用范围:增删改权限, 分录模板

不适用范围:读取权限、列表计算列,预警定义

取日期时间的日期部分函数:GetDatePartFromDateTime(date)

功能:取日期时间字段的日期部分

参数date::日期时间字段

适用频率:中

适用范围:增删改权限、分录模板

不适用范围:列表计算列、读取权限,预警定义

6、判断函数

判断函数:(condition?trueExpression:falseExpression)

功能:以某条件进行判断,条件成立,返回什么;条件不成立,返回什么

参数condition:条件表达式

参数TrueExpression:条件成立返回的表达式

参数falseExpression:条件不成立返回的表达式

使用频率:高

适用范围:增删改权限、分录模板,薪资规则

不适用范围:列表计算列、读取权限,预警定义

增删改权限举例:销售订单本币总金额需要满足小于2万,满足返回true, 不满足返回false

# 判断销售订单原币金额(TotalMoneyFC)是否小于 20000,小于则返回 True,否则返回 False。
IIF(NewSO.TotalMoneyFC<20000,true,false)

注意在列表里使用该函数是自动变为: (condition?trueExpression:falseExpression),用法相同。

# 三元条件运算符:条件成立返回前面的值,条件不成立返回后面的值。
## condition 是 条件表达式
## trueExpression 是 当条件成立时返回的值
## falseExpression 是 当条件不成立时返回的值
# (condition ? trueExpression : falseExpression)
(NewSO.TotalMoneyFC < 20000 ? true : false)

7、公共扩展函数

当前联系对象ID():GetCurrentContact()

功能:获取当前登陆用户联系对象ID

使用频率:低

适用范围:增删改权限、读取权限、列表计算列

不适用范围:预警定义

当前业务员ID():GetCurrentOperator()

功能:获取当前登陆用户对应业务员ID对象找到业务员ID

使用频率:低

适用范围:增删改权限、读取权限、列表计算列、通知管理

不适用范围:预警定义

当前业务员部门ID():GetCurrentOperatorDept()

功能:获取当前登陆用户对应业务员所在部门ID,

匹配规则:通过当前用户找到联系对象,再通过联系对象找到业务员对应部门ID

使用频率:低

适用范围:增删改权限、读取权限、列表计算列

不适用范围:预警定义

当前操作动作名称():GetCurrentActionName()

功能:获取当前操作名称

使用频率:极高

适用范围:增删改权限、通知管理

不适用范围:虽然在诸如读取权限,列表计算列也不报错,但是没有使用意义。

举例:销售订单制单人不能审核单据

# 判断当前操作不是“审核”或者当前用户不是销售订单创建人。
## GetCurrentActionName()  获取当前执行的动作名称,例如:保存、提交、审核、弃审等。
## !=  不等于比较运算符。
## GetCurrentUserName()   获取当前登录用户名称。
## SO  销售订单对象(Sales Order)。
## SO.CreatedBy  销售订单创建人用户名。
GetCurrentActionName()!='审核' or (GetCurrentUserName()!=SO.CreatedBy)


当前操作动作编码():GetCurrentActionCode()

功能:获取当前动作编码

使用频率:低

适用范围:增删改权限、通知管理

不适用范围:虽然在诸如读取权限,列表计算列也不报错,但是没有使用意义。

举例:由于动作编码对于普通使用者来说无法获知动作编码,因此极少使用该函数,也就不举例子了。

当前联系对象编码():GetCurrentContactCode()

功能:获取当前登陆用户联系对象编码

使用频率:中

适用范围:增删改权限、读取权限、列表计算列、通知管理

不适用范围:预警定义

当前业务员编码():GGetCurrentOperatorCode()

功能:获取当前登陆用户对应的业务员编码

匹配规则:用当前登陆用户联系对象去匹配当前组业务员记录,若能匹配到唯一的业务员记录,找到该业务员编码进行返回。

使用频率:高

适用范围:增删改权限、读取权限、列表计算列、通知管理

不适用范围:预警定义(不会报错)

举例:销售订单头上的业务员与当前登陆用户业务员相同时可以新增记录

# 判断当前操作人的编码是否与销售订单业务员编码一致。

## GetCurrentOperatorCode()  获取当前操作人的编码(用户编码/员工编码)。
## ==  等于比较运算符,左右两侧相等时返回 True,否则返回 False。
## SO  销售订单对象(Sales Order)。
## SO.Seller  销售订单上的业务员对象。
## SO.Seller.Code  业务员编码。
GetCurrentOperatorCode()==SO.Seller.Code

当前业务员部门编码():GetCurrentOperatorDeptCode()

功能:获取当前登陆用户对应业务员的部门编码

匹配规则:用当前登陆用户联系对象去匹配当前组业务员记录,若能匹配到唯一的业务员记录,找到该业务员对应部门的编码进行返回。

使用频率:高

适用范围:增删改权限、读取权限、列表计算列、通知管理

不适用范围:预警定义(不会报错)

增删改权限举例1能够维护本部门的销售订单

# 判断当前操作人所属部门编码是否与销售订单销售部门编码一致。

## GetCurrentOperatorDeptCode()  获取当前操作人所属部门编码。
## ==  等于比较运算符,左右两侧相等时返回 True,否则返回 False。
## NewSO  销售订单对象(新单据/New Sales Order)。
## NewSO.SaleDepartment  销售订单上的销售部门对象。
## NewSO.SaleDepartment.Code  销售部门编码。

GetCurrentOperatorDeptCode()==NewSO.SaleDepartment.Code

读取权限举例:能查看本部门的销售订单

# 将当前操作人所属部门编码赋值给销售部门编码。

## SaleDepartment  销售部门对象。
## SaleDepartment.Code  销售部门编码字段。
## =  赋值运算符,将右侧的值写入左侧字段。
## GetCurrentOperatorDeptCode()  获取当前操作人所属部门编码。

SaleDepartment.Code=GetCurrentOperatorDeptCode()

实体条件判断函数():GetAttachmentDocConditionValue(EntityFullName,EntityID,DocCondition)

功能:实体条件判断函数(****请补充更多使用场景,以及表达式中已经包含引号的情况下如何书写)

使用频率:中

参数EntityFullName:实体全名

参数EntityID:实体ID

参数DocCondition:条件表达式

适用范围:增删改权限

不适用范围:

举例:应收单审核后不能新增、修改、删除附件。

((Attachment.EntityFullName!='UFIDA.U9.AR.ARBill.ARBillHead' or Attachment.EntityFullName=='UFIDA.AP.APBill.APBillHead') and

GetAttachmentDocConditionValue(Attachment.EntityFullName,FloatToStr(Attachment.EntityID),'DocStatus<2')==1)

# 判断附件所属单据不是应收单(ARBill)或属于应付单(APBill),并且该单据状态满足“DocStatus<2”条件。

## Attachment  附件对象。
## Attachment.EntityFullName  附件关联实体的完整名称(单据类型全名)。
## !=  不等于比较运算符,左右两侧不相等时返回 True。
## ==  等于比较运算符,左右两侧相等时返回 True。
## 'UFIDA.U9.AR.ARBill.ARBillHead'  应收单(ARBill)实体全名。
## 'UFIDA.AP.APBill.APBillHead'  应付单(APBill)实体全名。
## and  逻辑与运算符,两侧条件同时成立时返回 True。
## or  逻辑或运算符,两侧条件任意一个成立时返回 True。
## GetAttachmentDocConditionValue()  获取附件关联单据是否满足指定条件。
## FloatToStr(Attachment.EntityID  附件关联单据的主键ID。)  将数值转换为字符串。
## 'DocStatus<2'  单据状态小于2的条件表达式。
## ==true  判断条件成立(部分系统中等价于 ==1)。

(
    (Attachment.EntityFullName!='UFIDA.U9.AR.ARBill.ARBillHead'
     or
     Attachment.EntityFullName=='UFIDA.AP.APBill.APBillHead')
    and
    GetAttachmentDocConditionValue(
        Attachment.EntityFullName,
        FloatToStr(Attachment.EntityID),
        'DocStatus<2'
    )==true
)

取枚举值名称(Code,Evalue,SysMLFlag):RunFunc(Code,Evalue,SysMLFlag)

功能:获取枚举值名称

参数Code:枚举全称(数据字典中查)

参数Evalue:枚举字段

SysMLFlag:语种名称

使用频率:高

适用范围:增删改权限、通知管理、实体扩展字段

不适用范围:读取权限、预警定义、列表计算列

举例:取销售订单需求分类名称

# 将销售订单需求类型编码转换为中文名称(zh-CN)。

## RunFunc()  调用系统内置函数或枚举转换函数。
## 'UFIDA.U9.CBO.Enums.DemandCodeEnum'  需求类型枚举(DemandCodeEnum)的完整类型名称。
## SO  销售订单对象(Sales Order)。
## SO.DemandType  销售订单需求类型对象。
## SO.DemandType.Value  需求类型的枚举值。
## ToString()  将枚举值转换为字符串。
## 'zh-CN'  中文(简体,中国)语言区域代码,用于返回中文显示名称。

RunFunc('UFIDA.U9.CBO.Enums.DemandCodeEnum', SO.DemandType.Value.ToString(),'zh-CN')

取枚举值编码(EnumFullName,Evalue):F_Sys_GetEnumCode(EnumFullName,Evalue)

功能:获取枚举值编码

参数EnumFullName:枚举全称(数据字典中查)

参数Evalue:枚举字段

使用频率:高

适用范围:增删改权限、通知管理、实体扩展字段

不适用范围:读取权限、预警定义、列表计算列

举例:取销售订单枚举编码

# 根据销售订单需求类型的枚举值,获取对应的枚举代码(Code)。

## F_Sys_GetEnumCode()  系统函数,根据枚举类型和枚举值获取枚举代码。
## 'UFIDA.U9.CBO.Enums.DemandCodeEnum'  需求类型枚举(DemandCodeEnum)的完整类型名称。
## SO  销售订单对象(Sales Order)。
## SO.DemandType  销售订单需求类型对象。
## SO.DemandType.Value  需求类型的枚举值。

F_Sys_GetEnumCode('UFIDA.U9.CBO.Enums.DemandCodeEnum',SO.DemandType.Value)

根据联系对象取组织(strContactID):GetOrgByContact(strContactID)

功能:根据联系对象ID获取联系对象关联的组织ID

参数strContactID:联系对象ID

使用频率:低

适用范围:增删改权限、通知管理、实体扩展字段

不适用范围:读取权限、预警定义、列表计算列

举例:无

是否集采集收(org,itemID):HasGatherPurMode(org,itemID)

请补充

取弹性域段值名称(ValueSetDefCode,SegValue):GetFlexSegNameValue(ValueSetDefCode,SegValue)

# 根据弹性域段对应的值集编码和字段值,获取该段值对应的显示名称。

## GetFlexSegNameValue()  获取弹性域段值对应的显示名称。
## ValueSetDefCode  弹性域段对应的值集编码(Value Set Code)。
## SegValue  弹性域段对应字段的实际存储值(编码值)。

GetFlexSegNameValue(ValueSetDefCode,SegValue)

功能:取弹性域段值名称

参数ValueSetDefCode:弹性域段对应的值集编码

参数SegValue:弹性域段对应字段

使用频率:高

适用范围:增删改权限、通知管理、实体扩展字段

不适用范围:读取权限、预警定义、列表计算列

举例:取销售订单私有段的名称

# 根据销售订单自定义字段4中的编码值,获取“半成品小类”对应的名称。

## GetFlexSegNameValue()  根据弹性域(FlexField)段值获取对应的显示名称。
## '半成品小类'  弹性域段名称(Flex Segment Name)。
## SO  销售订单对象(Sales Order)。
## SO.DescFlexField  销售订单的自定义字段(弹性域)对象。
## SO.DescFlexField.PrivateDescSeg4  自定义字段4中存储的编码值。

GetFlexSegNameValue('半成品小类',SO.DescFlexField.PrivateDescSeg4)

是否提交人(flowInstranceId,userId):WF_IsStartUser(flowInstranceId,userId)

功能:判断是否是工作流的提交人

参数flowInstranceId:工作流实例ID

参数userId:当前用户ID

使用频率:高

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:销售订单工作流提交人可以修改单据

# 判断当前登录用户是否为销售订单流程实例的发起人。

## WF_IsStartUser()  判断指定流程实例的发起人是否为当前用户。
## SO  销售订单对象(Sales Order)。
## SO.FlowInstance  销售订单关联的流程实例对象。
## SO.FlowInstance.ID  流程实例ID。
## GetCurrentUserID()  获取当前登录用户ID。
## == true  判断函数返回结果是否为真。

WF_IsStartUser(SO.FlowInstance.ID,GetCurrentUserID())==true

其中第一个参数[flowInstranceId]选择过程如下图

第二个参数[userid]选择过程如下图

是否发起人(flowInstranceId,userId):WF_IsSourceUser(flowInstranceId,userId)

功能:判断是否是工作流的发起人

参数flowInstrancId:工作流实例ID

参数userId:当前用户ID

使用频率:高

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:用法同上

是否审批人(flowInstranceId,userId):WF_IsAuditor(flowInstranceId,userId)

功能:判断是否是工作流的任意审批人

参数flowInstrancId:工作流实例ID

参数userId:当前用户ID

使用频率:高

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

用法同【是否提交人】

是否终审人(flowInstranceId,userId):WF_IsLastAuditor(flowInstranceId,userId)

功能:判断是否是工作流的终审人

参数flowInstrancId:工作流实例ID

参数userId:当前用户ID

使用频率:高

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

用法同【是否提交人】

获取流程实例标识(entityId,entityType):WF_GetFlowInstanceId(entityId,entityType)

功能:获取指定单据的工作流的流程示例

参数entityId:实体ID

参数entityType:实体全名称

使用频率:低

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:获取实体的工作流程实例,即获取工作流的流程实体表CS_Workflow_FlowInstance的ID

取成本要素名称(costElementID):GetCostElementName(costElementID)

功能:根据成本要素ID获取成本要素名称

costElementID:成本要素ID

使用频率:低

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:知道成本要素ID,不知道成本要素名称时使用

8、SQL函数

  • 本部分列出了在‌读取权限、列表计算列、预警定义‌等场景下使用的SQL版本函数,其功能与前述普通函数对应,但适用范围不同。
  • 枚举与组织‌:sqlF_Sys_GetEnumCode, sqlGetOrgByContact
  • 日期时间‌:sqlBizToday, sqlToBizDate, sqlSysToBizDate
  • 数值计算‌:sqlAbs, sqlCeiling, sqlFloor, sqlRound, sqlExp, sqlPower
  • 字符串处理‌:sqlLen, sqlRight, sqlLeft, sqlLTrim, sqlRTrim, sqlReplace
  • 日期提取‌:sqlYear, sqlMonth, sqlDay
  • 工作流‌:sqlWF_IsAuditor
  • 日期间隔‌:sqlYearsBetweenFunc, sqlMonthsBetweenFunc, sqlDaysBetweenFunc
  • 业务查询‌:
    • sqlGetSnMasterInfo(...):查询单据序列号
    • sqlGetCostElementName(costElementID):取成本要素名称
    • sqlGetAttachmentCount(EntityType, EntityID):查询附件数量
    • 每个函数均包含:功能、参数说明、使用频率、适用范围与不适用范围、举例。

取枚举值编码(EnumFullName,Evalue):sqlF_Sys_GetEnumCode(EnumFullName,Evalue)

功能:获取枚举值编码

参数EnumFullName:枚举全称(数据字典中查或“自定义代码”页面中的代码类型)

参数Evalue:枚举字段值,即“自定义代码”中的值

举例:根据枚举类型和枚举的值获取枚举的编码,如:

# 根据需求分类枚举值获取对应的需求分类编码。

## F_Sys_GetEnumCode()  根据枚举类型和枚举值获取对应的枚举编码(Code)。
## 'UFIDA.U9.CBO.Enums.DemandCodeEnum'  需求分类枚举(DemandCodeEnum)的完整类型名称。
## 2001  需求分类的枚举值(Value)。

sqlF_Sys_GetEnumCode(
    'UFIDA.U9.CBO.Enums.DemandCodeEnum',
    2001
)
# 得到需求分类的编码

根据联系对象取组织(strContactID):sqlGetOrgByContact(strContactID)

功能:根据联系对象ID获取联系对象关联的组织ID

参数strContactID:联系对象ID

使用频率:低

适用范围:增删改权限、通知管理、列表计算列

举例:无

取组织当前时间:sqlBizToday()

功能:取组织当前时间(类似于Today()函数)

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少适用

时区转换:sqlToBizDate(convertdatetime,SourceZone,TargetZone)

功能:不同时区转换函数

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用,请补充

系统时区转换:sqlSysToBizDate(convertdatetime,TargetZone)

功能:当前日期转换成固定时区

使用频率:极低

适用范围:增删改权限,读取权限、列表计算列

不适用:

举例:极少使用,请补充

取绝对值(value):sqlAbs(value)

功能:取某数值字段的绝对值

使用频率:极低

适用范围: 读取权限、列表计算列、预警定义

不适用范围:增删改函数(不报错但是不起作用)、通知管理

举例:

# 取数值的绝对值(去掉正负号)。

## sqlAbs()  SQL函数,用于获取数值的绝对值。
## 9  正数。
## -9  负数。

sqlAbs(9)=9

sqlAbs(-9)=9

取最小整数(a): sqlCeiling(a)

功能:对某数值字段向上取整

使用频率:极低

适用范围:列表计算列、读取权限、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

举例:

# 对数值向上取整,返回大于或等于该数值的最小整数。

## sqlCeiling()  SQL函数,用于向上取整。
## 22.22  需要进行向上取整的数值。

sqlCeiling(22.22)
# 结果为 23

取最大整数(a): sqlFloor (a)

功能:对某数值字段向下取整

使用频率:极低

适用范围:列表计算列、读取权限、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

举例:

# 对数值向下取整,返回小于或等于该数值的最大整数。

## sqlFloor()  SQL函数,用于向下取整。
## 22.22  需要进行向下取整的数值。

sqlFloor(22.22)
# 结果为 22

四舍五入(value,digits): sqlRound(value,digits)

功能:对某数值字段四舍五入

参数Value:进行四舍五入的字段

参数digits:保留的位数

使用频率:极低

适用范围:列表计算列、读取权限、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

举例:

# 按指定小数位数进行四舍五入。

## sqlRound()  SQL函数,用于对数值进行四舍五入。
## 1.55  需要进行四舍五入的数值。
## 1.54  需要进行四舍五入的数值。
## 1(第二个参数)  保留的小数位数。

sqlRound(1.55,1)=1.6
# 保留1位小数并进行四舍五入

sqlRound(1.54,1)=1.5
# 保留1位小数并进行四舍五入

指数函数(d1): sqlExp(d1):

功能:exp()函数表示以自然常数e为底的指数函数,exp(x)表示的是e的x次方,x可以是一个函数

使用频率:极低

适用范围:增删改函数

不适用范围:列表计算列、读取权限

举例:

# 计算 2 × e³(2乘以自然常数e的3次方)。

## 2  乘数。
## exp  指数函数,以自然常数e(约2.71828)为底。
## 3  指数。
## e  自然常数,约等于2.718281828。

2exp3

求幂函数(x,y): sqlPower(x,y)

功能:求x的y次幂

使用频率:极低

适用范围:增删改函数

不适用范围:列表计算列、读取权限

举例:

# 计算一个数的指定次幂(x的y次方)。

## sqlPower()  SQL函数,用于计算幂运算。
## 3(第1个参数)  底数(x)。
## 2(第2个参数)  指数(y)。

sqlPower(3,2)
# 结果为 9

字串长度:sqlLen(str)

功能:取得字串长度

使用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

取右子串:sqlRight(str, length)

功能:取字符串右子串

参数str:被取右子串的字段

参数length:右边截取的位数

适用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

读取权限举例:查看下料品主分类编码右边三位为【001】的记录

# 判断物料主分类编码右侧3位是否等于'001'。

## sqlRight()  SQL函数,用于从字符串右侧截取指定长度的字符。
## ItemMaster  料品对象(Item Master)。
## ItemMaster.MainItemCategory  料品主分类对象。
## ItemMaster.MainItemCategory.Code  料品主分类编码。
## 3  从右侧截取3个字符。
## =  等于比较运算符。
## '001'  比较值。

sqlRight(ItemMaster.MainItemCategory.Code,3)='001'

取左子串:sqlLeft(str,length)

功能:取字符串左子串

参数str:被取左子串的字段

参数length:左边截取的位数

使用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用范围:增删改函数(虽然不报错但不起作用)、通知管理

读取权限举例:查看下料品主分类编码左边三位为【001】的记录

# 判断物料主分类编码左侧3位是否等于'001'。

## sqlLeft()  SQL函数,用于从字符串左侧截取指定长度的字符。
## ItemMaster  料品对象(Item Master)。
## ItemMaster.MainItemCategory  料品主分类对象。
## ItemMaster.MainItemCategory.Code  料品主分类编码。
## 3  从左侧截取3个字符。
## =  等于比较运算符。
## '001'  比较值。

sqlLeft(ItemMaster.MainItemCategory.Code,3)='001'

去掉字符串左侧的空格(str):sqlLTrim(str)

功能:去掉字符串左侧的空格

参数str:要去掉左侧空格的字段

使用频率:极少

适用范围:读取权限,列表计算列、预警定义

不适用范围:增删改权限(不报错但不起作用)、通知管理

去掉字符串右侧的空格(str):sqlRTrim(str)

功能:去掉字符串右侧的空格

参数str:要去掉右侧空格的字段

使用频率:极少

适用范围:读取权限,列表计算列、预警定义

不适用范围:增删改权限(不报错但不起作用)、通知管理

字符串替换:sqlReplace(str,oldStr,newStr)

功能:将字串中某个子串替换成新的子串

参数str:进行子串替换的字段

参数oldStr:被替换旧子串(注意这里的子串即使是数字也要英文单引号括起来 )

参数newStr:替换后新子串(注意这里的子串即使是数字也要英文单引号括起来 )

使用频率:极少

适用范围:读取权限、预警定义

不适用范围:列表计算列、增删改权限、通知管理

举例:销售订单号中‘2’换成‘3’ 或者‘24‘换成’a’

原始单号SO225-0124Ab

# 将字符串中的指定内容替换为新的内容。

## sqlReplace()  SQL函数,用于替换字符串中的指定子串。
## DocNo  单据编号。
## '2'  需要被替换的旧字符串。
## '3'  替换后的新字符串。
## '24'  需要被替换的旧字符串。
## 'a'  替换后的新字符串。

# 原始单号: DocNo='SO225-0124Ab'

sqlReplace(DocNo,'2','3')
# 结果:SO335-0134Ab

sqlReplace(DocNo,'24','a')
# 结果:SO225-01aAb

年(date):sqlYear(date)

功能:取出日期或者时间中的年份

参数date:日期或者时间字段

使用频率:中

适用范围:列表计算列、读取权限

不适用范围:预警定义、增删改权限、分录模板

月(date):sqlMonth(date)

功能:取出日期或者时间中的月份

参数date:日期或者时间字段

使用频率:中

适用范围:列表计算列、读取权限

不适用范围:预警定义、增删改权限、分录模板

用法同年(date)

日(date):sqlDay(date)

功能:取出日期或者时间中的月份

参数date:日期或者时间字段

使用频率:中

适用范围:列表计算列、读取权限

不适用范围:预警定义、增删改权限、分录模板

用法同年(date)

是否是当前审批人(flowInstranceId,userId):sqlWF_IsAuditor(flowInstranceId,userId)

功能:判断是否是工作流的任意审批人

参数flowInstrancId:工作流实例ID

参数userId:当前用户ID

使用频率:中

适用范围: 列表计算列、读取权限

不适用范围:预警定义、增删改权限、通知管理

读取权限举例:显示当前用户要审批的销售订单、

# 判断当前登录用户是否为该工作流实例的审批人。

## sqlWF_IsAuditor()  SQL函数,用于判断指定用户是否为工作流的任意审批人。
## FlowInstance  工作流实例ID(FlowInstanceId)。
## GetCurrentUserID()  获取当前登录用户ID。
## =  等于比较运算符。
## 'true'  字符串形式的布尔真值。

sqlWF_IsAuditor(FlowInstance,GetCurrentUserID())='true'

其中第一个参数[flowInstranceId]选择过程如下图

第二个参数[userid]选择过程如下图

相隔年(now,then):sqlYearsBetweenFunc(CreatedOn,BusinessDate)

功能:两个时间字段相隔年份

BusinessDate年份减去CreatedOn的年份(只看年份)

使用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用:增删改权限、分录模板、通知管理

举例:若适用在数据权限,必须是两个日期或者时间类型字段比较

# 计算两个日期之间相差的年份数(仅比较年份部分)。

## sqlYearsBetweenFunc()  SQL函数,用于计算两个日期之间相差的年份数。
## StrToDate()  将字符串转换为日期类型。
## '2022-05-01'  开始日期(then)。
## '2023-02-01'  结束日期(now)。

sqlYearsBetweenFunc(StrToDate('2022-05-01'),StrToDate('2023-02-01'))
# 结果为 1

相隔月(now,then):sqlMonthsBetweenFunc(now,then)

功能:两个时间字段相隔月份

BusinessDate月份减去CreatedOn的月份(同时看年和月)

使用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用:增删改权限、分录模板、通知管理

举例:若适用在数据权限,必须是两个日期或者时间类型字段比较,

# 计算两个日期之间相差的月份数(结果:8)。
## sqlMonthsBetweenFunc
# 计算两个日期之间的月份差值(具体是否按“整月”或“跨月计数”取决于系统实现,不同ERP可能不同)。

## StrToDate('2021-05-20')
# 将字符串日期 '2021-05-20' 转换为日期类型。

## StrToDate('2022-01-01')
# 将字符串日期 '2022-01-01' 转换为日期类型。

sqlMonthsBetweenFunc(StrToDate('2021-05-20'), StrToDate('2022-01-01'))
# 结果为8

相隔日(now,then):sqlDaysBetweenFunc (now,then)

功能:两个时间字段相隔日

BusinessDate日减去CreatedOn的日(同时看年月日)

使用频率:低

适用范围:读取权限、列表计算列、预警定义

不适用:增删改权限、分录模板、通知管理

举例:若使用在数据权限,必须是两个日期或者时间类型字段比较

# 计算两个日期之间相差的天数,结果为226。
## sqlDaysBetweenFunc()
# 用于计算两个日期之间的天数差值(具体是否包含起止日期取决于U9C系统实现规则,一般为结束日期减开始日期)。

## StrToDate('2021-05-20')
# 将字符串日期 '2021-05-20' 转换为日期类型。

## StrToDate('2022-01-01')
# 将字符串日期 '2022-01-01' 转换为日期类型。

sqlDaysBetweenFunc(StrToDate('2021-05-20'), StrToDate('2022-01-01'))
# 结果为226

Sql查询单据序列号:sqlGetSnMasterInfo(DocType,ID,DocLineType,DocLineID,DocSubLineType,DocSubLineID,StrSeprate)

功能:根据单据行ID或单据子行ID获取单据的序列号,且用指定分隔符返回

DocType:单据头类型实体全称,对应表Sn_SnBeUsed中的Document_EntityType值

ID:单据头ID,对应表Sn_SnBeUsed中的Document_EntityID值

DocLineType:单据行类型实体全称,对应表Sn_SnBeUsed中的DocLine_EntityType值

DocLineID:单据行ID,对应表Sn_SnBeUsed中的DocLine_EntityID值

DocSubLineType单据子行类型,对应表Sn_SnBeUsed中的DocSubLine_EntityType值

DocSubLineID:单据子行ID,对应表Sn_SnBeUsed中的DocSubLine_EntityID值

StrSeprate:需要返回的序列号的分割符,

使用频率:低

适用范围:

不适用范围:

举例:无

取成本要素名称(costElementID):sqlGetCostElementName(costElementID)

功能:根据成本要素ID获取成本要素名称

costElementID:成本要素ID

使用频率:低

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:知道成本要素ID,不知道成本要素名称时使用

Sql查询附件数量(EntityType,EntityID):sqlGetAttachmentCount(EntityType,EntityID)

功能:查询单据的附件数量

EntityType:单据的实体全名称(数据字典查询)

EntityID:单据的ID

使用频率:低

适用范围:增删改权限、通知管理

不适用范围:预警定义、读取权限、列表计算列

举例:查询单据的附件数量