JS实现用户自定义计算公式
2010-02-06 16:30
615 查看
序号 | 员工 | 工种 | 基本工资 | 岗位补贴 | 职务工资 | 加班天数 | 保险费 | 实发工资 |
---|---|---|---|---|---|---|---|---|
1 | per1 | 高级 | ||||||
2 | per2 | 普通 | ||||||
3 | per3 | 高级 | ||||||
4 | per4 | 普通 | ||||||
5 | per5 | 高级 |
例,用户按照程序设定的规则自定义了一个公式:
if ([工种] == '高级') then
g = [基本工资] + [岗位补贴] + [职务工资] + [加班天数] * 200 - [保险费];
else then
g = [基本工资] + [岗位补贴] + [职务工资] + [加班天数] * 100 - [保险费];
if (g ≤ 2000) then
[实发工资] = g;
else if (g > 2000 and g ≤ 3000) then
[实发工资] = g - 50;
else if (g > 3000) then
[实发工资] = g - 100;
表格是画出来的:
protected string DrawTable(DataSet dsPerson, DataSet dsWageItem)
{
string strTable = "<table id='tbWage'>";
for (int i = 0; i < dsPerson.Tables[0].Rows.Count; i++)
{
//画表头
if (i == 0)
{
strTable += "<tr><th>序号</th><th>员工</th><th>工种</th>";
for (int j = 0; j < dsWageItem.Tables[0].Rows.Count; j++)
{
strTable += "<th>" + dsWageItem.Tables[0].Rows[j]["FItemName"].ToString() + "</th>";
hdWageItem.Value += "|" + dsWageItem.Tables[0].Rows[j]["FItemName"].ToString();
}
strTable += "</tr>";
}
//画表体
strTable += "<tr>"
+ "<td ><label id='" + (i + 1) + "序号'>" + (i + 1) + "</label></td>"
+ "<td><label id='" + (i + 1) + "员工'>" + dsPerson.Tables[0].Rows[i]["personName"].ToString() + "</label></td>"
+ "<td><label id='" + (i + 1) + "工种'>" + dsPerson.Tables[0].Rows[i]["workingType"].ToString() + "</label></td>";
for (int k = 0; k < dsWageItem.Tables[0].Rows.Count; k++)
{
strTable += "<td><input type='text' id='" + (i + 1) + dsWageItem.Tables[0].Rows[k]["FItemName"].ToString() + "' value='' onchange=/"GetResult('" + (i + 1) + "')/" /></td>";
}
strTable += "</tr>";
}
strTable += "</table>";
return strTable;
}
根据用户自定义的公式得JS方法,只不过,这个方法是存到了字符串中的:
function GetJSExp()
{
var strH = ""; //JS公式的前半部分
var strM = ""; //JS公式的中间部分
var strE = ""; //JS公式的后半部分
var strRtn = ""; //JS公式最后返回值
var strExp = $("#txtExp").val(); //获取用户定义的公式
//获取工资项
var strWageItem = "";
$("#tbWage th").each(function(){
strWageItem += "|" + $(this).text();
});
if(strWageItem != "") strWageItem = strWageItem.substr(1);
var aryWageItem = strWageItem.split("|");
//处理用户定义的公式,得到JS公式的中间部分
strM = strExp.replace(/then/g,"")
.replace(/≤/g,"<=")
.replace(/≥/g,">=")
.replace(/and/g,"&&")
.replace(/or/g,"||")
.replace(/not/g,"!=")
.replace(//[/g,"")
.replace(//]/g,"")
.replace(//s+/g," ")
;
//循环处理工资项,得到JS的前后部分
for(i = 0; i < aryWageItem.length; i++)
{
//验证工资表中第一行的各个工资项,以此来判断工资项类型
if($('#1' + aryWageItem[i]).get(0).nodeName == 'LABEL') //当工资项是label时
{
strH += "var " + aryWageItem[i] + "=GObj(rI+'" + aryWageItem[i] + "').innerHTML;";
strE += "GObj(rI+'" + aryWageItem[i] + "').innerHTML=" + aryWageItem[i] + ";";
}
else if($('#1' + aryWageItem[i]).get(0).nodeName == 'INPUT') //当工资项是input.text时
{
strH += "var " + aryWageItem[i] + "=GF(GObj(rI+'" + aryWageItem[i] + "').value);";
strE += "GObj(rI+'" + aryWageItem[i] + "').value=isNaN(GF(" + aryWageItem[i] + "))?0:" + aryWageItem[i] + ";";
}
}
strRtn = "function GetResult(rI)"
+ "{"
+ strH + strM + strE
+ "}";
$("#txtRuslt").val(strRtn);
return strRtn;
}
把strRtn保存到数据库中,然后在test.aspx.cs获取这个字符串给strJS,在test.aspx中写上这段代码:
<script type="text/javascript">
var strJSExp = "<%= strJS%>";
if(strJSExp != "")
eval(strJSExp);
</script>
这段代码相当于在页面中定义了一个GetResult(rI)JS方法,使用表单中的文本框的onchange事件调用此方法,就会实现想要的功能。
相关文章推荐
- Snooper taoism版中已经实现的可由用户自定义的辅助计算功能示例
- Lucene实现自定义相似度计算公式
- 一种基于 JEP 和可配置公式实现用户自定义字段的解决方案
- js代码实现根据实际物理地址,进行 URL 跳转,并实现用户自定义 URL 跳转
- 实现工资自定义公式的计算方法示例
- js代码实现根据实际物理地址,进行 URL 跳转,并实现用户自定义 URL 跳转
- 一种基于 JEP 和可配置公式实现用户自定义字段的解决方案
- 【笔记】电商网站, 用户可以自定义推荐橱窗的个数, 实现商品推荐的大体思路
- 类设计与声明之实现用户自定义下标上下限的数组
- 如何给Excel添加用户自定义的公式
- c#实现隐式的用户自定义类型转换(关键字implicit operator)
- java编程基础之用户自定义字符串,程序实现打印其每个字母出现的数目
- 并发用户量、吞吐量、思考时间的计算公式
- NodeJs实现自定义分享功能,获取微信授权+用户信息
- js实现上班请假天数计算
- js中自定义方法实现停留几秒sleep
- springMVC自定义注解实现用户行为验证
- js中自定义方法实现停留几秒sleep
- jquery.cookie.js && java后台代码 操作cookie实现记住当前用户输入信息代码
- 利用JS实现scroll自定义滚动效果详解