1用友网络科技股份有限公司单据模板专题手册编辑公式主编人:罗嘉参与编辑人员:高端服务支持中心南昌团队2编辑公式1.getcolvalue/getcolvalue2函数getcolvalue的标准写法如下:getColValue(tablename,fieldname,pkfield,pkvalue)类似SQL语句selectfieldnamefromtablenamewherepkfield=pkvalue从这条SQL语句可以看出各个参数的含义。第一项tablename是数据库表,第二项fieldname是要取的表字段,第三项pkfield是作为条件的表字段,需要等于第四项pkvalue的值。getcolvalue2的标准写法如下:getcolvalue2(tablename,fieldname,pkfield1,pkvalue1,pkfield2,pkvalue2)类似SQL语句:selectfieldnamefromtablenamewherepkfield1=pkvalue1andpkfield2=pkvalue2。从这条SQL语句可以看出各个参数的含义。tablename是数据库表名称,fieldname就是所要查询的字段。pkfield1,pkfield2是数据库表bd_psnjob的字段作为连接查询条件,pkvalue1,pkvalue2是单据上的字段。示例:NC65报销类根据人员带出主职部门NC65在报销单表体中增加了自定义项,选择对应的人员,如何自动带出人员所在的主职部门?解决方案:报销单表体的人员和主职部门是单据模板中的自定义项。人员使用自定义项12,即defitem12,主职部门使用自定义项13,即defitem13,另外增加一个自定义项15(defitem15)进行对比设置。自定义项12设置为参照用户,自定义项13设置为参照部门,自定义项15不设置参照。3通过数据字典可以找到人员工作信息的数据库表是bd_psnjob,是否主职的字段是ismainjob。但单据表体人员字段参照的是用户信息而不是人员信息,所以首先需要通过用户信息找到人员主键信息,设置公式:getcolvalue(sm_user,pk_psndoc,user_code,defitem12)。通过getcolvalue公式找到了人员主键,那么通过人员主键找到人员的主职部门主键就需要通过getcolvalue2公式,公式写法如下:getcolvalue2(bd_psnjob,pk_dept,ismainjob,Y,pk_psndoc,getcolvalue(sm_user,pk_psndoc,user_code,defitem12))4所以问题解决过程如下:用户bb关联的人员是bbb,该人员的主职部门是销售部门。在单据模板表体的自定义项12(人员)中设置编辑公式,当自定义项12录入数据后,会触发该公式。defitem13->getcolvalue2(bd_psnjob,pk_dept,ismainjob,Y,pk_psndoc,getcolvalue(sm_user,pk_psndoc,user_code,defitem12))5录入报销单,可以看到,在单据表体人员字段选择了用户bb后,自动带出了与用户关联人员的主职部门销售部门。6但上述设置的公式只取到了部门主键。由于自定义项13设置了参照部门,因此显示的是部门名称。而同样的公式如果对自定义项15进行设置,则只能显示出部门主键。当没有设置参照的情况下,如果想获取主职部门的名称可以再嵌套一个公式:defitem15->getcolvalue(org_dept,name,pk_dept,getcolvalue2(bd_psnjob,pk_dept,ismainjob,Y,pk_psndoc,getcolvalue(sm_user,pk_psndoc,user_code,defitem12)))。7可以看到自定义项15也显示出了部门名称。注:5版本中的人员管理档案没有是否主职的选项,可以直接用getcolvalue公式取人员所在部门,数据库的表和字段要从5版本的数据字典中找。示例:NC65报销单根据支付单位带出银行账户NC65报销单上【支付单位信息】中,“单位银行账户”需要根据“支付单位”,如何自动带出默认的支付账户?解决方案:8因一个单位存在多个银行账户,一个银行账户下可能存在多个银行账户子账,需要通过自定义项来默认一个账户。用户属性定义中定义自定义项为布尔类型。模板设置中将自定义项显示出来。修改银行账户,设置默认的支付账户。9报销单上,在支付单位上设置编辑公式。fkyhzh->getcolvalue2("bd_bankaccsub","pk_bankaccsub","def1","Y",pk_bankaccbas,getcolvalue2("bd_bankaccbas","pk_bankaccbas","def1","Y","controlorg",getcolvalue("org_orgs_v","pk_org","pk_vid",pk_payorg_v)))公式分解:1、根据支付单位pk_payorg_v取出单位主键:getcolvalue("org_orgs_v","pk_org","pk_vid",pk_payorg_v);2、根据核算单位主键controlorg及自定义项1为Y,从银行账户表bd_bankaccbas中取出银行账户主键pk_bankaccbas;getcolvalue2("bd_bankaccbas","pk_bankaccbas","def1","Y","controlorg",getcolvalue("org_orgs_v","pk_org","pk_vid",pk_payorg_v))3、根据银行账户主键pk_bankaccbas及自定义项1为Y,从银行账户子户表bd_bankaccsub取出银行账户子户主键pk_bankaccsub;录入单据,选择支付单位后带出单位银行账户。10示例:NC65出库申请单表体自定义项取采购订单的订单日期系统默认的出库申请单是没有采购订单的日期的,如何显示采购订单的订单日期?解决方案:(1)、首先在物料的库存信息页签维护好物料的出库优先级:(2)、做一张采购订单:11采购订单需要做完入库后才会在库存里面显示出来。(3)、设置出库申请单的单据模板:比如在物料字段出设置编辑公式:vbdef1->getcolvalue2(po_order_b,dbilldate,pk_material,cmaterialoid,pk_arrvstoorg,head.cissueorg)意思就是选择完物料后会根据会在自定义项1带出采购订单的订单日期。(4)、做单据验证:122.编辑公式实现:表头取表体示例:NC57报销单表头取表体字段值当一张报销单多笔费用时,用户会在报销单表体录入多行,表体自定义字段defitem9录入附单据数,表头的附件张数fjzs需要取表体所有行附单据数字段的合计,如何实现?解决方案:一、以交通费报销单为例,修改单据模板,在表体defitem9字段的自定义2上设置公式toHead(fjzs,sum(%all%,defitem9,arap_bxbusitem))二、将设置好的单据模板分配给用户13三、853用户录入单据验证效果四、公式说明公式示例:toHead(headKey,sum(%row%,%key%,%table%));公式说明:sum(%row%,%key%,%table%)公式的值赋值给表头headKey字段;%key%:默认是触发公式的字段,可以直接指定,比如本案例的defitem9;%row%:默认是触发公式的行,可以直接指定,表体第一行为0,表体第二行为1,依次类推..所有行都进行赋值和取值则用:%all%;%table%:默认是触发公式的页签,可以直接指定,比如arap_bxbusitem;注意事项1、公式定义在单据模板表体字段的自定义2上,在字段编辑时执行;2、表头和表体取值的单元格数据类型设置为一致。示例:NC57报销单表头取表体合计当一张报销单多笔费用时,用户会在报销单表体录入多行,表体自定义字段defitem9录入附单据数,表头的附件张数fjzs需要取表体所有行附单据数字段的合计,如何实现?解决方案:一、以交通费报销单为例,修改单据模板,在表体defitem9字段的自定义2上设置公式toHead(fjzs,sum(%all%,defitem9,arap_bxbusitem))14二、将设置好的单据模板分配给用户三、853用户录入单据验证效果15四、公式说明公式示例:toHead(headKey,sum(%row%,%key%,%table%));公式说明:sum(%row%,%key%,%table%)公式的值赋值给表头headKey字段;%key%:默认是触发公式的字段,可以直接指定,比如本案例的defitem9;%row%:默认是触发公式的行,可以直接指定,表体第一行为0,表体第二行为1,依次类推..所有行都进行赋值和取值则用:%all%;%table%:默认是触发公式的页签,可以直接指定,比如arap_bxbusitem;注意事项1、公式定义在单据模板表体字段的自定义2上,在字段编辑时执行;2、表头和表体取值的单元格数据类型设置为一致。示例:NC65如何将表体字段合计值显示到表头销售订单表体数量合计值需要放到表头的一个自定义项上,方便使用这个自定义项目来设置审批条件?解决方案:1、执行sql,创建视图:createorreplaceviewv_saleorder_sumnumasselectb.csaleorderid,sum(b.nnum)nnumfromso_saleorder_bbwhereb.dr=0groupbyb.csaleorderid;162、销售订单单据模板增加自定义项目,项目主键“zslhj”,显示名称-主数量合计,显示公式设置如下:getcolvalue(v_saleorder_sumnum,nnum,csaleorderid,csaleorderid)效果如下图:17附:销售订单单据上表头自定义项显示了表体的合计,但是无法做为审批流的判断条件。若想实现表头取表体指定行数量,可以设置显示公式:如下:getcolnmv2(so_saleorder_b,nnum,csaleorderid,csaleorderid,crowno,"40")效果如下图,取第四行数量。183.编辑公式实现:表体取表头示例:NC57报销单表体职位取表头差旅费报销单,当表头职务选择数据后,如何将表头职务数据填充到表体?解决方案:第一步:修改差旅费报销单的单据模板,选中报销公司信息中的zyx1(此自定义字段用来填写职务),将显示属性里的自定义2设置为:toBody(0,defitem3,arap_bxbusitem,value(-1,zyx1,zfdwbm))这个公式的意思是表头自定义项1的值传给表体自定义项3。保存模板的时候回提示保存模板失败,是因为这个字段的公式太长,需要执行脚本把字段允许的长度扩大,脚本如下:altertablepub_billtemplet_bmodifyuserdefine2varchar(200);19第二步:分配模板第三步:查看效果示例:NC65将表头字段业务员和部门联动到表体在录入付款结算单时当选择表头的部门和业务后,如何同步联动到表体的部门、业务员字段?解决方案:模板设置-业务单元节点找到付款结算单单据模板,把表头表体的业务员和部门字段显示出来。20在表体的业务员字段配置编辑公式:pk_dept->getcolvalue(bd_psnjob,pk_dept,pk_psndoc,pk_busiman_ID)保存后分配模板21用户录入付款结算单表头业务员和部门后表体同步联动效果:4.单据模板初始化-取得元数据在单据模板初始化节点,直接拖元数据到单据中往往比直接设置编辑公式更加方便稳定。示例:NC65销售订单显示纳税人登记号录入销售订单时,如何实现选择客户后自动把客户档案的纳税人登记号信息显示出来?22解决方案:方法1:使用自定义项,设置公式取值。第一步:进入【用户定义属性设置-集团】中,设置销售订单表头自定项引用,这里使用自定义项19注:销售订单引用自定义项后,如此自定义项信息不需传给下游单据,还需到单据转换规则中去掉引用,如销售订单到发货单第二步:设置单据模板,在表头客户字段上设置编辑公式公式为:vdef19->getcolvalue("bd_customer","taxpayerid","pk_customer",ccustomerid)23验证效果:方法2:直接在单据模板初始化中拖入元数据。(建议使用此方法)进入【动态建模平台】【开发配置】【单据模板初始化】中找到销售订单的单据模板,选择根模板点修改从左侧的元数据中,找到客户下的纳税人登记号字段,选中字段鼠标左键按住不放拖入到表头中,然后保存模板。注:如使用的单据模板是复制系统预置的模板修改的,需重新复制系统预置的模板进行修改后分配使用。24以上2种方法,建议使用第二种方法,第二种方法操作简单,不容易出错,且其他单据上如需要显对应档案上的其他字段或自定义信息都可以参照此方法,例如采购订单表体显示物料档案上的自定义项信息,销售订单显示部门档案上的自定义项信息等,都可以在单据模板初始化中增加。