JS實現用戶自定義計算公式

序號員工工種基本工資崗位補貼職務工資加班天數保險費實發工資

 

如上面表格,要做一個工資入錄表單。最後的“實發工資”由錄入數據的自動得到,而且還要根據用戶自定義的公式得到。

例,用戶按照程序設定的規則自定義了一個公式:

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事件調用此方法,就會實現想要的功能。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章