-1

私は2つのテーブルを持っています。1 つは *tbl_workers* という名前で、もう 1 つは *tbl_attendance* です。*tbl_worker* には、労働者の給与を記録しました。*tbl_attendance* には、特定の日に彼が行った残業を記録しました。今、私が欲しいのは、最初に労働者の時給を生成することです。給与を 31 で割り、その結果を 9 で割ります。これは、オフィスの通常の勤務日が 9 時間であるためです。こうすることで、労働者の時給を手に入れることができます。ここで、*tbl_attendence* の各行 (OT は列の名前) を労働者の時給で乗算し、*overtime_rate* という名前の別の列に格納します。私がこれまでに行ったことは次のとおりです。

SqlConnection con = new SqlConnection(@"Data Source=TIMBERTRENDZ-PC\NEWSERVER;Initial Catalog=trendz;user id=sa;Password=Letmein3#;Trusted_connection=False");
        con.Open();
        SqlCommand cmd = new SqlCommand("Select worker_salary from tbl_workers where worker_id='"+textBox1.Text +"'",con);
        int salary = (int)cmd.ExecuteScalar();
        salary = salary/31;
        salary = salary / 9;
        label1.Text = Convert.ToString(salary);
        SqlCommand cmd1 = new SqlCommand("Select ot from tbl_attendence where worker_id='"+textBox1.Text + "'",con);
        int ot = (int)cmd1.ExecuteScalar();
        ot = ot / 60;
        salary = salary * ot;
        SqlCommand cmd2 = new SqlCommand("update tbl_attendence set overtime_rate='"+salary +"' where worker_id='"+textBox1+ "'",con);
        /**int i = cmd2.ExecuteNonQuery();
        label2.Text = Convert.ToString(i);
        **/

しかし、これはワーカー ID に一致するすべての列に同じ金額を格納しています。

4

1 に答える 1

1

OK説明が必要です。まず、DBで単一の更新として実行できるのに、ADO.Netを使用してこれを行うのはなぜですか。次に、データベースに保存された値が必要な理由があります。従業員の給与が変更されたときに同期が取れなくなる場合は、残業代も更新されていることを確認する必要があります。

Select ((worker_salary / 31) / 9) * (ot / 60) 
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id
where worker_id=

このクエリは、上記の計算に基づいて OT レートを取得します。次に、tbl_attendance テーブルの overtime_rate フィールドを更新するには、次のコマンドを実行できます。

update tbl_attendence set overtime_rate= 
Select ((worker_salary / 31) / 9) * (ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id

これにより、すべての従業員の残業料金が更新されます。C# や ADO を使用する必要はありません。SQL Server に任せるだけです。かっこなどをチェックせずにフリーハンドで入力したため、実行する前にSQLを確認してください。

お役に立てれば。

ジェイソン

編集:

このクエリがどのように機能するかをもう少し理解できるように、列名にテーブル名を含めるようにしました。列が両方のテーブルに存在しない限り、クエリはとにかく機能します。

update tbl_attendence set overtime_rate= 
Select ((w.worker_salary / 31) / 9) * (a.ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id
于 2012-06-25T11:57:41.197 に答える