单据公式自定义内容,支持浏览器代码。
单据公式自定义内容,支持浏览器代码。
比如:
1、单据自定义公式:取【文本自定义1】字段@符号前的内容
var ifa= function(str){
return String(str).indexOf('@');
}
var index = ifa( 【文本自定义1】 );
return String( 【文本自定义1】 ).substring(0,index)
2、单据自定义公式:取【文本自定义1】字段@符号后的内容
var ifa= function(str){
return String(str).indexOf('@');
}
var index = ifa( 【文本自定义1】 );
return String( 【文本自定义1】 ).substring(index+1)
----6.8版本支持如果没有@返回空
var ifa= function(str){
return String(str).indexOf('@');
}
var index = ifa( 【商品名称】 );
if( index == -1 ) return ' ' ; else return String( 【商品名称】 ).substring(index+1);
3、其他
1)【b1】字段的平方
Math.pow( 【b1】 , 2) ;
2)5.5变6,5.2也变6
Math.ceil(【b1】);
3)取系统当前时间十分秒
new Date().format("yyyyMMddHHmmssfff");
new Date().format("yyyy-M-d h:m:s");
4)录入数据自动计算
eval(【备注】)
在备注里面录入 1+2+3 ,那么就会自动算出6
4、【文本自定义1】内容是1234(只有4位)显示成12年34周
String( 【文本自定义1】 ).substring(0,2)+'年'+String( 【文本自定义1】 ).substring(2)+'周'
5-1、单据2个日期相减(无正负区分)
function getifDaysBetweenDates(date1, date2) {
// 将日期字符串转换为Date对象
var d1 = new Date(date1);
var d2 = new Date(date2);
// 计算两个日期的时间差(毫秒)
var timeDiff = Math.abs(d2.getTime() - d1.getTime());
// 计算天数
var days = Math.ceil(timeDiff / (1000 * 3600 * 24));
return days;
}
if( 【生产日期】 == '' ) { return zte(0 ) } else
return getifDaysBetweenDates( 【表头.录单日期】 , 【生产日期】 )
5-2、报表日期相减,系统日期-批号(日期,不能是2025-1-1,格式需要是2025-01-01)
parseInt( (new Date() -(new Date( 【批号】 ) ) )/(1000 * 60 * 60*24))
5-3、报表公式:效期至-系统时间 ,还有几天到期,小于等于当天就是0,效期至大于系统时间就是多少天
function getifDaysBetweenDates(date1) {
// 将日期字符串转换为Date对象
var d1 = new Date(date1);
var d2 = new Date() ;
// 计算两个日期的时间差(毫秒)
var timeDiff = d2.getTime() - d1.getTime();
// 计算天数
var days = timeDiff / (1000 * 3600 * 24);
return days;
}
if( 【效期至】 == '' ) { return zte(0 ) } else{
var result =getifDaysBetweenDates( 【效期至】 );
if(result <0){ return Math.ceil(Math.abs(result)) }
else { return Math.ceil(result)-1
}
}
下图系统时间是2025-7-21

6、容易错的点,因为浏览器的计算是js计算,会存在小数位数精度的问题,所以在写公式的时候,需要加上.toFixed(8)
比如:
parseInt( ((【销售数量】 - (【文本1】* 【辅助单位3换算率】))/ 【辅助单位2换算率】).toFixed(8))

7、报表公式设置:字段内容拆分,这里是“/”作为拆分标记的
--/前面
var sifValueName=function(){
let cstr= 【商品名称】;
let match =String(cstr) .split('/');
if (match) {
return match[0];
}
return 0;
}
return sifValueName();
------------------------------------/后面
var sifValueName=function(){
let cstr= 【商品名称】;
let match =String(cstr) .split('/');
if (match) {
return match[1];
}
return 1;
}
return sifValueName();
8、单据,效期至小于系统日期,或者效期至为空,就显示空,否则显示1
if(new Date( 【效期至】 ) - new Date() <0) return ''
else if( 【效期至】== '') return ''
else return 1
9、单据拆分字段取值
1)前:
var ifa= function(str){
return String(str).indexOf('/');
}
var index = ifa( 【自由项】 );
return String( 【自由项】).substring(0,index)
2)中:
var ifa= function(str){
return String(str).indexOf('/');
}
var index1 = ifa( 【自由项】 );
var ifb= function(str){
return String(str).lastIndexOf('/');
}
var index2 = ifb( 【自由项】 );
return String( 【自由项】).substring(index1+1,index2)
3)后:
var ifa= function(str){
return String(str).lastIndexOf('/');
}
var index = ifa( 【自由项】 );
return String( 【自由项】 ).substring(index+1)
效果如下

