NC65单据模板公式使用

发布时间 2023-12-26 10:21:10作者: Kwoky

单据模板公式使用

(一) 公式使用场景

用户使用产品时,往往对单据上的字段取值有各种不同的需求。为此单据模板提供

了模板公式功能,可以让实施顾问或者用户通过配置各种公式,并且不用修改代码,从

而满足用户的各种个性化需求。

(二) 单据模板三种公式

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(,,"")

在保存时根据公式条件,给出提示信息,不影响保存。