序號 | 員工 | 工種 | 基本工資 | 崗位補貼 | 職務工資 | 加班天數 | 保險費 | 實發工資 |
---|---|---|---|---|---|---|---|---|
如上面表格,要做一個工資入錄表單。最後的“實發工資”由錄入數據的自動得到,而且還要根據用戶自定義的公式得到。
例,用戶按照程序設定的規則自定義了一個公式:
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事件調用此方法,就會實現想要的功能。