10、单据中,公式设置,取没放出来的字段
比如销售订单的虚拟库存,需要设置公式 销售数量-虚拟库存
设置:【销售数量】 -that.grid.get_selectedRowData()?.virtualstockqty
但是不支持单据助手刷新虚拟库存去刷新这个字段公式的值
11、单据中取grid的某列的合计值
比如,组装拆卸单上表体的数量的合计值+本行数量
设置:that.gridout.findColumn('qty').get_summaryValue() +【库存数量】
12、单据,当录单日期大于等于系统日期返回ok,否则空
var currentdate = new Date().format("yyyy-M-d") ;
if( new Date( 【表头.录单日期】) >=new Date(currentdate)) return 'ok'; else return ''
13、单据,组装拆装单,上表体 库存数量,当【商品类别】 = '包装袋',取整,其他取4位小数---目前自己设置自己的公式还是有问题,所以下面写法作废
对上表体库存数量设置公式:
if( 【商品类别】 == '包装袋' ) return round(【表头.数字自定义1】*0+numeric( that.gridout.get_selectedRowData()?.mqty), 0) ; else return round( numeric(that.gridout.get_selectedRowData()?.mqty ) + 【表头.数字自定义1】*0, 4)
注意:要录入 【表头.数字自定义1】才会触发这个公式
14、无法设置公式的字段或者录入商品不触发系统字段,现在通过给备注或者自定义字段设置公式,也可以进行触发了(7.1版本2025-4)
注意:慎用if(thatRow) ,因为这个写代码,如果代码字段不写完(如果写了原币,那么本币也要写),如果只写了一个,那么就会存在漏的情况,软件是不会对所有数据进行验证的,有些是前端看不见的,实际就会导致数据错误。
1)订单的到货时间目前是不能设置公式的,但希望默认取值:在单据日期上+10天,可以启用1个文本自定义字段,单据上设置公式:
if(thatRow) {
thatRow.reachdate =dateadd( 【表头.录单日期】 ,10 ,'d' )
}
2)销售出库调入销售订单,数量规则之前是代码写死了的(始终是调入未完成数量),现在可以根据公式重算这个数量了。比如希望数量取商品的规格的值,比如商品规格设置的是20*3,销售出库启用自定义设置按下面设置公式后,调入订单后,数量就是60
if(thatRow) {
thatRow.mqty = eval(【规格】 )
}
3)往来单位设置不同的税率,给备注或自定义字段设置公式:
if(thatRow) {
if( 【表头.客户名称】 == 'kh1' ) thatRow.tax= 11 ; else if( 【表头.客户名称】 == 'kh2' ) thatRow.tax= 12 ; else thatRow.tax= 13
}
4)生产任务单,给上表体自定义字段1设置取【销售订单编号】的值。需要启用配置,给备注(或者其他自定义字段)设置公式:
var thatjs=true;
if(thatRow) {thatRow.billdiy_ud1 =thatRow.orderbillcode}


15、报表显示系统时间,有2种(7.2版本开始才支持)
new Date().toLocaleString()
new Date().toLocaleDateString()

16、单据表体的内容自动赋值给表头,7.1版本,下面以销售订单为例,把表体自定义1的内容赋值给摘要
1)销售订单表体,启用2个文本自定义字段
2)销售订单设置公式:文本自定义2=文本自定义1,如图
3)备注设置公式:
var thatjs=true;
let comment=''
if(that){
let recount = that.grid.get_recordCount();
for(let iis=0;iis<recount;iis++){
let curRow=that.grid.findRowData(iis);
if(curRow && curRow.billdiy_ud1){
comment=comment+curRow.billdiy_ud1
//window.alert(curRow.billdiy_ud1)
}
}
//window.alert(comment)
that.comment.set_text(comment)
}; 【文本自定义2】

效果如下:表体录入文本自定义1的内容,摘要自动就显示了所有行的文本自定义1的内容

17、取单据编号的后4位
var thatjs=true;
function getLastCharacters(str, num) {
if (num >= str.length) {
return str;
}
return str.substring(str.length - num);
}
return getLastCharacters( (【表头.单据编号】).toString() ,4 )
效果:


浙公网安备 33010602011771号