单据及报表自定义公式设置演讲者:刘瑞环2025年7月9日U8C/U8服务部目录单据-高级公式设置1单据列表-栏目设置2审批流-自定义条件设置3报表-计算公式设置4U8C/U8服务部PART1单据-高级公式设置-js语法U8C/U8服务部单据自定义公式设置【应用场景】:在单据中,当表头字段的值或者表体字段的值为【某值】时,自定义项的内容显示【另一值】。【区分】:需和自定义项档案的值和代码进行区分,公式不是针对单个字段的显示设置,如当前字段输入A时,自动显示为是,输入B时,显示为否。而在设置自定义公式时,是通过已有值,计算另一个字段!U8C/U8服务部案例一:文本公式设置(当字段A等于..时,字段B显示..)【业务场景】-1:采购订单中,部门等于【采购部】时,显示“业务部门”,否则显示“其他”。U8C/U8服务部案例一:文本公式设置(当字段A等于..时,字段B显示..)【业务场景】-1:【参考脚本】:cstr([表头:部门]=="采购部"?"业务部门":"其他";)U8C/U8服务部案例一:文本公式设置(当字段A等于..时,字段B显示..)【业务场景】-2:采购订单中,部门等于【采购部】时,显示“业务部门”,部门等于【采购一部】,显示【业务一部】,否则显示【其他】。上个案例参考脚本是否还能使用?cstr([表头:部门]=="采购部"?"业务部门":"其他";)U8C/U8服务部案例一:文本公式设置(当字段A等于..时,字段B显示..)【业务场景】-2:采购订单中,部门等于【采购部】时,显示“业务部门”,部门等于【采购一部】,显示【业务一部】,否则显示【其他】。【参考脚本】-2:cstr(if([表头:部门]=="采购部"){value="业务部门"}elseif([表头:部门]=="采购一部"){value="业务一部"}else{value="其他"})【参考脚本】-3:cstr(varv1=[表头:部门];switch(v1){case"采购部":value="业务部门";break;case"采购一部":value="业务一部";break;default:value="其他";})【参考脚本】-1:cstr([表头:部门]=="采购部"?"业务部门":([表头:部门]=="采购一部"?"业务一部":"其他");)U8C/U8服务部案例二:文本公式设置(判断A的值是否包含B)【业务场景】-1:采购订单中,部门包含【采购】时,显示“业务部门”,否则显示“其他”。U8C/U8服务部案例二:文本公式设置(判断A的值是否包含B)此种情况可考虑使用indexOf函数实现,使用此函数可返回在字符串中的位置,当不存在时返回-1。结合案例1中的三段式:cstr([表头:部门].indexOf("采购")!==-1?"业务部门":"其他";)若是数组能否处理?index从0开始不存在,返回-1U8C/U8服务部案例二:文本公式设置(判断A的值是否包含B)【业务场景】-2:销售报价单输入的业务员需验证是否在预制列表内,预设部分业务员的信息,如:【“王铭”“李响”“小满”】,当表头选择的操作员在预设列表内,则返回信息是“是”,否则返回信息是“否”。U8C/U8服务部案例二:文本公式设置(判断A的值是否包含B)【参考脚本】:是否可以使用indexOf实现?不支持此方法???U8C/U8服务部案例二:文本公式设置(判断A的值是否包含B)【参考脚本】:cstr(varv2=[表头:业务员];varv3=0;varv1=["李响","王铭","小满"];for(vari=0;i=10,【预估金额】=【重量】+18+2*(重量-10)【参考脚本】:cstr(varv1=[表体:表体自定义项13];if(v1<=10){value=v1+18}else{value=v1+18+2*(v1-10)})U8C/U8服务部案例三-数值公式运算为什么重量是8时,金额不是26而是合并到一起变成818??【发现问题】:U8C/U8服务部案例三-数值公式运算【特此说明】:加号不单单用于算数的加减,也用于字符串的拼接,当数字+文本型的数据时,就会拼接在一起。尽量使用数字型的自定义项运算,或者运算时,将自定义项的值先转为数值型。U8C/U8服务部案例三-数值公式运算【参考脚本】:cstr(varv1=Number([表体:表体自定义项1]);if(v1<=10){value=v1+18}else{value=v1+18+2*(v1-10)})U8C/U8服务部案例四-日期公式设置(如何根据固定值计算出日期)【业务场景】:销售订单设置扩展自定义项,公式定义:预计发货日期+固定天数,从而推算出该日期;如何处理?如图所示:【注意】:在JavaScript中,YY-MM-DD格式的日期字符串不能直接进行加减天数的操作,因为该格式的字符串本身并不具备日期计算的能力。需要先将这个字符串转换为一个Date对象,然后通过Date对象的方法进行日期加减,最后再将结果格式化回YY-MM-DD格式。U8C/U8服务部案例四-日期公式设置(如何根据固定值计算出日期)【参考脚本】-1:cstr(vardateVal=[表头:预发货日期];dateVal=dateVal.replace("-","/");//替换所有"-"vardate=newDate(dateVal);date.setDate(date.getDate()+parseInt([表头:表头自定义项5]));//手动格式化日期为YYYY-MM-DDvaryear=date.getFullYear();varmonth=('0'+(date.getMonth()+1)).slice(-2);//补零的月份返回当前月份的索引,从0开始,1月则返回0,故+1varday=('0'+date.getDate()).slice(-2);//补零的日期value=year+'-'+month+'-'+day;value=value)U8C/U8服务部案例四-日期公式设置(如何根据固定值计算出日期)【参考脚本】-2://前段一致cstr(vardateVal=[表头:预发货日期];dateVal=dateVal.replace("-","/");vardd=newDate(dateVal);dd.setDate(dd.getDate()+parseInt([表头:表头自定义项5]));//手动格式化日期为YYYY-MM-DDvaryear=date.getFullYear();varmonth=(date.getMonth()+1)<10?"0"+(date.getMonth()+1):(date.getMonth()+1);varday=date.getDate()<10?"0"+date.getDate():date.getDate();value=year+'-'+month+'-'+day;value=value)经典三元条件表达式U8C/U8服务部PART2单据列表-栏目设置-SQLU8C/U8服务部案例一:列表增加存货或供应商、客户属性若是增加显示存货属性、供应商属性、客户属性等,可在单据格式设置中,直接增加扩展项。U8C/U8服务部案例一:列表增加存货或供应商、客户属性然后再单据列表中勾选显示即可。U8C/U8服务部案例二:列表增加栏目【业务场景】-1:采购发票列表增加关联的入库单日期。U8C/U8服务部案例二:列表增加栏目【参考代码】:(selecttop1t.d1from(selectdDateasd1,cCodeasc1fromRdRecord01)twheret.c1=$<入库单号>)【注意】:先as一个别名用于和标准字段进行区分。【为什么】?U8C/U8服务部案例二:列表增加栏目【错误现象】:U8C/U8服务部案例二:列表增加栏目【后台跟踪语句】-部分:U8C/U8服务部案例二:列表增加栏目【区分】:两种写法结果不同从语句角度分析:查询列表的视图zpurbilltail中入库单号是ccode,则插入的语句就变成了(selecttop1t.d1from(selectdDateasd1,cCodeasc1fromRdRecord01)twheret.c1=ccode),若不将ccode重命名,则实际为ccode=ccode和1=1的效果是一样的,恒等。U8C/U8服务部案例二:列表增加栏目【业务场景】-2:发货单列表如何显示最新开票日期?U8C/U8服务部案例二:列表增加栏目【参考代码】:由于发货单和发票是一对多的关系,一行发货可分多次开票,所以发货单列表栏目只能增加最新开票日期进行参考,栏目设置中-新增-名称标题自定义,对应字段复制以下语句即可:(selecttop1c1from(selectmax(t1.dDate)asc1,t3.cbSysBarCodeasc2fromSaleBillVouchstleftjoinSaleBillVoucht1ont.sbvid=t1.sbvidleftjoinDispatchListst3ont.iDLsID=t3.iDLsIDgroupbyt3.cbSysBarCode)twheret.c2=$<单据行条码>)增加栏目后查询很慢?能否优化?U8C/U8服务部案例二:列表增加栏目【优化】:嵌套子查询可能会导致性能问题,尤其是在处理大量数据时。一、使用其他方式替代子查询❌二、创建对应表字段的索引可尝试给发票的单据行条码字段创建索引,问题解决!U8C/U8服务部PART3审批流-自定义条件设置-SQLU8C/U8服务部案例一:销售订单增加自定义条件生产订单可以按行进行审批,那么对于销售订单来说,能否设置当存在一行单价为0时,需增加经理审批。查看销售订单条件没有类似字段可供选择?U8C/U8服务部案例一:销售订单增加自定义条件【发现】:条件中有一项【最低售价-价格】,最低售价减去价格本身就是表体的判断信息,这里可以选?U8C/U8服务部案例一:销售订单增加自定义条件可在UAP-数据引擎设计器中,找到销售订单工作流进行查看U8C/U8服务部案例一:销售订单增加自定义条件第一行是最低售价-价格的字段,查看对应的查询语句!U8C/U8服务部案例一:销售订单增加自定义条件复制出代码查看:主查询部分:SELECTISNULL(MAX(subprice),0)FROM(子查询)aWHEREa.id=@VoucherId子查询部分:SELECTCASE(CASEISNULL(fcusminprice,0)WHEN0THENISNULL(iinvlscost,0)ELSEfcusminpriceEND)WHEN0THEN0--当客户最低售价为0取存货档案最低售价,若最终为0则取0ELSE(CASEISNULL(fcusminprice,0)WHEN0THENISNULL(iinvlscost,0)ELSEfcusminpriceEND)-(CASEISNULL(bsaleprice,0)WHEN1THENitaxunitpriceELSEiunitpriceEND)ENDASsubprice,--当客户最低售价或存货档案最低售价不为0,根据报价含税标识,减去含税单价或者无税单价so_sodetails.idFROMso_sodetailsINNERJOINinventoryONinventory.cinvcode=so_sodetails.cinvcodeWHEREso_sodetails.id=@VoucherId销售订单XS00001最低售价销售单价返回结果A10015050B10050U8C/U8服务部案例一:销售订单增加自定义条件此条件可实现:当有最低售价的前提下,当前单据中最低售价减去价格最大的差额如果大于0,那么说明最少有一行小于最低售价,此情况走A流程审批,否则走B流程。参照此案例:SELECTtop1CASEWHENEXISTS(SELECT1FROMSO_SODetailsWHEREiUnitPrice=0andSO_SODetails.id=@VoucherId)THEN'存在'ELSE'不存在'ENDASresultFROMSO_SODetailsWHEREid=@VoucherId新增查询条件:U8C/U8服务部案例一:销售订单增加自定义条件U8C/U8服务部案例一:销售订单增加自定义条件已按照条件进入不同审批流程中!U8C/U8服务部PART4报表-计算公式设置-C#脚本U8C/U8服务部案例一:日期公式计算【业务场景】:采购订单执行统计表,日期+固定值计算日期或者计划到货日期减订单日期计算预计到货周期。U8C/U8服务部案例一:日期公式计算(日期+固定值)【参考脚本】-1:以日期+自定义项15为例。可用简单计算列(其他)实现:报表组件中,支持日期直接加int、floor类型的数字计算出最新日期。U8C/U8服务部案例一:日期公式计算(日期计算差值)【参考脚本】-2:计划到货日期减订单日期计算预计到货周期。可用复杂计算列(其他)实现:C#也不支持日期直接计算差值,可使用下方脚本实现return(current.darrivedate.Subtract(current.dPODate)).Days;U8C/U8服务部案例二:条件公式计算【业务场景】:现存量表中,有保质期管理的存货如何计算系统日期与当前行的生产日期相减计算相差天数。//current.dMdate表示当前行的生产日期DateTime.Now表示当前时间returnDateTime.Now.Subtract(current.dMdate).Days;U8C/U8服务部案例二:条件公式计算【参考脚本】:"1900-01-01"通常被用作一个默认的占位符日期,表示日期未被设置或无效,故可增加IF条件实现。if(current.dMdate.ToString("yyyy-MM-dd")=="1900-01-01")return"";elsereturnDateTime.Now.Subtract(current.dMdate).Days;U8C/U8服务部案例三:输出时事件【业务场景】:采购订单执行统计表,当当前日期大于计划到货日期,且入库状态为“未完全入库时”,当前行显示红色。U8C/U8服务部案例三:输出时事件【参考脚本】-1:可使用条件格式实现自定义公式$<条件>($<当前日期>>$<计划到货日期>,1,0)可实现,但是查询时,数据加载较慢?U8C/U8服务部案例三:输出时事件【参考脚本】-2:使用报表输出事件实现:if(DateTime.Now>current.darrivedate&¤t.入库状态=="入库未完成"){row.BackColor=Color.Red;}U8C/U8服务部U8C/U8服务部U8知识获取及下期预告友户通-移动端友户通-用户社区更多U8+产品知识资料、学习视频搜索获取移动端用户社区扫描二维码:关注用友友户通公众号-进入公众号点击自助服务-用户社区课程回放:用友友户通社区-学习-【U8听我说】PC网址:https://success.yonyou.comU8知识资料获取AI智能客服智能客服-AI小成7*24小时随时进行常见问题咨询U8产品端入口:登录软件门户左侧导航点击[智能客服】移动端入口:智能客服扫描二维码:预约下期U8听我说课程名称:第5期-投入产出核对的材料明细核对分析日期:2025年7月16日(星期三)18:00-19:00讲师:杨天椿微信扫码预约U8C/U8服务部