NC开发笔记——单据模板编辑显示公式使用

时间:2022-12-28 18:08:20
单据模板编辑显示公式使用
(一) 公式使用场景
用户使用产品时,往往对单据上的字段取值有各种不同的需求。为此单据模板提供
了模板公式功能,可以让实施顾问或者用户通过配置各种公式,并且不用修改代码,从
而满足用户的各种个性化需求。
(二) 单据模板三种公式
1、编辑公式
可实现单据编辑中字段自动带值的功能。只在编辑状态起作用,在某字段上设置好
编辑公式,当此字段编辑后,公式会被执行,并将结果填充到目的字段上。
例如:单据上编辑业务员,自动带入部门
2、显示公式
可实现单据显示时加载非持久信息的功能。只在非编辑状态起作用,例如查询后加
载或保存后刷新界面等,模板上的显示公式均会执行,运算结算会显示到相应字段上。
例如:采购入库单取采购订单的预计到货日期。
3、控制公式
可实现单据保存的检查功能。只在编辑状态起作用,一般在单据保存时执行所有字
段上的控制公式,根据公式类型的不同做不同的响应,可能弹出错误信息,也可能弹出
确认信息等。可以起到控制及提示作用,项目上应用广泛。
控制公式又分为:提示公式、检查公式、界面控制公式三种。
a、提示公式:如单据金额超过某一数值时,进行提示或弹出界面,用户以此判断
是否继续保存单据。
b、检查公式:例如:单据金额超过某一数值时,报出错误,不能保存单据。
c、界面控制公式:根据条件判断,单据上的字段颜色显示、或者能否编辑、或者
是否激活。
(三) 常用公式的应用场景
在产品中,开发人员一般情况下直接在后台通过 sql语句实现用户所需功能。实际
上我们定义的公式在执行时也是转化为 sql语句,本质是一样的。
场景一:采购订单表体行中取来源请购单行的需求日期,客户需要
分析计划到货日期与需求日期的差距, 相差较大的话需要对供应商催
货或者提醒下游用料单位做好材料短缺准备。
实现此功能,可使用三个表体自定义项,分别起名为:需求日期、相差天数、是否
严重延迟。
a、需求日期显字段示公式定义为:
getcolvalue(po_praybill_b ,dreqdate ,pk_praybill_b ,csourcebid )
意思是:从请购单表体(po_praybill_b)中取需求日期(dreqdate)的值,条件是
请购单表体行 ID(pk_praybill_b)等于采购订单的表体字段来源单据明细值(csourcebid) 。
类似于 sql语句:select dreqdate from po_praybill_b where pk_praybill_b= csourcebid
b、相差天数定义显示公式为:
comparedate(dplanarrvdate ,vbdef1 ,"D" )
意思是:比较采购订单表体计划到货日期(dplanarrvdate)与自定义项一(需求日
期)的差值,用天数(D)来体现。
c、在是否严重延迟定义显示公式为:iif(vbdef2>5,"是","否")
意思是:如果自定义项二的值大于 5,则为:是,否则为:否
场景二:单据中编辑业务员,给部门字段带出人员的任职部
门。
此时可以在人员字段中定义编辑公式:
rowcount->getrowcount("bd_psnjob","pk_psndoc",cemployeeid,"pk_org",pk_org);
pk_dept->iif(rowcount==1,getcolvalue2(bd_psnjob,pk_dept,pk_psndoc,cemployeeid,pk
_org,pk_org),pk_dept);
pk_dept_v->iif(rowcount==1,getcolvalue(org_dept ,pk_vid , pk_dept ,
pk_dept),pk_dept_v);
场景三:如果请购单的请购数量超过 1000,给出用户提示,
让用户自己判断是否保存。
方式一:使用控制公式:$Confirm->iif(,,"")
在保存时根据公式条件,给出提示信息,确认是否继续。
$Confirm->iif(nastnum>1000,"请购数量大于1000,是否保存?","")
方式二:使用控制公式:$Message->iif(,,"")   
在保存时根据公式条件,给出提示信息,不影响保存。
场景四:如果单据实收数量大于应收数量,不能保存。
$Error->iif(,,"")在保存时根据公式条件,进行报错处理,如果出错则保存失败。
$Error->iif(nnum>nshouldnum,"实收大于应收,不能保存","")
场景五:采购发票表头金额显示为大写
getmlcvaluemorewithcond() 将传入的字符串或数字转换为大写金额
可定义自定义项名字为:大写金额,并定义显示公式:
getchinesecurrency(ntotalorigmny )
将整单价税合计转换为大写。
(四) 附:NC公式表
一、日期
1、日期比较:comparedate(, ,)
compareDate(date1, date2, field)用于日期比较,返回两个日期指定时间域的差值,
可比较的时间域包括"Y"-比较年;"M"-比较月;"D"-比较日;"H"-比较小时;"m"-比较
分钟;"S"-比
较 秒 . 比 如 :compareDate("2005-12-27 23:12:10", toDateTime("2005-12-27
23:12:08"), "S")将返回两个日期相差的秒数.
例如:库存其他入库单入库日期与首次入库日期相差时间
comparedate(dbizdate ,dinbounddate ,"m" )
2、date()
date()返回当前日期
3、dateadd( , , )
dateAdd(date1, num, fieldchar)返回在指定日期的年、 月或者日上增加某个值 num,
可增加的时间域 fieldchar 包括"Y"-增加年;"M"-增加月;"D"-增加日;"H"-增加小
时;"m"-增加分
钟;"S"-增加秒.比如 dateAdd("23:13:23", 1, "H")表示对前面的时间增加一小时.
4、dateformat()
dateFormat(date, pattern[,language])用于将时间格式化为期望的字符串,其中 date
可以是时间字符串,也可以是Date对象,pattern为格式化参数,yyyy表示年,MM表
示月,dd 表示天
数,HH表示小时,mm表示分钟,ss表示秒.比如dateFormat("2006-07-04 12:12:12", "
日期:yyyy-MM-dd HH:mm:ss") 将返回"日期:2006-07-04 12:12:12".
5、datetime()
datetime()返回当前日期和时间
6、dayof()
dayOf(date)求日期 date的天数
7、formataddress( )
格式化地址,根据地址簿id 将地址格式化成语言格式中设置的样式
8、formatmararea( )
格式化物料维度的显示名称,根据指标表id 和物料ids
9、formatsraccto( )
格式化返利依据的显示名称,根据返利取数函数的编码,将返利取数函数的编码
转换成名称显示在返利依据上
10、loginbusidate()
得到当前登录业务时间,前后台均可用,如果是后台使用,可能会得不到
11、mon()
month()求当前月
12、monof( )
month(date)得到指定日期内的月份
13、time()
time()取得当前时间,格式是HH:mm:SS
14、todate( )
toDate(str)将字符串格式的时间 str 转换成UFDate对象
15、todatetime( )
toDateTime(str) 将 字 符 串 格式 的 时 间 str 转 换 成 UFDateTime 对 象, 比 如
toDateTime("2006-10-15 21:01:01").
16、totime( )
toTime(str)将字符串格式的时间str 转换成UFTime 对象
17、year()
year()求当前年
18、yearof()
yearof(date)求日期 date的年
二、数学
1、abs( )
abs(num)求数 num 的绝对值
2、acos( )
acos(x)返回一个弧度 x的反余弦,弧度值在0 到Pi 之间
3、acosh( )
acosh(z) = log(z + sqrt(z*z - 1))
4、add( , )
add(num1,num2)用于高精度加法运算
5、angle( , )
Math.atan2(x.doubleValue(), y.doubleValue())
6、asin( )
asin(x)返回一个弧度 x的反正弦,弧度值在-Pi/2 到 Pi/2 之间
7、asinh( )
asinh(z) = log(z + sqrt(z*z + 1))
8、atan( )
atan(x)返回一个弧度x的反正切值,弧度值在-Pi/2 到Pi/2 之间
9、atanh( )
atanh(z) = 1/2 * log( (1+z)/(1-z) )
10、ceil( )
ceil(数字或者字符串) 将变量转换为 int类型
11、cos( )
cos(x)返回给定角度x的余弦值
12、cosh( )
cosh(z) = ( exp(z) + exp(-z) ) / 2
13、div( , )
div(num1,num2)用于高精度除法运算
14、exp( )
exp(x)e的 x次方
15、flooring( )
flooring(数字或者字符串) 将变量转换为 int类型
16、getresult()
计算两个数的和
17、int( )
int(数字或者字符串) 将变量转换为 int类型
18、ln( )
ln(x)返回给定数值x的自然对数
19、log( )
log(x)返回给定数 n 的以十为底的对数
20、max( , )
max(x, y) 求数字 x,y两者中的最大值
21、min( , )
min(x, y) 求 x,y两者中的最小值
22、mod( , )
求模运算
23、mul( , )
mul(num1,num2)用于高精度乘法运算
24、rand()
生成随机数
25、round( , )
round(double num, int index) 对 num 保留index位小数(四舍五入)
26、sgn( )
sgn(num) 当数 num 大于0 时,返回 1,等于0 时,返回 0,小于0 时返回-1
27、sin( )
sin(x)返回给定角度 x的正弦值
28、sinh( )
sinh(z) = ( exp(z) - exp(-z) ) / 2
29、sqrt( )
sqrt(x)返回数值x 的平方根
30、sub( , )
sub(num1,num2)用于高精度减法运算
31、sum()
计算两个数的和
32、tan( )
tan(x)返回给定角度 x的正切值
33、tanh( )
sinh(z) / cosh(z)
34、tonumber( )
toNumber(String st) 将 字符 串 st 转 换为 本 解析 器 可识 别 的数 字 , 比如
toNumber("45.0")将返回一个数字型45.0,经过转化后可参与各种数值计算.
35、zeroifnull( )
zeroifnull(var)表示如果 var为空将返回 0
三、字符串
1、charat( , )
charat(st,index)得到字符串 st中第index个字符
2、endswith( , )
endswith(st, end)判断字符串 st是否以字符串end 结尾
3、equalsignorecase( , )
equalsIgnoreCase(st1, st2)判断忽略大小写字符串st1 是否与字符串 st2相等
4、indexof( , )
indexOf(st1, st2) 判断字符串 st1 中第一个字符串 st2 所在的位置,比如
lastIndexOf("HI,UAP2006,UAP","UAP")返回3.
5、isempty( )
isEmpty(变量)用于判断变量是否为空,包括空串("")及空值(null)
6、lastindexof( , )
lastIndexOf(st1, st2) 判断字符串 st1 中最后一个字符串 st2 所在的位置,比如
lastIndexOf("HI,UAP2006,UAP","UAP")返回11.
7、left( , )
left(st, index) 求字符串 st左边前 index个字符组成的字符串
8、leftstr( , , )
leftStr(st,len,defaultStr) 求字符串 st 左边前len 个字符组成的字符串, 如果字符串
长度小于len,则用defaultStr 补齐,比如 leftStr("abc",6,"@")将返回 abc@@@.
9、length( )
length(st) 求字符串 st的长度
10、mid( , , )
mid(String st, int start, int end) 求字符串st左边前第 start个字符至第 end 个字符
之间的字符串
11、pcacostdrivprop( )
动因占比
12、right( , )
right(String st, int index) 求字符串st右边前 index个字符组成的字符串
13、rightstr( , , )
rightStr(st,len,defaultStr) 求字符串 st右边后 len 个字符组成的字符串,如果字符
串长度小于len,则用 defaultStr 补齐,比如 rightStr("abc",6,"@")将返回abc@@@.
14、startswith( , )
startsWith(String st, String start) 判断字符串 st是否以字符串start开头
15、todecimal( )
toDecimal(fraction):fraction = num1 / num2 :\n[num1 cannot be null; num2 cannot
be null or zero]
16、tolowercase( )
toLowerCase(String st) 求字符串 st 的小写形式,比如 toLowerCase("Abc")返回
"abc".
17、tostring( )
toString(obj) 将对象obj 转换为本解析器可识别的字符串形式
18、touppercase( )
toUpperCase(String st) 求字符串 st的大写形式
19、trimzero()
trimzero()剪除字符串或数字 str的末尾 0 值
四、数据库
1、ass( , )
ass(freevalueID,checktype)是关于会计平台中辅助核算的函数,从gl_freevalue表中
根据freevalueID及 checktype 返回checkvalue
2、cvn( , , , )
cvn(tablename,fieldname,pkfield,pkvalue)根据主键从数据库查询特定字段的值,其
返回的值将直接作为数字使用
3、cvs( , , , )
cvs(tablename,fieldname,pkfield,pkvalue)根据主键从数据库查询特定字段的值,其
返回的值将直接作为字符串使用
4、getcolnmv( , , , )
getColNmv(tablename,fieldname,pkfield,pkvalue)根据主键从数据库查询特定字段
的值,其返回的值将直接作为数字使用,其功能类似SQL语句:select fieldname from
tablename
where pkfield = pkvalue 从这条 SQL语句可以看出各个参数的含义.
5、getcolnmv2( , , , , , )
getColNmv2(tablename,fieldname,pkfield1,pkvalue1,pkfield2,pkvalue2)根据主键从
数据库查询特定字段的值,其返回的值将直接作为数字使用,其功能类似 SQL 语
句:select
fieldname from tablename where pkfield1 = pkvalue1 and pkfield2 = pkvalue2. 从这
条SQL语句可以看出各个参数的含义.
6、getcolsvalue()
fieldname1,fieldname2->getColsValue("tablename","fieldname1","fieldname2","pkfi
eld",pkvalue)根据主键从数据库查询多个字段的值,左边待赋值的字段要用逗号分
割,注
意里面的字段,表名要用双引号扩起来。
7、getcolvalue( , , , )
getColValue(tablename,fieldname,pkfield,pkvalue)根据主键从数据库查询特定字段
的值,其功能类似 SQL 语句:select fieldname from tablename where pkfield =
pkvalue 从
这条SQL语句可以看出各个参数的含义.
8、getcolvalue2( , , , , , )
getColValue2(tablename,fieldname,pkfield1,pkvalue1,pkfield2,pkvalue2)根据主键从
数据库查询特定字段的值,其功能类似 SQL 语句:select fieldname from tablename
where
pkfield1 = pkvalue1 and pkfield2 = pkvalue2. 从这条SQL 语句可以看出各个参数的
含义.
9、getcolvaluemore()
getColValueMore("tablename","selectfield","field1",value1,"field2",value2....)
10、getcolvaluemorewithcond()
getColValueMoreWithCond("tablename","selectfield","field1",value1,"field2",value2..
.,"whereCondition")
11、getmlcvalue()
getMLCValue("tablename","fieldname","pkfield",pkvalue)根据主键从数据库查询特
定当前登录语种对应名称字段的值
12、getmlcvaluemorewithcond()
getMLCValueMoreWithCond(tablename,selectfield,field1,value1,field2,value2...,whe
reCondition)
五、财务
1、getmlcvaluemorewithcond()
getChineseCurrency(Object)将传入的字符串或数字转换为大写金额
2、getenglishcurrency( , )
getEnglishCurrency(mark,number)将数字金额转为英文文本描述
3、setthmark( )
setThMark(String)将传入的字符串或数字转为金额后加入千分位标志,如果希望保
留数字后面的 0,则需要先将数字转为字符串,然后再用 setThMark()函数,比如
setThMark
(toString(56510.000)).
4、tochinese( , , )
toChinese(Object number,int flag1,int flag2)将传入的字符串或数字转换为中文
六、常用
iif(condition, result1, result2)
根据condition 是否成立,返回值不同。当 condition=true,返回result1,否则返
回result2。
七、控制公式
1、$Confirm->iif(,,"")
在保存时根据公式条件,给出提示信息,确认是否继续。
2、$Editable->iif(,"Y","N")
3、$Editable[itemkey]->iif(,"Y","N")
如果条件为真,表中字段可编辑
4、$Enabled->iif(,"Y","N")
5、$Enabled[itemkey]->iif(,"Y","N")
如果条件为真,激活表中字段
6、$Error->iif(,,"")
在保存时根据公式条件,进行报错处理,如果出错则保存失败。可以起到业务检
查的作用。
7、$ForeGround->iif(,"red","blue")
可根据条件值,将当前设置公式的字段颜色变换,起到醒目提示的作用。
8、$ForeGround[itemkey]->iif(,"red","blue")
与上一公式的功能相同,唯一不同是指定了设置哪个字段的颜色。
9、$Message->iif(,,"")
在保存时根据公式条件,给出提示信息,不影响保存。