0

私の労働賃金計算機能がこのコードで機能しない理由を教えてください。(「Dowhile」ループを追加する前は正常に機能しました。)

私が欲しいのは、ユーザーが他の経費を入力し、生成された各レコードに直接報酬を与えることができた後、最初にデータベースから賃金額を取得することです。ユーザーが満足のいく結果を得ると、これをデータベースに保存し直すことができます。

ありがとうございました、

私のコードは以下の通りです:

<%
Do while Not Rs.EOF

if rs.fields.item("if_social_sec") = "True"  then
    displaytxt = "" 
    soc_sec_v = soc_sec
else
    displaytxt = "none"
    soc_sec_v = 0
end if 
%>

<table>
<form name="myform2" action="salary_action.asp" method="POST">

<tr bgcolor="#<%=color%>"> 
<td class="btline" width="25" align="center"><input type="checkbox" name="lb_id" value="<%=lb_id%>" onClick="highlightRow(this,'#FFFFCC','#EFF4FA');"></td>
<td class="btline difcursor" nowrap  width="7%">&nbsp;<%=rs.fields.item("lb_name")%></td>
<td class="btline"  nowrap  width="10%"><input type="text" name="working_day" id="working_day" value="<%=rs.fields.item("MaxOfdays")%>" size="7" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline "  nowrap width="10%"><input type="text" name="wage" id="wage" value="<%=formatnumber(rs.fields.item("Total"),2)%>" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline "  nowrap  width="8%"><input type="text" name="OT" id="OT" size="7" onFocus="startCalc();" onBlur="stopCalc();"><input type="hidden" id="OT_rate" value="<%=rs.fields.item("lbOT")%>" ></td>
<td class="btline " nowrap  width="8%"  ><input type="text" name="soc_sec" id="soc_sec" size="7" value="<%=soc_sec_v%>" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline" nowrap style="padding-left: 10px" width="8%" ><input type="text" name="ex_pay" id="ex_pay" size="7" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline bold" width="10%"><input type="text" name="net_wage" id="net_wage" size="7"  disabled></td>
<td class="btline"   ><input type="submit"></td>

</tr>

</form>
<%
        Rs.movenext
        n = n + 1       
    Loop
End if
Rs.close

set Rs=nothing
Call DBConnClose()
%>
</table>


<script>
function startCalc(){ 
  interval = setInterval("calc()",1);
}
function calc(){

  wage = document.myform2.wage.value;
  OT_rate = document.myform2.OT_rate.value;
  OT = document.myform2.OT.value; 
     OT_amt = OT_rate * OT;
  soc_sec = document.myform2.soc_sec.value; 
  ex_pay= document.myform2.ex_pay.value; 
  net_wage = (wage * 1) + (OT_amt * 1) - (soc_sec * 1) + (ex_pay * 1);

  document.myform2.net_wage.value = net_wage.toFixed(2);
}

function stopCalc(){
  clearInterval(interval);
}
</script>
4

1 に答える 1

2

問題は、データベーステーブル内のすべてのレコードに対して、個別のフォームを作成していて、すべてのフォームが同じ名前であるため、JavaScriptが実行時に実際のフォームを見つけることができないことです。

この動作(レコードごとに1つのフォーム)を維持したい場合は、最初に、既に持っているカウンターを追加して、各フォームに一意の名前を付ける必要があります。

<form name="myform2_<%=n%>" action="salary_action.asp" method="POST">

カウンターnを追加することで、各フォームに一意の名前を作成します。

次のステップは、関数の呼び出し方法を変更することです。適切なフォームを取得できるように、関数を呼び出したJavaScript関数に通知する必要があります。これを行うには、呼び出しを次のように変更します。

onFocus="startCalc(this);" onBlur="stopCalc(this);"

this予約済みのJavaScript識別子であり、この方法で渡されると、フォーカスされているかぼやけている実際の要素になります。

最後のステップはJavaScript自体を変更することです。フォームごとに1つずつ、複数の間隔が必要になるため、連想配列が最も簡単なソリューションであり、フォーム名をキーとして使用します。コードは次のようになります。

var intervals = {};
function startCalc(sender){ 
  var key = sender.form.name;
  intervals[key] = setInterval(function() {
    calc(key);
  },1);
}
function calc(key){
  var oForm = document.forms[key];
  wage = oForm.wage.value;
  OT_rate = oForm.OT_rate.value;
  OT = oForm.OT.value; 
  OT_amt = OT_rate * OT;
  soc_sec = oForm.soc_sec.value; 
  ex_pay= oForm.ex_pay.value; 
  net_wage = (wage * 1) + (OT_amt * 1) - (soc_sec * 1) + (ex_pay * 1);

  oForm.net_wage.value = net_wage.toFixed(2);
}

function stopCalc(sender){
  var key = sender.form.name;
  clearInterval(intervals[key]);
}

ご覧のとおり、フォーム名は「sender」要素から抽出され、複数のフォームがあるために存在しなくなった単一の「myform2」ではなく、実際のフォームを取得するために使用されています。

于 2012-09-23T11:44:45.203 に答える